[weston v2 2/8] xwm: Maximize windows when double-clicking on title bar

Louis-Francis Ratté-Boulianne lfrb at collabora.com
Mon Nov 13 21:20:50 UTC 2017


Signed-off-by: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
---
 xwayland/window-manager.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
index 149d7fe4..4b84b24e 100644
--- a/xwayland/window-manager.c
+++ b/xwayland/window-manager.c
@@ -165,6 +165,8 @@ struct weston_wm_window {
 	struct weston_output_weak_ref legacy_fullscreen_output;
 	int saved_width, saved_height;
 	int decorate;
+	uint32_t last_button_time;
+	int did_double;
 	int override_redirect;
 	int fullscreen;
 	int has_alpha;
@@ -2060,6 +2062,7 @@ weston_wm_window_close(struct weston_wm_window *window, xcb_timestamp_t time)
 	}
 }
 
+#define DOUBLE_CLICK_PERIOD 250
 static void
 weston_wm_handle_button(struct weston_wm *wm, xcb_generic_event_t *event)
 {
@@ -2072,6 +2075,7 @@ weston_wm_handle_button(struct weston_wm *wm, xcb_generic_event_t *event)
 	enum theme_location location;
 	enum wl_pointer_button_state button_state;
 	uint32_t button_id;
+	uint32_t double_click = 0;
 
 	wm_log("XCB_BUTTON_%s (detail %d)\n",
 	       button->response_type == XCB_BUTTON_PRESS ?
@@ -2092,6 +2096,19 @@ weston_wm_handle_button(struct weston_wm *wm, xcb_generic_event_t *event)
 		WL_POINTER_BUTTON_STATE_RELEASED;
 	button_id = button->detail == 1 ? BTN_LEFT : BTN_RIGHT;
 
+	if (button_state == WL_POINTER_BUTTON_STATE_PRESSED) {
+		if (button->time - window->last_button_time <= DOUBLE_CLICK_PERIOD) {
+			double_click = 1;
+			window->did_double = 1;
+		} else
+			window->did_double = 0;
+
+		window->last_button_time = button->time;
+	} else if (window->did_double == 1) {
+		double_click = 1;
+		window->did_double = 0;
+	}
+
 	/* Make sure we're looking at the right location.  The frame
 	 * could have received a motion event from a pointer from a
 	 * different wl_seat, but under X it looks like our core
@@ -2099,8 +2116,13 @@ weston_wm_handle_button(struct weston_wm *wm, xcb_generic_event_t *event)
 	 * location before deciding what to do. */
 	location = frame_pointer_motion(window->frame, NULL,
 					button->event_x, button->event_y);
-	location = frame_pointer_button(window->frame, NULL,
-					button_id, button_state);
+	if (double_click)
+		location = frame_double_click(window->frame, NULL,
+					      button_id, button_state);
+	else
+		location = frame_pointer_button(window->frame, NULL,
+						button_id, button_state);
+
 	if (frame_status(window->frame) & FRAME_STATUS_REPAINT)
 		weston_wm_window_schedule_repaint(window);
 
-- 
2.13.0



More information about the wayland-devel mailing list