X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=sys-x11.c;h=3fc4ed7f7d7a02a7e6e935b49895b5000173a7a7;hb=519fdd6d5a7c1e0c75638ff18a081e53aee30dbd;hp=dbab94820cc3dce31adeb1d1f9f310b25773768b;hpb=306672f9422fb3be995152e37abb704a9b568726;p=wmpus diff --git a/sys-x11.c b/sys-x11.c index dbab948..3fc4ed7 100644 --- a/sys-x11.c +++ b/sys-x11.c @@ -6,6 +6,7 @@ #include #include #include +#include #include "util.h" #include "sys.h" @@ -20,6 +21,7 @@ struct win_sys { struct { int left, right, top, bottom; } strut; + state_t state; }; typedef struct { @@ -36,7 +38,7 @@ typedef enum { } color_t; /* Global data */ -static void *win_cache; +static void *cache; static Atom atoms[natoms]; static int (*xerrorxlib)(Display *, XErrorEvent *); static unsigned long colors[ncolors]; @@ -215,16 +217,16 @@ static win_t *win_find(Display *dpy, Window xid, int create) win_sys_t sys = {.dpy=dpy, .xid=xid}; win_t tmp = {.sys=&sys}; win_t **old = NULL, *new = NULL; - if ((old = tfind(&tmp, &win_cache, win_cmp))) + if ((old = tfind(&tmp, &cache, win_cmp))) return *old; if (create && (new = win_new(dpy,xid))) - tsearch(new, &win_cache, win_cmp); + tsearch(new, &cache, win_cmp); return new; } static void win_remove(win_t *win) { - tdelete(win, &win_cache, win_cmp); + tdelete(win, &cache, win_cmp); free(win->sys); free(win); } @@ -253,7 +255,7 @@ static void process_event(int type, XEvent *ev, win_t *root) { Display *dpy = root->sys->dpy; win_t *win = NULL; - printf("event: %d\n", type); + //printf("event: %d\n", type); /* Common data for all these events ... */ ptr_t ptr; mod_t mod; @@ -271,6 +273,7 @@ static void process_event(int type, XEvent *ev, win_t *root) if (type == KeyPress) { while (XCheckTypedEvent(dpy, KeyPress, ev)); KeySym sym = XKeycodeToKeysym(dpy, ev->xkey.keycode, 0); + printf("got key %c %hhx\n", x2key(sym), mod2int(mod)); wm_handle_key(win, x2key(sym), mod, ptr); } else if (type == KeyRelease) { @@ -305,7 +308,7 @@ static void process_event(int type, XEvent *ev, win_t *root) wm_handle_key(win, key, MOD(), PTR()); } else if (type == FocusIn || type == FocusOut) { - printf("focus: %d\n", type); + //printf("focus: %d\n", type); key_t key = FocusIn ? key_focus : key_unfocus; if ((win = win_find(dpy,ev->xfocus.window,0))) wm_handle_key(win, key, MOD(), PTR()); @@ -317,15 +320,20 @@ static void process_event(int type, XEvent *ev, win_t *root) printf("map: %d\n", type); } else if (type == UnmapNotify) { - //printf("unmap: %d\n", type); - if ((win = win_find(dpy,ev->xunmap.window,0))) { + if ((win = win_find(dpy,ev->xunmap.window,0)) && + win->sys->state == st_show) { if (!del_strut(root, win)) wm_remove(win); else wm_update(); - win_remove(win); + win->sys->state = st_hide; } } + else if (type == DestroyNotify) { + //printf("destroy: %d\n", type); + if ((win = win_find(dpy,ev->xdestroywindow.window,0))) + win_remove(win); + } else if (type == ConfigureRequest) { XConfigureRequestEvent *cre = &ev->xconfigurerequest; printf("configure_req: %d - %x, (0x%lx) %dx%d @ %d,%d\n", @@ -380,7 +388,7 @@ 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); int b = 2*BORDER; - win->x = MAX(x,0); win->y = MAX(y,0); + win->x = x; win->y = y; win->w = MAX(w,1+b); win->h = MAX(h,1+b); w = MAX(w-b,1); h = MAX(h-b,1); XMoveResizeWindow(win->sys->dpy, win->sys->xid, x, y, w, h); @@ -401,7 +409,7 @@ void sys_raise(win_t *win) void sys_focus(win_t *win) { - printf("sys_focus: %p\n", win); + //printf("sys_focus: %p\n", win); /* Set border on focused window */ static win_t *last = NULL; @@ -424,6 +432,30 @@ void sys_focus(win_t *win) }); } +void sys_show(win_t *win, state_t state) +{ + win->sys->state = state; + switch (state) { + case st_show: + printf("sys_show: show\n"); + XMapWindow(win->sys->dpy, win->sys->xid); + return; + case st_full: + printf("sys_show: full\n"); + return; + case st_shade: + printf("sys_show: shade\n"); + return; + case st_icon: + printf("sys_show: icon\n"); + return; + case st_hide: + printf("sys_show: hide\n"); + XUnmapWindow(win->sys->dpy, win->sys->xid); + return; + } +} + void sys_watch(win_t *win, Key_t key, mod_t mod) { //printf("sys_watch: %p - %x %hhx\n", win, key, mod); @@ -451,24 +483,55 @@ void sys_unwatch(win_t *win, Key_t key, mod_t mod) XUngrabButton(win->sys->dpy, btn2x(key), mod2x(mod), win->sys->xid); } +list_t *sys_info(win_t *win) +{ + int n; + XineramaScreenInfo *info = NULL; + if (XineramaIsActive(win->sys->dpy)) + info = XineramaQueryScreens(win->sys->dpy, &n); + if (!info) { + win_t *screen = new0(win_t); + *screen = *win; + return list_insert(NULL, screen); + } + list_t *screens = NULL; + for (int i = 0; i < n; i++) { + win_t *screen = new0(win_t); + screen->x = info[i].x_org; + screen->y = info[i].y_org; + screen->w = info[i].width; + screen->h = info[i].height; + screens = list_append(screens, screen); + } + return screens; +} + win_t *sys_init(void) { Display *dpy; Window xid; + + /* Open the display */ if (!(dpy = XOpenDisplay(NULL))) error("Unable to get display"); if (!(xid = DefaultRootWindow(dpy))) error("Unable to get root window"); + + /* Setup X11 data */ atoms[wm_proto] = XInternAtom(dpy, "WM_PROTOCOLS", False); atoms[wm_focus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); atoms[net_strut] = XInternAtom(dpy, "_NET_WM_STRUT", False); + colors[clr_focus] = get_color(dpy, "#a0a0ff"); colors[clr_unfocus] = get_color(dpy, "#101066"); colors[clr_urgent] = get_color(dpy, "#ff0000"); printf("colors = #%06lx #%06lx #%06lx\n", colors[0], colors[1], colors[2]); + + /* Selec Window Managmenet events */ XSelectInput(dpy, xid, SubstructureRedirectMask|SubstructureNotifyMask); XSetInputFocus(dpy, None, RevertToNone, CurrentTime); xerrorxlib = XSetErrorHandler(xerror); + return win_find(dpy, xid, 1); }