Index: src/Window.cc =================================================================== --- src/Window.cc (Revision 3735) +++ src/Window.cc (Arbeitskopie) @@ -91,41 +91,43 @@ const int capslock = FbTk::KeyUtil::instance().capslock(); const int scrolllock = FbTk::KeyUtil::instance().scrolllock(); - // Grab with Mod1 and with all lock modifiers + // Grab with modkey and with all lock modifiers // (num, scroll and caps) + unsigned int modkey = Fluxbox::instance()->modKey(); + //numlock - XGrabButton(display, button, Mod1Mask|numlock, window, True, + XGrabButton(display, button, modkey|numlock, window, True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, cursor); //scrolllock - XGrabButton(display, button, Mod1Mask|scrolllock, window, True, + XGrabButton(display, button, modkey|scrolllock, window, True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, cursor); //capslock - XGrabButton(display, button, Mod1Mask|capslock, window, True, + XGrabButton(display, button, modkey|capslock, window, True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, cursor); //capslock+numlock - XGrabButton(display, Button1, Mod1Mask|capslock|numlock, window, True, + XGrabButton(display, Button1, modkey|capslock|numlock, window, True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, cursor); //capslock+scrolllock - XGrabButton(display, button, Mod1Mask|capslock|scrolllock, window, True, + XGrabButton(display, button, modkey|capslock|scrolllock, window, True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, cursor); //capslock+numlock+scrolllock - XGrabButton(display, button, Mod1Mask|capslock|numlock|scrolllock, window, + XGrabButton(display, button, modkey|capslock|numlock|scrolllock, window, True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, cursor); //numlock+scrollLock - XGrabButton(display, button, Mod1Mask|numlock|scrolllock, window, True, + XGrabButton(display, button, modkey|numlock|scrolllock, window, True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, cursor); @@ -1002,20 +1004,25 @@ XGrabButton(display, Button1, AnyModifier, frame().window().window(), True, ButtonPressMask, GrabModeSync, GrabModeSync, None, None); - XUngrabButton(display, Button1, Mod1Mask|Mod2Mask|Mod3Mask, frame().window().window()); - if (Fluxbox::instance()->useMod1()) { - XGrabButton(display, Button1, Mod1Mask, frame().window().window(), True, + XUngrabButton(display, Button1, + Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask, + frame().window().window()); + + unsigned int modkey = Fluxbox::instance()->modKey(); + + if (modkey) { + XGrabButton(display, Button1, modkey, frame().window().window(), True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, frame().theme().moveCursor()); //----grab with "all" modifiers grabButton(display, Button1, frame().window().window(), frame().theme().moveCursor()); - XGrabButton(display, Button2, Mod1Mask, frame().window().window(), True, + XGrabButton(display, Button2, modkey, frame().window().window(), True, ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None); - XGrabButton(display, Button3, Mod1Mask, frame().window().window(), True, + XGrabButton(display, Button3, modkey, frame().window().window(), True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None); @@ -2431,7 +2438,8 @@ // check frame events first frame().buttonPressEvent(be); - if (be.button == 1 || (be.button == 3 && be.state == Mod1Mask)) { + if (be.button == 1 || (be.button == 3 && + be.state == Fluxbox::instance()->modKey())) { if ((! focused) && (! screen().isSloppyFocus())) { //check focus setInputFocus(); } @@ -2464,7 +2472,7 @@ else if (m_attaching_tab) attachTo(re.x_root, re.y_root); else if (re.window == frame().window()) { - if (re.button == 2 && re.state == Mod1Mask) + if (re.button == 2 && re.state == Fluxbox::instance()->modKey()) ungrabPointer(CurrentTime); else frame().buttonReleaseEvent(re); @@ -2482,7 +2490,7 @@ frame().handle() == me.window || frame().window() == me.window); if (Fluxbox::instance()->getIgnoreBorder() - && !(me.state & Mod1Mask) // really should check for exact matches + && !(me.state & Fluxbox::instance()->modKey()) // really should check for exact matches && !(isMoving() || isResizing() || m_attaching_tab != 0)) { int borderw = frame().window().borderWidth(); if (me.x_root < (frame().x() + borderw) || Index: src/fluxbox.hh =================================================================== --- src/fluxbox.hh (Revision 3735) +++ src/fluxbox.hh (Arbeitskopie) @@ -158,8 +158,35 @@ inline unsigned int getCacheLife() const { return *m_rc_cache_life * 60000; } inline unsigned int getCacheMax() const { return *m_rc_cache_max; } - inline bool useMod1() const { return *m_rc_use_mod1; } + inline unsigned int modKey() const { + // Code borrowed from KeyUtil::getModifier + if (!(m_rc_mod_key->c_str())) + return 0; + struct t_modlist{ + char *str; + unsigned int mask; + bool operator == (const char *modstr) const { + return (strcasecmp(str, modstr) == 0 && mask !=0); + } + } modlist[] = { + {"SHIFT", ShiftMask}, + {"CONTROL", ControlMask}, + {"MOD1", Mod1Mask}, + {"MOD2", Mod2Mask}, + {"MOD3", Mod3Mask}, + {"MOD4", Mod4Mask}, + {"MOD5", Mod5Mask}, + {0, 0} + }; + for (unsigned int i=0; modlist[i].str != 0; i++) { + if (modlist[i] == m_rc_mod_key->c_str()) + return modlist[i].mask; + } + + return 0; + } + inline void maskWindowEvents(Window w, FluxboxWindow *bw) { m_masked = w; m_masked_window = bw; } @@ -272,7 +299,7 @@ FbTk::Resource m_rc_tabs_attach_area; FbTk::Resource m_rc_cache_life, m_rc_cache_max; FbTk::Resource m_rc_auto_raise_delay; - FbTk::Resource m_rc_use_mod1; /// temporary!, to disable mod1 for resize/move + FbTk::Resource m_rc_mod_key; std::map m_window_search; std::map m_window_search_group; Index: src/fluxbox.cc =================================================================== --- src/fluxbox.cc (Revision 3735) +++ src/fluxbox.cc (Arbeitskopie) @@ -229,7 +229,7 @@ m_rc_cache_life(m_resourcemanager, 5, "session.cacheLife", "Session.CacheLife"), m_rc_cache_max(m_resourcemanager, 200, "session.cacheMax", "Session.CacheMax"), m_rc_auto_raise_delay(m_resourcemanager, 250, "session.autoRaiseDelay", "Session.AutoRaiseDelay"), - m_rc_use_mod1(m_resourcemanager, true, "session.useMod1", "Session.UseMod1"), + m_rc_mod_key(m_resourcemanager, "Mod1", "session.modKey", "Session.ModKey"), m_focused_window(0), m_masked_window(0), m_mousescreen(0), m_keyscreen(0), Index: doc/fluxbox.1.in =================================================================== --- doc/fluxbox.1.in (Revision 3735) +++ doc/fluxbox.1.in (Arbeitskopie) @@ -291,11 +291,16 @@ You can also use Alt + button 1 to raise a partially visible window. Finally, Alt + button 2 lowers a window, and Alt + button 3 resizes the window. .PP -This can be disabled in the resource file +This can be disabled or changed to a different modifier in the resource file .I ~/.fluxbox/init -with +with: .TP -session.useMod1: \fItrue\fR or \fIfalse\fR +session.modKey: +(Default: Mod1) +.TP +Where is one of: +\fIMod1\fR (Alt), \fIMod4\fR ('Windows' key), \fIControl\fR, or \fINone\fR +(disables) .SH MENU FILE A default menu file is installed in .IR @pkgdatadir@/menu .