JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
.conf entry for modkey so that pepople will stop pestering me for the
[spectrwm.git] / scrotwm.c
index 985cda1..55b8896 100644 (file)
--- a/scrotwm.c
+++ b/scrotwm.c
@@ -160,7 +160,7 @@ int                 font_adjusted = 0;
 /* dialog windows */
 double                 dialog_ratio = .6;
 /* status bar */
-#define SWM_BAR_MAX    (128)
+#define SWM_BAR_MAX    (256)
 char                   *bar_argv[] = { NULL, NULL };
 int                    bar_pipe[2];
 char                   bar_ext[SWM_BAR_MAX];
@@ -249,6 +249,8 @@ void        horizontal_stack(struct workspace *, struct swm_geometry *);
 void   max_stack(struct workspace *, struct swm_geometry *);
 
 void   grabbuttons(struct ws_win *, int);
+void   new_region(struct swm_screen *, int, int, int, int);
+void   update_modkey(unsigned int);
 
 struct layout {
        void            (*l_stack)(struct workspace *, struct swm_geometry *);
@@ -353,6 +355,7 @@ struct quirk {
        { "OpenOffice.org 2.4", "VCLSalFrame",  SWM_Q_FLOAT },
        { "OpenOffice.org 3.0", "VCLSalFrame",  SWM_Q_FLOAT },
        { "Firefox-bin",        "firefox-bin",  SWM_Q_TRANSSZ },
+       { "Firefox",            "Dialog",       SWM_Q_FLOAT },
        { "Gimp",               "gimp",         SWM_Q_FLOAT | SWM_Q_ANYWHERE },
        { "XTerm",              "xterm",        SWM_Q_XTERM_FONTADJ },
        { "xine",               "Xine Window",  SWM_Q_FLOAT | SWM_Q_ANYWHERE },
@@ -360,6 +363,7 @@ struct quirk {
        { "xine",               "xine Panel",   SWM_Q_FLOAT | SWM_Q_ANYWHERE },
        { "Xitk",               "Xine Window",  SWM_Q_FLOAT | SWM_Q_ANYWHERE },
        { "xine",               "xine Video Fullscreen Window", SWM_Q_FULLSCREEN | SWM_Q_FLOAT },
+       { "pcb",                "pcb",          SWM_Q_FLOAT },
        { NULL,                 NULL,           0},
 };
 
@@ -436,8 +440,6 @@ setscreencolor(char *val, int i, int c)
                    i, ScreenCount(display));
 }
 
-void           new_region(struct swm_screen *, int, int, int, int);
-
 void
 custom_region(char *val)
 {
@@ -501,6 +503,7 @@ conf_load(char *filename)
        char                    *line, *cp, *var, *val;
        size_t                  len, lineno = 0;
        int                     i, sc;
+       unsigned int            modkey;
 
        DNPRINTF(SWM_D_MISC, "conf_load: filename %s\n", filename);
 
@@ -571,6 +574,22 @@ conf_load(char *filename)
                                goto bad;
                        break;
 
+               case 'm':
+                       if (!strncmp(var, "modkey", strlen("modkey"))) {
+                               modkey = MODKEY;
+                               if (!strncmp(val, "Mod2", strlen("Mod2")))
+                                       modkey = Mod2Mask;
+                               else if (!strncmp(val, "Mod3", strlen("Mod3")))
+                                       modkey = Mod3Mask;
+                               else if (!strncmp(val, "Mod4", strlen("Mod4")))
+                                       modkey = Mod4Mask;
+                               else
+                                       modkey = Mod1Mask;
+                               update_modkey(modkey);
+                       } else
+                               goto bad;
+                       break;
+
                case 'r':
                        if (!strncmp(var, "region", strlen("region")))
                                custom_region(val);
@@ -705,15 +724,15 @@ bar_toggle(struct swm_region *r, union arg *args)
 
        DNPRINTF(SWM_D_MISC, "bar_toggle\n");
 
-       if (bar_enabled) {
+       if (bar_enabled)
                for (i = 0; i < sc; i++)
                        TAILQ_FOREACH(tmpr, &screens[i].rl, entry)
                                XUnmapWindow(display, tmpr->bar_window);
-       } else {
+       else
                for (i = 0; i < sc; i++)
                        TAILQ_FOREACH(tmpr, &screens[i].rl, entry)
                                XMapRaised(display, tmpr->bar_window);
-       }
+
        bar_enabled = !bar_enabled;
        for (i = 0; i < sc; i++)
                for (j = 0; j < SWM_WS_MAX; j++)
@@ -1288,6 +1307,10 @@ focus(struct swm_region *r, union arg *args)
 
        case SWM_ARG_ID_FOCUSMAIN:
                winfocus = TAILQ_FIRST(wl);
+               if (winfocus == cur_focus)
+                       winfocus = cur_focus->ws->focus_prev;
+               if (winfocus == NULL)
+                       return;
                break;
 
        default:
@@ -2075,6 +2098,24 @@ struct button {
 };
 
 void
+update_modkey(unsigned int mod)
+{
+       int                     i;
+
+       for (i = 0; i < LENGTH(keys); i++)
+               if (keys[i].mod & ShiftMask)
+                       keys[i].mod = mod | ShiftMask;
+               else
+                       keys[i].mod = mod;
+
+       for (i = 0; i < LENGTH(buttons); i++)
+               if (buttons[i].mask & ShiftMask)
+                       buttons[i].mask = mod | ShiftMask;
+               else
+                       buttons[i].mask = mod;
+}
+
+void
 updatenumlockmask(void)
 {
        unsigned int            i, j;
@@ -2626,13 +2667,12 @@ getstate(Window w)
        unsigned long           n, extra;
        Atom                    real;
 
-       astate = XInternAtom(display, "WM_STATE", False);
        status = XGetWindowProperty(display, w, astate, 0L, 2L, False, astate,
            &real, &format, &n, &extra, (unsigned char **)&p);
        if (status != Success)
                return (-1);
        if (n != 0)
-               result = *p;
+               result = *((long *)p);
        XFree(p);
        return (result);
 }
@@ -2790,6 +2830,11 @@ screenchange(XEvent *e) {
        TAILQ_FOREACH(r, &screens[i].rl, entry)
                TAILQ_FOREACH(win, &r->ws->winlist, entry)
                        XUnmapWindow(display, win->id);
+
+       /* add bars to all regions */
+       for (i = 0; i < ScreenCount(display); i++)
+               TAILQ_FOREACH(r, &screens[i].rl, entry)
+                       bar_setup(r);
        stack();
 }
 
@@ -2889,6 +2934,26 @@ setup_screens(void)
        }
 }
 
+void
+workaround(void)
+{
+       int                     i;
+       Atom                    netwmcheck, netwmname, utf8_string;
+       Window                  root;
+
+       /* work around sun jdk bugs, code from wmname */
+       netwmcheck = XInternAtom(display, "_NET_SUPPORTING_WM_CHECK", False);
+       netwmname = XInternAtom(display, "_NET_WM_NAME", False);
+       utf8_string = XInternAtom(display, "UTF8_STRING", False);
+       for (i = 0; i < ScreenCount(display); i++) {
+               root = screens[i].root;
+               XChangeProperty(display, root, netwmcheck, XA_WINDOW, 32,
+                   PropModeReplace, (unsigned char *)&root, 1);
+               XChangeProperty(display, root, netwmname, utf8_string, 8,
+                   PropModeReplace, "LG3D", strlen("LG3D"));
+       }
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -2942,7 +3007,8 @@ main(int argc, char *argv[])
                TAILQ_FOREACH(r, &screens[i].rl, entry)
                        bar_setup(r);
 
-       /* ws[0].focus = TAILQ_FIRST(&ws[0].winlist); */
+       /* set some values to work around bad programs */
+       workaround();
 
        grabkeys();
        stack();