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 d5a9c19..55b8896 100644 (file)
--- a/scrotwm.c
+++ b/scrotwm.c
@@ -250,6 +250,7 @@ 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 *);
@@ -502,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);
 
@@ -572,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);
@@ -2080,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;
@@ -2898,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[])
 {
@@ -2951,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();