static void gdk_wayland_display_dispose (GObject *object) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (object); g_list_foreach (display_wayland->input_devices, (GFunc) g_object_run_dispose, NULL); _gdk_screen_close (display_wayland->screen); if (display_wayland->event_source) { g_source_destroy (display_wayland->event_source); g_source_unref (display_wayland->event_source); display_wayland->event_source = NULL; } if (display_wayland->selection) { gdk_wayland_selection_free (display_wayland->selection); display_wayland->selection = NULL; } G_OBJECT_CLASS (gdk_wayland_display_parent_class)->dispose (object); }
static void gdk_wayland_display_dispose (GObject *object) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (object); _gdk_screen_close (display_wayland->screen); if (display_wayland->event_source) { g_source_destroy (display_wayland->event_source); g_source_unref (display_wayland->event_source); display_wayland->event_source = NULL; } if (display_wayland->selection) { gdk_wayland_selection_free (display_wayland->selection); display_wayland->selection = NULL; } g_list_free_full (display_wayland->async_roundtrips, (GDestroyNotify) wl_callback_destroy); if (display_wayland->known_globals) { g_hash_table_destroy (display_wayland->known_globals); display_wayland->known_globals = NULL; } g_list_free_full (display_wayland->on_has_globals_closures, g_free); G_OBJECT_CLASS (gdk_wayland_display_parent_class)->dispose (object); }
GdkDisplay * _gdk_wayland_display_open (const gchar *display_name) { struct wl_display *wl_display; GdkDisplay *display; GdkWaylandDisplay *display_wayland; GDK_NOTE (MISC, g_message ("opening display %s", display_name ? display_name : "")); /* If this variable is unset then wayland initialisation will surely * fail, logging a fatal error in the process. Save ourselves from * that. */ if (g_getenv ("XDG_RUNTIME_DIR") == NULL) return NULL; wl_log_set_handler_client (log_handler); wl_display = wl_display_connect (display_name); if (!wl_display) return NULL; display = g_object_new (GDK_TYPE_WAYLAND_DISPLAY, NULL); display->device_manager = _gdk_wayland_device_manager_new (display); display_wayland = GDK_WAYLAND_DISPLAY (display); display_wayland->wl_display = wl_display; display_wayland->screen = _gdk_wayland_screen_new (display); display_wayland->event_source = _gdk_wayland_display_event_source_new (display); display_wayland->known_globals = g_hash_table_new_full (NULL, NULL, NULL, g_free); _gdk_wayland_display_init_cursors (display_wayland); _gdk_wayland_display_prepare_cursor_themes (display_wayland); display_wayland->wl_registry = wl_display_get_registry (display_wayland->wl_display); wl_registry_add_listener (display_wayland->wl_registry, ®istry_listener, display_wayland); _gdk_wayland_display_async_roundtrip (display_wayland); /* Wait for initializing to complete. This means waiting for all * asynchrounous roundtrips that were triggered during initial roundtrip. */ while (g_list_length (display_wayland->async_roundtrips) > 0) { if (wl_display_dispatch (display_wayland->wl_display) < 0) { g_object_unref (display); return NULL; } } gdk_input_init (display); display_wayland->selection = gdk_wayland_selection_new (); g_signal_emit_by_name (display, "opened"); return display; }
static GdkScreen * gdk_wayland_display_get_default_screen (GdkDisplay *display) { g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); return GDK_WAYLAND_DISPLAY (display)->screen; }
GSource * _gdk_wayland_display_event_source_new (GdkDisplay *display) { GSource *source; GdkWaylandEventSource *wl_source; GdkWaylandDisplay *display_wayland; char *name; source = g_source_new (&wl_glib_source_funcs, sizeof (GdkWaylandEventSource)); name = g_strdup_printf ("GDK Wayland Event source (%s)", "display name"); g_source_set_name (source, name); g_free (name); wl_source = (GdkWaylandEventSource *) source; display_wayland = GDK_WAYLAND_DISPLAY (display); wl_source->display = display; wl_source->pfd.fd = wl_display_get_fd(display_wayland->wl_display); wl_source->pfd.events = G_IO_IN | G_IO_ERR | G_IO_HUP; g_source_add_poll(source, &wl_source->pfd); g_source_set_priority (source, GDK_PRIORITY_EVENTS); g_source_set_can_recurse (source, TRUE); g_source_attach (source, NULL); event_sources = g_list_prepend (event_sources, source); return source; }
static void gdk_x11_gl_context_dispose (GObject *gobject) { GdkWaylandGLContext *context_wayland = GDK_WAYLAND_GL_CONTEXT (gobject); if (context_wayland->egl_context != NULL) { GdkGLContext *context = GDK_GL_CONTEXT (gobject); GdkWindow *window = gdk_gl_context_get_window (context); GdkDisplay *display = gdk_window_get_display (window); GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); if (eglGetCurrentContext () == context_wayland->egl_context) eglMakeCurrent(display_wayland->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); GDK_NOTE (OPENGL, g_print ("Destroying EGL context\n")); eglDestroyContext (display_wayland->egl_display, context_wayland->egl_context); context_wayland->egl_context = NULL; } G_OBJECT_CLASS (gdk_wayland_gl_context_parent_class)->dispose (gobject); }
static GList * gdk_wayland_display_list_devices (GdkDisplay *display) { g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); return GDK_WAYLAND_DISPLAY (display)->input_devices; }
static void gdk_wayland_display_flush (GdkDisplay *display) { g_return_if_fail (GDK_IS_DISPLAY (display)); if (!display->closed) wl_display_flush (GDK_WAYLAND_DISPLAY (display)->wl_display); }
void _gdk_wayland_display_flush (GdkDisplay *display, GSource *source) { GdkWaylandEventSource *wayland_source = (GdkWaylandEventSource *) source; while (wayland_source->mask & WL_DISPLAY_WRITABLE) wl_display_iterate(GDK_WAYLAND_DISPLAY (display)->wl_display, WL_DISPLAY_WRITABLE); }
struct wl_data_source * gdk_wayland_selection_get_data_source (GdkWindow *owner, GdkAtom selection) { GdkDisplay *display = gdk_window_get_display (owner); GdkWaylandSelection *wayland_selection = gdk_wayland_display_get_selection (display); struct wl_data_source *source = NULL; GdkWaylandDisplay *display_wayland; gboolean is_clipboard = FALSE; if (selection == atoms[ATOM_DND]) { if (wayland_selection->dnd_source && (!owner || owner == wayland_selection->dnd_owner)) return wayland_selection->dnd_source; } else if (selection == atoms[ATOM_CLIPBOARD]) { if (wayland_selection->clipboard_source && (!owner || owner == wayland_selection->clipboard_owner)) return wayland_selection->clipboard_source; if (wayland_selection->clipboard_source) { wl_data_source_destroy (wayland_selection->clipboard_source); wayland_selection->clipboard_source = NULL; } is_clipboard = TRUE; } else return NULL; if (!owner) return NULL; display_wayland = GDK_WAYLAND_DISPLAY (gdk_window_get_display (owner)); source = wl_data_device_manager_create_data_source (display_wayland->data_device_manager); wl_data_source_add_listener (source, &data_source_listener, wayland_selection); if (is_clipboard) { wayland_selection->clipboard_source = source; wayland_selection->clipboard_owner = owner; } else { wayland_selection->dnd_source = source; wayland_selection->dnd_owner = owner; } return source; }
gboolean gdk_wayland_display_init_gl (GdkDisplay *display) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); EGLint major, minor; EGLDisplay *dpy; if (display_wayland->have_egl) return TRUE; dpy = eglGetDisplay ((EGLNativeDisplayType)display_wayland->wl_display); if (dpy == NULL) return FALSE; if (!eglInitialize (dpy, &major, &minor)) return FALSE; if (!eglBindAPI (EGL_OPENGL_API)) return FALSE; display_wayland->egl_display = dpy; display_wayland->egl_major_version = major; display_wayland->egl_minor_version = minor; display_wayland->have_egl = TRUE; display_wayland->have_egl_khr_create_context = epoxy_has_egl_extension (dpy, "EGL_KHR_create_context"); display_wayland->have_egl_buffer_age = epoxy_has_egl_extension (dpy, "EGL_EXT_buffer_age"); display_wayland->have_egl_swap_buffers_with_damage = epoxy_has_egl_extension (dpy, "EGL_EXT_swap_buffers_with_damage"); display_wayland->have_egl_surfaceless_context = epoxy_has_egl_extension (dpy, "EGL_KHR_surfaceless_context"); GDK_NOTE (OPENGL, g_print ("EGL API version %d.%d found\n" " - Vendor: %s\n" " - Version: %s\n" " - Client APIs: %s\n" " - Extensions:\n" "\t%s\n" , display_wayland->egl_major_version, display_wayland->egl_minor_version, eglQueryString (dpy, EGL_VENDOR), eglQueryString(dpy, EGL_VERSION), eglQueryString(dpy, EGL_CLIENT_APIS), eglQueryString(dpy, EGL_EXTENSIONS))); return TRUE; }
static void gdk_wayland_display_sync (GdkDisplay *display) { GdkWaylandDisplay *display_wayland; g_return_if_fail (GDK_IS_DISPLAY (display)); display_wayland = GDK_WAYLAND_DISPLAY (display); wl_display_roundtrip (display_wayland->wl_display); }
static void gdk_input_init (GdkDisplay *display) { GdkWaylandDisplay *display_wayland; display_wayland = GDK_WAYLAND_DISPLAY (display); display->core_pointer = gdk_seat_get_pointer (gdk_display_get_default_seat (display)); /* Add the core pointer to the devices list */ display_wayland->input_devices = g_list_prepend (display_wayland->input_devices, display->core_pointer); }
static void gdk_wayland_display_finalize (GObject *object) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (object); _gdk_wayland_display_finalize_cursors (display_wayland); g_object_unref (display_wayland->screen); g_free (display_wayland->startup_notification_id); G_OBJECT_CLASS (gdk_wayland_display_parent_class)->finalize (object); }
static void gdk_wayland_display_beep (GdkDisplay *display) { GdkWaylandDisplay *display_wayland; g_return_if_fail (GDK_IS_DISPLAY (display)); display_wayland = GDK_WAYLAND_DISPLAY (display); if (!display_wayland->gtk_shell) return; gtk_shell1_system_bell (display_wayland->gtk_shell, NULL); }
static void gdk_input_init (GdkDisplay *display) { GdkWaylandDisplay *display_wayland; GdkDeviceManager *device_manager; GdkDevice *device; GList *list, *l; display_wayland = GDK_WAYLAND_DISPLAY (display); device_manager = gdk_display_get_device_manager (display); /* For backwards compatibility, just add * floating devices that are not keyboards. */ list = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_FLOATING); for (l = list; l; l = l->next) { device = l->data; if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) continue; display_wayland->input_devices = g_list_prepend (display_wayland->input_devices, l->data); } g_list_free (list); /* Now set "core" pointer to the first * master device that is a pointer. */ list = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER); for (l = list; l; l = l->next) { device = l->data; if (gdk_device_get_source (device) != GDK_SOURCE_MOUSE) continue; display->core_pointer = device; break; } /* Add the core pointer to the devices list */ display_wayland->input_devices = g_list_prepend (display_wayland->input_devices, display->core_pointer); g_list_free (list); }
void _gdk_wayland_display_queue_events (GdkDisplay *display) { GdkWaylandDisplay *display_wayland; GdkWaylandEventSource *source; display_wayland = GDK_WAYLAND_DISPLAY (display); source = (GdkWaylandEventSource *) display_wayland->event_source; if (source->pfd.revents) { wl_display_iterate(display_wayland->wl_display, WL_DISPLAY_READABLE); source->pfd.revents = 0; } }
void _gdk_wayland_display_queue_events (GdkDisplay *display) { GdkWaylandDisplay *display_wayland; GdkWaylandEventSource *source; display_wayland = GDK_WAYLAND_DISPLAY (display); source = (GdkWaylandEventSource *) display_wayland->event_source; if (source->pfd.revents & G_IO_IN) { wl_display_dispatch(display_wayland->wl_display); source->pfd.revents = 0; } if (source->pfd.revents & (G_IO_ERR | G_IO_HUP)) g_error ("Lost connection to wayland compositor"); }
GdkDisplay * _gdk_wayland_display_open (const gchar *display_name) { struct wl_display *wl_display; GdkDisplay *display; GdkWaylandDisplay *display_wayland; /* If this variable is unset then wayland initialisation will surely * fail, logging a fatal error in the process. Save ourselves from * that. */ if (g_getenv ("XDG_RUNTIME_DIR") == NULL) return NULL; wl_log_set_handler_client(log_handler); wl_display = wl_display_connect(display_name); if (!wl_display) return NULL; display = g_object_new (GDK_TYPE_WAYLAND_DISPLAY, NULL); display->device_manager = _gdk_wayland_device_manager_new (display); display_wayland = GDK_WAYLAND_DISPLAY (display); display_wayland->wl_display = wl_display; display_wayland->screen = _gdk_wayland_screen_new (display); display_wayland->event_source = _gdk_wayland_display_event_source_new (display); _gdk_wayland_display_init_cursors (display_wayland); display_wayland->wl_registry = wl_display_get_registry(display_wayland->wl_display); wl_registry_add_listener(display_wayland->wl_registry, ®istry_listener, display_wayland); /* Wait until the dust has settled during init... */ wl_display_roundtrip (display_wayland->wl_display); gdk_input_init (display); display_wayland->selection = gdk_wayland_selection_new (); g_signal_emit_by_name (display, "opened"); return display; }
GdkDisplay * _gdk_wayland_display_open (const gchar *display_name) { struct wl_display *wl_display; GdkDisplay *display; GdkWaylandDisplay *display_wayland; wl_log_set_handler_client(log_handler); wl_display = wl_display_connect(display_name); if (!wl_display) return NULL; display = g_object_new (GDK_TYPE_WAYLAND_DISPLAY, NULL); display_wayland = GDK_WAYLAND_DISPLAY (display); display_wayland->wl_display = wl_display; display_wayland->screen = _gdk_wayland_screen_new (display); display->device_manager = _gdk_wayland_device_manager_new (display); /* Set up listener so we'll catch all events. */ display_wayland->wl_registry = wl_display_get_registry(display_wayland->wl_display); wl_registry_add_listener(display_wayland->wl_registry, ®istry_listener, display_wayland); /* We use init_ref_count to track whether some part of our * initialization still needs a roundtrip to complete. */ wait_for_roundtrip(display_wayland); while (display_wayland->init_ref_count > 0) wl_display_roundtrip(display_wayland->wl_display); display_wayland->event_source = _gdk_wayland_display_event_source_new (display); gdk_input_init (display); g_signal_emit_by_name (display, "opened"); return display; }
GdkGLContext * gdk_wayland_window_create_gl_context (GdkWindow *window, gboolean attached, GdkGLContext *share, GError **error) { GdkDisplay *display = gdk_window_get_display (window); GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); GdkWaylandGLContext *context; EGLConfig config; if (!gdk_wayland_display_init_gl (display)) { g_set_error_literal (error, GDK_GL_ERROR, GDK_GL_ERROR_NOT_AVAILABLE, _("No GL implementation is available")); return NULL; } if (!display_wayland->have_egl_khr_create_context) { g_set_error_literal (error, GDK_GL_ERROR, GDK_GL_ERROR_UNSUPPORTED_PROFILE, _("Core GL is not available on EGL implementation")); return NULL; } if (!find_eglconfig_for_window (window, &config, error)) return NULL; context = g_object_new (GDK_TYPE_WAYLAND_GL_CONTEXT, "display", display, "window", window, "shared-context", share, NULL); context->egl_config = config; context->is_attached = attached; return GDK_GL_CONTEXT (context); }
static void gdk_wayland_display_notify_startup_complete (GdkDisplay *display, const gchar *startup_id) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); gchar *free_this = NULL; if (startup_id == NULL) { startup_id = free_this = display_wayland->startup_notification_id; display_wayland->startup_notification_id = NULL; if (startup_id == NULL) return; } if (display_wayland->gtk_shell) gtk_shell1_set_startup_id (display_wayland->gtk_shell, startup_id); g_free (free_this); }
void _gdk_wayland_cursor_set_scale (GdkCursor *cursor, guint scale) { GdkWaylandDisplay *wayland_display = GDK_WAYLAND_DISPLAY (gdk_cursor_get_display (cursor)); GdkWaylandCursor *wayland_cursor = GDK_WAYLAND_CURSOR (cursor); if (scale > GDK_WAYLAND_MAX_THEME_SCALE) { g_warning (G_STRLOC ": cursor theme size %u too large", scale); scale = GDK_WAYLAND_MAX_THEME_SCALE; } if (wayland_cursor->scale == scale) return; wayland_cursor->scale = scale; _gdk_wayland_cursor_update (wayland_display, wayland_cursor); }
gboolean gdk_wayland_display_make_gl_context_current (GdkDisplay *display, GdkGLContext *context) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); GdkWaylandGLContext *context_wayland; GdkWindow *window; EGLSurface egl_surface; if (context == NULL) { eglMakeCurrent(display_wayland->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); return TRUE; } context_wayland = GDK_WAYLAND_GL_CONTEXT (context); window = gdk_gl_context_get_window (context); if (context_wayland->is_attached) egl_surface = gdk_wayland_window_get_egl_surface (window->impl_window, context_wayland->egl_config); else { if (display_wayland->have_egl_surfaceless_context) egl_surface = EGL_NO_SURFACE; else egl_surface = gdk_wayland_window_get_dummy_egl_surface (window->impl_window, context_wayland->egl_config); } if (!eglMakeCurrent (display_wayland->egl_display, egl_surface, egl_surface, context_wayland->egl_context)) { g_warning ("eglMakeCurrent failed"); return FALSE; } return TRUE; }
static void gdk_wayland_gl_context_end_frame (GdkGLContext *context, cairo_region_t *painted, cairo_region_t *damage) { GdkWindow *window = gdk_gl_context_get_window (context); GdkDisplay *display = gdk_window_get_display (window); GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); GdkWaylandGLContext *context_wayland = GDK_WAYLAND_GL_CONTEXT (context); EGLSurface egl_surface; gdk_gl_context_make_current (context); egl_surface = gdk_wayland_window_get_egl_surface (window->impl_window, context_wayland->egl_config); /* TODO: Use eglSwapBuffersWithDamageEXT if available */ if (display_wayland->have_egl_swap_buffers_with_damage) { int i, j, n_rects = cairo_region_num_rectangles (damage); EGLint *rects = g_new (EGLint, n_rects * 4); cairo_rectangle_int_t rect; int window_height = gdk_window_get_height (window); for (i = 0, j = 0; i < n_rects; i++) { cairo_region_get_rectangle (damage, i, &rect); rects[j++] = rect.x; rects[j++] = window_height - rect.height - rect.y; rects[j++] = rect.width; rects[j++] = rect.height; } eglSwapBuffersWithDamageEXT (display_wayland->egl_display, egl_surface, rects, n_rects); g_free (rects); } else eglSwapBuffers (display_wayland->egl_display, egl_surface); }
static void gdk_wayland_display_make_default (GdkDisplay *display) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); const gchar *startup_id; g_free (display_wayland->startup_notification_id); display_wayland->startup_notification_id = NULL; startup_id = g_getenv ("DESKTOP_STARTUP_ID"); if (startup_id && *startup_id != '\0') { if (!g_utf8_validate (startup_id, -1, NULL)) g_warning ("DESKTOP_STARTUP_ID contains invalid UTF-8"); else display_wayland->startup_notification_id = g_strdup (startup_id); /* Clear the environment variable so it won't be inherited by * child processes and confuse things. */ g_unsetenv ("DESKTOP_STARTUP_ID"); } }
gboolean gdk_wayland_selection_set_current_offer_actions (GdkDisplay *display, uint32_t action) { GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); struct wl_data_offer *offer; uint32_t all_actions = 0; offer = gdk_wayland_selection_get_offer (display, atoms[ATOM_DND]); if (!offer) return FALSE; if (action != 0) all_actions = WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY | WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE | WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK; if (display_wayland->data_device_manager_version >= WL_DATA_OFFER_SET_ACTIONS_SINCE_VERSION) wl_data_offer_set_actions (offer, all_actions, action); return TRUE; }
void _gdk_wayland_display_convert_selection (GdkDisplay *display, GdkWindow *requestor, GdkAtom selection, GdkAtom target, guint32 time) { GdkWaylandSelection *wayland_selection = gdk_wayland_display_get_selection (display); SelectionBuffer *buffer_data; if (!wayland_selection->offer) { GdkEvent *event; event = gdk_event_new (GDK_SELECTION_NOTIFY); event->selection.window = g_object_ref (requestor); event->selection.send_event = FALSE; event->selection.selection = selection; event->selection.target = target; event->selection.property = GDK_NONE; event->selection.time = GDK_CURRENT_TIME; event->selection.requestor = g_object_ref (requestor); gdk_event_put (event); gdk_event_free (event); return; } wl_data_offer_accept (wayland_selection->offer, _gdk_wayland_display_get_serial (GDK_WAYLAND_DISPLAY (display)), gdk_atom_name (target)); buffer_data = g_hash_table_lookup (wayland_selection->selection_buffers, target); if (buffer_data) selection_buffer_add_requestor (buffer_data, requestor); else { GInputStream *stream = NULL; int pipe_fd[2], natoms = 0; GdkAtom *atoms = NULL; if (target == gdk_atom_intern_static_string ("TARGETS")) { gint i = 0; GList *l; natoms = g_list_length (wayland_selection->targets); atoms = g_new0 (GdkAtom, natoms); for (l = wayland_selection->targets; l; l = l->next) atoms[i++] = l->data; } else { g_unix_open_pipe (pipe_fd, FD_CLOEXEC, NULL); wl_data_offer_receive (wayland_selection->offer, gdk_atom_name (target), pipe_fd[1]); stream = g_unix_input_stream_new (pipe_fd[0], TRUE); close (pipe_fd[1]); } buffer_data = selection_buffer_new (stream, selection, target); selection_buffer_add_requestor (buffer_data, requestor); if (stream) g_object_unref (stream); if (atoms) { /* Store directly the local atoms */ selection_buffer_append_data (buffer_data, atoms, natoms * sizeof (GdkAtom)); g_free (atoms); } g_hash_table_insert (wayland_selection->selection_buffers, GDK_ATOM_TO_POINTER (target), buffer_data); } if (!buffer_data->stream) selection_buffer_notify (buffer_data); }
void gdk_wayland_window_invalidate_for_new_frame (GdkWindow *window, cairo_region_t *update_area) { cairo_rectangle_int_t window_rect; GdkDisplay *display = gdk_window_get_display (window); GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); GdkWaylandGLContext *context_wayland; int buffer_age; gboolean invalidate_all; EGLSurface egl_surface; /* Minimal update is ok if we're not drawing with gl */ if (window->gl_paint_context == NULL) return; context_wayland = GDK_WAYLAND_GL_CONTEXT (window->gl_paint_context); buffer_age = 0; egl_surface = gdk_wayland_window_get_egl_surface (window->impl_window, context_wayland->egl_config); if (display_wayland->have_egl_buffer_age) { gdk_gl_context_make_current (window->gl_paint_context); eglQuerySurface (display_wayland->egl_display, egl_surface, EGL_BUFFER_AGE_EXT, &buffer_age); } invalidate_all = FALSE; if (buffer_age == 0 || buffer_age >= 4) invalidate_all = TRUE; else { if (buffer_age >= 2) { if (window->old_updated_area[0]) cairo_region_union (update_area, window->old_updated_area[0]); else invalidate_all = TRUE; } if (buffer_age >= 3) { if (window->old_updated_area[1]) cairo_region_union (update_area, window->old_updated_area[1]); else invalidate_all = TRUE; } } if (invalidate_all) { window_rect.x = 0; window_rect.y = 0; window_rect.width = gdk_window_get_width (window); window_rect.height = gdk_window_get_height (window); /* If nothing else is known, repaint everything so that the back * buffer is fully up-to-date for the swapbuffer */ cairo_region_union_rectangle (update_area, &window_rect); } }
cursor_class->get_surface = gdk_wayland_cursor_get_surface; } static void _gdk_wayland_cursor_init (GdkWaylandCursor *cursor) { } static GdkCursor * _gdk_wayland_display_get_cursor_for_name_with_scale (GdkDisplay *display, const gchar *name, guint scale) { GdkWaylandCursor *private; GdkWaylandDisplay *wayland_display = GDK_WAYLAND_DISPLAY (display); g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); private = g_hash_table_lookup (wayland_display->cursor_cache, name); if (private) return GDK_CURSOR (g_object_ref (private)); private = g_object_new (GDK_TYPE_WAYLAND_CURSOR, "cursor-type", GDK_CURSOR_IS_PIXMAP, "display", display, NULL); private->name = g_strdup (name); private->scale = scale; /* Blank cursor case */