/* 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)
[st_icon ] {"icon" , SW_MINIMIZE},
[st_hide ] {"hide" , SW_HIDE },
};
+ if (win->state != state && win->state == st_shade)
+ SetWindowRgn(win->sys->hwnd, NULL, TRUE);
win->state = 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);
}
void sys_watch(win_t *win, Key_t key, mod_t mod)