all repos — fluxbox @ dedbd7e46816ebce6628d9357cc7feee7a61ab57

custom fork of the fluxbox windowmanager

Added patch from Jim Ramsay (i dot am at jimramsay dot com) to freely
define the used modkey.

Added new action SetModKey too
mathias mathias
commit

dedbd7e46816ebce6628d9357cc7feee7a61ab57

parent

535a88ce907641ef5648787bfa5d507d2581b86f

M ChangeLogChangeLog

@@ -1,5 +1,12 @@

(Format: Year/Month/Day) Changes for 1.0rc2: +*06/06/22: + * new Resource: session.modKey: <modkey> (thanks Jim Ramsay i dot am at jimramsay dot com) + new Command: SetModKey <modkey> + eg: session.modKey: Mod4 allows to use the winkey to resize and move + windows and have Mod1 (Alt) free for using blender or Maya. + FbCommands.cc Window.cc fluxbox.hh FbCommandFactory.cc FbCommands.hh fluxbox.cc + doc/fluxbox.1.in *06/06/21: * Fix de_DE translation (thanks Michael Bueker) * Fix nls (Simon)
M doc/fluxbox.1.indoc/fluxbox.1.in

@@ -291,11 +291,16 @@ drag it around.

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.modKey: <modifier> +(Default: Mod1) .TP -session.useMod1: \fItrue\fR or \fIfalse\fR +Where <modifier> 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 .
M src/FbCommandFactory.ccsrc/FbCommandFactory.cc

@@ -44,7 +44,10 @@ #else

#include <stdio.h> #endif -using namespace std; +using std::string; +using std::vector; +using std::cerr; +using std::endl; // autoregister this module to command parser FbCommandFactory FbCommandFactory::s_autoreg;

@@ -60,7 +63,7 @@ const char* commands[] = {

"arrangewindows", "bindkey", "close", - "closeallwindows", + "closeallwindows", "commanddialog", "deiconify", "detachclient",

@@ -122,6 +125,7 @@ "sendtonextworkspace",

"sendtoprevworkspace", "setenv", "sethead", + "setmodkey", "setstyle", "setworkspacename", "setworkspacenamedialog",

@@ -186,17 +190,24 @@ else if (command == "exit")

return new ExitFluxboxCmd(); else if (command == "setenv" || command == "export") { - std::string name = arguments; + string name = arguments; FbTk::StringUtil::removeFirstWhitespace(name); FbTk::StringUtil::removeTrailingWhitespace(name); size_t pos = name.find_first_of(command == "setenv" ? " \t" : "="); - if (pos == std::string::npos || pos == name.size()) + if (pos == string::npos || pos == name.size()) return 0; - - std::string value = name.substr(pos + 1); + + string value = name.substr(pos + 1); name = name.substr(0, pos); return new ExportCmd(name, value); } + else if (command == "setmodkey") { + string modkey(arguments); + FbTk::StringUtil::removeFirstWhitespace(modkey); + FbTk::StringUtil::removeTrailingWhitespace(modkey); + + return new SetModKeyCmd(modkey); + } else if (command == "quit") return new FbTk::SimpleCommand<Fluxbox>(*Fluxbox::instance(), &Fluxbox::shutdown); else if (command == "commanddialog") // run specified fluxbox command

@@ -233,7 +244,7 @@ return new CurrentWindowCmd(&FluxboxWindow::maximizeVertical);

else if (command == "maximizehorizontal") return new CurrentWindowCmd(&FluxboxWindow::maximizeHorizontal); else if (command == "resize") { - FbTk_istringstream is(arguments.c_str()); + FbTk_istringstream is(arguments.c_str()); int dx = 0, dy = 0; is >> dx >> dy; return new ResizeCmd(dx, dy);

@@ -249,19 +260,19 @@ return new ResizeCmd(atoi(arguments.c_str()),0);

else if (command == "resizevertical") return new ResizeCmd(0,atoi(arguments.c_str())); else if (command == "moveto") { - typedef std::vector<std::string> StringTokens; + typedef vector<string> StringTokens; StringTokens tokens; FbTk::StringUtil::stringtok<StringTokens>(tokens, arguments); - + if (tokens.size() < 2) { cerr<<"*** WARNING: missing arguments for MoveTo\n"; return NULL; } - + unsigned int refc = MoveToCmd::UPPER|MoveToCmd::LEFT; int dx = 0; int dy = 0; - + if (tokens[0][0] == '*') refc |= MoveToCmd::IGNORE_X; else

@@ -271,17 +282,17 @@ if (tokens[1][0] == '*' && ! (refc & MoveToCmd::IGNORE_X))

refc |= MoveToCmd::IGNORE_Y; else dy = atoi(tokens[1].c_str()); - + if (tokens.size() >= 3) { tokens[2] = FbTk::StringUtil::toLower(tokens[2]); if (tokens[2] == "left" || tokens[2] == "upperleft" || tokens[2] == "lowerleft") { refc |= MoveToCmd::LEFT; - refc &= ~MoveToCmd::RIGHT; + refc &= ~MoveToCmd::RIGHT; } else if (tokens[2] == "right" || tokens[2] == "upperright" || tokens[2] == "lowerright") { refc |= MoveToCmd::RIGHT; refc &= ~MoveToCmd::LEFT; - } - + } + if (tokens[2] == "upper" || tokens[2] == "upperleft" || tokens[2] == "upperright") { refc |= MoveToCmd::UPPER; refc &= ~MoveToCmd::LOWER;

@@ -290,8 +301,8 @@ refc |= MoveToCmd::LOWER;

refc &= ~MoveToCmd::UPPER; } } - - return new MoveToCmd(dx, dy, refc); + + return new MoveToCmd(dx, dy, refc); } else if (command == "move") { FbTk_istringstream is(arguments.c_str());

@@ -328,14 +339,14 @@ return new CurrentWindowCmd(&FluxboxWindow::toggleDecoration);

else if (command == "sethead") return new SetHeadCmd(atoi(arguments.c_str())); else if (command == "sendtoworkspace") - // workspaces appear 1-indexed to the user, hence the minus 1 + // workspaces appear 1-indexed to the user, hence the minus 1 return new SendToWorkspaceCmd(getint(arguments.c_str(), 1) - 1); else if (command == "sendtonextworkspace") return new SendToNextWorkspaceCmd(getint(arguments.c_str(), 1)); else if (command == "sendtoprevworkspace") return new SendToPrevWorkspaceCmd(getint(arguments.c_str(), 1)); else if (command == "taketoworkspace") - // workspaces appear 1-indexed to the user, hence the minus 1 + // workspaces appear 1-indexed to the user, hence the minus 1 return new TakeToWorkspaceCmd(getint(arguments.c_str(), 1) - 1); else if (command == "taketonextworkspace") return new TakeToNextWorkspaceCmd(getint(arguments.c_str(), 1));

@@ -357,7 +368,7 @@ else if (command == "detachclient")

return new CurrentWindowCmd(&FluxboxWindow::detachCurrentClient); else if (command == "windowmenu") return new CurrentWindowCmd(&FluxboxWindow::popupMenu); - // + // // Workspace commands // else if (command == "nextworkspace")

@@ -369,12 +380,12 @@ return new RightWorkspaceCmd(getint(arguments.c_str(), 1));

else if (command == "leftworkspace") return new LeftWorkspaceCmd(getint(arguments.c_str(), 1)); else if (command == "workspace") - // workspaces appear 1-indexed to the user, hence the minus 1 + // workspaces appear 1-indexed to the user, hence the minus 1 return new JumpToWorkspaceCmd(getint(arguments.c_str(), 1) - 1); else if (command.substr(0, 9) == "workspace" && command[9] >= '0' && command[9] <= '9') { cerr<<"*** WARNING: 'Workspace<n>' actions are deprecated! Use 'Workspace <n>' instead"<<endl; return new JumpToWorkspaceCmd(getint(command.substr(9).c_str(), 1) - 1); - + } else if (command == "nextwindow") return new NextWindowCmd(atoi(arguments.c_str())); else if (command == "prevwindow")

@@ -421,7 +432,7 @@ iss >> mode;

if (iss.fail()) mode="lastworkspace"; mode= FbTk::StringUtil::toLower(mode); - + iss >> d; if (iss.fail()) d="current";

@@ -432,9 +443,9 @@ else if (d == "originquiet")

dest= DeiconifyCmd::ORIGINQUIET; else dest= DeiconifyCmd::CURRENT; - + if ( mode == "all" ) - return new DeiconifyCmd(DeiconifyCmd::ALL, dest); + return new DeiconifyCmd(DeiconifyCmd::ALL, dest); else if ( mode == "allworkspace" ) return new DeiconifyCmd(DeiconifyCmd::ALLWORKSPACE, dest); else if ( mode == "last" )

@@ -443,23 +454,23 @@ else // lastworkspace, default

return new DeiconifyCmd(DeiconifyCmd::LASTWORKSPACE, dest); } else if (command == "macrocmd") { - std::string cmd; + string cmd; int err= 0; int parse_pos= 0; FbTk::MacroCommand* macro= new FbTk::MacroCommand(); while (true) { parse_pos+= err; - err= FbTk::StringUtil::getStringBetween(cmd, arguments.c_str() + + err= FbTk::StringUtil::getStringBetween(cmd, arguments.c_str() + parse_pos, '{', '}', " \t\n", true); if ( err > 0 ) { - std::string c, a; - std::string::size_type first_pos = + string c, a; + string::size_type first_pos = FbTk::StringUtil::removeFirstWhitespace(cmd); - std::string::size_type second_pos = + string::size_type second_pos = cmd.find_first_of(" \t", first_pos); - if (second_pos != std::string::npos) { + if (second_pos != string::npos) { a= cmd.substr(second_pos); FbTk::StringUtil::removeFirstWhitespace(a); cmd.erase(second_pos);

@@ -480,23 +491,23 @@ return macro;

delete macro; } else if (command == "togglecmd") { - std::string cmd; + string cmd; int err= 0; int parse_pos= 0; FbTk::ToggleCommand* macro= new FbTk::ToggleCommand(); while (true) { parse_pos+= err; - err= FbTk::StringUtil::getStringBetween(cmd, arguments.c_str() + + err= FbTk::StringUtil::getStringBetween(cmd, arguments.c_str() + parse_pos, '{', '}', " \t\n", true); if ( err > 0 ) { - std::string c, a; - std::string::size_type first_pos = + string c, a; + string::size_type first_pos = FbTk::StringUtil::removeFirstWhitespace(cmd); - std::string::size_type second_pos= + string::size_type second_pos= cmd.find_first_of(" \t", first_pos); - if (second_pos != std::string::npos) { + if (second_pos != string::npos) { a= cmd.substr(second_pos); FbTk::StringUtil::removeFirstWhitespace(a); cmd.erase(second_pos);
M src/FbCommands.ccsrc/FbCommands.cc

@@ -71,7 +71,7 @@ fb->rereadMenu(true);

return; } } - + Window root_ret; // not used Window window_ret; // not used

@@ -86,9 +86,9 @@

int borderw = menu.fbwindow().borderWidth(); int head = screen.getHead(rx, ry); - pair<int, int> m = + pair<int, int> m = screen.clampToHead(head, - rx - menu.width() / 2, + rx - menu.width() / 2, ry - menu.titleWindow().height() / 2, menu.width() + 2*borderw, menu.height() + 2*borderw);

@@ -98,7 +98,7 @@ menu.setScreen(screen.getHeadX(head),

screen.getHeadY(head), screen.getHeadWidth(head), screen.getHeadHeight(head)); - + menu.show(); menu.grabInputFocus(); }

@@ -122,7 +122,7 @@ }

int ExecuteCmd::run() { pid_t pid = fork(); - if (pid) + if (pid) return pid; std::string displaystring("DISPLAY=");

@@ -149,8 +149,17 @@

return pid; // compiler happy -> we are happy ;) } +SetModKeyCmd::SetModKeyCmd(const std::string& modkey) : m_modkey(modkey) { } + +void SetModKeyCmd::execute() { + Fluxbox::instance()->setModKey(m_modkey.c_str()); + Fluxbox::instance()->save_rc(); + // TODO: we need a better way to do this ... + Fluxbox::instance()->reconfigure(); +} + ExportCmd::ExportCmd(const std::string& name, const std::string& value) : - m_name(name), m_value(value) { + m_name(name), m_value(value) { } void ExportCmd::execute() {

@@ -161,9 +170,9 @@ // and hence we have to do that on our own to avoid memleaking

static std::set<char*> stored; char* newenv = new char[m_name.size() + m_value.size() + 2]; if (newenv) { - + char* oldenv = getenv(m_name.c_str()); - + // oldenv points to the value .. we have to go back a bit if (oldenv && stored.find(oldenv - (m_name.size() + 1)) != stored.end()) oldenv -= (m_name.size() + 1);

@@ -221,7 +230,7 @@

void SetStyleCmd::execute() { Fluxbox::instance()->saveStyleFilename(m_filename.c_str()); Fluxbox::instance()->save_rc(); - FbTk::ThemeManager::instance().load(m_filename, + FbTk::ThemeManager::instance().load(m_filename, Fluxbox::instance()->getStyleOverlayFilename()); }

@@ -302,8 +311,8 @@ FbTk::FbWindow *win = new CommandDialog(*screen, "Fluxbox Command");

win->show(); } - -SetResourceValueCmd::SetResourceValueCmd(const std::string &resname, + +SetResourceValueCmd::SetResourceValueCmd(const std::string &resname, const std::string &value): m_resname(resname), m_value(value) {

@@ -334,13 +343,13 @@ if (Fluxbox::instance()->keys() != 0) {

if (Fluxbox::instance()->keys()->addBinding(m_keybind)) { ofstream ofile(Fluxbox::instance()->keys()->filename().c_str(), ios::app); if (!ofile) - return; + return; ofile<<m_keybind<<endl; } } } -DeiconifyCmd::DeiconifyCmd(Mode mode, +DeiconifyCmd::DeiconifyCmd(Mode mode, Destination dest) : m_mode(mode), m_dest(dest) { } void DeiconifyCmd::execute() {

@@ -356,12 +365,12 @@

const bool change_ws= m_dest == ORIGIN; switch(m_mode) { - + case ALL: case ALLWORKSPACE: for(; it != itend; it++) { old_workspace_num= (*it)->workspaceNumber(); - if (m_mode == ALL || old_workspace_num == workspace_num || + if (m_mode == ALL || old_workspace_num == workspace_num || (*it)->isStuck()) { if (m_dest == ORIGIN || m_dest == ORIGINQUIET) screen->sendToWorkspace(old_workspace_num, (*it), change_ws);

@@ -378,7 +387,7 @@ for (; it != itend; it++) {

old_workspace_num= (*it)->workspaceNumber(); if(m_mode == LAST || old_workspace_num == workspace_num || (*it)->isStuck()) { - if ((m_dest == ORIGIN || m_dest == ORIGINQUIET) && + if ((m_dest == ORIGIN || m_dest == ORIGINQUIET) && m_mode != LASTWORKSPACE) screen->sendToWorkspace(old_workspace_num, (*it), change_ws); else

@@ -389,5 +398,5 @@ }

break; }; } - + }; // end namespace FbCommands
M src/FbCommands.hhsrc/FbCommands.hh

@@ -96,6 +96,14 @@ private:

std::string m_filename; }; +class SetModKeyCmd: public FbTk::Command { +public: + explicit SetModKeyCmd(const std::string& modkey); + void execute(); +private: + std::string m_modkey; +}; + class KeyModeCmd: public FbTk::Command { public: explicit KeyModeCmd(const std::string &arguments);
M src/Window.ccsrc/Window.cc

@@ -98,41 +98,43 @@ const int numlock = KeyUtil::instance().numlock();

const int capslock = KeyUtil::instance().capslock(); const int scrolllock = 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()->getModKey(); + //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);

@@ -1108,20 +1110,23 @@ // needed for click to focus

XGrabButton(display, Button1, AnyModifier, frame().window().window(), True, ButtonPressMask, GrabModeSync, GrabModeSync, None, None); - XUngrabButton(display, Button1, Mod1Mask|Mod2Mask|Mod3Mask, frame().window().window()); + XUngrabButton(display, Button1, Mod1Mask|Mod2Mask|Mod3Mask, + frame().window().window()); - if (Fluxbox::instance()->useMod1()) { - XGrabButton(display, Button1, Mod1Mask, frame().window().window(), True, + unsigned int modkey = Fluxbox::instance()->getModKey(); + + if (modkey) { + XGrabButton(display, Button1, modkey, frame().window().window(), True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, frame().theme().moveCursor()); //----grab with "all" modifiers grabButton(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);

@@ -1738,7 +1743,7 @@ m_last_resize_x = new_x;

m_last_resize_y = new_y; m_last_resize_w = new_w; m_last_resize_h = new_h; - + ResizeDirection old_resize_corner = m_resize_corner; m_resize_corner = NOCORNER; fixsize();

@@ -2684,7 +2689,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()->getModKey())) { if ( (! focused) ) { //check focus setInputFocus(); }

@@ -2721,7 +2727,7 @@ stopResizing();

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()->getModKey()) ungrabPointer(CurrentTime); else frame().buttonReleaseEvent(re);

@@ -2743,7 +2749,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()->getModKey()) // really should check for exact matches && !(isMoving() || isResizing() || m_attaching_tab != 0)) { int borderw = frame().window().borderWidth(); //!! TODO(tabs): the below test ought to be in FbWinFrame

@@ -2871,7 +2877,7 @@ else

resize_corner = (me.y < cy) ? RIGHTTOP : RIGHTBOTTOM; - // We are grabbing frame window in startResizing + // We are grabbing frame window in startResizing // we need to translate coordinates to it. int start_x = me.x, start_y = me.y; Window child;
M src/fluxbox.ccsrc/fluxbox.cc

@@ -42,7 +42,6 @@

#include "FbTk/I18n.hh" #include "FbTk/Image.hh" #include "FbTk/FileUtil.hh" -#include "FbTk/KeyUtil.hh" #include "FbTk/ImageControl.hh" #include "FbTk/EventManager.hh" #include "FbTk/StringUtil.hh"

@@ -56,6 +55,7 @@ #include "FbTk/CompareEqual.hh"

#include "FbTk/Transparent.hh" #include "FbTk/Select2nd.hh" #include "FbTk/Compose.hh" +#include "FbTk/KeyUtil.hh" //Use GNU extensions #ifndef _GNU_SOURCE

@@ -160,8 +160,8 @@

namespace { Window last_bad_window = None; - -// *** NOTE: if you want to debug here the X errors are + +// *** NOTE: if you want to debug here the X errors are // coming from, you should turn on the XSynchronise call below int handleXErrors(Display *d, XErrorEvent *e) { if (e->error_code == BadWindow)

@@ -215,7 +215,7 @@ m_rc_tabs_attach_area(m_resourcemanager, ATTACH_AREA_WINDOW, "session.tabsAttachArea", "Session.TabsAttachArea"),

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_masked_window(0), m_mousescreen(0), m_keyscreen(0),

@@ -347,7 +347,7 @@ vector<string> vals;

vector<int> scrtmp; int scrnr = 0; FbTk::StringUtil::stringtok(vals, m_argv[i], ",:"); - for (vector<string>::iterator scrit = vals.begin(); + for (vector<string>::iterator scrit = vals.begin(); scrit != vals.end(); scrit++) { scrnr = atoi(scrit->c_str()); if (scrnr >= 0 && scrnr < ScreenCount(disp))

@@ -358,17 +358,17 @@ if (!vals.empty())

swap(scrtmp, screens); } } - + // init all "screens" for(size_t s = 0; s < screens.size(); s++) initScreen(screens[s]); - + XAllowEvents(disp, ReplayPointer, CurrentTime); if (m_screen_list.empty()) { throw _FB_CONSOLETEXT(Fluxbox, ErrorNoScreens, - "Couldn't find screens to manage.\nMake sure you don't have another window manager running.", + "Couldn't find screens to manage.\nMake sure you don't have another window manager running.", "Error message when no unmanaged screens found - usually means another window manager is running"); }

@@ -388,7 +388,7 @@ m_key->load(StringUtil::expandFilename(*m_rc_keyfile).c_str());

m_resourcemanager.unlock(); ungrab(); - + #ifdef DEBUG if (m_resourcemanager.lockDepth() != 0) cerr<<"--- resource manager lockdepth = "<<m_resourcemanager.lockDepth()<<endl;

@@ -439,7 +439,7 @@ }

int Fluxbox::initScreen(int scrnr) { - + Display* disp = display(); char scrname[128], altscrname[128]; sprintf(scrname, "session.screen%d", scrnr);

@@ -453,7 +453,7 @@ if (! screen->isScreenManaged()) {

delete screen; return 0; } - + // add to our list m_screen_list.push_back(screen);

@@ -595,8 +595,8 @@ _FB_USES_NLS;

// create directory with perm 700 if (mkdir(dirname.c_str(), 0700)) { fprintf(stderr, _FB_CONSOLETEXT(Fluxbox, ErrorCreatingDirectory, - "Can't create %s directory", - "Can't create a directory, one %s for directory name").c_str(), + "Can't create %s directory", + "Can't create a directory, one %s for directory name").c_str(), dirname.c_str()); cerr<<endl; return;

@@ -658,7 +658,7 @@ m_mousescreen = searchScreen(e->xcrossing.root);

} else if (e->type == PropertyNotify) { m_last_time = e->xproperty.time; // check transparency atoms if it's a root pm - + BScreen *screen = searchScreen(e->xproperty.window); if (screen) { FbTk::FbPixmap::rootwinPropertyNotify(screen->screenNumber(), e->xproperty.atom);

@@ -966,7 +966,7 @@

void Fluxbox::handleUnmapNotify(XUnmapEvent &ue) { BScreen *screen = searchScreen(ue.event); - + if (ue.event != ue.window && (!screen || !ue.send_event)) { return; }

@@ -996,7 +996,7 @@ }

} // according to http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.4 - // a XWithdrawWindow is + // a XWithdrawWindow is // 1) unmapping the window (which leads to the upper branch // 2) sends an synthetic unampevent (which is handled below) } else if (screen && ue.send_event) {

@@ -1108,7 +1108,7 @@ // mask the mod of the released key out

// won't mask anything if it isn't a mod unsigned int state = FbTk::KeyUtil::instance().isolateModifierMask(ke.state); state &= ~FbTk::KeyUtil::instance().keycodeToModmask(ke.keycode); - + if ((m_watch_keyrelease & state) == 0) { m_watching_screen->notifyReleasedKeys(ke);

@@ -1217,7 +1217,7 @@ if ((*it).first->update())

(*it).first->updateLayer(win); } } else if ((&(win.dieSig())) == changedsub) { // window death signal - + for (AtomHandlerContainerIt it= m_atomhandler.begin(); it != m_atomhandler.end(); ++it) { if ((*it).first->update())

@@ -1585,7 +1585,7 @@ &value)) {

string values(value.addr); BScreen::WorkspaceNames names; - + StringUtil::removeTrailingWhitespace(values); StringUtil::removeFirstWhitespace(values); StringUtil::stringtok<BScreen::WorkspaceNames>(names, values, ",");

@@ -1703,7 +1703,7 @@ bool Fluxbox::menuTimestampsChanged() const {

std::list<MenuTimestamp *>::const_iterator it = m_menu_timestamps.begin(); std::list<MenuTimestamp *>::const_iterator it_end = m_menu_timestamps.end(); for (; it != it_end; ++it) { - + time_t timestamp = FbTk::FileUtil::getLastStatusChangeTimestamp((*it)->filename.c_str()); if (timestamp >= 0) {

@@ -1743,11 +1743,11 @@ }

void Fluxbox::real_rereadMenu() { - + clearMenuFilenames(); - - for_each(m_screen_list.begin(), - m_screen_list.end(), + + for_each(m_screen_list.begin(), + m_screen_list.end(), mem_fun(&BScreen::rereadMenu)); if(m_show_menu_after_reread) {

@@ -1806,7 +1806,7 @@ m_reconfigure_wait = m_reread_menu_wait = false;

} bool Fluxbox::validateClient(const WinClient *client) const { - WinClientMap::const_iterator it = + WinClientMap::const_iterator it = find_if(m_window_search.begin(), m_window_search.end(), Compose(bind2nd(equal_to<WinClient *>(), client),

@@ -1834,7 +1834,7 @@ }

} void Fluxbox::watchKeyRelease(BScreen &screen, unsigned int mods) { - + if (mods == 0) { cerr<<"WARNING: attempt to grab without modifiers!"<<endl; return;

@@ -1855,3 +1855,22 @@ for (; it != it_end; ++it ) {

(*it).first->updateFrameExtents(win); } } + +unsigned int Fluxbox::getModKey() const { + if (!(m_rc_mod_key->c_str())) + return 0; + else + return FbTk::KeyUtil::instance().getModifier(m_rc_mod_key->c_str()); +} + +void Fluxbox::setModKey(const char* modkeyname) { + + if (!modkeyname) + return; + + unsigned int modkey = FbTk::KeyUtil::instance().getModifier(modkeyname); + + if (modkey > 0) { + m_rc_mod_key = modkeyname; + } +}
M src/fluxbox.hhsrc/fluxbox.hh

@@ -139,7 +139,10 @@ time_t getAutoRaiseDelay() const { return *m_rc_auto_raise_delay; }

unsigned int getCacheLife() const { return *m_rc_cache_life * 60000; } unsigned int getCacheMax() const { return *m_rc_cache_max; } - bool useMod1() const { return *m_rc_use_mod1; } + + + unsigned int getModKey() const; + void setModKey(const char*); void maskWindowEvents(Window w, FluxboxWindow *bw) { m_masked = w; m_masked_window = bw; }

@@ -177,7 +180,7 @@ /// handle any system signal sent to the application

void handleSignal(int signum); void update(FbTk::Subject *changed); /** - * Sends update signal to atomhandlers, + * Sends update signal to atomhandlers, * @param screen the new screen * @param old_screen the old screen if any, can be the same as new screen */

@@ -212,7 +215,7 @@ BScreen *watchingScreen() { return m_watching_screen; }

const XEvent &lastEvent() const { return m_last_event; } AttentionNoticeHandler &attentionHandler() { return m_attention_handler; } - + private: typedef struct MenuTimestamp {

@@ -258,7 +261,7 @@

FbTk::Resource<TabsAttachArea> m_rc_tabs_attach_area; FbTk::Resource<unsigned int> m_rc_cache_life, m_rc_cache_max; FbTk::Resource<time_t> m_rc_auto_raise_delay; - FbTk::Resource<bool> m_rc_use_mod1; /// temporary!, to disable mod1 for resize/move + FbTk::Resource<std::string> m_rc_mod_key; typedef std::map<Window, WinClient *> WinClientMap; WinClientMap m_window_search;