Ticket #4021: cursor-manager.c

File cursor-manager.c, 2.2 KB (added by garnacho, 12 years ago)

Standalone app dealing with cursor visibility

Line 
1/* gcc -o cursor-manager `pkg-config --cflags --libs gtk+-3.0 gtk+-x11-3.0 xi xfixes` cursor-manager.c */
2#include <stdio.h>
3#include <gtk/gtk.h>
4#include <gdk/gdkx.h>
5#include <X11/extensions/XInput2.h>
6#include <X11/extensions/Xfixes.h>
7
8static gboolean cursor_shown = TRUE;
9
10static GdkFilterReturn
11raw_event_filter (GdkXEvent *xevent,
12                  GdkEvent  *event,
13                  gpointer   user_data)
14{
15  GdkDisplay *display;
16  GdkScreen *screen;
17  XEvent *ev = xevent;
18  XIEvent *xiev;
19
20  if (ev->type != GenericEvent)
21    return GDK_FILTER_CONTINUE;
22
23  xiev = ev->xcookie.data;
24  display = gdk_display_get_default ();
25  screen = gdk_display_get_default_screen (display);
26
27  switch (xiev->evtype)
28    {
29    case XI_RawTouchBegin:
30    case XI_RawTouchUpdate:
31      if (cursor_shown)
32        {
33          XFixesHideCursor (GDK_DISPLAY_XDISPLAY (display),
34                            GDK_WINDOW_XID (gdk_screen_get_root_window (screen)));
35          cursor_shown = FALSE;
36        }
37      break;
38    case XI_RawButtonPress:
39    case XI_RawButtonRelease:
40    case XI_RawMotion:
41      if (!cursor_shown)
42        {
43          XFixesShowCursor (GDK_DISPLAY_XDISPLAY (display),
44                            GDK_WINDOW_XID (gdk_screen_get_root_window (screen)));
45          cursor_shown = TRUE;
46        }
47      break;
48    default:
49      break;
50    }
51
52  return GDK_FILTER_CONTINUE;
53}
54
55int
56main (int argc, char *argv[])
57{
58  GdkRGBA transparent = { 0 };
59  XIEventMask mask;
60  guchar *evmask;
61  GtkWidget *window;
62  GdkScreen *screen;
63  cairo_region_t *region;
64  GdkCursor *cursor;
65  Display *xdisplay;
66  GdkDisplay *display;
67
68  gtk_init (NULL, NULL);
69
70  screen = gdk_screen_get_default ();
71
72  evmask = g_new0 (guchar, XIMaskLen (XI_LASTEVENT));
73  XISetMask (evmask, XI_RawTouchBegin);
74  XISetMask (evmask, XI_RawTouchEnd);
75  XISetMask (evmask, XI_RawTouchUpdate);
76  XISetMask (evmask, XI_RawButtonPress);
77  XISetMask (evmask, XI_RawButtonRelease);
78  XISetMask (evmask, XI_RawMotion);
79
80  mask.deviceid = XIAllMasterDevices;
81  mask.mask_len = sizeof (evmask);
82  mask.mask = evmask;
83
84  XISelectEvents (GDK_SCREEN_XDISPLAY (screen),
85                  GDK_WINDOW_XID (gdk_screen_get_root_window (screen)),
86                  &mask, 1);
87
88  gdk_window_add_filter (NULL, raw_event_filter, window);
89
90  gtk_main ();
91}