5 #define WIN32_LEAN_AND_MEAN
6 #define _WIN32_WINNT 0x0500
19 /* Internal structures */
29 win_t *win_new(HWND hwnd)
32 GetWindowRect(hwnd, &rect);
33 win_t *win = new0(win_t);
36 win->w = rect.right - rect.left;
37 win->h = rect.bottom - rect.top;
38 win->sys = new0(win_sys_t);
39 win->sys->hwnd = hwnd;
43 /* Conversion functions */
45 {key_mouse1 , VK_LBUTTON },
46 {key_mouse2 , VK_MBUTTON },
47 {key_mouse3 , VK_RBUTTON },
48 {key_left , VK_LEFT },
49 {key_right , VK_RIGHT },
51 {key_down , VK_DOWN },
52 {key_home , VK_HOME },
54 {key_pageup , VK_PRIOR },
55 {key_pagedown, VK_NEXT },
68 {key_shift , VK_SHIFT },
69 {key_shift , VK_LSHIFT },
70 {key_shift , VK_RSHIFT },
71 {key_ctrl , VK_CONTROL },
72 {key_ctrl , VK_LCONTROL},
73 {key_ctrl , VK_RCONTROL},
75 {key_alt , VK_LMENU },
76 {key_alt , VK_RMENU },
83 keymap_t *km = map_get(key2vk,key);
84 return km ? km->vk : toupper(key);
88 keymap_t *km = map_getr(key2vk,vk);
89 return km ? km->key : vk;
96 return (ptr_t){-1, -1, wptr.x, wptr.y};
100 void sys_move(win_t *win, int x, int y, int w, int h)
102 printf("sys_move: %p - %d,%d %dx%d\n", win, x, y, w, h);
103 MoveWindow(win->sys->hwnd, x, y, w, h, TRUE);
106 void sys_raise(win_t *win)
108 printf("sys_raise: %p\n", win);
111 void sys_watch(win_t *win, Key_t key, mod_t mod)
113 printf("sys_watch: %p\n", win);
116 LRESULT CALLBACK KbdProc(int msg, WPARAM wParam, LPARAM lParam)
118 KBDLLHOOKSTRUCT *st = (KBDLLHOOKSTRUCT *)lParam;
119 Key_t key = w2key(st->vkCode);
120 mod_state.up = !!(st->flags & 0x80);
121 if (key == key_alt ) mod_state.alt = !mod_state.up;
122 if (key == key_ctrl ) mod_state.ctrl = !mod_state.up;
123 if (key == key_shift) mod_state.shift = !mod_state.up;
124 if (key == key_win ) mod_state.win = !mod_state.up;
125 printf("KbdProc: %d,%x,%lx - %lx,%lx,%lx - %x,%x\n",
127 st->vkCode, st->scanCode, st->flags,
128 key, mod2int(mod_state));
129 HWND fghwnd = GetForegroundWindow();
130 wm_handle_key(win_new(fghwnd), key, mod_state, getptr());
131 return CallNextHookEx(0, msg, wParam, lParam);
134 LRESULT CALLBACK MllProc(int msg, WPARAM wParam, LPARAM lParam)
136 Key_t key = key_none;
137 HWND fghwnd = GetForegroundWindow();
139 case WM_LBUTTONDOWN: mod_state.up = 0; key = key_mouse1; break;
140 case WM_LBUTTONUP: mod_state.up = 1; key = key_mouse1; break;
141 case WM_RBUTTONDOWN: mod_state.up = 0; key = key_mouse3; break;
142 case WM_RBUTTONUP: mod_state.up = 1; key = key_mouse3; break;
144 if (wParam == WM_MOUSEMOVE)
145 return wm_handle_ptr(win_new(fghwnd), getptr());
146 else if (key != key_none)
147 return wm_handle_key(win_new(fghwnd), key, mod_state, getptr());
149 return CallNextHookEx(0, msg, wParam, lParam);
152 LRESULT CALLBACK ShlWndProc(HWND hwnd, int msg, WPARAM wParam, LPARAM lParam)
154 printf("ShlWndProc: %d, %x, %lx\n", msg, wParam, lParam);
156 case HSHELL_WINDOWCREATED:
157 printf("ShlProc: window created\n");
159 case HSHELL_WINDOWDESTROYED:
160 printf("ShlProc: window destroyed\n");
162 case HSHELL_WINDOWACTIVATED:
163 printf("ShlProc: window activated\n");
166 return DefWindowProc(hwnd, msg, wParam, lParam);
169 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
171 printf("WndProc: %d, %x, %lx\n", msg, wParam, lParam);
178 if (msg == shellhookid) {
179 printf("WndProc: shellhook\n");
180 return ShlWndProc(hwnd, msg, wParam, lParam);
182 return DefWindowProc(hwnd, msg, wParam, lParam);
185 win_t *sys_init(void)
187 HINSTANCE hInst = GetModuleHandle(NULL);
192 wc.cbSize = sizeof(WNDCLASSEX);
193 wc.lpfnWndProc = WndProc;
194 wc.hInstance = hInst;
195 wc.lpszClassName = "awm_class";
196 if (!RegisterClassEx(&wc))
197 printf("sys_init: Error Registering Class - %lu\n", GetLastError());
200 HWND hwnd = CreateWindowEx(0, "awm_class", "awm", 0,
201 0, 0, 0, 0, HWND_MESSAGE, NULL, hInst, NULL);
203 printf("sys_init: Error Creating Window - %lu\n", GetLastError());
205 /* Try Shell Hook Window */
206 HINSTANCE hInstUser32 = GetModuleHandle("USER32.DLL");
207 BOOL (*RegisterShellHookWindow)(HWND hwnd) = (void*)GetProcAddress(hInstUser32, "RegisterShellHookWindow");
208 if (!RegisterShellHookWindow)
209 printf("sys_init: Error Finding RegisterShellHookWindow - %lu\n", GetLastError());
210 if (!RegisterShellHookWindow(hwnd))
211 printf("sys_init: Error Registering ShellHook Window - %lu\n", GetLastError());
212 shellhookid = RegisterWindowMessage("SHELLHOOK");
214 /* Register other hooks for testing */
215 SetWindowsHookEx(WH_MOUSE_LL, MllProc, hInst, 0);
216 SetWindowsHookEx(WH_KEYBOARD_LL, KbdProc, hInst, 0);
217 //SetWindowsHookEx(WH_SHELL, ShlProc, hInst, 0);
219 //if (!RegisterHotKey(hwnd, 123, MOD_CONTROL, VK_LBUTTON))
220 // printf("sys_init: Error Registering Hotkey - %lu\n", GetLastError());
221 if (!RegisterHotKey(NULL, 123, MOD_CONTROL, VK_LBUTTON))
222 printf("sys_init: Error Registering Hotkey - %lu\n", GetLastError());
224 return win_new(hwnd);
228 void sys_run(win_t *root)
231 while (GetMessage(&msg, NULL, 0, 0) > 0) {
232 TranslateMessage(&msg);
233 DispatchMessage(&msg);