summaryrefslogtreecommitdiff
path: root/src/wayland/meta-wayland-gtk-shell.c
diff options
context:
space:
mode:
authorFlorian Müllner <fmuellner@gnome.org>2021-07-19 00:01:24 +0200
committerFlorian Müllner <fmuellner@gnome.org>2021-07-19 00:03:33 +0200
commit952865a86ebb08f97263cfdbfe38b7adc20e4560 (patch)
tree1f9347628656210b03ceee4fae83beb21491d1eb /src/wayland/meta-wayland-gtk-shell.c
parent7862f143937e43dca0513af3a24dabfb4d0db4fc (diff)
downloadmutter-master.tar.gz
Replace contents with redirect messagemaster
The default development branch is now `main`. This commit only exists on `master` to point people towards that. See https://gitlab.gnome.org/GNOME/glib/-/issues/2348 for details.
Diffstat (limited to 'src/wayland/meta-wayland-gtk-shell.c')
-rw-r--r--src/wayland/meta-wayland-gtk-shell.c565
1 files changed, 0 insertions, 565 deletions
diff --git a/src/wayland/meta-wayland-gtk-shell.c b/src/wayland/meta-wayland-gtk-shell.c
deleted file mode 100644
index 12e1b0e4a..000000000
--- a/src/wayland/meta-wayland-gtk-shell.c
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
- * Wayland Support
- *
- * Copyright (C) 2012,2013 Intel Corporation
- * 2013-2016 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include "config.h"
-
-#include "wayland/meta-wayland-gtk-shell.h"
-
-#include "core/bell.h"
-#include "core/window-private.h"
-#include "wayland/meta-wayland-private.h"
-#include "wayland/meta-wayland-surface.h"
-#include "wayland/meta-wayland-versions.h"
-#include "wayland/meta-window-wayland.h"
-
-#include "gtk-shell-server-protocol.h"
-
-static GQuark quark_gtk_surface_data = 0;
-
-typedef struct _MetaWaylandGtkSurface
-{
- struct wl_resource *resource;
- MetaWaylandSurface *surface;
- gboolean is_modal;
- gulong configure_handler_id;
-} MetaWaylandGtkSurface;
-
-struct _MetaWaylandGtkShell
-{
- GObject parent;
-
- GList *shell_resources;
- uint32_t capabilities;
-};
-
-G_DEFINE_TYPE (MetaWaylandGtkShell, meta_wayland_gtk_shell, G_TYPE_OBJECT)
-
-static void
-gtk_surface_destructor (struct wl_resource *resource)
-{
- MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
-
- if (gtk_surface->surface)
- {
- g_object_steal_qdata (G_OBJECT (gtk_surface->surface),
- quark_gtk_surface_data);
- g_clear_signal_handler (&gtk_surface->configure_handler_id,
- gtk_surface->surface);
- }
-
- g_free (gtk_surface);
-}
-
-static void
-gtk_surface_set_dbus_properties (struct wl_client *client,
- struct wl_resource *resource,
- const char *application_id,
- const char *app_menu_path,
- const char *menubar_path,
- const char *window_object_path,
- const char *application_object_path,
- const char *unique_bus_name)
-{
- MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
- MetaWaylandSurface *surface = gtk_surface->surface;
- MetaWindow *window;
-
- if (!surface)
- return;
-
- window = meta_wayland_surface_get_window (surface);
- if (!window)
- return;
-
- meta_window_set_gtk_dbus_properties (window,
- application_id,
- unique_bus_name,
- app_menu_path,
- menubar_path,
- application_object_path,
- window_object_path);
-}
-
-static void
-gtk_surface_set_modal (struct wl_client *client,
- struct wl_resource *resource)
-{
- MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
- MetaWaylandSurface *surface = gtk_surface->surface;
- MetaWindow *window;
-
- if (!surface)
- return;
-
- window = meta_wayland_surface_get_window (surface);
- if (!window)
- return;
-
- if (gtk_surface->is_modal)
- return;
-
- gtk_surface->is_modal = TRUE;
- meta_window_set_type (window, META_WINDOW_MODAL_DIALOG);
-}
-
-static void
-gtk_surface_unset_modal (struct wl_client *client,
- struct wl_resource *resource)
-{
- MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
- MetaWaylandSurface *surface = gtk_surface->surface;
- MetaWindow *window;
-
- if (!surface)
- return;
-
- window = meta_wayland_surface_get_window (surface);
- if (!window)
- return;
-
- if (!gtk_surface->is_modal)
- return;
-
- gtk_surface->is_modal = FALSE;
- meta_window_set_type (window, META_WINDOW_NORMAL);
-}
-
-static void
-gtk_surface_present (struct wl_client *client,
- struct wl_resource *resource,
- uint32_t timestamp)
-{
- MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
- MetaWaylandSurface *surface = gtk_surface->surface;
- MetaWindow *window;
-
- if (!surface)
- return;
-
- window = meta_wayland_surface_get_window (surface);
- if (!window)
- return;
-
- meta_window_activate_full (window, timestamp,
- META_CLIENT_TYPE_APPLICATION, NULL);
-}
-
-static void
-gtk_surface_request_focus (struct wl_client *client,
- struct wl_resource *resource,
- const char *startup_id)
-{
- MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
- MetaWaylandSurface *surface = gtk_surface->surface;
- MetaDisplay *display = meta_get_display ();
- MetaStartupSequence *sequence = NULL;
- MetaWindow *window;
-
- if (!surface)
- return;
-
- window = meta_wayland_surface_get_window (surface);
- if (!window)
- return;
-
- if (startup_id)
- sequence = meta_startup_notification_lookup_sequence (display->startup_notification,
- startup_id);
-
- if (sequence)
- {
- uint32_t timestamp;
- int32_t workspace_idx;
-
- workspace_idx = meta_startup_sequence_get_workspace (sequence);
- timestamp = meta_startup_sequence_get_timestamp (sequence);
-
- meta_startup_sequence_complete (sequence);
- meta_startup_notification_remove_sequence (display->startup_notification,
- sequence);
- if (workspace_idx >= 0)
- meta_window_change_workspace_by_index (window, workspace_idx, TRUE);
-
- meta_window_activate_full (window, timestamp,
- META_CLIENT_TYPE_APPLICATION, NULL);
- }
- else
- {
- meta_window_set_demands_attention (window);
- }
-}
-
-static void
-gtk_surface_release (struct wl_client *client,
- struct wl_resource *resource)
-{
- wl_resource_destroy (resource);
-}
-
-static const struct gtk_surface1_interface meta_wayland_gtk_surface_interface = {
- gtk_surface_set_dbus_properties,
- gtk_surface_set_modal,
- gtk_surface_unset_modal,
- gtk_surface_present,
- gtk_surface_request_focus,
- gtk_surface_release
-};
-
-static void
-gtk_surface_surface_destroyed (MetaWaylandGtkSurface *gtk_surface)
-{
- gtk_surface->surface = NULL;
-}
-
-static void
-fill_edge_states (struct wl_array *states,
- MetaWindow *window)
-{
- uint32_t *s;
-
- if (window->edge_constraints.top != META_EDGE_CONSTRAINT_MONITOR)
- {
- s = wl_array_add (states, sizeof *s);
- *s = GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_TOP;
- }
-
- if (window->edge_constraints.right != META_EDGE_CONSTRAINT_MONITOR)
- {
- s = wl_array_add (states, sizeof *s);
- *s = GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_RIGHT;
- }
-
- if (window->edge_constraints.bottom != META_EDGE_CONSTRAINT_MONITOR)
- {
- s = wl_array_add (states, sizeof *s);
- *s = GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_BOTTOM;
- }
-
- if (window->edge_constraints.left != META_EDGE_CONSTRAINT_MONITOR)
- {
- s = wl_array_add (states, sizeof *s);
- *s = GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_LEFT;
- }
-}
-
-static void
-send_configure_edges (MetaWaylandGtkSurface *gtk_surface,
- MetaWindow *window)
-{
- struct wl_array edge_states;
-
- wl_array_init (&edge_states);
- fill_edge_states (&edge_states, window);
-
- gtk_surface1_send_configure_edges (gtk_surface->resource, &edge_states);
-
- wl_array_release (&edge_states);
-}
-
-static void
-add_state_value (struct wl_array *states,
- enum gtk_surface1_state state)
-{
- uint32_t *s;
-
- s = wl_array_add (states, sizeof *s);
- *s = state;
-}
-
-static void
-fill_states (struct wl_array *states,
- MetaWindow *window,
- struct wl_resource *resource)
-{
- int version;
-
- version = wl_resource_get_version (resource);
-
- if (version < GTK_SURFACE1_CONFIGURE_EDGES_SINCE_VERSION &&
- (window->tile_mode == META_TILE_LEFT ||
- window->tile_mode == META_TILE_RIGHT))
- add_state_value (states, GTK_SURFACE1_STATE_TILED);
-
- if (version >= GTK_SURFACE1_STATE_TILED_TOP_SINCE_VERSION &&
- window->edge_constraints.top != META_EDGE_CONSTRAINT_NONE)
- add_state_value (states, GTK_SURFACE1_STATE_TILED_TOP);
-
- if (version >= GTK_SURFACE1_STATE_TILED_RIGHT_SINCE_VERSION &&
- window->edge_constraints.right != META_EDGE_CONSTRAINT_NONE)
- add_state_value (states, GTK_SURFACE1_STATE_TILED_RIGHT);
-
- if (version >= GTK_SURFACE1_STATE_TILED_BOTTOM_SINCE_VERSION &&
- window->edge_constraints.bottom != META_EDGE_CONSTRAINT_NONE)
- add_state_value (states, GTK_SURFACE1_STATE_TILED_BOTTOM);
-
- if (version >= GTK_SURFACE1_STATE_TILED_LEFT_SINCE_VERSION &&
- window->edge_constraints.left != META_EDGE_CONSTRAINT_NONE)
- add_state_value (states, GTK_SURFACE1_STATE_TILED_LEFT);
-}
-
-static void
-send_configure (MetaWaylandGtkSurface *gtk_surface,
- MetaWindow *window)
-{
- struct wl_array states;
-
- wl_array_init (&states);
- fill_states (&states, window, gtk_surface->resource);
-
- gtk_surface1_send_configure (gtk_surface->resource, &states);
-
- wl_array_release (&states);
-}
-
-static void
-on_configure (MetaWaylandSurface *surface,
- MetaWaylandGtkSurface *gtk_surface)
-{
- MetaWindow *window;
-
- window = meta_wayland_surface_get_window (surface);
- send_configure (gtk_surface, window);
-
- if (wl_resource_get_version (gtk_surface->resource) >=
- GTK_SURFACE1_CONFIGURE_EDGES_SINCE_VERSION)
- send_configure_edges (gtk_surface, window);
-}
-
-static void
-gtk_shell_get_gtk_surface (struct wl_client *client,
- struct wl_resource *resource,
- guint32 id,
- struct wl_resource *surface_resource)
-{
- MetaWaylandSurface *surface = wl_resource_get_user_data (surface_resource);
- MetaWaylandGtkSurface *gtk_surface;
-
- gtk_surface = g_object_get_qdata (G_OBJECT (surface), quark_gtk_surface_data);
- if (gtk_surface)
- {
- wl_resource_post_error (surface_resource,
- WL_DISPLAY_ERROR_INVALID_OBJECT,
- "gtk_shell::get_gtk_surface already requested");
- return;
- }
-
- gtk_surface = g_new0 (MetaWaylandGtkSurface, 1);
- gtk_surface->surface = surface;
- gtk_surface->resource = wl_resource_create (client,
- &gtk_surface1_interface,
- wl_resource_get_version (resource),
- id);
- wl_resource_set_implementation (gtk_surface->resource,
- &meta_wayland_gtk_surface_interface,
- gtk_surface, gtk_surface_destructor);
-
- gtk_surface->configure_handler_id = g_signal_connect (surface,
- "configure",
- G_CALLBACK (on_configure),
- gtk_surface);
-
- g_object_set_qdata_full (G_OBJECT (surface),
- quark_gtk_surface_data,
- gtk_surface,
- (GDestroyNotify) gtk_surface_surface_destroyed);
-}
-
-static void
-gtk_shell_set_startup_id (struct wl_client *client,
- struct wl_resource *resource,
- const char *startup_id)
-{
- MetaStartupSequence *sequence;
- MetaDisplay *display;
-
- display = meta_get_display ();
-
- sequence = meta_startup_notification_lookup_sequence (display->startup_notification,
- startup_id);
- if (sequence)
- meta_startup_sequence_complete (sequence);
-}
-
-static void
-gtk_shell_system_bell (struct wl_client *client,
- struct wl_resource *resource,
- struct wl_resource *gtk_surface_resource)
-{
- MetaDisplay *display = meta_get_display ();
-
- if (gtk_surface_resource)
- {
- MetaWaylandGtkSurface *gtk_surface =
- wl_resource_get_user_data (gtk_surface_resource);
- MetaWaylandSurface *surface = gtk_surface->surface;
- MetaWindow *window;
-
- window = meta_wayland_surface_get_window (surface);
- if (!window)
- return;
-
- meta_bell_notify (display, window);
- }
- else
- {
- meta_bell_notify (display, NULL);
- }
-}
-
-static void
-gtk_shell_notify_launch (struct wl_client *client,
- struct wl_resource *resource,
- const char *startup_id)
-{
- MetaDisplay *display = meta_get_display ();
- MetaStartupSequence *sequence;
- uint32_t timestamp;
-
- sequence = meta_startup_notification_lookup_sequence (display->startup_notification,
- startup_id);
- if (sequence)
- {
- g_warning ("Naughty client notified launch with duplicate startup_id '%s'",
- startup_id);
- return;
- }
-
- timestamp = meta_display_get_current_time_roundtrip (display);
- sequence = g_object_new (META_TYPE_STARTUP_SEQUENCE,
- "id", startup_id,
- "timestamp", timestamp,
- NULL);
-
- meta_startup_notification_add_sequence (display->startup_notification,
- sequence);
- g_object_unref (sequence);
-}
-
-static const struct gtk_shell1_interface meta_wayland_gtk_shell_interface = {
- gtk_shell_get_gtk_surface,
- gtk_shell_set_startup_id,
- gtk_shell_system_bell,
- gtk_shell_notify_launch,
-};
-
-static void
-gtk_shell_destructor (struct wl_resource *resource)
-{
- MetaWaylandGtkShell *gtk_shell = wl_resource_get_user_data (resource);
-
- gtk_shell->shell_resources = g_list_remove (gtk_shell->shell_resources,
- resource);
-}
-
-static void
-bind_gtk_shell (struct wl_client *client,
- void *data,
- guint32 version,
- guint32 id)
-{
- MetaWaylandGtkShell *gtk_shell = data;
- struct wl_resource *resource;
-
- resource = wl_resource_create (client, &gtk_shell1_interface, version, id);
- wl_resource_set_implementation (resource, &meta_wayland_gtk_shell_interface,
- data, gtk_shell_destructor);
-
- gtk_shell->shell_resources = g_list_prepend (gtk_shell->shell_resources,
- resource);
-
- gtk_shell1_send_capabilities (resource, gtk_shell->capabilities);
-}
-
-static void
-meta_wayland_gtk_shell_init (MetaWaylandGtkShell *gtk_shell)
-{
-}
-
-static void
-meta_wayland_gtk_shell_class_init (MetaWaylandGtkShellClass *klass)
-{
- quark_gtk_surface_data =
- g_quark_from_static_string ("-meta-wayland-gtk-shell-surface-data");
-}
-
-static uint32_t
-calculate_capabilities (void)
-{
- uint32_t capabilities = 0;
-
- if (!meta_prefs_get_show_fallback_app_menu ())
- capabilities = GTK_SHELL1_CAPABILITY_GLOBAL_APP_MENU;
-
- return capabilities;
-}
-
-static void
-prefs_changed (MetaPreference pref,
- gpointer user_data)
-{
- MetaWaylandGtkShell *gtk_shell = user_data;
- uint32_t new_capabilities;
- GList *l;
-
- if (pref != META_PREF_BUTTON_LAYOUT)
- return;
-
- new_capabilities = calculate_capabilities ();
- if (gtk_shell->capabilities == new_capabilities)
- return;
- gtk_shell->capabilities = new_capabilities;
-
- for (l = gtk_shell->shell_resources; l; l = l->next)
- {
- struct wl_resource *resource = l->data;
-
- gtk_shell1_send_capabilities (resource, gtk_shell->capabilities);
- }
-}
-
-static MetaWaylandGtkShell *
-meta_wayland_gtk_shell_new (MetaWaylandCompositor *compositor)
-{
- MetaWaylandGtkShell *gtk_shell;
-
- gtk_shell = g_object_new (META_TYPE_WAYLAND_GTK_SHELL, NULL);
-
- if (wl_global_create (compositor->wayland_display,
- &gtk_shell1_interface,
- META_GTK_SHELL1_VERSION,
- gtk_shell, bind_gtk_shell) == NULL)
- g_error ("Failed to register a global gtk-shell object");
-
- gtk_shell->capabilities = calculate_capabilities ();
-
- meta_prefs_add_listener (prefs_changed, gtk_shell);
-
- return gtk_shell;
-}
-
-void
-meta_wayland_init_gtk_shell (MetaWaylandCompositor *compositor)
-{
- g_object_set_data_full (G_OBJECT (compositor), "-meta-wayland-gtk-shell",
- meta_wayland_gtk_shell_new (compositor),
- g_object_unref);
-}