JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
bring italian man page back to reality; from Andrea Bolognani <eof@kiyuko.org>
[spectrwm.git] / scrotwm.c
index 227c3f4..4730a0f 100644 (file)
--- a/scrotwm.c
+++ b/scrotwm.c
@@ -55,7 +55,7 @@
 static const char      *cvstag =
     "$scrotwm$";
 
-#define        SWM_VERSION     "0.9.33"
+#define        SWM_VERSION     "0.9.34"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -87,6 +87,7 @@ static const char     *cvstag =
 #include <X11/Xproto.h>
 #include <X11/Xutil.h>
 #include <X11/extensions/Xrandr.h>
+#include <X11/extensions/XTest.h>
 
 #ifdef __OSX__
 #include <osx.h>
@@ -613,12 +614,11 @@ void
 ewmh_autoquirk(struct ws_win *win)
 {
        int                     success, i;
-       unsigned long           *data = NULL;
-       unsigned long           n;
+       unsigned long           *data = NULL, n;
        Atom                    type;
 
        success = get_property(win->id, ewmh[_NET_WM_WINDOW_TYPE].atom, (~0L),
-           XA_ATOM, &n, (unsigned char **)&data);
+           XA_ATOM, &n, (void *)&data);
 
        if (!success) {
                XFree(data);
@@ -807,7 +807,7 @@ ewmh_get_win_state(struct ws_win *win)
                win->ewmh_flags |= SWM_F_MANUAL;
 
        success = get_property(win->id, ewmh[_NET_WM_STATE].atom,
-           (~0L), XA_ATOM, &n, (unsigned char **)&states);
+           (~0L), XA_ATOM, &n, (void *)&states);
 
        if (!success)
                return;
@@ -1166,8 +1166,8 @@ custom_region(char *val)
        if (w < 1 || h < 1)
                errx(1, "region %ux%u+%u+%u too small\n", w, h, x, y);
 
-       if (x  < 0 || x > DisplayWidth(display, sidx) ||
-           y < 0 || y > DisplayHeight(display, sidx) ||
+       if (x > DisplayWidth(display, sidx) ||
+           y > DisplayHeight(display, sidx) ||
            w + x > DisplayWidth(display, sidx) ||
            h + y > DisplayHeight(display, sidx)) {
                fprintf(stderr, "ignoring region %ux%u+%u+%u "
@@ -1262,18 +1262,21 @@ bar_window_name(char *s, ssize_t sz, struct ws_win *cur_focus)
        }
 }
 
+int            urgent[SWM_WS_MAX];
 void
 bar_urgent(char *s, ssize_t sz)
 {
        XWMHints                *wmh = NULL;
        struct ws_win           *win;
-       int                     i, j, got_some = 0;
-       char                    a[32], b[8];
+       int                     i, j;
+       char                    b[8];
 
        if (urgent_enabled == 0)
                return;
 
-       a[0] = '\0';
+       for (i = 0; i < SWM_WS_MAX; i++)
+               urgent[i] = 0;
+
        for (i = 0; i < ScreenCount(display); i++)
                for (j = 0; j < SWM_WS_MAX; j++)
                        TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) {
@@ -1281,19 +1284,20 @@ bar_urgent(char *s, ssize_t sz)
                                if (wmh == NULL)
                                        continue;
 
-                               if (wmh->flags & XUrgencyHint) {
-                                       snprintf(b, sizeof b, "%d ", j + 1);
-                                       strlcat(a, b, sizeof a);
-                                       got_some = 1;
-                               }
+                               if (wmh->flags & XUrgencyHint)
+                                       urgent[j] = 1;
                                XFree(wmh);
                        }
 
-       if (got_some) {
-               strlcat(s, a, sz);
-               strlcat(s, "   ", sz);
-        } else
-               strlcat(s, "    ", sz);
+       strlcat(s, "* ", sz);
+       for (i = 0; i < SWM_WS_MAX; i++) {
+               if (urgent[i])
+                       snprintf(b, sizeof b, "%d ", i + 1);
+               else
+                       snprintf(b, sizeof b, "- ");
+               strlcat(s, b, sz);
+       }
+       strlcat(s, "*    ", sz);
 }
 
 void
@@ -3053,7 +3057,8 @@ send_to_ws(struct swm_region *r, union arg *args)
        /* Try to update the window's workspace property */
        ws_idx_atom = XInternAtom(display, "_SWM_WS", False);
        if (ws_idx_atom &&
-           snprintf(ws_idx_str, SWM_PROPLEN, "%d", nws->idx) < SWM_PROPLEN) {
+           snprintf((char *)ws_idx_str, SWM_PROPLEN, "%d", nws->idx) <
+               SWM_PROPLEN) {
                DNPRINTF(SWM_D_PROP, "setting property _SWM_WS to %s\n",
                    ws_idx_str);
                XChangeProperty(display, win->id, ws_idx_atom, XA_STRING, 8,
@@ -3064,6 +3069,13 @@ send_to_ws(struct swm_region *r, union arg *args)
 }
 
 void
+pressbutton(struct swm_region *r, union arg *args)
+{
+       XTestFakeButtonEvent(display, args->id, True, CurrentTime);
+       XTestFakeButtonEvent(display, args->id, False, CurrentTime);
+}
+
+void
 raise_toggle(struct swm_region *r, union arg *args)
 {
        if (r && r->ws == NULL)
@@ -3127,7 +3139,7 @@ uniconify(struct swm_region *r, union arg *args)
 {
        struct ws_win           *win;
        FILE                    *lfile;
-       char                    *name;
+       unsigned char           *name;
        int                     count = 0;
        unsigned long           len;
 
@@ -3178,7 +3190,8 @@ search_do_resp(void)
 {
        ssize_t                 rbytes;
        struct ws_win           *win;
-       char                    *name, *resp, *s;
+       unsigned char           *name;
+       char                    *resp, *s;
        unsigned long           len;
 
        DNPRINTF(SWM_D_MISC, "search_do_resp:\n");
@@ -3562,6 +3575,7 @@ enum keyfuncid {
        kf_iconify,
        kf_uniconify,
        kf_raise_toggle,
+       kf_button2,
        kf_dumpwins, /* MUST BE LAST */
        kf_invalid
 };
@@ -3639,6 +3653,7 @@ struct keyfunc {
        { "iconify",            iconify,        {0} },
        { "uniconify",          uniconify,      {0} },
        { "raise_toggle",       raise_toggle,   {0} },
+       { "button2",            pressbutton,    {2} },
        { "dumpwins",           dumpwins,       {0} }, /* MUST BE LAST */
        { "invalid key func",   NULL,           {0} },
 };
@@ -4231,6 +4246,7 @@ setup_keys(void)
        setkeybinding(MODKEY,           XK_w,           kf_iconify,     NULL);
        setkeybinding(MODKEY|ShiftMask, XK_w,           kf_uniconify,   NULL);
        setkeybinding(MODKEY|ShiftMask, XK_r,           kf_raise_toggle,NULL);
+       setkeybinding(MODKEY,           XK_v,           kf_button2,     NULL);
 #ifdef SWM_DEBUG
        setkeybinding(MODKEY|ShiftMask, XK_d,           kf_dumpwins,    NULL);
 #endif
@@ -4973,7 +4989,7 @@ tryharder:
        if (prop == NULL)
                return (0);
 
-       ret = strtonum(prop, 0, UINT_MAX, &errstr);
+       ret = strtonum((const char *)prop, 0, UINT_MAX, &errstr);
        /* ignore error because strtonum returns 0 anyway */
        XFree(prop);
 
@@ -5067,7 +5083,7 @@ manage_window(Window id)
                p = NULL;
        } else if (prop && win->transient == 0) {
                DNPRINTF(SWM_D_PROP, "got property _SWM_WS=%s\n", prop);
-               ws_idx = strtonum(prop, 0, 9, &errstr);
+               ws_idx = strtonum((const char *)prop, 0, 9, &errstr);
                if (errstr) {
                        DNPRINTF(SWM_D_EVENT, "window idx is %s: %s",
                            errstr, prop);
@@ -5108,7 +5124,8 @@ manage_window(Window id)
 
        /* Set window properties so we can remember this after reincarnation */
        if (ws_idx_atom && prop == NULL &&
-           snprintf(ws_idx_str, SWM_PROPLEN, "%d", ws->idx) < SWM_PROPLEN) {
+           snprintf((char *)ws_idx_str, SWM_PROPLEN, "%d", ws->idx) <
+               SWM_PROPLEN) {
                DNPRINTF(SWM_D_PROP, "setting property _SWM_WS to %s\n",
                    ws_idx_str);
                XChangeProperty(display, win->id, ws_idx_atom, XA_STRING, 8,
@@ -6195,7 +6212,6 @@ main(int argc, char *argv[])
        setup_ewmh();
        /* set some values to work around bad programs */
        workaround();
-
        /* grab existing windows (before we build the bars) */
        grab_windows();