X-Git-Url: http://pileus.org/git/?p=wmpus;a=blobdiff_plain;f=sys-win32.c;h=1bc8a6cd48ab8182016b432d6fcc99ae8f67f35f;hp=4a5e8318becc5e349b1e6c580186390e22f03b2c;hb=bcf8984f9b78949a7f33b2771800e67a538caddc;hpb=9b4ab92753e6e9ff8cdf96c20c6c0a2c8b5f1d33 diff --git a/sys-win32.c b/sys-win32.c index 4a5e831..1bc8a6c 100644 --- a/sys-win32.c +++ b/sys-win32.c @@ -16,6 +16,7 @@ /* Internal structures */ struct win_sys { HWND hwnd; + state_t state; }; typedef struct { @@ -214,7 +215,8 @@ LRESULT CALLBACK ShlProc(int msg, WPARAM wParam, LPARAM lParam) return 1; case HSHELL_WINDOWDESTROYED: printf("ShlProc: %p - window destroyed\n", hwnd); - if ((win = win_find(hwnd,0))) { + if ((win = win_find(hwnd,0)) && + win->sys->state == st_show) { wm_remove(win); win_remove(win); } @@ -249,7 +251,7 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) void sys_move(win_t *win, int x, int y, int w, int h) { printf("sys_move: %p - %d,%d %dx%d\n", win, x, y, w, h); - win->x = MAX(x,0); win->y = MAX(y,0); + win->x = x; win->y = y; win->w = MAX(w,1); win->h = MAX(h,1); MoveWindow(win->sys->hwnd, win->x, win->y, win->w, win->h, TRUE); } @@ -279,6 +281,23 @@ void sys_focus(win_t *win) 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 }, + }; + win->sys->state = state; + printf("sys_show: %s\n", map[state].str); + ShowWindow(win->sys->hwnd, map[state].cmd); +} + void sys_watch(win_t *win, Key_t key, mod_t mod) { (void)key2w; // TODO @@ -291,6 +310,31 @@ void sys_unwatch(win_t *win, Key_t key, mod_t mod) printf("sys_unwatch: %p\n", win); } +BOOL CALLBACK Mon(HMONITOR mon, HDC dc, LPRECT rect, LPARAM _screens) +{ + MONITORINFO info = {.cbSize=sizeof(MONITORINFO)}; + GetMonitorInfo(mon, &info); + RECT *work = &info.rcWork; + + list_t **screens = (list_t**)_screens; + win_t *screen = new0(win_t); + screen->x = work->left; + screen->y = work->top; + screen->w = work->right - work->left; + screen->h = work->bottom - work->top; + *screens = list_append(*screens, screen); + printf("mon_proc: %d,%d %dx%d\n", + screen->x, screen->y, screen->w, screen->h); + return TRUE; +} + +list_t *sys_info(win_t *win) +{ + list_t *screens = NULL; + EnumDisplayMonitors(NULL, NULL, Mon, (LPARAM)&screens); + return screens; +} + win_t *sys_init(void) { HINSTANCE hInst = GetModuleHandle(NULL);