diff -urN fluxbox-0.1.5/src/BaseDisplay.cc fluxbox-0.1.5-tc/src/BaseDisplay.cc --- fluxbox-0.1.5/src/BaseDisplay.cc Mon Dec 3 08:05:10 2001 +++ fluxbox-0.1.5-tc/src/BaseDisplay.cc Wed Dec 26 11:43:42 2001 @@ -337,6 +337,8 @@ XInternAtom(display, "_BLACKBOX_CHANGE_WINDOW_FOCUS", False); blackbox_cycle_window_focus = XInternAtom(display, "_BLACKBOX_CYCLE_WINDOW_FOCUS", False); + blackbox_direction_window_focus = + XInternAtom(display, "_BLACKBOX_DIRECTION_WINDOW_FOCUS", False); #ifdef NEWWMSPEC diff -urN fluxbox-0.1.5/src/BaseDisplay.hh fluxbox-0.1.5-tc/src/BaseDisplay.hh --- fluxbox-0.1.5/src/BaseDisplay.hh Sat Dec 8 20:20:10 2001 +++ fluxbox-0.1.5-tc/src/BaseDisplay.hh Wed Dec 26 11:44:54 2001 @@ -147,6 +147,8 @@ { return blackbox_change_window_focus; } inline const Atom &getFluxboxCycleWindowFocusAtom(void) const { return blackbox_cycle_window_focus; } + inline const Atom &getFluxboxDirectionWindowFocusAtom(void) const + { return blackbox_direction_window_focus; } #ifdef NEWWMSPEC @@ -282,7 +284,7 @@ // message_types for client -> wm messages Atom blackbox_change_workspace, blackbox_change_window_focus, - blackbox_cycle_window_focus; + blackbox_cycle_window_focus, blackbox_direction_window_focus; #ifdef NEWWMSPEC diff -urN fluxbox-0.1.5/src/Keys.cc fluxbox-0.1.5-tc/src/Keys.cc --- fluxbox-0.1.5/src/Keys.cc Sun Dec 9 08:12:08 2001 +++ fluxbox-0.1.5-tc/src/Keys.cc Wed Dec 26 12:09:30 2001 @@ -95,6 +95,12 @@ {"KillWindow", grabKillWindow}, {"NextWindow", grabNextWindow}, {"PrevWindow", grabPrevWindow}, + /* TCMOD */ + {"LeftWindow", grabLeftWindow}, + {"RightWindow", grabRightWindow}, + {"UpWindow", grabUpWindow}, + {"DownWindow", grabDownWindow}, + /* end TCMOD */ {"NextTab", grabNextTab}, {"PrevTab", grabPrevTab}, {"ShadeWindow", grabShade}, diff -urN fluxbox-0.1.5/src/Keys.hh fluxbox-0.1.5-tc/src/Keys.hh --- fluxbox-0.1.5/src/Keys.hh Sun Dec 9 08:01:18 2001 +++ fluxbox-0.1.5-tc/src/Keys.hh Wed Dec 26 12:10:32 2001 @@ -38,6 +38,9 @@ grabWorkspace11, grabWorkspace12, grabNextWorkspace, grabPrevWorkspace, grabLeftWorkspace, grabRightWorkspace, grabKillWindow, grabNextWindow, grabPrevWindow, + /* TCMOD */ + grabLeftWindow, grabRightWindow, grabUpWindow, grabDownWindow, + /* TCMOD end */ grabNextTab, grabPrevTab, grabShade, grabMaximize, grabStick, grabExecute, grabVertMax, grabHorizMax, grabNudgeRight, grabNudgeLeft,grabNudgeUp, diff -urN fluxbox-0.1.5/src/Screen.cc fluxbox-0.1.5-tc/src/Screen.cc --- fluxbox-0.1.5/src/Screen.cc Sat Dec 8 22:07:25 2001 +++ fluxbox-0.1.5-tc/src/Screen.cc Wed Dec 26 11:47:32 2001 @@ -49,6 +49,8 @@ #include "Workspace.hh" #include "Workspacemenu.hh" +#include "dirSort.hh" + #ifdef STDC_HEADERS # include # include @@ -837,8 +839,7 @@ void BScreen::addWorkspaceName(char *name) { - workspaceNames->insert(bstrdup(name)); - + /* TCMOD workspaceNames->insert(bstrdup(name)); */ } @@ -1674,4 +1675,83 @@ changeWorkspaceID(getCount()-1); else changeWorkspaceID(getCurrentWorkspaceID()-1); +} + +void BScreen::directionFocus(unsigned long int dir) { + int map[8] = {0,1,1,0,0,0,1,1}; + + Bool have_focused = False; + int cur = -1, numwins = -1, newwin = -1; + int i, j, elem; + int offsetx, offsety; + FluxboxWindow *check; + + numwins = getCurrentWorkspace()->getCount(); + if (fluxbox->getFocusedWindow() && fluxbox->getFocusedWindow()->getScreen()->getScreenNumber() == getScreenNumber()) + cur = fluxbox->getFocusedWindow()->getWindowNumber(); + else if (numwins > 0) { + check = getCurrentWorkspace()->getWindow(0); + if (check->setInputFocus()) + getCurrentWorkspace()->raiseWindow(check); + } + + if (numwins > 1 && cur > -1) { + dirsortElem wins[numwins], tempWin; + + for (i = 0; i < numwins; i++) { + check = getCurrentWorkspace()->getWindow(i); + wins[i].w = check->getWidth(); + wins[i].h = check->getHeight(); + wins[i].x = check->getXFrame() + wins[i].w * map[dir]; + wins[i].y = check->getYFrame() + wins[i].h * map[dir+4]; + wins[i].i = i; + + for (j = 0; j < dir; j++) { + elem = wins[i].x; + wins[i].x = wins[i].y; + wins[i].y = elem * -1; + elem = wins[i].w; + wins[i].w = wins[i].h; + wins[i].h = elem; + } + + wins[i].centre = wins[i].y + wins[i].h/2; + } + + for (i = 0; i < numwins; i++) { + offsetx = (int)(wins[i].x - wins[cur].x); + if (offsetx < 1) + offsetx += getBaseDisplay()->getScreenInfo(0)->getWidth() * 2; + + if (wins[cur].centre > wins[i].y + wins[i].h) + offsety = wins[cur].centre - (wins[i].y + wins[i].h); + else if (wins[cur].centre < wins[i].y) + offsety = wins[i].y - wins[cur].centre; + else + offsety = 0; + + if (offsety < 0) + offsety *= -1; + else if (offsety > 100) + offsety = 75 + offsety / 4; + + wins[i].score = (offsety * (1000-fabs(wins[cur].h/2))) / offsetx + offsetx; + } + + for (i = 1; i < numwins; i++) { + tempWin = wins[i]; + for (j = i-1; j >= 0 && wins[j].score > tempWin.score; j--) { + wins[j+1] = wins[j]; + } + wins[j+1] = tempWin; + } + + for (i = 0; i < numwins; i++) { + check = getCurrentWorkspace()->getWindow(wins[i].i); + if (check->setInputFocus() && wins[i].i != cur) { + getCurrentWorkspace()->raiseWindow(check); + break; + } + } + } } diff -urN fluxbox-0.1.5/src/Screen.hh fluxbox-0.1.5-tc/src/Screen.hh --- fluxbox-0.1.5/src/Screen.hh Sun Dec 9 06:24:30 2001 +++ fluxbox-0.1.5-tc/src/Screen.hh Wed Dec 26 11:47:50 2001 @@ -237,6 +237,7 @@ void reassociateWindow(FluxboxWindow *, int, Bool); void prevFocus(void); void nextFocus(void); + void directionFocus(unsigned long int); void raiseFocus(void); void reconfigure(void); void rereadMenu(void); diff -urN fluxbox-0.1.5/src/dirSort.hh fluxbox-0.1.5-tc/src/dirSort.hh --- fluxbox-0.1.5/src/dirSort.hh Thu Jan 1 09:00:00 1970 +++ fluxbox-0.1.5-tc/src/dirSort.hh Wed Dec 26 11:54:09 2001 @@ -0,0 +1,9 @@ +typedef struct dirsortElem { + float score; + int centre; + int x; + int y; + int w; + int h; + int i; +} dirsortElem; diff -urN fluxbox-0.1.5/src/fluxbox.cc fluxbox-0.1.5-tc/src/fluxbox.cc --- fluxbox-0.1.5/src/fluxbox.cc Sun Dec 9 08:08:26 2001 +++ fluxbox-0.1.5-tc/src/fluxbox.cc Wed Dec 26 12:08:20 2001 @@ -864,6 +864,25 @@ case Keys::grabPrevWindow: //activate prev window screen->prevFocus(); break; + + /* TCMOD */ + case Keys::grabLeftWindow: + screen->directionFocus(2); + break; + + case Keys::grabRightWindow: + screen->directionFocus(0); + break; + + case Keys::grabUpWindow: + screen->directionFocus(3); + break; + + case Keys::grabDownWindow: + screen->directionFocus(1); + break; + /* TCMOD end */ + case Keys::grabNextTab: if (focused_window && focused_window->getTab()) { Tab *tab = focused_window->getTab(); @@ -891,7 +910,7 @@ sprintf(displaystring, "DISPLAY=%s", DisplayString(getXDisplay())); sprintf(displaystring + strlen(displaystring) - 1, "%d", - screen->getScreenNumber()); + screen->getScreenNumber()); #ifdef DEBUG cerr<<__FILE__<<"("<<__LINE__<<"): Executing:"<getExecCommand().c_str()<