- //POINT wptr;
- //GetCursorPos(&wptr);
- //HWND old = GetForegroundWindow();
- //HWND newc = WindowFromPoint(wptr);
- //HWND new = GetAncestor(newc,GA_ROOT);
- //SetWindowPos(new, HWND_NOTOPMOST, 0, 0, 0, 0,
- // SWP_NOMOVE|SWP_NOSIZE);
- //SetWindowPos(old, HWND_NOTOPMOST, 0, 0, 0, 0,
- // SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
- //SetFocus(hwnd);
- //SetActiveWindow(hwnd);
-
- // Go to: HKEY_CURRENT_USER\Control Panel\Mouse
- // Modify/Create DWORD Value of Data type REG_DWORD Named [ActiveWindowTracking] Setting for Value Data: [0 = ActiveWindowTracking Disabled / 1 = ActiveWindowTracking Enabled]
-
- //LockSetForegroundWindow(LSFW_LOCK);
- //SetForegroundWindow(win->sys->hwnd);
- //LockSetForegroundWindow(LSFW_UNLOCK);
- //SetFocus(win->sys->hwnd);
- //SetActiveWindow(win->sys->hwnd);
- //EnableWindow(win->sys->hwnd, TRUE);
+
+ /* 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 */
+ HWND fgWin = GetForegroundWindow();
+ if (fgWin == win->sys->hwnd)
+ return; // already focused
+ DWORD oldId = GetWindowThreadProcessId(fgWin, NULL);
+ DWORD newId = GetCurrentThreadId();
+ 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);
+
+ if (oldId != newId)
+ AttachThreadInput(oldId, newId, FALSE);
+}
+
+void sys_show(win_t *win, state_t state)
+{
+ static struct {
+ char *str;
+ int cmd;
+ } map[] = {
+ [ST_SHOW ] {"show" , SW_SHOW },
+ [ST_FULL ] {"full" , SW_MAXIMIZE},
+ [ST_SHADE] {"shade", SW_SHOW },
+ [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,stack), TRUE);
+}
+
+void sys_watch(win_t *win, event_t ev, mod_t mod)
+{
+ (void)ev2w; // TODO
+ //printf("sys_watch: %p\n", win);