static GdkScreen * gdk_wayland_display_get_default_screen (GdkDisplay *display) { g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); return GDK_DISPLAY_WAYLAND (display)->screen; }
GSource * _gdk_wayland_display_event_source_new (GdkDisplay *display) { GSource *source; GdkWaylandEventSource *wl_source; GdkDisplayWayland *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_DISPLAY_WAYLAND (display); wl_source->display = display; wl_source->pfd.fd = wl_display_get_fd(display_wayland->wl_display, gdk_event_source_update, source); wl_source->pfd.events = G_IO_IN | G_IO_ERR; 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 GList * gdk_wayland_display_list_devices (GdkDisplay *display) { g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); return GDK_DISPLAY_WAYLAND (display)->input_devices; }
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_DISPLAY_WAYLAND (display)->wl_display, WL_DISPLAY_WRITABLE); }
static void gdk_wayland_display_flush (GdkDisplay *display) { g_return_if_fail (GDK_IS_DISPLAY (display)); if (!display->closed) _gdk_wayland_display_flush (display, GDK_DISPLAY_WAYLAND (display)->event_source); }
static GdkScreen * gdk_wayland_display_get_screen (GdkDisplay *display, gint screen_num) { g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); g_return_val_if_fail (screen_num == 0, NULL); return GDK_DISPLAY_WAYLAND (display)->screen; }
static gboolean gdk_display_init_egl(GdkDisplay *display) { GdkDisplayWayland *display_wayland = GDK_DISPLAY_WAYLAND (display); EGLint major, minor, i; void *p; static const struct { const char *f; unsigned int offset; } extension_functions[] = { { "glEGLImageTargetTexture2DOES", offsetof(GdkDisplayWayland, image_target_texture_2d) }, { "eglCreateImageKHR", offsetof(GdkDisplayWayland, create_image) }, { "eglDestroyImageKHR", offsetof(GdkDisplayWayland, destroy_image) } }; display_wayland->egl_display = eglGetDisplay(display_wayland->wl_display); if (!eglInitialize(display_wayland->egl_display, &major, &minor)) { fprintf(stderr, "failed to initialize display\n"); return FALSE; } eglBindAPI(EGL_OPENGL_API); display_wayland->egl_context = eglCreateContext(display_wayland->egl_display, NULL, EGL_NO_CONTEXT, NULL); if (display_wayland->egl_context == NULL) { fprintf(stderr, "failed to create context\n"); return FALSE; } if (!eglMakeCurrent(display_wayland->egl_display, NULL, NULL, display_wayland->egl_context)) { fprintf(stderr, "faile to make context current\n"); return FALSE; } display_wayland->cairo_device = cairo_egl_device_create(display_wayland->egl_display, display_wayland->egl_context); if (cairo_device_status (display_wayland->cairo_device) != CAIRO_STATUS_SUCCESS) { fprintf(stderr, "failed to get cairo drm device\n"); return FALSE; } for (i = 0; i < G_N_ELEMENTS(extension_functions); i++) { p = eglGetProcAddress(extension_functions[i].f); *(void **) ((char *) display_wayland + extension_functions[i].offset) = p; if (p == NULL) { fprintf(stderr, "failed to look up %s\n", extension_functions[i].f); return FALSE; } } return TRUE; }
static void gdk_wayland_display_sync (GdkDisplay *display) { GdkDisplayWayland *display_wayland; g_return_if_fail (GDK_IS_DISPLAY (display)); display_wayland = GDK_DISPLAY_WAYLAND (display); wl_display_roundtrip(display_wayland->wl_display); }
static GdkKeymap * gdk_wayland_display_get_keymap (GdkDisplay *display) { GdkDisplayWayland *display_wayland; g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); display_wayland = GDK_DISPLAY_WAYLAND (display); if (!display_wayland->keymap) display_wayland->keymap = _gdk_wayland_keymap_new (display); return display_wayland->keymap; }
static void gdk_input_init (GdkDisplay *display) { GdkDisplayWayland *display_wayland; GdkDeviceManager *device_manager; GdkDevice *device; GList *list, *l; display_wayland = GDK_DISPLAY_WAYLAND (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 = list->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) { GdkDisplayWayland *display_wayland; GdkWaylandEventSource *source; display_wayland = GDK_DISPLAY_WAYLAND (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; } }
static void gdk_wayland_display_sync (GdkDisplay *display) { GdkDisplayWayland *display_wayland; gboolean done; g_return_if_fail (GDK_IS_DISPLAY (display)); display_wayland = GDK_DISPLAY_WAYLAND (display); wl_display_sync_callback(display_wayland->wl_display, sync_callback, &done); wl_display_iterate(display_wayland->wl_display, WL_DISPLAY_WRITABLE); while (!done) wl_display_iterate(display_wayland->wl_display, WL_DISPLAY_READABLE); }
static void gdk_wayland_display_finalize (GObject *object) { GdkDisplayWayland *display_wayland = GDK_DISPLAY_WAYLAND (object); /* Keymap */ if (display_wayland->keymap) g_object_unref (display_wayland->keymap); /* input GdkDevice list */ g_list_free_full (display_wayland->input_devices, g_object_unref); g_object_unref (display_wayland->screen); g_free (display_wayland->startup_notification_id); G_OBJECT_CLASS (_gdk_display_wayland_parent_class)->finalize (object); }
static void gdk_wayland_display_dispose (GObject *object) { GdkDisplayWayland *display_wayland = GDK_DISPLAY_WAYLAND (object); _gdk_wayland_display_manager_remove_display (gdk_display_manager_get (), GDK_DISPLAY (display_wayland)); 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; } eglTerminate(display_wayland->egl_display); G_OBJECT_CLASS (_gdk_display_wayland_parent_class)->dispose (object); }
GdkDisplay * _gdk_wayland_display_open (const gchar *display_name) { struct wl_display *wl_display; GdkDisplay *display; GdkDisplayWayland *display_wayland; wl_display = wl_display_connect(display_name); if (!wl_display) return NULL; display = g_object_new (GDK_TYPE_DISPLAY_WAYLAND, NULL); display_wayland = GDK_DISPLAY_WAYLAND (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. */ wl_display_add_global_listener(display_wayland->wl_display, gdk_display_handle_global, display_wayland); gdk_display_init_egl(display); display_wayland->event_source = _gdk_wayland_display_event_source_new (display); gdk_input_init (display); g_signal_emit_by_name (display, "opened"); g_signal_emit_by_name (gdk_display_manager_get(), "display_opened", display); return display; }