#include <search.h>
#define WIN32_LEAN_AND_MEAN
-#define _WIN32_WINNT 0x0500
+#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <winbase.h>
#include <winuser.h>
/* Configuration */
static int NO_CAPTURE = 0;
+static int STACK = 25;
/* Internal structures */
struct win_sys {
HWND hwnd = (HWND)wParam;
win_t *win = NULL;
switch (msg) {
- case HSHELL_WINDOWCREATED:
case HSHELL_REDRAW:
+ case HSHELL_WINDOWCREATED:
printf("ShlProc: %p - %s\n", hwnd, msg == HSHELL_REDRAW ?
"redraw" : "window created");
if (!(win = win_find(hwnd,0)))
if ((win = win_find(hwnd,1)))
wm_insert(win);
return 1;
+ case HSHELL_WINDOWREPLACED:
case HSHELL_WINDOWDESTROYED:
- printf("ShlProc: %p - window destroyed\n", hwnd);
+ printf("ShlProc: %p - %s\n", hwnd, msg == HSHELL_WINDOWREPLACED ?
+ "window replaced" : "window destroyed");
if ((win = win_find(hwnd,0)) &&
- win->state == st_show) {
+ (win->state == st_show ||
+ win->state == st_shade)) {
wm_remove(win);
win_remove(win);
}
return 1;
case HSHELL_WINDOWACTIVATED:
printf("ShlProc: %p - window activated\n", hwnd);
+ // Fake button-click
+ if ((win = win_find(hwnd,0)))
+ wm_handle_key(win, key_mouse1, MOD(), getptr());
return 0;
default:
printf("ShlProc: %p - unknown msg, %d\n", hwnd, msg);
/* Windows prevents a thread from using SetForegroundInput under
* certain circumstances and instead flashes the windows toolbar icon.
* Attaching the thread input queues avoids this behavior */
- DWORD oldId = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
+ HWND fgWin = GetForegroundWindow();
+ if (fgWin == win->sys->hwnd)
+ return; // already focused
+ DWORD oldId = GetWindowThreadProcessId(fgWin, NULL);
DWORD newId = GetCurrentThreadId();
- AttachThreadInput(oldId, newId, TRUE);
+ if (oldId != newId)
+ AttachThreadInput(oldId, newId, TRUE);
HWND next = GetWindow(win->sys->hwnd, GW_HWNDNEXT);
SetWindowPos(win->sys->hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
if (next)
SetWindowPos(win->sys->hwnd, next, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
- AttachThreadInput(oldId, newId, FALSE);
+ if (oldId != newId)
+ AttachThreadInput(oldId, newId, FALSE);
}
void sys_show(win_t *win, state_t state)
printf("sys_show: %s\n", map[state].str);
ShowWindow(win->sys->hwnd, map[state].cmd);
if (state == st_shade)
- SetWindowRgn(win->sys->hwnd, CreateRectRgn(0,0,win->w,25), TRUE);
+ SetWindowRgn(win->sys->hwnd, CreateRectRgn(0,0,win->w,STACK), TRUE);
}
void sys_watch(win_t *win, Key_t key, mod_t mod)
/* Load configuration */
NO_CAPTURE = conf_get_int("main.no-capture", NO_CAPTURE);
+ STACK = conf_get_int("main.stack", STACK);
/* Setup window class */
WNDCLASSEX wc = {