From nobody Mon Feb 9 23:01:23 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1627297710116972.4549933406513; Mon, 26 Jul 2021 04:08:30 -0700 (PDT) Received: from localhost ([::1]:41862 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1m7yTE-0004P9-Nz for importer@patchew.org; Mon, 26 Jul 2021 07:08:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50744) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m7yQp-0001M5-MK for qemu-devel@nongnu.org; Mon, 26 Jul 2021 07:06:00 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:50207) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m7yQm-0004aQ-1q for qemu-devel@nongnu.org; Mon, 26 Jul 2021 07:05:58 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-502-SOE7j1YDMcq5lbQEQmQmqw-1; Mon, 26 Jul 2021 07:05:53 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E112D1008061; Mon, 26 Jul 2021 11:05:52 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-114-106.ams2.redhat.com [10.36.114.106]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BAF4F60C5F; Mon, 26 Jul 2021 11:05:45 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 420691800903; Mon, 26 Jul 2021 13:05:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1627297555; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5Qho4eUmI2j3ooWz1Puc624X/X0cOSrEZ+/Jzjb9PEk=; b=jUbgYZVfJAsh1PctRyqZglOp3pIHIJDCxRfBrIdcdBhhUKNiF6jr5P+904RdVouXauQ8xQ MK0IAATAy3fjwaa4ekcZyauFvEHWYi1gQMeaf53u/n/CkVSwMn3/K7seXcWh/Tw+ASMlgE kRFCJ+5VrfprGNAORqqMhwNfwo6Qkxk= X-MC-Unique: SOE7j1YDMcq5lbQEQmQmqw-1 From: Gerd Hoffmann To: qemu-devel@nongnu.org Subject: [PULL 1/6] ui/gtk: Fix relative mouse with multiple monitors Date: Mon, 26 Jul 2021 13:05:39 +0200 Message-Id: <20210726110544.1934386-2-kraxel@redhat.com> In-Reply-To: <20210726110544.1934386-1-kraxel@redhat.com> References: <20210726110544.1934386-1-kraxel@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=kraxel@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=kraxel@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -34 X-Spam_score: -3.5 X-Spam_bar: --- X-Spam_report: (-3.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.717, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , =?UTF-8?q?Dennis=20W=C3=B6lfing?= , Gerd Hoffmann , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1627297711235100001 From: Dennis W=C3=B6lfing To handle relative mouse input the event handler needs to move the mouse away from the screen edges. Failing to do so results in the mouse getting stuck at invisible walls. However the current implementation for this is broken on hosts with multiple monitors. With multiple monitors the mouse can be located outside of the current monitor which is not handled by the current code. Also the monitor itself might be located at coordinates different from (0, 0). Signed-off-by: Dennis W=C3=B6lfing Reviewed-by: Marc-Andr=C3=A9 Lureau Message-Id: <20210720143940.291413-1-denniswoelfing@gmx.de> Signed-off-by: Gerd Hoffmann --- ui/gtk.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/ui/gtk.c b/ui/gtk.c index 376b4d528daa..18542c763312 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -865,37 +865,25 @@ static gboolean gd_motion_event(GtkWidget *widget, Gd= kEventMotion *motion, GdkWindow *win =3D gtk_widget_get_window(widget); GdkMonitor *monitor =3D gdk_display_get_monitor_at_window(dpy, win= ); GdkRectangle geometry; - int screen_width, screen_height; =20 int x =3D (int)motion->x_root; int y =3D (int)motion->y_root; =20 gdk_monitor_get_geometry(monitor, &geometry); - screen_width =3D geometry.width; - screen_height =3D geometry.height; =20 /* In relative mode check to see if client pointer hit - * one of the screen edges, and if so move it back by - * 200 pixels. This is important because the pointer + * one of the monitor edges, and if so move it back to the + * center of the monitor. This is important because the pointer * in the server doesn't correspond 1-for-1, and so * may still be only half way across the screen. Without * this warp, the server pointer would thus appear to hit * an invisible wall */ - if (x =3D=3D 0) { - x +=3D 200; - } - if (y =3D=3D 0) { - y +=3D 200; - } - if (x =3D=3D (screen_width - 1)) { - x -=3D 200; - } - if (y =3D=3D (screen_height - 1)) { - y -=3D 200; - } - - if (x !=3D (int)motion->x_root || y !=3D (int)motion->y_root) { + if (x <=3D geometry.x || x - geometry.x >=3D geometry.width - 1 || + y <=3D geometry.y || y - geometry.y >=3D geometry.height - 1) { GdkDevice *dev =3D gdk_event_get_device((GdkEvent *)motion); + x =3D geometry.x + geometry.width / 2; + y =3D geometry.y + geometry.height / 2; + gdk_device_warp(dev, screen, x, y); s->last_set =3D FALSE; return FALSE; --=20 2.31.1