diff options
author | Victor Kareh <[email protected]> | 2025-08-15 07:20:47 -0400 |
---|---|---|
committer | Luke from DC <[email protected]> | 2025-09-09 19:51:09 +0000 |
commit | b5292ba66132104256590631b2d2b7a1c92ad934 (patch) | |
tree | 3d83ea535c11942428a57af64263af5f71837205 /src/ui/frames.c | |
parent | 4a2eebdd0f20a9ea4f60d63fe03837f9a39350ba (diff) | |
download | marco-b5292ba66132104256590631b2d2b7a1c92ad934.tar.bz2 marco-b5292ba66132104256590631b2d2b7a1c92ad934.tar.xz |
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
Diffstat (limited to 'src/ui/frames.c')
-rw-r--r-- | src/ui/frames.c | 95 |
1 files changed, 95 insertions, 0 deletions
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; } @@ -1611,6 +1676,24 @@ meta_frame_right_click_event(MetaUIFrame *frame, } 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; } |