summaryrefslogtreecommitdiff
path: root/src/ui/frames.c
diff options
context:
space:
mode:
authorVictor Kareh <[email protected]>2025-08-15 07:20:47 -0400
committerLuke from DC <[email protected]>2025-09-09 19:51:09 +0000
commitb5292ba66132104256590631b2d2b7a1c92ad934 (patch)
tree3d83ea535c11942428a57af64263af5f71837205 /src/ui/frames.c
parent4a2eebdd0f20a9ea4f60d63fe03837f9a39350ba (diff)
downloadmarco-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.c95
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;
}