From e4283f6d48b98e764b988b43bbc86b9d52e6ec94 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:54:43 +0200 Subject: Adding upstream version 43.9. Signed-off-by: Daniel Baumann --- src/shell-wm.c | 462 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 462 insertions(+) create mode 100644 src/shell-wm.c (limited to 'src/shell-wm.c') diff --git a/src/shell-wm.c b/src/shell-wm.c new file mode 100644 index 0000000..a11e419 --- /dev/null +++ b/src/shell-wm.c @@ -0,0 +1,462 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +#include "config.h" + +#include + +#include +#include + +#include "shell-wm-private.h" +#include "shell-global.h" + +struct _ShellWM { + GObject parent; + + MetaPlugin *plugin; +}; + +/* Signals */ +enum +{ + MINIMIZE, + UNMINIMIZE, + SIZE_CHANGED, + SIZE_CHANGE, + MAP, + DESTROY, + SWITCH_WORKSPACE, + KILL_SWITCH_WORKSPACE, + KILL_WINDOW_EFFECTS, + SHOW_TILE_PREVIEW, + HIDE_TILE_PREVIEW, + SHOW_WINDOW_MENU, + FILTER_KEYBINDING, + CONFIRM_DISPLAY_CHANGE, + CREATE_CLOSE_DIALOG, + CREATE_INHIBIT_SHORTCUTS_DIALOG, + + LAST_SIGNAL +}; + +G_DEFINE_TYPE(ShellWM, shell_wm, G_TYPE_OBJECT); + +static guint shell_wm_signals [LAST_SIGNAL] = { 0 }; + +static void +shell_wm_init (ShellWM *wm) +{ +} + +static void +shell_wm_finalize (GObject *object) +{ + G_OBJECT_CLASS (shell_wm_parent_class)->finalize (object); +} + +static void +shell_wm_class_init (ShellWMClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = shell_wm_finalize; + + shell_wm_signals[MINIMIZE] = + g_signal_new ("minimize", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 1, + META_TYPE_WINDOW_ACTOR); + shell_wm_signals[UNMINIMIZE] = + g_signal_new ("unminimize", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 1, + META_TYPE_WINDOW_ACTOR); + shell_wm_signals[SIZE_CHANGED] = + g_signal_new ("size-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 1, + META_TYPE_WINDOW_ACTOR); + shell_wm_signals[SIZE_CHANGE] = + g_signal_new ("size-change", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 4, + META_TYPE_WINDOW_ACTOR, META_TYPE_SIZE_CHANGE, META_TYPE_RECTANGLE, META_TYPE_RECTANGLE); + shell_wm_signals[MAP] = + g_signal_new ("map", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 1, + META_TYPE_WINDOW_ACTOR); + shell_wm_signals[DESTROY] = + g_signal_new ("destroy", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 1, + META_TYPE_WINDOW_ACTOR); + shell_wm_signals[SWITCH_WORKSPACE] = + g_signal_new ("switch-workspace", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 3, + G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); + shell_wm_signals[KILL_SWITCH_WORKSPACE] = + g_signal_new ("kill-switch-workspace", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0); + shell_wm_signals[KILL_WINDOW_EFFECTS] = + g_signal_new ("kill-window-effects", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 1, + META_TYPE_WINDOW_ACTOR); + shell_wm_signals[SHOW_TILE_PREVIEW] = + g_signal_new ("show-tile-preview", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 3, + META_TYPE_WINDOW, + META_TYPE_RECTANGLE, + G_TYPE_INT); + shell_wm_signals[HIDE_TILE_PREVIEW] = + g_signal_new ("hide-tile-preview", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0); + shell_wm_signals[SHOW_WINDOW_MENU] = + g_signal_new ("show-window-menu", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 3, + META_TYPE_WINDOW, G_TYPE_INT, META_TYPE_RECTANGLE); + shell_wm_signals[FILTER_KEYBINDING] = + g_signal_new ("filter-keybinding", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + g_signal_accumulator_true_handled, NULL, NULL, + G_TYPE_BOOLEAN, 1, + META_TYPE_KEY_BINDING); + shell_wm_signals[CONFIRM_DISPLAY_CHANGE] = + g_signal_new ("confirm-display-change", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0); + /** + * ShellWM::create-close-dialog: + * @wm: The WM + * @window: The window to create the dialog for + * + * Creates a close dialog for the given window. + * + * Returns: (transfer full): The close dialog instance. + */ + shell_wm_signals[CREATE_CLOSE_DIALOG] = + g_signal_new ("create-close-dialog", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + META_TYPE_CLOSE_DIALOG, 1, META_TYPE_WINDOW); + /** + * ShellWM::create-inhibit-shortcuts-dialog: + * @wm: The WM + * @window: The window to create the dialog for + * + * Creates an inhibit shortcuts dialog for the given window. + * + * Returns: (transfer full): The inhibit shortcuts dialog instance. + */ + shell_wm_signals[CREATE_INHIBIT_SHORTCUTS_DIALOG] = + g_signal_new ("create-inhibit-shortcuts-dialog", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + META_TYPE_INHIBIT_SHORTCUTS_DIALOG, 1, META_TYPE_WINDOW); +} + +void +_shell_wm_switch_workspace (ShellWM *wm, + gint from, + gint to, + MetaMotionDirection direction) +{ + g_signal_emit (wm, shell_wm_signals[SWITCH_WORKSPACE], 0, + from, to, direction); +} + +/** + * shell_wm_completed_switch_workspace: + * @wm: the ShellWM + * + * The plugin must call this when it has finished switching the + * workspace. + **/ +void +shell_wm_completed_switch_workspace (ShellWM *wm) +{ + meta_plugin_switch_workspace_completed (wm->plugin); +} + +/** + * shell_wm_completed_minimize: + * @wm: the ShellWM + * @actor: the MetaWindowActor actor + * + * The plugin must call this when it has completed a window minimize effect. + **/ +void +shell_wm_completed_minimize (ShellWM *wm, + MetaWindowActor *actor) +{ + meta_plugin_minimize_completed (wm->plugin, actor); +} + +/** + * shell_wm_completed_unminimize: + * @wm: the ShellWM + * @actor: the MetaWindowActor actor + * + * The plugin must call this when it has completed a window unminimize effect. + **/ +void +shell_wm_completed_unminimize (ShellWM *wm, + MetaWindowActor *actor) +{ + meta_plugin_unminimize_completed (wm->plugin, actor); +} + +void +shell_wm_completed_size_change (ShellWM *wm, + MetaWindowActor *actor) +{ + meta_plugin_size_change_completed (wm->plugin, actor); +} + +/** + * shell_wm_completed_map: + * @wm: the ShellWM + * @actor: the MetaWindowActor actor + * + * The plugin must call this when it has completed a window map effect. + **/ +void +shell_wm_completed_map (ShellWM *wm, + MetaWindowActor *actor) +{ + meta_plugin_map_completed (wm->plugin, actor); +} + +/** + * shell_wm_completed_destroy: + * @wm: the ShellWM + * @actor: the MetaWindowActor actor + * + * The plugin must call this when it has completed a window destroy effect. + **/ +void +shell_wm_completed_destroy (ShellWM *wm, + MetaWindowActor *actor) +{ + meta_plugin_destroy_completed (wm->plugin, actor); +} + +/** + * shell_wm_complete_display_change: + * @wm: the ShellWM + * @ok: if the new configuration was OK + * + * The plugin must call this after the user responded to the confirmation dialog. + */ +void +shell_wm_complete_display_change (ShellWM *wm, + gboolean ok) +{ + meta_plugin_complete_display_change (wm->plugin, ok); +} + +void +_shell_wm_kill_switch_workspace (ShellWM *wm) +{ + g_signal_emit (wm, shell_wm_signals[KILL_SWITCH_WORKSPACE], 0); +} + +void +_shell_wm_kill_window_effects (ShellWM *wm, + MetaWindowActor *actor) +{ + g_signal_emit (wm, shell_wm_signals[KILL_WINDOW_EFFECTS], 0, actor); +} + +void +_shell_wm_show_tile_preview (ShellWM *wm, + MetaWindow *window, + MetaRectangle *tile_rect, + int tile_monitor) +{ + g_signal_emit (wm, shell_wm_signals[SHOW_TILE_PREVIEW], 0, + window, tile_rect, tile_monitor); +} + +void +_shell_wm_hide_tile_preview (ShellWM *wm) +{ + g_signal_emit (wm, shell_wm_signals[HIDE_TILE_PREVIEW], 0); +} + +void +_shell_wm_show_window_menu (ShellWM *wm, + MetaWindow *window, + MetaWindowMenuType menu, + int x, + int y) +{ + MetaRectangle rect; + + rect.x = x; + rect.y = y; + rect.width = rect.height = 0; + + _shell_wm_show_window_menu_for_rect (wm, window, menu, &rect); +} + +void +_shell_wm_show_window_menu_for_rect (ShellWM *wm, + MetaWindow *window, + MetaWindowMenuType menu, + MetaRectangle *rect) +{ + g_signal_emit (wm, shell_wm_signals[SHOW_WINDOW_MENU], 0, window, menu, rect); +} + +void +_shell_wm_minimize (ShellWM *wm, + MetaWindowActor *actor) +{ + g_signal_emit (wm, shell_wm_signals[MINIMIZE], 0, actor); +} + +void +_shell_wm_unminimize (ShellWM *wm, + MetaWindowActor *actor) +{ + g_signal_emit (wm, shell_wm_signals[UNMINIMIZE], 0, actor); +} + +void +_shell_wm_size_changed (ShellWM *wm, + MetaWindowActor *actor) +{ + g_signal_emit (wm, shell_wm_signals[SIZE_CHANGED], 0, actor); +} + +void +_shell_wm_size_change (ShellWM *wm, + MetaWindowActor *actor, + MetaSizeChange which_change, + MetaRectangle *old_frame_rect, + MetaRectangle *old_buffer_rect) +{ + g_signal_emit (wm, shell_wm_signals[SIZE_CHANGE], 0, actor, which_change, old_frame_rect, old_buffer_rect); +} + +void +_shell_wm_map (ShellWM *wm, + MetaWindowActor *actor) +{ + g_signal_emit (wm, shell_wm_signals[MAP], 0, actor); +} + +void +_shell_wm_destroy (ShellWM *wm, + MetaWindowActor *actor) +{ + g_signal_emit (wm, shell_wm_signals[DESTROY], 0, actor); +} + +gboolean +_shell_wm_filter_keybinding (ShellWM *wm, + MetaKeyBinding *binding) +{ + gboolean rv; + + g_signal_emit (wm, shell_wm_signals[FILTER_KEYBINDING], 0, binding, &rv); + + return rv; +} + +void +_shell_wm_confirm_display_change (ShellWM *wm) +{ + g_signal_emit (wm, shell_wm_signals[CONFIRM_DISPLAY_CHANGE], 0); +} + +MetaCloseDialog * +_shell_wm_create_close_dialog (ShellWM *wm, + MetaWindow *window) +{ + MetaCloseDialog *dialog; + + g_signal_emit (wm, shell_wm_signals[CREATE_CLOSE_DIALOG], 0, window, &dialog); + + return dialog; +} + +MetaInhibitShortcutsDialog * +_shell_wm_create_inhibit_shortcuts_dialog (ShellWM *wm, + MetaWindow *window) +{ + MetaInhibitShortcutsDialog *dialog; + + g_signal_emit (wm, shell_wm_signals[CREATE_INHIBIT_SHORTCUTS_DIALOG], 0, window, &dialog); + + return dialog; +} + +/** + * shell_wm_new: + * @plugin: the #MetaPlugin + * + * Creates a new window management interface by hooking into @plugin. + * + * Return value: the new window-management interface + **/ +ShellWM * +shell_wm_new (MetaPlugin *plugin) +{ + ShellWM *wm; + + wm = g_object_new (SHELL_TYPE_WM, NULL); + wm->plugin = plugin; + + return wm; +} -- cgit v1.2.3