diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2013-05-16 22:19:21 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-05-16 22:19:21 -0400 |
commit | 6f965a7f5030f530c072d8320d173df78c8e61d3 (patch) | |
tree | 61734e89952f2895407a98842d66c789b65a3056 | |
parent | 68ed10bd33df4018e4fec2f99aac16bbe7e50ecc (diff) |
Send MapNotify to parent when it has SubstructureNotify
-rw-r--r-- | src/test.c | 24 | ||||
-rw-r--r-- | src/window.c | 15 |
2 files changed, 26 insertions, 13 deletions
@@ -8,8 +8,8 @@ print_event(XEvent *e) { switch (e->type) { case MapNotify: - printf("got MapNotify event: window %d\n", - e->xmap.window); + printf("got MapNotify event: window %d event %d\n", + e->xmap.window, e->xmap.event); break; case ReparentNotify: printf("got ReparentNotify event: window %d\n", @@ -45,7 +45,12 @@ print_event(XEvent *e) e->xexpose.x, e->xexpose.y, e->xexpose.width, e->xexpose.height); break; - + case ConfigureNotify: + printf("got ConfigureNotify event: window %d event %d at %d,%d size %dx%d\n", + e->xconfigure.window, e->xconfigure.event, + e->xconfigure.x, e->xconfigure.y, + e->xconfigure.width, e->xconfigure.height); + break; default: printf("got event type %d\n", e->type); break; @@ -53,17 +58,16 @@ print_event(XEvent *e) } static void -run(Display *display) +run(Display *display, int event) { XEvent e; while (1) { XNextEvent(display, &e); print_event(&e); - switch (e.type) { - case ButtonPress: + + if (e.type == event) break; - } } } @@ -97,13 +101,17 @@ int main(int argc, char *argv[]) printf("created window %d and subwindow %d\n", win, sub); XMapWindow(display, win); + + /* Wait for ReparentNotify to get more similar behavior + between csx and xlib: run(display, ReparentNotify); */ + XMapWindow(display, sub); XMoveWindow(display, sub, 60, 60); XFlush(display); - run(display); + run(display, ButtonPress); XCloseDisplay(display); diff --git a/src/window.c b/src/window.c index 1a6160e..298ba0e 100644 --- a/src/window.c +++ b/src/window.c @@ -176,22 +176,22 @@ static const struct wl_shell_surface_listener shell_surface_listener = { }; void -csx_display_send_map_notify(struct csx_display *display, - struct csx_window *window) +csx_window_send_map_notify(struct csx_window *window, + struct csx_window *event_window) { + struct csx_display *display = window->display; struct csx_event *event; if (!(window->event_mask & StructureNotifyMask)) return; event = malloc(sizeof *event); - event->xevent.type = MapNotify; event->xevent.xmap.type = MapNotify; event->xevent.xmap.serial = display->serial; event->xevent.xmap.send_event = False; event->xevent.xmap.display = display->xdisplay; - event->xevent.xmap.event = window->id; + event->xevent.xmap.event = event_window->id; event->xevent.xmap.window = window->id; event->xevent.xmap.override_redirect = False; @@ -313,7 +313,12 @@ XMapWindow(Display *xdisplay, Window xwindow) return 0; window->mapped = 1; - csx_display_send_map_notify(display, window); + if (window->event_mask & StructureNotifyMask) + csx_window_send_map_notify(window, window); + if (window->parent && + window->parent->event_mask & SubstructureNotifyMask) + csx_window_send_map_notify(window, window->parent); + if (window->parent == display->root) { csx_window_map_toplevel(window); } else if (window->parent->mapped) { |