1 /* 2 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #include <stdio.h> 27 #include <stdlib.h> 28 #include <linux/fb.h> 29 #include <fcntl.h> 30 #ifndef __USE_GNU // required for dladdr() & Dl_info 31 #define __USE_GNU 32 #endif 33 #include <dlfcn.h> 34 #include <sys/ioctl.h> 35 36 #include <string.h> 37 #include <strings.h> 38 39 #include <assert.h> 40 41 #include <gdk/gdk.h> 42 #include <gdk/gdkx.h> 43 44 #include "glass_wrapper.h" 45 46 static GdkAtom (*_gdk_atom_intern) (const gchar * atom_name, 47 gboolean only_if_exists); 48 static GdkAtom (*_gdk_atom_intern_static_string) (const gchar * atom_name); 49 static gchar *(*_gdk_atom_name) (GdkAtom atom); 50 static cairo_t *(*_gdk_cairo_create) (GdkDrawable * drawable); 51 static GdkColormap *(*_gdk_colormap_new) (GdkVisual * visual, 52 gboolean allocate); 53 static GdkCursor *(*_gdk_cursor_new) (GdkCursorType cursor_type); 54 static GdkCursor *(*_gdk_cursor_new_from_name) (GdkDisplay * display, 55 const gchar * name); 56 static GdkCursor *(*_gdk_cursor_new_from_pixbuf) (GdkDisplay * display, 57 GdkPixbuf * pixbuf, 58 gint x, gint y); 59 static GdkDisplay *(*_gdk_display_get_default) (void); 60 static guint (*_gdk_display_get_default_cursor_size) (GdkDisplay * display); 61 static void (*_gdk_display_get_pointer) (GdkDisplay * display, 62 GdkScreen ** screen, 63 gint * x, 64 gint * y, GdkModifierType * mask); 65 static GdkWindow *(*_gdk_display_get_window_at_pointer) (GdkDisplay * display, 66 gint * win_x, 67 gint * win_y); 68 static gboolean (*_gdk_display_pointer_is_grabbed) (GdkDisplay * display); 69 static gboolean (*_gdk_display_supports_composite) (GdkDisplay * display); 70 static void (*_gdk_drag_abort) (GdkDragContext * context, guint32 time_); 71 static gboolean (*_gdk_drag_motion) (GdkDragContext * context, 72 GdkWindow * dest_window, 73 GdkDragProtocol protocol, 74 gint x_root, 75 gint y_root, 76 GdkDragAction suggested_action, 77 GdkDragAction possible_actions, 78 guint32 time_); 79 static void (*_gdk_drag_drop) (GdkDragContext * context, guint32 time_); 80 static GdkDragContext *(*_gdk_drag_begin) (GdkWindow * window, 81 GList * targets); 82 static GdkDragAction (*_gdk_drag_context_get_actions) (GdkDragContext * 83 context); 84 static GdkDragAction (*_gdk_drag_context_get_selected_action) (GdkDragContext 85 * context); 86 static GdkDragAction (*_gdk_drag_context_get_suggested_action) (GdkDragContext 87 * context); 88 static GList *(*_gdk_drag_context_list_targets) (GdkDragContext * context); 89 static void (*_gdk_drag_find_window_for_screen) (GdkDragContext * context, 90 GdkWindow * drag_window, 91 GdkScreen * screen, 92 gint x_root, 93 gint y_root, 94 GdkWindow ** dest_window, 95 GdkDragProtocol * protocol); 96 static GdkAtom (*_gdk_drag_get_selection) (GdkDragContext * context); 97 static GdkWindow *(*_gdk_drag_context_get_dest_window) (GdkDragContext * 98 context); 99 static void (*_gdk_drag_status) (GdkDragContext * context, 100 GdkDragAction action, guint32 time_); 101 static void (*_gdk_drop_reply) (GdkDragContext * context, gboolean ok, 102 guint32 time_); 103 static void (*_gdk_drop_finish) (GdkDragContext * context, gboolean success, 104 guint32 time_); 105 static GdkScreen *(*_gdk_window_get_screen) (GdkWindow * window); 106 static GdkDisplay *(*_gdk_window_get_display) (GdkWindow * window); 107 static int (*_gdk_window_get_width) (GdkWindow * window); 108 static int (*_gdk_window_get_height) (GdkWindow * window); 109 static void (*_gdk_error_trap_push) (void); 110 static void (*_gdk_event_request_motions) (const GdkEventMotion * event); 111 static void (*_gdk_event_handler_set) (GdkEventFunc func, 112 gpointer data, GDestroyNotify notify); 113 static GdkWindow *(*_gdk_get_default_root_window) (void); 114 static GdkKeymap *(*_gdk_keymap_get_default) (void); 115 static gboolean (*_gdk_keymap_get_entries_for_keyval) (GdkKeymap * keymap, 116 guint keyval, 117 GdkKeymapKey ** keys, 118 gint * n_keys); 119 static guint (*_gdk_keymap_lookup_key) (GdkKeymap * keymap, 120 const GdkKeymapKey * key); 121 static gboolean (*_gdk_keymap_translate_keyboard_state) (GdkKeymap * keymap, 122 guint 123 hardware_keycode, 124 GdkModifierType 125 state, gint group, 126 guint * keyval, 127 gint * 128 effective_group, 129 gint * level, 130 GdkModifierType * 131 consumed_modifiers); 132 static guint32 (*_gdk_keyval_to_unicode) (guint keyval) G_GNUC_CONST; 133 static GdkPixbuf *(*_gdk_pixbuf_get_from_drawable) (GdkPixbuf * dest, 134 GdkDrawable * src, 135 GdkColormap * cmap, 136 int src_x, 137 int src_y, 138 int dest_x, 139 int dest_y, 140 int width, int height); 141 static void (*_gdk_pixbuf_render_pixmap_and_mask) (GdkPixbuf * pixbuf, 142 GdkPixmap ** pixmap_return, 143 GdkBitmap ** mask_return, 144 int alpha_threshold); 145 static void (*_gdk_pixbuf_render_pixmap_and_mask_for_colormap) (GdkPixbuf * 146 pixbuf, 147 GdkColormap * 148 colormap, 149 GdkPixmap ** 150 pixmap_return, 151 GdkBitmap ** 152 mask_return, 153 int 154 alpha_threshold); 155 static GdkGrabStatus (*_gdk_pointer_grab) (GdkWindow * window, 156 gboolean owner_events, 157 GdkEventMask event_mask, 158 GdkWindow * confine_to, 159 GdkCursor * cursor, guint32 time_); 160 static void (*_gdk_pointer_ungrab) (guint32 time_); 161 static void (*_gdk_property_change) (GdkWindow * window, 162 GdkAtom property, 163 GdkAtom type, 164 gint format, 165 GdkPropMode mode, 166 const guchar * data, gint nelements); 167 static gboolean (*_gdk_property_get) (GdkWindow * window, 168 GdkAtom property, 169 GdkAtom type, 170 gulong offset, 171 gulong length, 172 gint pdelete, 173 GdkAtom * actual_property_type, 174 gint * actual_format, 175 gint * actual_length, guchar ** data); 176 static gboolean (*_gdk_rectangle_intersect) (const GdkRectangle * src1, 177 const GdkRectangle * src2, 178 GdkRectangle * dest); 179 static void (*_gdk_region_destroy) (GdkRegion * region); 180 static GdkRegion *(*_gdk_region_new) (void); 181 static GdkScreen *(*_gdk_screen_get_default) (void); 182 static gint (*_gdk_screen_get_height) (GdkScreen * screen); 183 static gint (*_gdk_screen_get_monitor_at_point) (GdkScreen * screen, 184 gint x, gint y); 185 static void (*_gdk_screen_get_monitor_geometry) (GdkScreen * screen, 186 gint monitor_num, 187 GdkRectangle * dest); 188 static gint (*_gdk_screen_get_n_monitors) (GdkScreen * screen); 189 static gint (*_gdk_screen_get_monitor_width_mm) (GdkScreen *screen, 190 gint monitor_num); 191 static gint (*_gdk_screen_get_monitor_height_mm) (GdkScreen *screen, 192 gint monitor_num); 193 static gint (*_gdk_screen_get_width_mm) (GdkScreen *screen); 194 static gint (*_gdk_screen_get_height_mm) (GdkScreen *screen); 195 static gdouble (*_gdk_screen_get_resolution) (GdkScreen * screen); 196 static GdkColormap *(*_gdk_screen_get_rgba_colormap) (GdkScreen * screen); 197 static GdkColormap *(*_gdk_screen_get_rgb_colormap) (GdkScreen * screen); 198 static GdkWindow *(*_gdk_screen_get_root_window) (GdkScreen * screen); 199 static GdkVisual *(*_gdk_screen_get_system_visual) (GdkScreen * screen); 200 static gint (*_gdk_screen_get_width) (GdkScreen * screen); 201 static gboolean (*_gdk_screen_is_composited) (GdkScreen * screen); 202 static void (*_gdk_selection_convert) (GdkWindow * requestor, 203 GdkAtom selection, 204 GdkAtom target, guint32 time_); 205 static gboolean (*_gdk_selection_owner_set) (GdkWindow * owner, 206 GdkAtom selection, 207 guint32 time_, 208 gboolean send_event); 209 static gint (*_gdk_selection_property_get) (GdkWindow * requestor, 210 guchar ** data, 211 GdkAtom * prop_type, 212 gint * prop_format); 213 static void (*_gdk_selection_send_notify) (GdkNativeWindow requestor, 214 GdkAtom selection, 215 GdkAtom target, 216 GdkAtom property, guint32 time_); 217 static guint (*_gdk_unicode_to_keyval) (guint32 wc) G_GNUC_CONST; 218 static guint (*_gdk_threads_add_idle_full) (gint priority, 219 GSourceFunc function, 220 gpointer data, 221 GDestroyNotify notify); 222 static guint (*_gdk_threads_add_idle) (GSourceFunc function, gpointer data); 223 static guint (*_gdk_threads_add_timeout_full) (gint priority, 224 guint interval, 225 GSourceFunc function, 226 gpointer data, 227 GDestroyNotify notify); 228 static void (*_gdk_threads_enter) (void); 229 static void (*_gdk_threads_init) (void); 230 static void (*_gdk_threads_leave) (void); 231 static void (*_gdk_window_destroy) (GdkWindow * window); 232 static GdkCursor *(*_gdk_window_get_cursor) (GdkWindow * window); 233 static GdkEventMask (*_gdk_window_get_events) (GdkWindow * window); 234 static void (*_gdk_window_get_geometry) (GdkWindow * window, 235 gint * x, 236 gint * y, 237 gint * width, 238 gint * height, gint * depth); 239 static gint (*_gdk_window_get_origin) (GdkWindow * window, 240 gint * x, gint * y); 241 static void (*_gdk_window_input_shape_combine_mask) (GdkWindow * window, 242 GdkBitmap * mask, 243 gint x, gint y); 244 static void (*_gdk_window_shape_combine_region) (GdkWindow *window, 245 const cairo_region_t *shape_region, 246 gint offset_x, 247 gint offset_y); 248 static void (*_gdk_window_input_shape_combine_region) (GdkWindow * window, 249 const cairo_region_t * shape_region, 250 gint offset_x, 251 gint offset_y); 252 static gboolean (*_gdk_window_is_destroyed) (GdkWindow * window); 253 static void (*_gdk_window_move) (GdkWindow * window, gint x, gint y); 254 static GdkWindow *(*_gdk_window_new) (GdkWindow * parent, 255 GdkWindowAttr * attributes, 256 gint attributes_mask); 257 static void (*_gdk_window_register_dnd) (GdkWindow * window); 258 static void (*_gdk_window_resize) (GdkWindow * window, 259 gint width, gint height); 260 static void (*_gdk_window_restack) (GdkWindow * window, 261 GdkWindow * sibling, gboolean above); 262 static void (*_gdk_window_set_cursor) (GdkWindow * window, 263 GdkCursor * cursor); 264 static void (*_gdk_window_set_events) (GdkWindow * window, 265 GdkEventMask event_mask); 266 static void (*_gdk_window_set_functions) (GdkWindow * window, 267 GdkWMFunction functions); 268 static void (*_gdk_window_show) (GdkWindow * window); 269 static Display *(*_gdk_x11_display_get_xdisplay) (GdkDisplay * display); 270 static XID (*_gdk_x11_drawable_get_xid) (GdkDrawable * drawable); 271 static gint (*_gdk_x11_get_default_screen) (void); 272 static Display *(*_gdk_x11_get_default_xdisplay) (void); 273 static guint32 (*_gdk_x11_get_server_time) (GdkWindow * window); 274 static GdkVisual *(*_gdk_x11_screen_lookup_visual) (GdkScreen * screen, 275 VisualID xvisualid); 276 static GdkWindow *(*_gdk_x11_window_foreign_new_for_display) (GdkDisplay * 277 display, 278 Window window); 279 static GdkWindow *(*_gdk_x11_window_lookup_for_display) (GdkDisplay * display, 280 Window window); 281 static gint (*_gdk_visual_get_depth) (GdkVisual * visual); 282 283 static GType (*_gdk_window_object_get_type) (void); 284 285 //----------- GTK 3.0 ------------------------------------------------------ 286 287 typedef struct _GdkDeviceManager GdkDeviceManager; 288 struct _GdkRGBA 289 { 290 gdouble red; 291 gdouble green; 292 gdouble blue; 293 gdouble alpha; 294 }; 295 typedef struct _GdkRGBA GdkRGBA; 296 297 typedef enum { 298 GDK_DEVICE_TYPE_MASTER, 299 GDK_DEVICE_TYPE_SLAVE, 300 GDK_DEVICE_TYPE_FLOATING 301 } GdkDeviceType; 302 303 typedef enum 304 { 305 GDK_OWNERSHIP_NONE, 306 GDK_OWNERSHIP_WINDOW, 307 GDK_OWNERSHIP_APPLICATION 308 } GdkGrabOwnership; 309 310 311 static GdkVisual * (*_gdk_window_get_visual) (GdkWindow *window); 312 static GdkScreen *(*_gdk_visual_get_screen) (GdkVisual *visual); 313 static GList * (*_gdk_device_manager_list_devices) (GdkDeviceManager *device_manager, 314 GdkDeviceType type); 315 static GdkDeviceManager * (*_gdk_display_get_device_manager) (GdkDisplay *display); 316 static GdkVisual * (*_gdk_screen_get_rgba_visual) (GdkScreen *screen); 317 static GdkInputSource (*_gdk_device_get_source) (GdkDevice *device); 318 static GdkGrabStatus (*_gdk_device_grab) (GdkDevice *device, 319 GdkWindow *window, 320 GdkGrabOwnership grab_ownership, 321 gboolean owner_events, 322 GdkEventMask event_mask, 323 GdkCursor *cursor, 324 guint32 time_); 325 static void (*_gdk_device_ungrab) (GdkDevice *device, guint32 time_); 326 static GdkDevice * (*_gdk_device_manager_get_client_pointer) (GdkDeviceManager *device_manager); 327 static void (*_gdk_device_get_position) (GdkDevice *device, 328 GdkScreen **screen, 329 gint *x, 330 gint *y); 331 static gboolean (*_gdk_display_device_is_grabbed) (GdkDisplay *display, 332 GdkDevice *device); 333 static GdkWindow * (*_gdk_device_get_window_at_position) (GdkDevice *device, 334 gint *win_x, 335 gint *win_y); 336 static void (*_gdk_window_set_background) (GdkWindow *window, 337 const GdkColor *color); 338 static void (*_gdk_window_set_background_rgba) (GdkWindow *window, 339 const GdkRGBA *rgba); 340 static Window (*_gdk_x11_window_get_xid) (GdkWindow *window); 341 342 static GdkPixbuf *(*_gdk_pixbuf_get_from_window) (GdkWindow *window, 343 gint src_x, 344 gint src_y, 345 gint width, 346 gint height); 347 348 static GType (*_gdk_window_get_type) (void); 349 350 static cairo_region_t * (*_gdk_cairo_region_create_from_surface) (cairo_surface_t *surface); 351 352 /***** Utilities ***********************************************************/ 353 354 355 #define PRELOAD_SYMBOL_GDK(x) \ 356 _##x = dlsym(libgdk, #x); \ 357 if (_##x == NULL) { \ 358 symbol_load_errors++; \ 359 fprintf(stderr,"failed loading %s\n", #x); \ 360 } 361 362 int wrapper_load_symbols_gdk (int version, void * libgdk) 363 { 364 int symbol_load_errors = 0; 365 366 PRELOAD_SYMBOL_GDK (gdk_atom_intern); 367 PRELOAD_SYMBOL_GDK (gdk_atom_intern_static_string); 368 PRELOAD_SYMBOL_GDK (gdk_atom_name); 369 PRELOAD_SYMBOL_GDK (gdk_cairo_create); 370 PRELOAD_SYMBOL_GDK (gdk_cursor_new); 371 PRELOAD_SYMBOL_GDK (gdk_cursor_new_from_name); 372 PRELOAD_SYMBOL_GDK (gdk_cursor_new_from_pixbuf); 373 PRELOAD_SYMBOL_GDK (gdk_display_get_default); 374 PRELOAD_SYMBOL_GDK (gdk_display_get_default_cursor_size); 375 PRELOAD_SYMBOL_GDK (gdk_display_get_pointer); 376 PRELOAD_SYMBOL_GDK (gdk_display_get_window_at_pointer); 377 PRELOAD_SYMBOL_GDK (gdk_display_pointer_is_grabbed); 378 PRELOAD_SYMBOL_GDK (gdk_display_supports_composite); 379 PRELOAD_SYMBOL_GDK (gdk_drag_abort); 380 PRELOAD_SYMBOL_GDK (gdk_drag_motion); 381 PRELOAD_SYMBOL_GDK (gdk_drag_drop); 382 PRELOAD_SYMBOL_GDK (gdk_drag_begin); 383 PRELOAD_SYMBOL_GDK (gdk_drag_context_get_actions); 384 PRELOAD_SYMBOL_GDK (gdk_drag_context_get_selected_action); 385 PRELOAD_SYMBOL_GDK (gdk_drag_context_get_suggested_action); 386 PRELOAD_SYMBOL_GDK (gdk_drag_context_list_targets); 387 PRELOAD_SYMBOL_GDK (gdk_drag_find_window_for_screen); 388 PRELOAD_SYMBOL_GDK (gdk_drag_get_selection); 389 PRELOAD_SYMBOL_GDK (gdk_drag_context_get_dest_window); 390 PRELOAD_SYMBOL_GDK (gdk_drag_status); 391 PRELOAD_SYMBOL_GDK (gdk_drop_reply); 392 PRELOAD_SYMBOL_GDK (gdk_drop_finish); 393 PRELOAD_SYMBOL_GDK (gdk_error_trap_push); 394 PRELOAD_SYMBOL_GDK (gdk_event_request_motions); 395 PRELOAD_SYMBOL_GDK (gdk_event_handler_set); 396 PRELOAD_SYMBOL_GDK (gdk_get_default_root_window); 397 PRELOAD_SYMBOL_GDK (gdk_keymap_get_default); 398 PRELOAD_SYMBOL_GDK (gdk_keymap_get_entries_for_keyval); 399 PRELOAD_SYMBOL_GDK (gdk_keymap_lookup_key); 400 PRELOAD_SYMBOL_GDK (gdk_keymap_translate_keyboard_state); 401 PRELOAD_SYMBOL_GDK (gdk_keyval_to_unicode); 402 PRELOAD_SYMBOL_GDK (gdk_pointer_grab); 403 PRELOAD_SYMBOL_GDK (gdk_pointer_ungrab); 404 PRELOAD_SYMBOL_GDK (gdk_property_change); 405 PRELOAD_SYMBOL_GDK (gdk_property_get); 406 PRELOAD_SYMBOL_GDK (gdk_rectangle_intersect); 407 PRELOAD_SYMBOL_GDK (gdk_screen_get_default); 408 PRELOAD_SYMBOL_GDK (gdk_screen_get_height); 409 PRELOAD_SYMBOL_GDK (gdk_screen_get_monitor_at_point); 410 PRELOAD_SYMBOL_GDK (gdk_screen_get_monitor_geometry); 411 PRELOAD_SYMBOL_GDK (gdk_screen_get_n_monitors); 412 PRELOAD_SYMBOL_GDK (gdk_screen_get_monitor_width_mm); 413 PRELOAD_SYMBOL_GDK (gdk_screen_get_monitor_height_mm); 414 PRELOAD_SYMBOL_GDK (gdk_screen_get_width_mm); 415 PRELOAD_SYMBOL_GDK (gdk_screen_get_height_mm); 416 PRELOAD_SYMBOL_GDK (gdk_screen_get_resolution); 417 PRELOAD_SYMBOL_GDK (gdk_screen_get_root_window); 418 PRELOAD_SYMBOL_GDK (gdk_screen_get_system_visual); 419 PRELOAD_SYMBOL_GDK (gdk_screen_get_width); 420 PRELOAD_SYMBOL_GDK (gdk_screen_is_composited); 421 PRELOAD_SYMBOL_GDK (gdk_selection_convert); 422 PRELOAD_SYMBOL_GDK (gdk_selection_owner_set); 423 PRELOAD_SYMBOL_GDK (gdk_selection_property_get); 424 PRELOAD_SYMBOL_GDK (gdk_selection_send_notify); 425 PRELOAD_SYMBOL_GDK (gdk_unicode_to_keyval); 426 PRELOAD_SYMBOL_GDK (gdk_threads_add_idle_full); 427 PRELOAD_SYMBOL_GDK (gdk_threads_add_idle); 428 PRELOAD_SYMBOL_GDK (gdk_threads_add_timeout_full); 429 PRELOAD_SYMBOL_GDK (gdk_threads_enter); 430 PRELOAD_SYMBOL_GDK (gdk_threads_init); 431 PRELOAD_SYMBOL_GDK (gdk_threads_leave); 432 PRELOAD_SYMBOL_GDK (gdk_window_destroy); 433 PRELOAD_SYMBOL_GDK (gdk_window_get_cursor); 434 PRELOAD_SYMBOL_GDK (gdk_window_get_events); 435 PRELOAD_SYMBOL_GDK (gdk_window_get_geometry); 436 PRELOAD_SYMBOL_GDK (gdk_window_get_origin); 437 PRELOAD_SYMBOL_GDK (gdk_window_is_destroyed); 438 PRELOAD_SYMBOL_GDK (gdk_window_move); 439 PRELOAD_SYMBOL_GDK (gdk_window_new); 440 PRELOAD_SYMBOL_GDK (gdk_window_register_dnd); 441 PRELOAD_SYMBOL_GDK (gdk_window_resize); 442 PRELOAD_SYMBOL_GDK (gdk_window_restack); 443 PRELOAD_SYMBOL_GDK (gdk_window_set_cursor); 444 PRELOAD_SYMBOL_GDK (gdk_window_set_events); 445 PRELOAD_SYMBOL_GDK (gdk_window_set_functions); 446 PRELOAD_SYMBOL_GDK (gdk_window_show); 447 PRELOAD_SYMBOL_GDK (gdk_x11_display_get_xdisplay); 448 PRELOAD_SYMBOL_GDK (gdk_x11_get_default_screen); 449 PRELOAD_SYMBOL_GDK (gdk_x11_get_default_xdisplay); 450 PRELOAD_SYMBOL_GDK (gdk_x11_get_server_time); 451 PRELOAD_SYMBOL_GDK (gdk_x11_screen_lookup_visual); 452 PRELOAD_SYMBOL_GDK (gdk_x11_window_foreign_new_for_display); 453 PRELOAD_SYMBOL_GDK (gdk_x11_window_lookup_for_display); 454 PRELOAD_SYMBOL_GDK (gdk_window_get_display); 455 PRELOAD_SYMBOL_GDK (gdk_window_get_height); 456 PRELOAD_SYMBOL_GDK (gdk_window_get_width); 457 PRELOAD_SYMBOL_GDK (gdk_window_get_screen); 458 PRELOAD_SYMBOL_GDK (gdk_visual_get_screen); // 2.2 459 460 if (version == 2) { 461 PRELOAD_SYMBOL_GDK (gdk_colormap_new); 462 PRELOAD_SYMBOL_GDK (gdk_pixbuf_get_from_drawable); 463 PRELOAD_SYMBOL_GDK (gdk_pixbuf_render_pixmap_and_mask); 464 PRELOAD_SYMBOL_GDK (gdk_pixbuf_render_pixmap_and_mask_for_colormap); 465 PRELOAD_SYMBOL_GDK (gdk_region_destroy); 466 PRELOAD_SYMBOL_GDK (gdk_region_new); 467 PRELOAD_SYMBOL_GDK (gdk_screen_get_rgba_colormap); 468 PRELOAD_SYMBOL_GDK (gdk_screen_get_rgb_colormap); 469 PRELOAD_SYMBOL_GDK (gdk_window_input_shape_combine_mask); 470 PRELOAD_SYMBOL_GDK (gdk_x11_drawable_get_xid); 471 PRELOAD_SYMBOL_GDK (gdk_window_object_get_type); 472 PRELOAD_SYMBOL_GDK (gdk_visual_get_depth); 473 } 474 475 if (version == 3) { 476 // gtk version 3 unique symbols 477 PRELOAD_SYMBOL_GDK (gdk_window_get_visual); // both 478 PRELOAD_SYMBOL_GDK (gdk_device_manager_list_devices); //both 479 PRELOAD_SYMBOL_GDK (gdk_display_get_device_manager); 480 PRELOAD_SYMBOL_GDK (gdk_screen_get_rgba_visual); 481 PRELOAD_SYMBOL_GDK (gdk_device_get_source); // both 482 PRELOAD_SYMBOL_GDK (gdk_device_grab); 483 PRELOAD_SYMBOL_GDK (gdk_device_ungrab); 484 PRELOAD_SYMBOL_GDK (gdk_device_manager_get_client_pointer) 485 PRELOAD_SYMBOL_GDK (gdk_device_get_position) 486 PRELOAD_SYMBOL_GDK (gdk_display_device_is_grabbed) 487 PRELOAD_SYMBOL_GDK (gdk_device_get_window_at_position) 488 PRELOAD_SYMBOL_GDK (gdk_window_set_background_rgba) 489 PRELOAD_SYMBOL_GDK (gdk_x11_window_get_xid); 490 PRELOAD_SYMBOL_GDK (gdk_pixbuf_get_from_window); 491 PRELOAD_SYMBOL_GDK (gdk_window_get_type); 492 PRELOAD_SYMBOL_GDK (gdk_cairo_region_create_from_surface); 493 PRELOAD_SYMBOL_GDK (gdk_window_shape_combine_region); 494 PRELOAD_SYMBOL_GDK (gdk_window_input_shape_combine_region); 495 } 496 497 if (symbol_load_errors && wrapper_debug) { 498 fprintf (stderr, "failed to load %d gdk symbols", symbol_load_errors); 499 } 500 501 return symbol_load_errors; 502 503 } 504 505 #define CHECK_LOAD_SYMBOL_GDK(x) \ 506 { \ 507 if (!_##x) { \ 508 if (wrapper_debug) fprintf(stderr,"missing %s\n", #x); \ 509 assert(_##x); \ 510 } else { \ 511 if (wrapper_debug) { \ 512 fprintf(stderr,"using %s\n", #x); \ 513 fflush(stderr); \ 514 } \ 515 } \ 516 } 517 518 519 GdkAtom gdk_atom_intern (const gchar * atom_name, gboolean only_if_exists) 520 { 521 CHECK_LOAD_SYMBOL_GDK (gdk_atom_intern); 522 return (*_gdk_atom_intern) (atom_name, only_if_exists); 523 } 524 525 GdkAtom gdk_atom_intern_static_string (const gchar * atom_name) 526 { 527 CHECK_LOAD_SYMBOL_GDK (gdk_atom_intern_static_string); 528 return (*_gdk_atom_intern_static_string) (atom_name); 529 } 530 531 gchar *gdk_atom_name (GdkAtom atom) 532 { 533 CHECK_LOAD_SYMBOL_GDK (gdk_atom_name); 534 return (*_gdk_atom_name) (atom); 535 } 536 537 cairo_t *gdk_cairo_create (GdkDrawable * drawable) 538 { 539 CHECK_LOAD_SYMBOL_GDK (gdk_cairo_create); 540 return (*_gdk_cairo_create) (drawable); 541 } 542 543 GdkColormap *gdk_colormap_new (GdkVisual * visual, gboolean allocate) 544 { 545 CHECK_LOAD_SYMBOL_GDK (gdk_colormap_new); 546 return (*_gdk_colormap_new) (visual, allocate); 547 } 548 549 GdkCursor *gdk_cursor_new (GdkCursorType cursor_type) 550 { 551 CHECK_LOAD_SYMBOL_GDK (gdk_cursor_new); 552 return (*_gdk_cursor_new) (cursor_type); 553 } 554 555 GdkCursor *gdk_cursor_new_from_name (GdkDisplay * display, const gchar * name) 556 { 557 CHECK_LOAD_SYMBOL_GDK (gdk_cursor_new_from_name); 558 return (*_gdk_cursor_new_from_name) (display, name); 559 } 560 561 GdkCursor *gdk_cursor_new_from_pixbuf (GdkDisplay * display, 562 GdkPixbuf * pixbuf, gint x, gint y) 563 { 564 CHECK_LOAD_SYMBOL_GDK (gdk_cursor_new_from_pixbuf); 565 return (*_gdk_cursor_new_from_pixbuf) (display, pixbuf, x, y); 566 } 567 568 GdkDisplay *gdk_display_get_default (void) 569 { 570 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_default); 571 return (*_gdk_display_get_default) (); 572 } 573 574 guint gdk_display_get_default_cursor_size (GdkDisplay * display) 575 { 576 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_default_cursor_size); 577 return (*_gdk_display_get_default_cursor_size) (display); 578 } 579 580 void gdk_display_get_pointer (GdkDisplay * display, 581 GdkScreen ** screen, 582 gint * x, gint * y, GdkModifierType * mask) 583 { 584 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_pointer); 585 (*_gdk_display_get_pointer) (display, screen, x, y, mask); 586 } 587 588 GdkWindow *gdk_display_get_window_at_pointer (GdkDisplay * display, 589 gint * win_x, gint * win_y) 590 { 591 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_window_at_pointer); 592 return (*_gdk_display_get_window_at_pointer) (display, win_x, win_y); 593 } 594 595 gboolean gdk_display_pointer_is_grabbed (GdkDisplay * display) 596 { 597 CHECK_LOAD_SYMBOL_GDK (gdk_display_pointer_is_grabbed); 598 return (*_gdk_display_pointer_is_grabbed) (display); 599 } 600 601 gboolean gdk_display_supports_composite (GdkDisplay * display) 602 { 603 CHECK_LOAD_SYMBOL_GDK (gdk_display_supports_composite); 604 return (*_gdk_display_supports_composite) (display); 605 } 606 607 void gdk_drag_abort (GdkDragContext * context, guint32 time_) 608 { 609 CHECK_LOAD_SYMBOL_GDK (gdk_drag_abort); 610 (*_gdk_drag_abort) (context, time_); 611 } 612 613 gboolean gdk_drag_motion (GdkDragContext * context, 614 GdkWindow * dest_window, 615 GdkDragProtocol protocol, 616 gint x_root, 617 gint y_root, 618 GdkDragAction suggested_action, 619 GdkDragAction possible_actions, guint32 time_) 620 { 621 CHECK_LOAD_SYMBOL_GDK (gdk_drag_motion); 622 return (*_gdk_drag_motion) (context, dest_window, protocol, x_root, 623 y_root, suggested_action, possible_actions, 624 time_); 625 } 626 627 void gdk_drag_drop (GdkDragContext * context, guint32 time_) 628 { 629 CHECK_LOAD_SYMBOL_GDK (gdk_drag_drop); 630 (*_gdk_drag_drop) (context, time_); 631 } 632 633 GdkDragContext *gdk_drag_begin (GdkWindow * window, GList * targets) 634 { 635 CHECK_LOAD_SYMBOL_GDK (gdk_drag_begin); 636 return (*_gdk_drag_begin) (window, targets); 637 } 638 639 GdkDragAction gdk_drag_context_get_actions (GdkDragContext * context) 640 { 641 CHECK_LOAD_SYMBOL_GDK (gdk_drag_context_get_actions); 642 return (*_gdk_drag_context_get_actions) (context); 643 } 644 645 GdkDragAction gdk_drag_context_get_selected_action (GdkDragContext * context) 646 { 647 CHECK_LOAD_SYMBOL_GDK (gdk_drag_context_get_selected_action); 648 return (*_gdk_drag_context_get_selected_action) (context); 649 } 650 651 GdkDragAction gdk_drag_context_get_suggested_action (GdkDragContext * context) 652 { 653 CHECK_LOAD_SYMBOL_GDK (gdk_drag_context_get_suggested_action); 654 return (*_gdk_drag_context_get_suggested_action) (context); 655 } 656 657 GList *gdk_drag_context_list_targets (GdkDragContext * context) 658 { 659 CHECK_LOAD_SYMBOL_GDK (gdk_drag_context_list_targets); 660 return (*_gdk_drag_context_list_targets) (context); 661 } 662 663 void gdk_drag_find_window_for_screen (GdkDragContext * context, 664 GdkWindow * drag_window, 665 GdkScreen * screen, 666 gint x_root, 667 gint y_root, 668 GdkWindow ** dest_window, 669 GdkDragProtocol * protocol) 670 { 671 CHECK_LOAD_SYMBOL_GDK (gdk_drag_find_window_for_screen); 672 (*_gdk_drag_find_window_for_screen) (context, drag_window, screen, x_root, 673 y_root, dest_window, protocol); 674 } 675 676 GdkAtom gdk_drag_get_selection (GdkDragContext * context) 677 { 678 CHECK_LOAD_SYMBOL_GDK (gdk_drag_get_selection); 679 return (*_gdk_drag_get_selection) (context); 680 } 681 682 GdkWindow *gdk_drag_context_get_dest_window (GdkDragContext * context) 683 { 684 CHECK_LOAD_SYMBOL_GDK (gdk_drag_context_get_dest_window); 685 return (*_gdk_drag_context_get_dest_window) (context); 686 } 687 688 void gdk_drag_status (GdkDragContext * context, 689 GdkDragAction action, guint32 time_) 690 { 691 CHECK_LOAD_SYMBOL_GDK (gdk_drag_status); 692 (*_gdk_drag_status) (context, action, time_); 693 } 694 695 void gdk_drop_reply (GdkDragContext * context, gboolean ok, guint32 time_) 696 { 697 CHECK_LOAD_SYMBOL_GDK (gdk_drop_reply); 698 (*_gdk_drop_reply) (context, ok, time_); 699 } 700 701 void gdk_drop_finish (GdkDragContext * context, 702 gboolean success, guint32 time_) 703 { 704 CHECK_LOAD_SYMBOL_GDK (gdk_drop_finish); 705 (*_gdk_drop_finish) (context, success, time_); 706 } 707 708 void gdk_error_trap_push (void) 709 { 710 CHECK_LOAD_SYMBOL_GDK (gdk_error_trap_push); 711 return (*_gdk_error_trap_push) (); 712 } 713 714 void gdk_event_request_motions (const GdkEventMotion * event) 715 { 716 CHECK_LOAD_SYMBOL_GDK (gdk_event_request_motions); 717 (*_gdk_event_request_motions) (event); 718 } 719 720 void gdk_event_handler_set (GdkEventFunc func, 721 gpointer data, GDestroyNotify notify) 722 { 723 CHECK_LOAD_SYMBOL_GDK (gdk_event_handler_set); 724 (*_gdk_event_handler_set) (func, data, notify); 725 } 726 727 GdkWindow *gdk_get_default_root_window (void) 728 { 729 CHECK_LOAD_SYMBOL_GDK (gdk_get_default_root_window); 730 return (*_gdk_get_default_root_window) (); 731 } 732 733 GdkKeymap *gdk_keymap_get_default (void) 734 { 735 CHECK_LOAD_SYMBOL_GDK (gdk_keymap_get_default); 736 return (*_gdk_keymap_get_default) (); 737 } 738 739 gboolean gdk_keymap_get_entries_for_keyval (GdkKeymap * keymap, 740 guint keyval, 741 GdkKeymapKey ** keys, 742 gint * n_keys) 743 { 744 CHECK_LOAD_SYMBOL_GDK (gdk_keymap_get_entries_for_keyval); 745 return (*_gdk_keymap_get_entries_for_keyval) (keymap, keyval, keys, 746 n_keys); 747 } 748 749 guint gdk_keymap_lookup_key (GdkKeymap * keymap, const GdkKeymapKey * key) 750 { 751 CHECK_LOAD_SYMBOL_GDK (gdk_keymap_lookup_key); 752 return (*_gdk_keymap_lookup_key) (keymap, key); 753 } 754 755 gboolean gdk_keymap_translate_keyboard_state (GdkKeymap * keymap, 756 guint hardware_keycode, 757 GdkModifierType state, 758 gint group, 759 guint * keyval, 760 gint * effective_group, 761 gint * level, 762 GdkModifierType * 763 consumed_modifiers) 764 { 765 CHECK_LOAD_SYMBOL_GDK (gdk_keymap_translate_keyboard_state); 766 return (*_gdk_keymap_translate_keyboard_state) (keymap, hardware_keycode, 767 state, group, keyval, 768 effective_group, level, 769 consumed_modifiers); 770 } 771 772 guint32 gdk_keyval_to_unicode (guint keyval) 773 { 774 CHECK_LOAD_SYMBOL_GDK (gdk_keyval_to_unicode); 775 return (*_gdk_keyval_to_unicode) (keyval); 776 } 777 778 GdkPixbuf *gdk_pixbuf_get_from_drawable (GdkPixbuf * dest, 779 GdkDrawable * src, 780 GdkColormap * cmap, 781 int src_x, 782 int src_y, 783 int dest_x, 784 int dest_y, int width, int height) 785 { 786 CHECK_LOAD_SYMBOL_GDK (gdk_pixbuf_get_from_drawable); 787 return (*_gdk_pixbuf_get_from_drawable) (dest, src, cmap, src_x, src_y, 788 dest_x, dest_y, width, height); 789 } 790 791 void gdk_pixbuf_render_pixmap_and_mask (GdkPixbuf * pixbuf, 792 GdkPixmap ** pixmap_return, 793 GdkBitmap ** mask_return, 794 int alpha_threshold) 795 { 796 CHECK_LOAD_SYMBOL_GDK (gdk_pixbuf_render_pixmap_and_mask); 797 (*_gdk_pixbuf_render_pixmap_and_mask) (pixbuf, pixmap_return, mask_return, 798 alpha_threshold); 799 } 800 801 void gdk_pixbuf_render_pixmap_and_mask_for_colormap (GdkPixbuf * pixbuf, 802 GdkColormap * colormap, 803 GdkPixmap ** 804 pixmap_return, 805 GdkBitmap ** mask_return, 806 int alpha_threshold) 807 { 808 CHECK_LOAD_SYMBOL_GDK (gdk_pixbuf_render_pixmap_and_mask_for_colormap); 809 (*_gdk_pixbuf_render_pixmap_and_mask_for_colormap) (pixbuf, colormap, 810 pixmap_return, 811 mask_return, 812 alpha_threshold); 813 } 814 815 GdkGrabStatus gdk_pointer_grab (GdkWindow * window, 816 gboolean owner_events, 817 GdkEventMask event_mask, 818 GdkWindow * confine_to, 819 GdkCursor * cursor, guint32 time_) 820 { 821 CHECK_LOAD_SYMBOL_GDK (gdk_pointer_grab); 822 return (*_gdk_pointer_grab) (window, owner_events, event_mask, confine_to, 823 cursor, time_); 824 } 825 826 void gdk_pointer_ungrab (guint32 time_) 827 { 828 CHECK_LOAD_SYMBOL_GDK (gdk_pointer_ungrab); 829 return (*_gdk_pointer_ungrab) (time_); 830 } 831 832 void gdk_property_change (GdkWindow * window, 833 GdkAtom property, 834 GdkAtom type, 835 gint format, 836 GdkPropMode mode, 837 const guchar * data, gint nelements) 838 { 839 CHECK_LOAD_SYMBOL_GDK (gdk_property_change); 840 return (*_gdk_property_change) (window, property, type, format, mode, 841 data, nelements); 842 } 843 844 gboolean gdk_property_get (GdkWindow * window, 845 GdkAtom property, 846 GdkAtom type, 847 gulong offset, 848 gulong length, 849 gint pdelete, 850 GdkAtom * actual_property_type, 851 gint * actual_format, 852 gint * actual_length, guchar ** data) 853 { 854 CHECK_LOAD_SYMBOL_GDK (gdk_property_get); 855 return (*_gdk_property_get) (window, property, type, offset, length, 856 pdelete, actual_property_type, actual_format, 857 actual_length, data); 858 } 859 860 gboolean gdk_rectangle_intersect (const GdkRectangle * src1, 861 const GdkRectangle * src2, 862 GdkRectangle * dest) 863 { 864 CHECK_LOAD_SYMBOL_GDK (gdk_rectangle_intersect); 865 return (*_gdk_rectangle_intersect) (src1, src2, dest); 866 } 867 868 void gdk_region_destroy (GdkRegion * region) 869 { 870 CHECK_LOAD_SYMBOL_GDK (gdk_region_destroy); 871 (*_gdk_region_destroy) (region); 872 } 873 874 GdkRegion *gdk_region_new (void) 875 { 876 CHECK_LOAD_SYMBOL_GDK (gdk_region_new); 877 return (*_gdk_region_new) (); 878 } 879 880 GdkScreen *gdk_screen_get_default (void) 881 { 882 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_default); 883 return (*_gdk_screen_get_default) (); 884 } 885 886 gint gdk_screen_get_height (GdkScreen * screen) 887 { 888 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_height); 889 return (*_gdk_screen_get_height) (screen); 890 } 891 892 gint gdk_screen_get_monitor_at_point (GdkScreen * screen, gint x, gint y) 893 { 894 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_monitor_at_point); 895 return (*_gdk_screen_get_monitor_at_point) (screen, x, y); 896 } 897 898 void gdk_screen_get_monitor_geometry (GdkScreen * screen, 899 gint monitor_num, GdkRectangle * dest) 900 { 901 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_monitor_geometry); 902 (*_gdk_screen_get_monitor_geometry) (screen, monitor_num, dest); 903 } 904 905 gint gdk_screen_get_n_monitors (GdkScreen * screen) 906 { 907 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_n_monitors); 908 return (*_gdk_screen_get_n_monitors) (screen); 909 } 910 911 gint gdk_screen_get_width_mm (GdkScreen * screen) 912 { 913 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_width_mm); 914 return (*_gdk_screen_get_width_mm) (screen); 915 } 916 917 gint gdk_screen_get_height_mm (GdkScreen * screen) 918 { 919 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_height_mm); 920 return (*_gdk_screen_get_height_mm) (screen); 921 } 922 923 gint gdk_screen_get_monitor_width_mm (GdkScreen * screen, gint monitor_num) 924 { 925 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_monitor_width_mm); 926 return (*_gdk_screen_get_monitor_width_mm) (screen, monitor_num); 927 } 928 929 gint gdk_screen_get_monitor_height_mm (GdkScreen * screen, gint monitor_num) 930 { 931 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_monitor_height_mm); 932 return (*_gdk_screen_get_monitor_height_mm) (screen, monitor_num); 933 } 934 935 gdouble gdk_screen_get_resolution (GdkScreen * screen) 936 { 937 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_resolution); 938 return (*_gdk_screen_get_resolution) (screen); 939 } 940 941 GdkColormap *gdk_screen_get_rgba_colormap (GdkScreen * screen) 942 { 943 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_rgba_colormap); 944 return (*_gdk_screen_get_rgba_colormap) (screen); 945 } 946 947 GdkColormap *gdk_screen_get_rgb_colormap (GdkScreen * screen) 948 { 949 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_rgb_colormap); 950 return (*_gdk_screen_get_rgb_colormap) (screen); 951 } 952 953 GdkWindow *gdk_screen_get_root_window (GdkScreen * screen) 954 { 955 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_root_window); 956 return (*_gdk_screen_get_root_window) (screen); 957 } 958 959 GdkVisual *gdk_screen_get_system_visual (GdkScreen * screen) 960 { 961 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_system_visual); 962 return (*_gdk_screen_get_system_visual) (screen); 963 } 964 965 gint gdk_screen_get_width (GdkScreen * screen) 966 { 967 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_width); 968 return (*_gdk_screen_get_width) (screen); 969 } 970 971 gboolean gdk_screen_is_composited (GdkScreen * screen) 972 { 973 CHECK_LOAD_SYMBOL_GDK (gdk_screen_is_composited); 974 return (*_gdk_screen_is_composited) (screen); 975 } 976 977 void gdk_selection_convert (GdkWindow * requestor, 978 GdkAtom selection, GdkAtom target, guint32 time_) 979 { 980 CHECK_LOAD_SYMBOL_GDK (gdk_selection_convert); 981 (*_gdk_selection_convert) (requestor, selection, target, time_); 982 } 983 984 gboolean gdk_selection_owner_set (GdkWindow * owner, 985 GdkAtom selection, 986 guint32 time_, gboolean send_event) 987 { 988 CHECK_LOAD_SYMBOL_GDK (gdk_selection_owner_set); 989 return (*_gdk_selection_owner_set) (owner, selection, time_, send_event); 990 } 991 992 gint gdk_selection_property_get (GdkWindow * requestor, 993 guchar ** data, 994 GdkAtom * prop_type, gint * prop_format) 995 { 996 CHECK_LOAD_SYMBOL_GDK (gdk_selection_property_get); 997 return (*_gdk_selection_property_get) (requestor, data, prop_type, 998 prop_format); 999 } 1000 1001 void gdk_selection_send_notify (GdkNativeWindow requestor, 1002 GdkAtom selection, 1003 GdkAtom target, 1004 GdkAtom property, guint32 time_) 1005 { 1006 CHECK_LOAD_SYMBOL_GDK (gdk_selection_send_notify); 1007 return (*_gdk_selection_send_notify) (requestor, selection, target, 1008 property, time_); 1009 } 1010 1011 guint gdk_unicode_to_keyval (guint32 wc) 1012 { 1013 CHECK_LOAD_SYMBOL_GDK (gdk_unicode_to_keyval); 1014 return (*_gdk_unicode_to_keyval) (wc); 1015 } 1016 1017 guint gdk_threads_add_idle_full (gint priority, 1018 GSourceFunc function, 1019 gpointer data, GDestroyNotify notify) 1020 { 1021 CHECK_LOAD_SYMBOL_GDK (gdk_threads_add_idle_full); 1022 return (*_gdk_threads_add_idle_full) (priority, function, data, notify); 1023 } 1024 1025 guint gdk_threads_add_idle (GSourceFunc function, gpointer data) 1026 { 1027 CHECK_LOAD_SYMBOL_GDK (gdk_threads_add_idle); 1028 return (*_gdk_threads_add_idle) (function, data); 1029 } 1030 1031 guint gdk_threads_add_timeout_full (gint priority, 1032 guint interval, 1033 GSourceFunc function, 1034 gpointer data, GDestroyNotify notify) 1035 { 1036 CHECK_LOAD_SYMBOL_GDK (gdk_threads_add_timeout_full); 1037 return (*_gdk_threads_add_timeout_full) (priority, interval, function, 1038 data, notify); 1039 } 1040 1041 void gdk_threads_enter (void) 1042 { 1043 CHECK_LOAD_SYMBOL_GDK (gdk_threads_enter); 1044 (*_gdk_threads_enter) (); 1045 } 1046 1047 void gdk_threads_init (void) 1048 { 1049 CHECK_LOAD_SYMBOL_GDK (gdk_threads_init); 1050 (*_gdk_threads_init) (); 1051 } 1052 1053 void gdk_threads_leave (void) 1054 { 1055 CHECK_LOAD_SYMBOL_GDK (gdk_threads_leave); 1056 (*_gdk_threads_leave) (); 1057 } 1058 1059 void gdk_window_destroy (GdkWindow * window) 1060 { 1061 CHECK_LOAD_SYMBOL_GDK (gdk_window_destroy); 1062 (*_gdk_window_destroy) (window); 1063 } 1064 1065 GdkCursor *gdk_window_get_cursor (GdkWindow * window) 1066 { 1067 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_cursor); 1068 return (*_gdk_window_get_cursor) (window); 1069 } 1070 1071 GdkEventMask gdk_window_get_events (GdkWindow * window) 1072 { 1073 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_events); 1074 return (*_gdk_window_get_events) (window); 1075 } 1076 1077 void gdk_window_get_geometry (GdkWindow * window, 1078 gint * x, 1079 gint * y, 1080 gint * width, gint * height, gint * depth) 1081 { 1082 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_geometry); 1083 (*_gdk_window_get_geometry) (window, x, y, width, height, depth); 1084 } 1085 1086 gint gdk_window_get_origin (GdkWindow * window, gint * x, gint * y) 1087 { 1088 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_origin); 1089 return (*_gdk_window_get_origin) (window, x, y); 1090 } 1091 1092 gboolean gdk_window_is_destroyed (GdkWindow * window) 1093 { 1094 CHECK_LOAD_SYMBOL_GDK (gdk_window_is_destroyed); 1095 return (*_gdk_window_is_destroyed) (window); 1096 } 1097 1098 void gdk_window_move (GdkWindow * window, gint x, gint y) 1099 { 1100 CHECK_LOAD_SYMBOL_GDK (gdk_window_move); 1101 (*_gdk_window_move) (window, x, y); 1102 } 1103 1104 GdkWindow *gdk_window_new (GdkWindow * parent, 1105 GdkWindowAttr * attributes, gint attributes_mask) 1106 { 1107 CHECK_LOAD_SYMBOL_GDK (gdk_window_new); 1108 return (*_gdk_window_new) (parent, attributes, attributes_mask); 1109 } 1110 1111 void gdk_window_register_dnd (GdkWindow * window) 1112 { 1113 CHECK_LOAD_SYMBOL_GDK (gdk_window_register_dnd); 1114 (*_gdk_window_register_dnd) (window); 1115 } 1116 1117 void gdk_window_resize (GdkWindow * window, gint width, gint height) 1118 { 1119 CHECK_LOAD_SYMBOL_GDK (gdk_window_resize); 1120 (*_gdk_window_resize) (window, width, height); 1121 } 1122 1123 void gdk_window_restack (GdkWindow * window, 1124 GdkWindow * sibling, gboolean above) 1125 { 1126 CHECK_LOAD_SYMBOL_GDK (gdk_window_restack); 1127 (*_gdk_window_restack) (window, sibling, above); 1128 } 1129 1130 void gdk_window_set_cursor (GdkWindow * window, GdkCursor * cursor) 1131 { 1132 CHECK_LOAD_SYMBOL_GDK (gdk_window_set_cursor); 1133 (*_gdk_window_set_cursor) (window, cursor); 1134 } 1135 1136 void gdk_window_set_events (GdkWindow * window, GdkEventMask event_mask) 1137 { 1138 CHECK_LOAD_SYMBOL_GDK (gdk_window_set_events); 1139 (*_gdk_window_set_events) (window, event_mask); 1140 } 1141 1142 void gdk_window_set_functions (GdkWindow * window, GdkWMFunction functions) 1143 { 1144 CHECK_LOAD_SYMBOL_GDK (gdk_window_set_functions); 1145 (*_gdk_window_set_functions) (window, functions); 1146 } 1147 1148 void gdk_window_show (GdkWindow * window) 1149 { 1150 CHECK_LOAD_SYMBOL_GDK (gdk_window_show); 1151 (*_gdk_window_show) (window); 1152 } 1153 1154 Display *gdk_x11_display_get_xdisplay (GdkDisplay * display) 1155 { 1156 CHECK_LOAD_SYMBOL_GDK (gdk_x11_display_get_xdisplay); 1157 return (*_gdk_x11_display_get_xdisplay) (display); 1158 } 1159 1160 XID gdk_x11_drawable_get_xid (GdkDrawable * drawable) 1161 { 1162 if (wrapper_gtk_version == 2) { 1163 CHECK_LOAD_SYMBOL_GDK (gdk_x11_drawable_get_xid); 1164 return (*_gdk_x11_drawable_get_xid) (drawable); 1165 } else { 1166 CHECK_LOAD_SYMBOL_GDK (gdk_x11_window_get_xid); 1167 return (*_gdk_x11_window_get_xid) (drawable); 1168 } 1169 } 1170 1171 gint gdk_x11_get_default_screen (void) 1172 { 1173 CHECK_LOAD_SYMBOL_GDK (gdk_x11_get_default_screen); 1174 return (*_gdk_x11_get_default_screen) (); 1175 } 1176 1177 Display *gdk_x11_get_default_xdisplay (void) 1178 { 1179 CHECK_LOAD_SYMBOL_GDK (gdk_x11_get_default_xdisplay); 1180 return (*_gdk_x11_get_default_xdisplay) (); 1181 } 1182 1183 guint32 gdk_x11_get_server_time (GdkWindow * window) 1184 { 1185 CHECK_LOAD_SYMBOL_GDK (gdk_x11_get_server_time); 1186 return (*_gdk_x11_get_server_time) (window); 1187 } 1188 1189 GdkVisual *gdk_x11_screen_lookup_visual (GdkScreen * screen, 1190 VisualID xvisualid) 1191 { 1192 CHECK_LOAD_SYMBOL_GDK (gdk_x11_screen_lookup_visual); 1193 return (*_gdk_x11_screen_lookup_visual) (screen, xvisualid); 1194 } 1195 1196 GdkWindow *gdk_x11_window_foreign_new_for_display (GdkDisplay * display, 1197 Window window) 1198 { 1199 CHECK_LOAD_SYMBOL_GDK (gdk_x11_window_foreign_new_for_display); 1200 return (*_gdk_x11_window_foreign_new_for_display) (display, window); 1201 } 1202 1203 GdkWindow *gdk_x11_window_lookup_for_display (GdkDisplay * display, 1204 Window window) 1205 { 1206 CHECK_LOAD_SYMBOL_GDK (gdk_x11_window_lookup_for_display); 1207 return (*_gdk_x11_window_lookup_for_display) (display, window); 1208 } 1209 1210 GdkDisplay *gdk_window_get_display (GdkWindow * window) 1211 { 1212 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_display); 1213 return (*_gdk_window_get_display) (window); 1214 } 1215 1216 int gdk_window_get_height (GdkWindow * window) 1217 { 1218 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_height); 1219 return (*_gdk_window_get_height) (window); 1220 } 1221 1222 int gdk_window_get_width (GdkWindow * window) 1223 { 1224 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_width); 1225 return (*_gdk_window_get_width) (window); 1226 } 1227 1228 GdkScreen *gdk_window_get_screen (GdkWindow * window) 1229 { 1230 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_screen); 1231 return (*_gdk_window_get_screen) (window); 1232 } 1233 1234 1235 //-------------------------------------------------------------------------------------- 1236 1237 1238 GdkVisual * gdk_window_get_visual (GdkWindow *window) 1239 { 1240 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_visual); 1241 return (*_gdk_window_get_visual)(window); 1242 } 1243 1244 GdkScreen *gdk_visual_get_screen (GdkVisual *visual) 1245 { 1246 CHECK_LOAD_SYMBOL_GDK (gdk_visual_get_screen); 1247 return (*_gdk_visual_get_screen)(visual); 1248 } 1249 1250 //-------------------------------------------------------------------------------------- 1251 1252 Window 1253 gdk_x11_window_get_xid(GdkWindow *window) 1254 { 1255 CHECK_LOAD_SYMBOL_GDK (gdk_x11_window_get_xid); 1256 return (*_gdk_x11_window_get_xid)(window); 1257 } 1258 1259 GType 1260 gdk_window_object_get_type (void) 1261 { 1262 if (wrapper_gtk_version == 2) { 1263 return (*_gdk_window_object_get_type)(); 1264 } else { 1265 return (*_gdk_window_get_type)(); 1266 } 1267 } 1268 1269 cairo_region_t * 1270 gdk_cairo_region_create_from_surface (cairo_surface_t *surface) 1271 { 1272 return (*_gdk_cairo_region_create_from_surface)(surface); 1273 } 1274 1275 //-------------------------------------------------------------------------------------- 1276 1277 typedef struct _DeviceGrabContext { 1278 GdkWindow * window; 1279 gboolean grabbed; 1280 } DeviceGrabContext; 1281 1282 1283 1284 gboolean disableGrab = FALSE; 1285 static gboolean configure_transparent_window(GtkWidget *window); 1286 static void configure_opaque_window(GtkWidget *window); 1287 1288 static void grab_mouse_device(GdkDevice *device, DeviceGrabContext *context); 1289 static void ungrab_mouse_device(GdkDevice *device); 1290 1291 gint glass_gdk_visual_get_depth (GdkVisual * visual) 1292 { 1293 // gdk_visual_get_depth is GTK 2.2 + 1294 if (_gdk_visual_get_depth) { 1295 CHECK_LOAD_SYMBOL_GDK (gdk_visual_get_depth); 1296 return (*_gdk_visual_get_depth) (visual); 1297 } else { 1298 return visual ? visual->depth : 0; 1299 } 1300 } 1301 1302 GdkScreen * glass_gdk_window_get_screen(GdkWindow * gdkWindow) 1303 { 1304 if (wrapper_gtk_version == 2) { 1305 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_screen); 1306 return (*_gdk_window_get_screen)(gdkWindow); 1307 } else { 1308 GdkVisual * gdkVisual = gdk_window_get_visual(gdkWindow); 1309 return gdk_visual_get_screen(gdkVisual); 1310 } 1311 } 1312 1313 gboolean 1314 glass_gdk_mouse_devices_grab(GdkWindow *gdkWindow) { 1315 if (wrapper_gtk_version == 2) { 1316 return glass_gdk_mouse_devices_grab_with_cursor(gdkWindow, NULL, TRUE); 1317 } else { 1318 if (disableGrab) { 1319 return TRUE; 1320 } 1321 1322 CHECK_LOAD_SYMBOL_GDK (gdk_device_manager_list_devices); 1323 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_device_manager); 1324 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_default); 1325 1326 DeviceGrabContext context; 1327 GList *devices = (*_gdk_device_manager_list_devices) ( 1328 (*_gdk_display_get_device_manager)( 1329 gdk_display_get_default()), 1330 GDK_DEVICE_TYPE_MASTER); 1331 1332 context.window = gdkWindow; 1333 context.grabbed = FALSE; 1334 g_list_foreach(devices, (GFunc) grab_mouse_device, &context); 1335 1336 return context.grabbed; 1337 } 1338 } 1339 1340 gboolean 1341 glass_gdk_mouse_devices_grab_with_cursor(GdkWindow *gdkWindow, GdkCursor *cursor, gboolean owner_events) { 1342 if (disableGrab) { 1343 return TRUE; 1344 } 1345 CHECK_LOAD_SYMBOL_GDK (gdk_pointer_grab); 1346 GdkGrabStatus status = (*_gdk_pointer_grab)(gdkWindow, owner_events, (GdkEventMask) 1347 (GDK_POINTER_MOTION_MASK 1348 | GDK_POINTER_MOTION_HINT_MASK 1349 | GDK_BUTTON_MOTION_MASK 1350 | GDK_BUTTON1_MOTION_MASK 1351 | GDK_BUTTON2_MOTION_MASK 1352 | GDK_BUTTON3_MOTION_MASK 1353 | GDK_BUTTON_PRESS_MASK 1354 | GDK_BUTTON_RELEASE_MASK), 1355 NULL, cursor, GDK_CURRENT_TIME); 1356 1357 return (status == GDK_GRAB_SUCCESS) ? TRUE : FALSE; 1358 } 1359 1360 void 1361 glass_gdk_mouse_devices_ungrab() { 1362 if (wrapper_gtk_version == 2) { 1363 CHECK_LOAD_SYMBOL_GDK (gdk_pointer_ungrab); 1364 (*_gdk_pointer_ungrab)(GDK_CURRENT_TIME); 1365 } else { 1366 CHECK_LOAD_SYMBOL_GDK (gdk_device_manager_list_devices); 1367 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_device_manager); 1368 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_default); 1369 1370 GList *devices = (*_gdk_device_manager_list_devices)( 1371 (*_gdk_display_get_device_manager)( 1372 (*_gdk_display_get_default)()), 1373 GDK_DEVICE_TYPE_MASTER); 1374 g_list_foreach(devices, (GFunc) ungrab_mouse_device, NULL); 1375 } 1376 } 1377 1378 void 1379 glass_gdk_master_pointer_grab(GdkWindow *window, GdkCursor *cursor) { 1380 if (disableGrab) { 1381 CHECK_LOAD_SYMBOL_GDK (gdk_window_set_cursor); 1382 (*_gdk_window_set_cursor)(window, cursor); 1383 return; 1384 } 1385 if (wrapper_gtk_version == 2) { 1386 CHECK_LOAD_SYMBOL_GDK (gdk_pointer_grab); 1387 (*_gdk_pointer_grab)(window, FALSE, (GdkEventMask) 1388 (GDK_POINTER_MOTION_MASK 1389 | GDK_BUTTON_MOTION_MASK 1390 | GDK_BUTTON1_MOTION_MASK 1391 | GDK_BUTTON2_MOTION_MASK 1392 | GDK_BUTTON3_MOTION_MASK 1393 | GDK_BUTTON_RELEASE_MASK), 1394 NULL, cursor, GDK_CURRENT_TIME); 1395 } else { 1396 CHECK_LOAD_SYMBOL_GDK (gdk_device_grab); 1397 CHECK_LOAD_SYMBOL_GDK (gdk_device_manager_get_client_pointer); 1398 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_device_manager); 1399 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_default); 1400 1401 (*_gdk_device_grab)((*_gdk_device_manager_get_client_pointer)( 1402 (*_gdk_display_get_device_manager)( 1403 (*_gdk_display_get_default)())), 1404 window, GDK_OWNERSHIP_NONE, FALSE, GDK_ALL_EVENTS_MASK, 1405 cursor, GDK_CURRENT_TIME); 1406 } 1407 } 1408 1409 void 1410 glass_gdk_master_pointer_ungrab() { 1411 if (wrapper_gtk_version == 2) { 1412 CHECK_LOAD_SYMBOL_GDK (gdk_pointer_ungrab); 1413 (*_gdk_pointer_ungrab)(GDK_CURRENT_TIME); 1414 } else { 1415 CHECK_LOAD_SYMBOL_GDK (gdk_device_ungrab); 1416 CHECK_LOAD_SYMBOL_GDK (gdk_device_manager_get_client_pointer); 1417 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_device_manager); 1418 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_default); 1419 (*_gdk_device_ungrab)((*_gdk_device_manager_get_client_pointer)( 1420 (*_gdk_display_get_device_manager)( 1421 (*_gdk_display_get_default)())), 1422 GDK_CURRENT_TIME); 1423 } 1424 } 1425 1426 void 1427 glass_gdk_master_pointer_get_position(gint *x, gint *y) { 1428 if (wrapper_gtk_version == 2) { 1429 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_pointer); 1430 (*_gdk_display_get_pointer)(gdk_display_get_default(), NULL, x, y, NULL); 1431 } else { 1432 CHECK_LOAD_SYMBOL_GDK (gdk_device_manager_get_client_pointer); 1433 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_device_manager); 1434 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_default); 1435 (*_gdk_device_get_position)((*_gdk_device_manager_get_client_pointer)( 1436 (*_gdk_display_get_device_manager)( 1437 (*_gdk_display_get_default)())), 1438 NULL, x, y); 1439 } 1440 } 1441 1442 gboolean 1443 glass_gdk_device_is_grabbed(GdkDevice *device) { 1444 if (wrapper_gtk_version == 2) { 1445 (void) device; 1446 CHECK_LOAD_SYMBOL_GDK (gdk_display_pointer_is_grabbed); 1447 return (*_gdk_display_pointer_is_grabbed)(gdk_display_get_default()); 1448 } else { 1449 CHECK_LOAD_SYMBOL_GDK (gdk_display_device_is_grabbed); 1450 return (*_gdk_display_device_is_grabbed)((*_gdk_display_get_default)(), device); 1451 } 1452 } 1453 1454 void 1455 glass_gdk_device_ungrab(GdkDevice *device) { 1456 if (wrapper_gtk_version == 2) { 1457 (void) device; 1458 CHECK_LOAD_SYMBOL_GDK (gdk_pointer_ungrab); 1459 (*_gdk_pointer_ungrab)(GDK_CURRENT_TIME); 1460 } else { 1461 CHECK_LOAD_SYMBOL_GDK (gdk_device_ungrab); 1462 (*_gdk_device_ungrab)(device, GDK_CURRENT_TIME); 1463 } 1464 } 1465 1466 GdkWindow * 1467 glass_gdk_device_get_window_at_position(GdkDevice *device, gint *x, gint *y) { 1468 if (wrapper_gtk_version == 2) { 1469 (void) device; 1470 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_window_at_pointer); 1471 return (*_gdk_display_get_window_at_pointer)(gdk_display_get_default(), x, y); 1472 } else { 1473 CHECK_LOAD_SYMBOL_GDK (gdk_device_get_window_at_position); 1474 return (*_gdk_device_get_window_at_position)(device, x, y); 1475 } 1476 } 1477 1478 void 1479 glass_gtk_configure_transparency_and_realize(GtkWidget *window, 1480 gboolean transparent) { 1481 if (wrapper_gtk_version == 2) { 1482 glass_configure_window_transparency(window, transparent); 1483 gtk_widget_realize(window); 1484 } else { 1485 CHECK_LOAD_SYMBOL_GDK (gdk_window_set_background_rgba); 1486 gboolean isTransparent = glass_configure_window_transparency(window, transparent); 1487 gtk_widget_realize(window); 1488 if (isTransparent) { 1489 GdkRGBA rgba = { 1.0, 1.0, 1.0, 0.0 }; 1490 (*_gdk_window_set_background_rgba)(gtk_widget_get_window(window), &rgba); 1491 } 1492 } 1493 } 1494 1495 void 1496 glass_gtk_window_configure_from_visual(GtkWidget *widget, GdkVisual *visual) { 1497 glass_widget_set_visual(widget, visual); 1498 } 1499 1500 static gboolean 1501 configure_transparent_window(GtkWidget *window) { 1502 GdkScreen *default_screen = (*_gdk_screen_get_default)(); 1503 GdkDisplay *default_display = (*_gdk_display_get_default)(); 1504 1505 if (wrapper_gtk_version == 2) { 1506 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_rgba_colormap); 1507 CHECK_LOAD_SYMBOL_GDK (gdk_display_supports_composite); 1508 CHECK_LOAD_SYMBOL_GDK (gdk_screen_is_composited); 1509 GdkColormap *colormap = (*_gdk_screen_get_rgba_colormap)(default_screen); 1510 if (colormap 1511 && (*_gdk_display_supports_composite)(default_display) 1512 && (*_gdk_screen_is_composited)(default_screen)) { 1513 gtk_widget_set_colormap(window, colormap); 1514 return TRUE; 1515 } 1516 } else { 1517 CHECK_LOAD_SYMBOL_GDK (gdk_display_supports_composite); 1518 CHECK_LOAD_SYMBOL_GDK (gdk_screen_is_composited); 1519 GdkVisual *visual = (*_gdk_screen_get_rgba_visual)(default_screen); 1520 if (visual 1521 && (*_gdk_display_supports_composite)(default_display) 1522 && (*_gdk_screen_is_composited)(default_screen)) { 1523 glass_widget_set_visual(window, visual); 1524 return TRUE; 1525 } 1526 1527 return FALSE; 1528 } 1529 1530 return FALSE; 1531 } 1532 1533 int 1534 glass_gtk_fixup_typed_key(int key, int keyval) { 1535 if (wrapper_gtk_version == 2) { 1536 if (key == 0) { 1537 // Work around "bug" fixed in gtk-3.0: 1538 // http://mail.gnome.org/archives/commits-list/2011-March/msg06832.html 1539 switch (keyval) { 1540 case 0xFF08 /* Backspace */: return '\b'; 1541 case 0xFF09 /* Tab */: return '\t'; 1542 case 0xFF0A /* Linefeed */: return '\n'; 1543 case 0xFF0B /* Vert. Tab */: return '\v'; 1544 case 0xFF0D /* Return */: return '\r'; 1545 case 0xFF1B /* Escape */: return '\033'; 1546 case 0xFFFF /* Delete */: return '\177'; 1547 } 1548 } 1549 } 1550 return key; 1551 } 1552 1553 void 1554 glass_gdk_window_get_size(GdkWindow *window, gint *w, gint *h) { 1555 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_width); 1556 CHECK_LOAD_SYMBOL_GDK (gdk_window_get_height); 1557 *w = (*_gdk_window_get_width)(window); 1558 *h = (*_gdk_window_get_height)(window); 1559 } 1560 1561 void 1562 glass_gdk_display_get_pointer(GdkDisplay* display, gint* x, gint *y) { 1563 if (wrapper_gtk_version == 2) { 1564 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_pointer); 1565 (*_gdk_display_get_pointer)(display, NULL, x, y, NULL); 1566 } else { 1567 CHECK_LOAD_SYMBOL_GDK (gdk_device_get_position); 1568 CHECK_LOAD_SYMBOL_GDK (gdk_device_manager_get_client_pointer); 1569 CHECK_LOAD_SYMBOL_GDK (gdk_display_get_device_manager); 1570 (*_gdk_device_get_position)( 1571 (*_gdk_device_manager_get_client_pointer)( 1572 (*_gdk_display_get_device_manager)(display)), NULL , x, y); 1573 } 1574 } 1575 1576 1577 const guchar* 1578 glass_gtk_selection_data_get_data_with_length( 1579 GtkSelectionData * selectionData, 1580 gint * length) { 1581 if (selectionData == NULL) { 1582 return NULL; 1583 } 1584 1585 *length = gtk_selection_data_get_length(selectionData); 1586 return gtk_selection_data_get_data(selectionData); 1587 } 1588 1589 static void 1590 configure_opaque_window(GtkWidget *window) { 1591 (void) window; 1592 /* We need to pick a visual that really is glx compatible 1593 * instead of using the default visual 1594 * 1595 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_system_visual); 1596 CHECK_LOAD_SYMBOL_GDK (gdk_screen_get_default); 1597 glass_widget_set_visual(window, 1598 gdk_screen_get_system_visual( 1599 gdk_screen_get_default())); 1600 */ 1601 } 1602 1603 gboolean 1604 glass_configure_window_transparency(GtkWidget *window, gboolean transparent) { 1605 if (transparent) { 1606 if (configure_transparent_window(window)) { 1607 return TRUE; 1608 } 1609 1610 fprintf(stderr,"Can't create transparent stage, because your screen doesn't" 1611 " support alpha channel." 1612 " You need to enable XComposite extension.\n"); 1613 fflush(stderr); 1614 } 1615 1616 configure_opaque_window(window); 1617 return FALSE; 1618 } 1619 1620 static void 1621 grab_mouse_device(GdkDevice *device, DeviceGrabContext *context) { 1622 CHECK_LOAD_SYMBOL_GDK (gdk_device_get_source); 1623 CHECK_LOAD_SYMBOL_GDK (gdk_device_grab); 1624 GdkInputSource source = (*_gdk_device_get_source)(device); 1625 if (source == GDK_SOURCE_MOUSE) { 1626 GdkGrabStatus status = (*_gdk_device_grab)(device, 1627 context->window, 1628 GDK_OWNERSHIP_NONE, 1629 TRUE, 1630 GDK_ALL_EVENTS_MASK, 1631 NULL, 1632 GDK_CURRENT_TIME); 1633 if (status == GDK_GRAB_SUCCESS) { 1634 context->grabbed = TRUE; 1635 } 1636 } 1637 } 1638 1639 static void 1640 ungrab_mouse_device(GdkDevice *device) { 1641 CHECK_LOAD_SYMBOL_GDK (gdk_device_get_source); 1642 CHECK_LOAD_SYMBOL_GDK (gdk_device_ungrab); 1643 GdkInputSource source = (*_gdk_device_get_source)(device); 1644 if (source == GDK_SOURCE_MOUSE) { 1645 (*_gdk_device_ungrab)(device, GDK_CURRENT_TIME); 1646 } 1647 } 1648 1649 GdkPixbuf * 1650 glass_pixbuf_from_window(GdkWindow *window, 1651 gint srcx, gint srcy, 1652 gint width, gint height) 1653 { 1654 GdkPixbuf * ret = NULL; 1655 1656 if (wrapper_gtk_version == 2) { 1657 CHECK_LOAD_SYMBOL_GDK (gdk_pixbuf_get_from_drawable); 1658 ret = (*_gdk_pixbuf_get_from_drawable) (NULL, 1659 window, 1660 NULL, 1661 srcx, srcy, 1662 0, 0, 1663 width, height); 1664 } else { 1665 CHECK_LOAD_SYMBOL_GDK (gdk_pixbuf_get_from_window); 1666 ret = (*_gdk_pixbuf_get_from_window) (window, srcx, srcy, width, height); 1667 } 1668 1669 return ret; 1670 } 1671 1672 void 1673 glass_window_apply_shape_mask(GdkWindow *window, 1674 void* data, uint width, uint height) 1675 { 1676 if (wrapper_gtk_version == 2) { 1677 CHECK_LOAD_SYMBOL_GDK (gdk_window_input_shape_combine_mask); 1678 1679 GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data((guchar *) data, 1680 GDK_COLORSPACE_RGB, TRUE, 8, width, height, width * 4, NULL, NULL); 1681 1682 if (GDK_IS_PIXBUF(pixbuf)) { 1683 GdkBitmap* mask = NULL; 1684 gdk_pixbuf_render_pixmap_and_mask(pixbuf, NULL, &mask, 128); 1685 1686 (*_gdk_window_input_shape_combine_mask)(window, mask, 0, 0); 1687 1688 g_object_unref(pixbuf); 1689 if (mask) { 1690 g_object_unref(mask); 1691 } 1692 } 1693 } else { 1694 CHECK_LOAD_SYMBOL_GDK (gdk_window_shape_combine_region); 1695 CHECK_LOAD_SYMBOL_GDK (gdk_window_input_shape_combine_region); 1696 CHECK_LOAD_SYMBOL_GDK (gdk_cairo_region_create_from_surface); 1697 1698 cairo_surface_t * shape = cairo_image_surface_create_for_data( 1699 (unsigned char *)data, 1700 CAIRO_FORMAT_ARGB32, 1701 width, height, 1702 width * 4 1703 ); 1704 cairo_region_t *region = (*_gdk_cairo_region_create_from_surface) (shape); 1705 1706 (*_gdk_window_shape_combine_region) (window, region, 0, 0); 1707 1708 (*_gdk_window_input_shape_combine_region) (window, region, 0, 0); 1709 1710 cairo_region_destroy(region); 1711 cairo_surface_finish (shape); 1712 } 1713 } 1714 1715 void 1716 glass_window_reset_input_shape_mask(GdkWindow *window) 1717 { 1718 if (wrapper_gtk_version == 2) { 1719 CHECK_LOAD_SYMBOL_GDK (gdk_window_input_shape_combine_mask); 1720 (*_gdk_window_input_shape_combine_mask)(window, NULL, 0, 0); 1721 } else { 1722 CHECK_LOAD_SYMBOL_GDK (gdk_window_input_shape_combine_region); 1723 (*_gdk_window_input_shape_combine_region) (window, NULL, 0, 0); 1724 } 1725 } 1726 1727 GdkWindow * 1728 glass_gdk_drag_context_get_dest_window (GdkDragContext * context) 1729 { 1730 CHECK_LOAD_SYMBOL_GDK (gdk_drag_context_get_dest_window); 1731 return ((context != NULL) ? gdk_drag_context_get_dest_window(context) : NULL); 1732 } 1733 1734