-
Notifications
You must be signed in to change notification settings - Fork 33
Extended tag support
gtellalov edited this page Sep 13, 2010
·
1 revision
diff -r 978fd856d4d6 main.c --- a/main.c Thu Apr 08 11:32:36 2010 +0300 +++ b/main.c Tue Jun 22 17:17:51 2010 +0300 @@ -1,4 +1,5 @@ /* + * vim: ts=8 noexpandtab sw=8 : * HashTWM * An automatic Tiling Window Manager for XP/Vista in spirit of dwm * Copyright 2008-2009, Zane Ashby, http://demonastery.org @@ -16,7 +17,7 @@ */ #define NAME "HashTWM" /* Used for Window Name/Class */ -#define VERSION "HashTWM 0.8Beta" /* Used for Version Box - Wait there isn't one, oh well */ +#define VERSION "HashTWM 0.9Beta" /* Used for Version Box - Wait there isn't one, oh well */ //#define REMOTE // Not finished, but half working @@ -30,28 +31,65 @@ #define DEFAULT_MODKEY MOD_CONTROL | MOD_ALT #define MAX_IGNORE 16 /* Allows 16 window classes to be ignored */ +#define DEFAULT_TILING_MODE 0 /* Vertical tiling is the default */ +#define TAGS 9 + +/* Controls */ +enum controls { + KEY_SELECT_UP = 1, + KEY_SELECT_DOWN, + KEY_MOVE_MAIN, + KEY_EXIT, + KEY_MARGIN_LEFT, + KEY_MARGIN_RIGHT, + KEY_IGNORE, + KEY_MOUSE_LOCK, + KEY_TILING_MODE, + KEY_MOVE_UP, + KEY_MOVE_DOWN, + KEY_DISP_CLASS, + KEY_TILE, + KEY_UNTILE, + KEY_INC_AREA, + KEY_DEC_AREA, + KEY_CLOSE_WIN, + KEY_SWITCH_T1=100, + KEY_TOGGLE_T1=200 +}; + +/* Node */ +typedef struct +{ + HWND hwnd; /* Used as key */ + void* prev; + void* next; +} node; /* Tags */ -#define TAG_1 1 -#define TAG_2 2 -#define TAG_3 4 -#define TAG_4 8 -#define TAG_5 16 -unsigned short current_tags = TAG_1; +typedef struct +{ + node* nodes; + node* last_node; + node* current_window; + /* Tiling modes: 0=Vertical, 1=Horizontal, 2=Grid, 3=Fullscreen */ + unsigned short tilingMode; + /* Xmonad style Master area count */ + unsigned short masterarea_count; +} tag; /* Global Variables */ +tag tags[TAGS]; +unsigned short current_tag = 0; int screen_x, screen_y, screen_width, screen_height; unsigned short experimental_mouse = 0; unsigned short mouse_pos_out = 0; int margin = 120; unsigned short disableNext = 0; unsigned short lockMouse = 0; -unsigned short tilingMode = 0; /* 0=Vertical, 1=Horizontal, 2=Grid, 3=Fullscreen */ unsigned short alpha = 255; unsigned short borders = 1; unsigned short ignoreCount = 0; unsigned short ignoreCountBorders = 0; -unsigned short masterarea_count = 1; /* Xmonad style Master area count */ int modkeys = DEFAULT_MODKEY; char ignoreClasses[MAX_IGNORE][128]; /* Don't include these classes in tiling */ char ignoreClassesBorders[MAX_IGNORE][128]; /* Don't remove borders from these classes */ @@ -85,18 +123,6 @@ SendMessage(FindWindow("HashTWM", NULL), WM_COPYDATA, (WPARAM)(HWND)selfhwnd, (LPARAM)(LPVOID)&cds); } #endif - -/* Node */ -typedef struct -{ - HWND hwnd; /* Used as key */ - unsigned short tags; /* Bitmask - Actually not yet, but will become one */ - void* prev; - void* next; -} node; - -node *nodes = NULL; /* Should always point to first node */ -node *current = NULL; /* Should always point to current node */ void RemoveTransparency(HWND hwnd) { @@ -161,62 +187,10 @@ /* List Methods */ -void AddNode(HWND hwnd) +node* FindNode(HWND hwnd, unsigned short tag) { - RemoveBorder(hwnd); - AddTransparency(hwnd); - - node *new = (node*)malloc(sizeof(node)); - new->hwnd = hwnd; - new->tags = current_tags; - new->prev = NULL; - new->next = NULL; - - AddTransparency(hwnd); - - if (nodes == NULL) { - new->prev = new; - nodes = new; - current = nodes; - return; - } - - new->prev = nodes->prev; - nodes->prev = new; - new->next = nodes; - nodes = new; - current = nodes; -} - -void RemoveNode(HWND hwnd) -{ - node *temp = nodes; - for (temp = nodes; temp; temp = temp->next) { - if (temp->hwnd == hwnd) { - if (temp != nodes) { - ((node*)temp->prev)->next = temp->next; - } else { - nodes = temp->next; - } - if (temp->next) { - ((node*)temp->next)->prev = temp->prev; - } else if (nodes) { - nodes->prev = temp->prev; - } - node *temp2 = temp->prev; - RemoveTransparency(temp->hwnd); - AddBorder(temp->hwnd); - free(temp); - temp = temp2; - current = NULL; - return; - } - } -} - -node* FindNode(HWND hwnd) -{ - node *temp = nodes; + node *temp; + node *nodes = tags[tag].nodes; for (temp = nodes; temp; temp = temp->next) { if (temp->hwnd == hwnd) { return temp; @@ -225,19 +199,110 @@ return NULL; } +node* FullFindNode(HWND hwnd) +{ + unsigned short tag; + node *found; + for (tag=0; tag<TAGS; tag++) { + found = FindNode(hwnd, tag); + if (found) return found; + } + return NULL; +} + +void AddNode(HWND hwnd, unsigned short tag) +{ + RemoveBorder(hwnd); + AddTransparency(hwnd); + + if (FindNode(hwnd, tag)) return; + + node *new = (node*)malloc(sizeof(node)); + new->hwnd = hwnd; + new->prev = NULL; + new->next = NULL; + + AddTransparency(hwnd); + + if (tags[tag].nodes == NULL) { + new->prev = new; + tags[tag].nodes = new; + tags[tag].current_window = new; + tags[tag].last_node = new; + } else { + tags[tag].last_node->next = new; + new->prev = tags[tag].last_node; + tags[tag].last_node = new; + tags[tag].nodes->prev = new; + } +} + +void RemoveNode(HWND hwnd, unsigned short tag) +{ + node *temp; + temp = FindNode(hwnd, tag); + if (!temp) return; + // Remove the only node + if (tags[tag].nodes == tags[tag].last_node) { + tags[tag].nodes = NULL; + tags[tag].last_node = NULL; + tags[tag].current_window = NULL; + // Remove the first node + } else if (temp == tags[tag].nodes) { + tags[tag].nodes = temp->next; + tags[tag].nodes->prev = tags[tag].last_node; + // Remove the last node + } else if (temp == tags[tag].last_node) { + tags[tag].last_node = temp->prev; + tags[tag].nodes->prev = temp->prev; + tags[tag].last_node->next = NULL; + // Remove any other node + } else { + ((node*)temp->prev)->next = temp->next; + ((node*)temp->next)->prev = temp->prev; + } + if (tags[tag].current_window == temp) + tags[tag].current_window = temp->prev; + RemoveTransparency(temp->hwnd); + if (!FullFindNode(hwnd)) + AddBorder(temp->hwnd); + free(temp); + return; +} + +void FullRemoveNode(HWND hwnd) +{ + unsigned short tag; + for (tag=0; tag<TAGS; tag++) + RemoveNode(hwnd, tag); +} + +void ToggleTag(unsigned short tag) { + HWND hwnd = GetForegroundWindow(); + + if (FindNode(hwnd, tag)) + RemoveNode(hwnd, tag); + else + AddNode(hwnd, tag); +} + void SwapWindowWithNode(node *window) { - if (current && window) { + + if (tags[current_tag].current_window == window) return; + if (tags[current_tag].current_window && window) { AddTransparency(window->hwnd); HWND temp = window->hwnd; - window->hwnd = current->hwnd; - current->hwnd = temp; - current = window; + window->hwnd = tags[current_tag].current_window->hwnd; + tags[current_tag].current_window->hwnd = temp; + tags[current_tag].current_window = window; } } void FocusCurrent() { + node *current = tags[current_tag].current_window; + if (current) { SetForegroundWindow(current->hwnd); if (lockMouse) { @@ -250,30 +315,12 @@ } } -node* GetFirstNode() -{ - node *temp, *first = nodes; - for (temp = nodes; temp; temp = temp->next) - { - if (temp->tags == current_tags) { - return temp; - } - if (temp == first) return current; - } -} - /* * Returns the previous Node with the same tag as current */ node* GetPreviousNode() { - node *temp, *first = current; - for (temp = current->prev; temp; temp = temp->prev) { - if (temp->tags == current_tags) { - return temp; - } - if (temp == first) return temp; - } + return tags[current_tag].current_window->prev; } /* @@ -281,14 +328,12 @@ */ node* GetNextNode() { - node *temp, *first = current; - for (temp = current; temp;) { - if (temp->next) { temp = temp->next; } else { temp = nodes; } - if (temp->tags == current_tags) { - return temp; - } - if (temp == first) return temp; - } + tag *thistag = &tags[current_tag]; + + if (thistag->current_window && thistag->current_window->next) + return thistag->current_window->next; + else + return thistag->nodes; } /* @@ -296,13 +341,23 @@ */ int CountNodes() { - node *temp = nodes; + node *temp; + node *nodes = tags[current_tag].nodes; int i = 0; for (temp = nodes; temp; temp = temp->next) { - if (temp->tags == current_tags) - i++; + i++; } return i - 1; +} + +/* + * Minimizes all the windows with the specified tag + */ +void MinimizeTag(unsigned short tag) +{ + node *temp; + for (temp=tags[tag].nodes; temp; temp = temp->next) + ShowWindow(temp->hwnd, SW_MINIMIZE); } /* @@ -311,132 +366,127 @@ void ArrangeWindows() { int a, i, x, y, width, height; + unsigned short masterarea_count; a = CountNodes(); if (a == -1) return; i = 0; - node *temp = nodes; -// for (temp = nodes; i <= a; temp = temp->next, i++) { + node *nodes; + node *temp; + nodes = tags[current_tag].nodes; + masterarea_count = tags[current_tag].masterarea_count; for (temp = nodes; temp; temp = temp->next) { - if (temp->tags == current_tags) { - ShowWindow(temp->hwnd, SW_RESTORE); - if (a == 0) { /* I think this is universal to all tiling modes */ - x = 0; - y = 0; - width = screen_width; - height = screen_height; - } else { - switch (tilingMode) - { - default: - case 0: /* Vertical */ - { - if (i < masterarea_count) { - x = 0; - y = (screen_height / masterarea_count) * i; - width = (screen_width / 2) + margin; - height = (screen_height / masterarea_count); - } else { - x = (screen_width / 2) + margin; - y = (screen_height / ((a + 1) - masterarea_count)) * (a - i); - width = (screen_width / 2) - margin; - height = (screen_height / ((a + 1) - masterarea_count)); + ShowWindow(temp->hwnd, SW_RESTORE); + if (a == 0) { /* I think this is universal to all tiling modes */ + x = 0; + y = 0; + width = screen_width; + height = screen_height; + } else { + switch (tags[current_tag].tilingMode) + { + default: + case 0: /* Vertical */ + { + if (i < masterarea_count) { + x = 0; + y = (screen_height / masterarea_count) * i; + width = (screen_width / 2) + margin; + height = (screen_height / masterarea_count); + } else { + x = (screen_width / 2) + margin; + y = (screen_height / ((a + 1) - masterarea_count)) * (a - i); + width = (screen_width / 2) - margin; + height = (screen_height / ((a + 1) - masterarea_count)); + } + } + break; + case 1: /* Horizontal */ + { + if (i < masterarea_count) { + /* Main window */ + x = (screen_width / masterarea_count) * i; + y = 0; + width = (screen_width / masterarea_count); + height = (screen_height / 2) + margin; + } else { + /* Normal windows to be tiled */ + x = (screen_width / ((a + 1) - masterarea_count)) * (a - i); + y = (screen_height / 2) + margin; + width = (screen_width / ((a + 1) - masterarea_count)); + height = (screen_height / 2) - margin; + } + } + break; + case 2: /* Grid - See dvtm-license.txt */ + { + int ah, aw, rows, cols; + for (cols = 0; cols <= (a + 1)/2; cols++) { + if (cols * cols >= (a + 1)) { + break; } } - break; - case 1: /* Horizontal */ - { - if (i < masterarea_count) { - /* Main window */ - x = (screen_width / masterarea_count) * i; - y = 0; - width = (screen_width / masterarea_count); - height = (screen_height / 2) + margin; - } else { - /* Normal windows to be tiled */ - x = (screen_width / ((a + 1) - masterarea_count)) * (a - i); - y = (screen_height / 2) + margin; - width = (screen_width / ((a + 1) - masterarea_count)); - height = (screen_height / 2) - margin; - } + rows = (cols && (cols - 1) * cols >= (a + 1)) ? cols - 1 : cols; + height = screen_height / (rows ? rows : 1); + width = screen_width / (cols ? cols : 1); + if (rows > 1 && i == (rows * cols) - cols && ((a + 1) - i) <= ((a + 1) % cols)) { + width = screen_width / ((a + 1) - i); } - break; - case 2: /* Grid - See dvtm-license.txt */ - { - int ah, aw, rows, cols; - for (cols = 0; cols <= (a + 1)/2; cols++) { - if (cols * cols >= (a + 1)) { - break; - } - } - rows = (cols && (cols - 1) * cols >= (a + 1)) ? cols - 1 : cols; - height = screen_height / (rows ? rows : 1); - width = screen_width / (cols ? cols : 1); - if (rows > 1 && i == (rows * cols) - cols && ((a + 1) - i) <= ((a + 1) % cols)) { - width = screen_width / ((a + 1) - i); - } - x = (i % cols) * width; - y = (i / cols) * height; - ah = (i >= cols * (rows - 1)) ? screen_height - height * rows: 0; - if (rows > 1 && i == (a + 1) - 1 && ((a + 1) - i) < ((a + 1) % cols)) { - aw = screen_width - width * ((a + 1) % cols); - } else { - aw = ((i + 1) % cols == 0) ? screen_width - width * cols : 0; - } - width += aw; - height += ah; + x = (i % cols) * width; + y = (i / cols) * height; + ah = (i >= cols * (rows - 1)) ? screen_height - height * rows: 0; + if (rows > 1 && i == (a + 1) - 1 && ((a + 1) - i) < ((a + 1) % cols)) { + aw = screen_width - width * ((a + 1) % cols); + } else { + aw = ((i + 1) % cols == 0) ? screen_width - width * cols : 0; } - break; - case 3: /* Fullscreen - This could probably be changed to work better */ - x = 0; - y = 0; - width = screen_width; - height = screen_height; - break; - } + width += aw; + height += ah; + } + break; + case 3: /* Fullscreen - This could probably be changed to work better */ + x = 0; + y = 0; + width = screen_width; + height = screen_height; + break; } - SetWindowPos(temp->hwnd, HWND_TOP, x + screen_x, y + screen_y, width, height, SWP_SHOWWINDOW); - i++; - } else { - ShowWindow(temp->hwnd, SW_MINIMIZE); } + SetWindowPos(temp->hwnd, HWND_TOP, x + screen_x, y + screen_y, width, height, SWP_SHOWWINDOW); + i++; } FocusCurrent(); } void RegisterHotkeys(HWND hwnd) { - RegisterHotKey(hwnd, 1, modkeys, 'K'); /* Select Up */ - RegisterHotKey(hwnd, 2, modkeys, 'J'); /* Select Down */ - RegisterHotKey(hwnd, 3, modkeys, VK_RETURN); /* Move Window in to Main Area */ - RegisterHotKey(hwnd, 4, modkeys, VK_ESCAPE); /* Exit */ - RegisterHotKey(hwnd, 5, modkeys, 'H'); /* Margin Left */ - RegisterHotKey(hwnd, 6, modkeys, 'L'); /* Margin Right */ - RegisterHotKey(hwnd, 7, modkeys, 'I'); /* Ignore Mode */ - RegisterHotKey(hwnd, 8, modkeys, 'U'); /* Mouse Lock Mode */ - RegisterHotKey(hwnd, 9, modkeys, VK_SPACE); /* Switch Tiling Mode */ - RegisterHotKey(hwnd, 10, modkeys | MOD_SHIFT, 'K'); /* Move Window Up */ - RegisterHotKey(hwnd, 11, modkeys | MOD_SHIFT, 'J'); /* Move Window Down */ - RegisterHotKey(hwnd, 12, modkeys, 'Y'); /* Display Window Class */ - RegisterHotKey(hwnd, 13, modkeys, 'O'); /* Tile Window */ - RegisterHotKey(hwnd, 14, modkeys, 'P'); /* Untile Window */ - RegisterHotKey(hwnd, 15, modkeys, 'Z'); /* Increase Master Area */ - RegisterHotKey(hwnd, 16, modkeys, 'X'); /* Decrease Master Area */ - RegisterHotKey(hwnd, 17, modkeys, 'C'); /* Close Foreground Window */ + RegisterHotKey(hwnd, KEY_SELECT_UP, modkeys, 'K'); /* Select Up */ + RegisterHotKey(hwnd, KEY_SELECT_DOWN, modkeys, 'J'); /* Select Down */ + RegisterHotKey(hwnd, KEY_MOVE_MAIN, modkeys, VK_RETURN); /* Move Window in to Main Area */ + RegisterHotKey(hwnd, KEY_EXIT, modkeys, VK_ESCAPE); /* Exit */ + RegisterHotKey(hwnd, KEY_MARGIN_LEFT, modkeys, 'H'); /* Margin Left */ + RegisterHotKey(hwnd, KEY_MARGIN_RIGHT, modkeys, 'L'); /* Margin Right */ + RegisterHotKey(hwnd, KEY_IGNORE, modkeys, 'I'); /* Ignore Mode */ + RegisterHotKey(hwnd, KEY_MOUSE_LOCK, modkeys, 'U'); /* Mouse Lock Mode */ + RegisterHotKey(hwnd, KEY_TILING_MODE, modkeys, VK_SPACE); /* Switch Tiling Mode */ + RegisterHotKey(hwnd, KEY_MOVE_UP, modkeys | MOD_SHIFT, 'K'); /* Move Window Up */ + RegisterHotKey(hwnd, KEY_MOVE_DOWN, modkeys | MOD_SHIFT, 'J'); /* Move Window Down */ + RegisterHotKey(hwnd, KEY_DISP_CLASS, modkeys, 'Y'); /* Display Window Class */ + RegisterHotKey(hwnd, KEY_TILE, modkeys, 'O'); /* Tile Window */ + RegisterHotKey(hwnd, KEY_UNTILE, modkeys, 'P'); /* Untile Window */ + RegisterHotKey(hwnd, KEY_INC_AREA, modkeys, 'Z'); /* Increase Master Area */ + RegisterHotKey(hwnd, KEY_DEC_AREA, modkeys, 'X'); /* Decrease Master Area */ + RegisterHotKey(hwnd, KEY_CLOSE_WIN, modkeys, 'C'); /* Close Foreground Window */ // Tags - RegisterHotKey(hwnd, 18, modkeys, '1'); /* Switch to tag 1 */ - RegisterHotKey(hwnd, 19, modkeys, '2'); /* Switch to tag 2 */ - RegisterHotKey(hwnd, 20, modkeys, '3'); /* Switch to tag 3 */ - RegisterHotKey(hwnd, 21, modkeys, '4'); /* Switch to tag 4 */ - RegisterHotKey(hwnd, 22, modkeys, '5'); /* Switch to tag 5 */ - - RegisterHotKey(hwnd, 23, modkeys | MOD_SHIFT, '1'); /* Move to tag 1 */ - RegisterHotKey(hwnd, 24, modkeys | MOD_SHIFT, '2'); /* Move to tag 2 */ - RegisterHotKey(hwnd, 25, modkeys | MOD_SHIFT, '3'); /* Move to tag 3 */ - RegisterHotKey(hwnd, 26, modkeys | MOD_SHIFT, '4'); /* Move to tag 4 */ - RegisterHotKey(hwnd, 27, modkeys | MOD_SHIFT, '5'); /* Move to tag 5 */ + char key[2]; + int i; + for (i=0; i<TAGS; i++) { + sprintf(key, "%d", i+1); + RegisterHotKey(hwnd, KEY_SWITCH_T1+i, modkeys, *key); /* Switch to tag N */ + RegisterHotKey(hwnd, KEY_TOGGLE_T1+i, modkeys | MOD_SHIFT, *key); /* Toggle tag N */ + } } void UnregisterHotkeys(HWND hwnd) @@ -465,6 +515,10 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { + node *current; + node *nodes; + unsigned short tag; + switch (msg) { case WM_CREATE: @@ -483,16 +537,19 @@ if (experimental_mouse) { KillTimer(hwnd, 2); /* Mouse Poll Timer */ } - for (current = nodes; current;) { /* Add window borders, reset opacity and remove */ - node *temp = NULL; - ShowWindow(current->hwnd, SW_RESTORE); - AddBorder(current->hwnd); - RemoveTransparency(current->hwnd); - temp = current->next; - free(current); - current = temp; + for (tag=0; tag<TAGS; tag++) { + nodes = tags[tag].nodes; + for (current = nodes; current;) { /* Add window borders, reset opacity and remove */ + node *temp = NULL; + ShowWindow(current->hwnd, SW_RESTORE); + AddBorder(current->hwnd); + RemoveTransparency(current->hwnd); + temp = current->next; + free(current); + current = temp; + } + DestroyWindow(hwnd); } - DestroyWindow(hwnd); } break; case WM_DESTROY: @@ -523,45 +580,55 @@ #ifdef REMOTE SendRemoteQuery(hwnd, wParam, 0); #endif + if (wParam >= KEY_TOGGLE_T1 && wParam < (KEY_TOGGLE_T1 + TAGS)) { + ToggleTag(wParam - KEY_TOGGLE_T1); + break; + } else if (wParam >= KEY_SWITCH_T1 && wParam < (KEY_SWITCH_T1 + TAGS)) { + MinimizeTag(current_tag); + current_tag = wParam - KEY_SWITCH_T1; + ArrangeWindows(); + break; + } + current = tags[current_tag].current_window; switch (wParam) { - case 1: /* Select Up */ + case KEY_SELECT_UP: /* Select Up */ if (current) { AddTransparency(current->hwnd); - current = GetNextNode(); + tags[current_tag].current_window = GetNextNode(); FocusCurrent(); } break; - case 2: /* Select Down */ + case KEY_SELECT_DOWN: /* Select Down */ if (current) { AddTransparency(current->hwnd); - current = GetPreviousNode(); + tags[current_tag].current_window = GetPreviousNode(); FocusCurrent(); } break; - case 3: /* Move Window in to Main Area */ - SwapWindowWithNode(GetFirstNode()); + case KEY_MOVE_MAIN: /* Move Window in to Main Area */ + SwapWindowWithNode(tags[current_tag].nodes); ArrangeWindows(); break; - case 4: /* Exit */ + case KEY_EXIT: /* Exit */ PostMessage(hwnd, WM_CLOSE, 0, 0); break; - case 5: /* Margin Left */ + case KEY_MARGIN_LEFT: /* Margin Left */ margin -= 20; ArrangeWindows(); break; - case 6: /* Margin Right */ + case KEY_MARGIN_RIGHT: /* Margin Right */ margin += 20; ArrangeWindows(); break; - case 7: /* Ignore Mode */ + case KEY_IGNORE: /* Ignore Mode */ if (!disableNext) { disableNext = 1; } else { disableNext = 0; } break; - case 8: /* Mouse Lock Mode */ + case KEY_MOUSE_LOCK: /* Mouse Lock Mode */ if (lockMouse) { lockMouse = 0; ClipCursor(0); @@ -570,26 +637,23 @@ FocusCurrent(); } break; - case 9: /* Switch Tiling Mode */ - tilingMode++; - if (tilingMode > 3) { - tilingMode = 0; - } + case KEY_TILING_MODE: /* Switch Tiling Mode */ + tags[current_tag].tilingMode = (tags[current_tag].tilingMode + 1) % 3; ArrangeWindows(); break; - case 10: /* Move Window Up */ + case KEY_MOVE_UP: /* Move Window Up */ if (current) { SwapWindowWithNode(GetNextNode()); ArrangeWindows(); } break; - case 11: /* Move Window Down */ + case KEY_MOVE_DOWN: /* Move Window Down */ if (current) { SwapWindowWithNode(GetPreviousNode()); ArrangeWindows(); } break; - case 12: /* Display Window Class */ + case KEY_DISP_CLASS: /* Display Window Class */ { LPSTR temp = (LPSTR)malloc(sizeof(TCHAR) * 128); GetClassName(GetForegroundWindow(), temp, 128); @@ -597,66 +661,26 @@ free(temp); } break; - case 13: /* Tile Window */ + case KEY_TILE: /* Tile Window */ if (IsGoodWindow(GetForegroundWindow())) { - AddNode(GetForegroundWindow()); + AddNode(GetForegroundWindow(), current_tag); ArrangeWindows(); } break; - case 14: /* Untile Window */ - RemoveNode(GetForegroundWindow()); + case KEY_UNTILE: /* Untile Window */ + FullRemoveNode(GetForegroundWindow()); ArrangeWindows(); break; - case 15: /* Increase Master Area */ - masterarea_count++; + case KEY_INC_AREA: /* Increase Master Area */ + tags[current_tag].masterarea_count++; ArrangeWindows(); break; - case 16: /* Decrease Master Area */ - masterarea_count--; + case KEY_DEC_AREA: /* Decrease Master Area */ + tags[current_tag].masterarea_count--; ArrangeWindows(); break; - case 17: /* Close Foreground Window */ + case KEY_CLOSE_WIN: /* Close Foreground Window */ PostMessage(GetForegroundWindow(), WM_CLOSE, 0, 0); - break; - case 18: /* Switch to tag 1 */ - current_tags = TAG_1; - ArrangeWindows(); - break; - case 19: /* Switch to tag 2 */ - current_tags = TAG_2; - ArrangeWindows(); - break; - case 20: /* Switch to tag 3 */ - current_tags = TAG_3; - ArrangeWindows(); - break; - case 21: /* Switch to tag 4 */ - current_tags = TAG_4; - ArrangeWindows(); - break; - case 22: /* Switch to tag 5 */ - current_tags = TAG_5; - ArrangeWindows(); - break; - case 23: /* Move to tag 1 */ - current->tags = TAG_1; - ArrangeWindows(); - break; - case 24: /* Move to tag 2 */ - current->tags = TAG_2; - ArrangeWindows(); - break; - case 25: /* Move to tag 3 */ - current->tags = TAG_3; - ArrangeWindows(); - break; - case 26: /* Move to tag 4 */ - current->tags = TAG_4; - ArrangeWindows(); - break; - case 27: /* Move to tag 5 */ - current->tags = TAG_5; - ArrangeWindows(); break; } break; @@ -677,19 +701,19 @@ { case HSHELL_WINDOWCREATED: if (IsGoodWindow((HWND)lParam)) { - AddNode((HWND)lParam); + AddNode((HWND)lParam, current_tag); ArrangeWindows(); FocusCurrent(); } break; case HSHELL_WINDOWDESTROYED: - RemoveNode((HWND)lParam); + FullRemoveNode((HWND)lParam); ArrangeWindows(); FocusCurrent(); break; case HSHELL_WINDOWACTIVATED: { - node *found = FindNode((HWND)lParam); + node *found = FindNode((HWND)lParam, current_tag); if (found) { if (current) { AddTransparency(current->hwnd); @@ -714,7 +738,7 @@ */ BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { - if (IsGoodWindow(hwnd)) { AddNode(hwnd); } + if (IsGoodWindow(hwnd)) { AddNode(hwnd, current_tag); } return TRUE; } @@ -734,6 +758,7 @@ LPWSTR *argv = NULL; int argc; int i; + unsigned short tilingMode; argv = CommandLineToArgvW(GetCommandLineW(), &argc); for (i = 0; i < argc; i++) { @@ -797,6 +822,15 @@ } } + /* Initialize tags */ + for (i=0; i<TAGS; i++) { + tags[i].nodes = NULL; + tags[i].last_node = NULL; + tags[i].current_window = NULL; + tags[i].tilingMode = DEFAULT_TILING_MODE; + tags[i].masterarea_count = 1; + } + LocalFree(argv); winClass.cbSize = sizeof(WNDCLASSEX);