Hide wayland cursor when X11 compositor loses focus
authorKristian Høgsberg <krh@bitplanet.net>
Wed, 7 Jul 2010 13:51:11 +0000 (09:51 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Wed, 7 Jul 2010 13:51:11 +0000 (09:51 -0400)
compositor-drm.c
compositor-x11.c
compositor.c
compositor.h

index c45b1d8..38d04bf 100644 (file)
@@ -678,6 +678,7 @@ drm_compositor_create(struct wl_display *display)
                                     WL_EVENT_READABLE, on_drm_input, ec);
        setup_tty(ec, loop);
        ec->base.present = drm_compositor_present;
+       ec->base.focus = 1;
 
        return &ec->base;
 }
index 61369fd..2ecd2a2 100644 (file)
@@ -346,7 +346,9 @@ x11_compositor_create_output(struct x11_compositor *c, int width, int height)
                XCB_EVENT_MASK_BUTTON_RELEASE |
                XCB_EVENT_MASK_POINTER_MOTION |
                XCB_EVENT_MASK_EXPOSURE |
-               XCB_EVENT_MASK_STRUCTURE_NOTIFY,
+               XCB_EVENT_MASK_STRUCTURE_NOTIFY |
+               XCB_EVENT_MASK_ENTER_WINDOW |
+               XCB_EVENT_MASK_LEAVE_WINDOW,
                0
        };
 
@@ -559,6 +561,17 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data)
                        r->width = expose->width;
                        r->height = expose->height;
                        break;
+
+               case XCB_ENTER_NOTIFY:
+                       c->base.focus = 1;
+                       wlsc_compositor_schedule_repaint(&c->base);
+                       break;
+
+               case XCB_LEAVE_NOTIFY:
+                       c->base.focus = 0;
+                       wlsc_compositor_schedule_repaint(&c->base);
+                       break;
+
                case XCB_CLIENT_MESSAGE:
                        client_message = (xcb_client_message_event_t *) event;
                        atom = client_message->data.data32[0];
index 268c8e5..f3017ab 100644 (file)
@@ -375,8 +375,9 @@ wlsc_output_repaint(struct wlsc_output *output)
        wl_list_for_each(es, &ec->surface_list, link)
                wlsc_surface_draw(es, output);
 
-       wl_list_for_each(eid, &ec->input_device_list, link)
-               wlsc_surface_draw(eid->sprite, output);
+       if (ec->focus)
+               wl_list_for_each(eid, &ec->input_device_list, link)
+                       wlsc_surface_draw(eid->sprite, output);
 }
 
 static void
@@ -398,7 +399,7 @@ repaint(void *data)
        ec->repaint_needed = 0;
 }
 
-static void
+void
 wlsc_compositor_schedule_repaint(struct wlsc_compositor *compositor)
 {
        compositor->repaint_needed = 1;
index 99cce30..362a8c5 100644 (file)
@@ -99,6 +99,7 @@ struct wlsc_compositor {
        uint32_t current_frame;
 
        uint32_t modifier_state;
+       uint32_t focus;
 
        void (*present)(struct wlsc_compositor *c);
 };
@@ -131,8 +132,8 @@ notify_key(struct wlsc_input_device *device, uint32_t key, uint32_t state);
 
 void
 wlsc_compositor_finish_frame(struct wlsc_compositor *compositor, int msecs);
-struct wlsc_input_device *
-wlsc_input_device_create(struct wlsc_compositor *ec);
+void
+wlsc_compositor_schedule_repaint(struct wlsc_compositor *compositor);
 
 int
 wlsc_compositor_init(struct wlsc_compositor *ec, struct wl_display *display);