From b5292ba66132104256590631b2d2b7a1c92ad934 Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Fri, 15 Aug 2025 07:20:47 -0400 Subject: window: Add configurable mouse actions for titlebar Adds support for configurable mouse actions on window titlebars, including middle-click and scroll wheel events. New actions added: - close: Close the window - raise: Raise window to top - toggle_stick: Toggle sticky state (all workspaces) - toggle_above: Toggle always-on-top state Fixes #425 Fixes #787 Note: requries matching mate-control-center changes to work properly --- src/ui/frames.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) (limited to 'src/ui/frames.c') diff --git a/src/ui/frames.c b/src/ui/frames.c index 19c14c56..1d45a38a 100644 --- a/src/ui/frames.c +++ b/src/ui/frames.c @@ -1576,6 +1576,71 @@ meta_frame_titlebar_event (MetaUIFrame *frame, event->time); break; + case META_ACTION_TITLEBAR_CLOSE: + meta_core_delete (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + frame->xwindow, + event->time); + break; + + case META_ACTION_TITLEBAR_RAISE: + meta_core_user_raise (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + frame->xwindow); + break; + + case META_ACTION_TITLEBAR_SHADE: + meta_core_get (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), frame->xwindow, + META_CORE_GET_FRAME_FLAGS, &flags, + META_CORE_GET_END); + if ((flags & META_FRAME_ALLOWS_SHADE) && !(flags & META_FRAME_SHADED)) + { + meta_core_shade (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + frame->xwindow, + event->time); + } + break; + + case META_ACTION_TITLEBAR_UNSHADE: + meta_core_get (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), frame->xwindow, + META_CORE_GET_FRAME_FLAGS, &flags, + META_CORE_GET_END); + if ((flags & META_FRAME_ALLOWS_SHADE) && (flags & META_FRAME_SHADED)) + { + meta_core_unshade (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + frame->xwindow, + event->time); + } + break; + + case META_ACTION_TITLEBAR_TOGGLE_STICK: + { + MetaFrameFlags flags; + meta_core_get (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), frame->xwindow, + META_CORE_GET_FRAME_FLAGS, &flags, + META_CORE_GET_END); + if (flags & META_FRAME_STUCK) + meta_core_unstick (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + frame->xwindow); + else + meta_core_stick (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + frame->xwindow); + } + break; + + case META_ACTION_TITLEBAR_TOGGLE_ABOVE: + { + MetaFrameFlags flags; + meta_core_get (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), frame->xwindow, + META_CORE_GET_FRAME_FLAGS, &flags, + META_CORE_GET_END); + if (flags & META_FRAME_ABOVE) + meta_core_unmake_above (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + frame->xwindow); + else + meta_core_make_above (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + frame->xwindow); + } + break; + case META_ACTION_TITLEBAR_LAST: break; } @@ -1610,6 +1675,24 @@ meta_frame_right_click_event(MetaUIFrame *frame, return meta_frame_titlebar_event (frame, event, action); } +static gboolean +meta_frame_scroll_up_event (MetaUIFrame *frame, + GdkEventButton *event) +{ + int action = meta_prefs_get_action_scroll_up_titlebar(); + + return meta_frame_titlebar_event (frame, event, action); +} + +static gboolean +meta_frame_scroll_down_event (MetaUIFrame *frame, + GdkEventButton *event) +{ + int action = meta_prefs_get_action_scroll_down_titlebar(); + + return meta_frame_titlebar_event (frame, event, action); +} + static gboolean meta_frames_button_press_event (GtkWidget *widget, GdkEventButton *event) @@ -1851,6 +1934,18 @@ meta_frames_button_press_event (GtkWidget *widget, { return meta_frame_right_click_event (frame, event); } + else if (event->button == 4) /* scroll up */ + { + /* Only handle scroll on titlebar, not on other frame controls */ + if (control == META_FRAME_CONTROL_TITLE) + return meta_frame_scroll_up_event (frame, event); + } + else if (event->button == 5) /* scroll down */ + { + /* Only handle scroll on titlebar, not on other frame controls */ + if (control == META_FRAME_CONTROL_TITLE) + return meta_frame_scroll_down_event (frame, event); + } return TRUE; } -- cgit v1.2.1