On Thu, Sep 21, 2023 at 12:30 PM Akihiko Odaki <akihiko.od...@daynix.com> wrote: > > Although an input is routed depending on the console, > qemu_input_is_absolute() had no mechanism to specify the console. > > Accept QemuConsole as an argument for qemu_input_is_absolute, and let > the display know the absolute/relative state for a particular console. > > Signed-off-by: Akihiko Odaki <akihiko.od...@daynix.com>
Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > V2 -> V3: Rebased to commit 55394dcbec8f0c29c30e792c102a0edd50a52bf4 > V1 -> V2: Rebased to commit 79b677d658d3d35e1e776826ac4abb28cdce69b8 > > include/ui/input.h | 2 +- > ui/dbus-console.c | 6 +++--- > ui/gtk.c | 12 ++++++------ > ui/input.c | 29 +++++++---------------------- > ui/sdl2.c | 26 +++++++++++++------------- > ui/spice-input.c | 2 +- > ui/vnc.c | 2 +- > ui/cocoa.m | 2 +- > ui/trace-events | 1 - > 9 files changed, 33 insertions(+), 49 deletions(-) > > diff --git a/include/ui/input.h b/include/ui/input.h > index c29a730a71..24d8e4579e 100644 > --- a/include/ui/input.h > +++ b/include/ui/input.h > @@ -57,7 +57,7 @@ void qemu_input_queue_btn(QemuConsole *src, InputButton > btn, bool down); > void qemu_input_update_buttons(QemuConsole *src, uint32_t *button_map, > uint32_t button_old, uint32_t button_new); > > -bool qemu_input_is_absolute(void); > +bool qemu_input_is_absolute(QemuConsole *con); > int qemu_input_scale_axis(int value, > int min_in, int max_in, > int min_out, int max_out); > diff --git a/ui/dbus-console.c b/ui/dbus-console.c > index 36f7349585..49da9ccc83 100644 > --- a/ui/dbus-console.c > +++ b/ui/dbus-console.c > @@ -386,7 +386,7 @@ dbus_mouse_rel_motion(DBusDisplayConsole *ddc, > { > trace_dbus_mouse_rel_motion(dx, dy); > > - if (qemu_input_is_absolute()) { > + if (qemu_input_is_absolute(ddc->dcl.con)) { > g_dbus_method_invocation_return_error( > invocation, DBUS_DISPLAY_ERROR, > DBUS_DISPLAY_ERROR_INVALID, > @@ -453,7 +453,7 @@ dbus_mouse_set_pos(DBusDisplayConsole *ddc, > > trace_dbus_mouse_set_pos(x, y); > > - if (!qemu_input_is_absolute()) { > + if (!qemu_input_is_absolute(ddc->dcl.con)) { > g_dbus_method_invocation_return_error( > invocation, DBUS_DISPLAY_ERROR, > DBUS_DISPLAY_ERROR_INVALID, > @@ -514,7 +514,7 @@ static void > dbus_mouse_update_is_absolute(DBusDisplayConsole *ddc) > { > g_object_set(ddc->iface_mouse, > - "is-absolute", qemu_input_is_absolute(), > + "is-absolute", qemu_input_is_absolute(ddc->dcl.con), > NULL); > } > > diff --git a/ui/gtk.c b/ui/gtk.c > index e09f97a86b..40b8d27da5 100644 > --- a/ui/gtk.c > +++ b/ui/gtk.c > @@ -204,7 +204,7 @@ static void gd_update_cursor(VirtualConsole *vc) > } > > window = gtk_widget_get_window(GTK_WIDGET(vc->gfx.drawing_area)); > - if (s->full_screen || qemu_input_is_absolute() || s->ptr_owner == vc) { > + if (s->full_screen || qemu_input_is_absolute(vc->gfx.dcl.con) || > s->ptr_owner == vc) { > gdk_window_set_cursor(window, s->null_cursor); > } else { > gdk_window_set_cursor(window, NULL); > @@ -453,7 +453,7 @@ static void gd_mouse_set(DisplayChangeListener *dcl, > gint x_root, y_root; > > if (!gtk_widget_get_realized(vc->gfx.drawing_area) || > - qemu_input_is_absolute()) { > + qemu_input_is_absolute(dcl->con)) { > return; > } > > @@ -689,7 +689,7 @@ static void gd_mouse_mode_change(Notifier *notify, void > *data) > > s = container_of(notify, GtkDisplayState, mouse_mode_notifier); > /* release the grab at switching to absolute mode */ > - if (qemu_input_is_absolute() && s->ptr_owner) { > + if (s->ptr_owner && qemu_input_is_absolute(s->ptr_owner->gfx.dcl.con)) { > if (!s->ptr_owner->window) { > gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(s->grab_item), > FALSE); > @@ -903,7 +903,7 @@ static gboolean gd_motion_event(GtkWidget *widget, > GdkEventMotion *motion, > x = (motion->x - mx) / vc->gfx.scale_x * ws; > y = (motion->y - my) / vc->gfx.scale_y * ws; > > - if (qemu_input_is_absolute()) { > + if (qemu_input_is_absolute(vc->gfx.dcl.con)) { > if (x < 0 || y < 0 || > x >= surface_width(vc->gfx.ds) || > y >= surface_height(vc->gfx.ds)) { > @@ -923,7 +923,7 @@ static gboolean gd_motion_event(GtkWidget *widget, > GdkEventMotion *motion, > s->last_y = y; > s->last_set = TRUE; > > - if (!qemu_input_is_absolute() && s->ptr_owner == vc) { > + if (!qemu_input_is_absolute(vc->gfx.dcl.con) && s->ptr_owner == vc) { > GdkScreen *screen = gtk_widget_get_screen(vc->gfx.drawing_area); > GdkDisplay *dpy = gtk_widget_get_display(widget); > GdkWindow *win = gtk_widget_get_window(widget); > @@ -965,7 +965,7 @@ static gboolean gd_button_event(GtkWidget *widget, > GdkEventButton *button, > > /* implicitly grab the input at the first click in the relative mode */ > if (button->button == 1 && button->type == GDK_BUTTON_PRESS && > - !qemu_input_is_absolute() && s->ptr_owner != vc) { > + !qemu_input_is_absolute(vc->gfx.dcl.con) && s->ptr_owner != vc) { > if (!vc->window) { > gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(s->grab_item), > TRUE); > diff --git a/ui/input.c b/ui/input.c > index 1aad64b07c..cbe8573c5c 100644 > --- a/ui/input.c > +++ b/ui/input.c > @@ -56,7 +56,7 @@ QemuInputHandlerState > *qemu_input_handler_register(DeviceState *dev, > s->id = id++; > QTAILQ_INSERT_TAIL(&handlers, s, node); > > - qemu_input_check_mode_change(); > + notifier_list_notify(&mouse_mode_notifiers, NULL); > return s; > } > > @@ -64,21 +64,21 @@ void qemu_input_handler_activate(QemuInputHandlerState *s) > { > QTAILQ_REMOVE(&handlers, s, node); > QTAILQ_INSERT_HEAD(&handlers, s, node); > - qemu_input_check_mode_change(); > + notifier_list_notify(&mouse_mode_notifiers, NULL); > } > > void qemu_input_handler_deactivate(QemuInputHandlerState *s) > { > QTAILQ_REMOVE(&handlers, s, node); > QTAILQ_INSERT_TAIL(&handlers, s, node); > - qemu_input_check_mode_change(); > + notifier_list_notify(&mouse_mode_notifiers, NULL); > } > > void qemu_input_handler_unregister(QemuInputHandlerState *s) > { > QTAILQ_REMOVE(&handlers, s, node); > g_free(s); > - qemu_input_check_mode_change(); > + notifier_list_notify(&mouse_mode_notifiers, NULL); > } > > void qemu_input_handler_bind(QemuInputHandlerState *s, > @@ -494,12 +494,12 @@ void qemu_input_update_buttons(QemuConsole *src, > uint32_t *button_map, > } > } > > -bool qemu_input_is_absolute(void) > +bool qemu_input_is_absolute(QemuConsole *con) > { > QemuInputHandlerState *s; > > s = qemu_input_find_handler(INPUT_EVENT_MASK_REL | INPUT_EVENT_MASK_ABS, > - NULL); > + con); > return (s != NULL) && (s->handler->mask & INPUT_EVENT_MASK_ABS); > } > > @@ -583,21 +583,6 @@ void qemu_input_queue_mtt_abs(QemuConsole *src, > InputAxis axis, int value, > qemu_input_event_send(src, &evt); > } > > -void qemu_input_check_mode_change(void) > -{ > - static int current_is_absolute; > - int is_absolute; > - > - is_absolute = qemu_input_is_absolute(); > - > - if (is_absolute != current_is_absolute) { > - trace_input_mouse_mode(is_absolute); > - notifier_list_notify(&mouse_mode_notifiers, NULL); > - } > - > - current_is_absolute = is_absolute; > -} > - > void qemu_add_mouse_mode_change_notifier(Notifier *notify) > { > notifier_list_add(&mouse_mode_notifiers, notify); > @@ -657,6 +642,6 @@ bool qemu_mouse_set(int index, Error **errp) > } > > qemu_input_handler_activate(s); > - qemu_input_check_mode_change(); > + notifier_list_notify(&mouse_mode_notifiers, NULL); > return true; > } > diff --git a/ui/sdl2.c b/ui/sdl2.c > index 178cc054ab..fbfdb64e90 100644 > --- a/ui/sdl2.c > +++ b/ui/sdl2.c > @@ -203,7 +203,7 @@ static void sdl_hide_cursor(struct sdl2_console *scon) > SDL_ShowCursor(SDL_DISABLE); > SDL_SetCursor(sdl_cursor_hidden); > > - if (!qemu_input_is_absolute()) { > + if (!qemu_input_is_absolute(scon->dcl.con)) { > SDL_SetRelativeMouseMode(SDL_TRUE); > } > } > @@ -214,12 +214,12 @@ static void sdl_show_cursor(struct sdl2_console *scon) > return; > } > > - if (!qemu_input_is_absolute()) { > + if (!qemu_input_is_absolute(scon->dcl.con)) { > SDL_SetRelativeMouseMode(SDL_FALSE); > } > > if (guest_cursor && > - (gui_grab || qemu_input_is_absolute() || absolute_enabled)) { > + (gui_grab || qemu_input_is_absolute(scon->dcl.con) || > absolute_enabled)) { > SDL_SetCursor(guest_sprite); > } else { > SDL_SetCursor(sdl_cursor_normal); > @@ -245,7 +245,7 @@ static void sdl_grab_start(struct sdl2_console *scon) > } > if (guest_cursor) { > SDL_SetCursor(guest_sprite); > - if (!qemu_input_is_absolute() && !absolute_enabled) { > + if (!qemu_input_is_absolute(scon->dcl.con) && !absolute_enabled) { > SDL_WarpMouseInWindow(scon->real_window, guest_x, guest_y); > } > } else { > @@ -280,7 +280,7 @@ static void absolute_mouse_grab(struct sdl2_console *scon) > > static void sdl_mouse_mode_change(Notifier *notify, void *data) > { > - if (qemu_input_is_absolute()) { > + if (qemu_input_is_absolute(sdl2_console[0].dcl.con)) { > if (!absolute_enabled) { > absolute_enabled = 1; > SDL_SetRelativeMouseMode(SDL_FALSE); > @@ -311,7 +311,7 @@ static void sdl_send_mouse_event(struct sdl2_console > *scon, int dx, int dy, > prev_state = state; > } > > - if (qemu_input_is_absolute()) { > + if (qemu_input_is_absolute(scon->dcl.con)) { > qemu_input_queue_abs(scon->dcl.con, INPUT_AXIS_X, > x, 0, surface_width(scon->surface)); > qemu_input_queue_abs(scon->dcl.con, INPUT_AXIS_Y, > @@ -497,7 +497,7 @@ static void handle_mousemotion(SDL_Event *ev) > return; > } > > - if (qemu_input_is_absolute() || absolute_enabled) { > + if (qemu_input_is_absolute(scon->dcl.con) || absolute_enabled) { > int scr_w, scr_h; > SDL_GetWindowSize(scon->real_window, &scr_w, &scr_h); > max_x = scr_w - 1; > @@ -513,7 +513,7 @@ static void handle_mousemotion(SDL_Event *ev) > sdl_grab_start(scon); > } > } > - if (gui_grab || qemu_input_is_absolute() || absolute_enabled) { > + if (gui_grab || qemu_input_is_absolute(scon->dcl.con) || > absolute_enabled) { > sdl_send_mouse_event(scon, ev->motion.xrel, ev->motion.yrel, > ev->motion.x, ev->motion.y, ev->motion.state); > } > @@ -530,7 +530,7 @@ static void handle_mousebutton(SDL_Event *ev) > } > > bev = &ev->button; > - if (!gui_grab && !qemu_input_is_absolute()) { > + if (!gui_grab && !qemu_input_is_absolute(scon->dcl.con)) { > if (ev->type == SDL_MOUSEBUTTONUP && bev->button == SDL_BUTTON_LEFT) > { > /* start grabbing all events */ > sdl_grab_start(scon); > @@ -603,7 +603,7 @@ static void handle_windowevent(SDL_Event *ev) > } > /* fall through */ > case SDL_WINDOWEVENT_ENTER: > - if (!gui_grab && (qemu_input_is_absolute() || absolute_enabled)) { > + if (!gui_grab && (qemu_input_is_absolute(scon->dcl.con) || > absolute_enabled)) { > absolute_mouse_grab(scon); > } > /* If a new console window opened using a hotkey receives the > @@ -733,9 +733,9 @@ static void sdl_mouse_warp(DisplayChangeListener *dcl, > if (!guest_cursor) { > sdl_show_cursor(scon); > } > - if (gui_grab || qemu_input_is_absolute() || absolute_enabled) { > + if (gui_grab || qemu_input_is_absolute(scon->dcl.con) || > absolute_enabled) { > SDL_SetCursor(guest_sprite); > - if (!qemu_input_is_absolute() && !absolute_enabled) { > + if (!qemu_input_is_absolute(scon->dcl.con) && !absolute_enabled) > { > SDL_WarpMouseInWindow(scon->real_window, x, y); > } > } > @@ -773,7 +773,7 @@ static void sdl_mouse_define(DisplayChangeListener *dcl, > return; > } > if (guest_cursor && > - (gui_grab || qemu_input_is_absolute() || absolute_enabled)) { > + (gui_grab || qemu_input_is_absolute(dcl->con) || absolute_enabled)) { > SDL_SetCursor(guest_sprite); > } > } > diff --git a/ui/spice-input.c b/ui/spice-input.c > index bbd502564e..a5c5d78474 100644 > --- a/ui/spice-input.c > +++ b/ui/spice-input.c > @@ -224,7 +224,7 @@ static const SpiceTabletInterface tablet_interface = { > static void mouse_mode_notifier(Notifier *notifier, void *data) > { > QemuSpicePointer *pointer = container_of(notifier, QemuSpicePointer, > mouse_mode); > - bool is_absolute = qemu_input_is_absolute(); > + bool is_absolute = qemu_input_is_absolute(NULL); > > if (pointer->absolute == is_absolute) { > return; > diff --git a/ui/vnc.c b/ui/vnc.c > index 6fd86996a5..e2114499d9 100644 > --- a/ui/vnc.c > +++ b/ui/vnc.c > @@ -1771,7 +1771,7 @@ uint32_t read_u32(uint8_t *data, size_t offset) > static void check_pointer_type_change(Notifier *notifier, void *data) > { > VncState *vs = container_of(notifier, VncState, mouse_mode_notifier); > - int absolute = qemu_input_is_absolute(); > + int absolute = qemu_input_is_absolute(vs->vd->dcl.con); > > if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute > != absolute) { > vnc_lock_output(vs); > diff --git a/ui/cocoa.m b/ui/cocoa.m > index df6d13be38..145f42d190 100644 > --- a/ui/cocoa.m > +++ b/ui/cocoa.m > @@ -2001,7 +2001,7 @@ static void cocoa_refresh(DisplayChangeListener *dcl) > COCOA_DEBUG("qemu_cocoa: cocoa_refresh\n"); > graphic_hw_update(NULL); > > - if (qemu_input_is_absolute()) { > + if (qemu_input_is_absolute(dcl->con)) { > dispatch_async(dispatch_get_main_queue(), ^{ > if (![cocoaView isAbsoluteEnabled]) { > if ([cocoaView isMouseGrabbed]) { > diff --git a/ui/trace-events b/ui/trace-events > index 76b19a2995..16c35c9fd6 100644 > --- a/ui/trace-events > +++ b/ui/trace-events > @@ -92,7 +92,6 @@ input_event_rel(int conidx, const char *axis, int value) > "con %d, axis %s, value > input_event_abs(int conidx, const char *axis, int value) "con %d, axis %s, > value 0x%x" > input_event_mtt(int conidx, const char *axis, int value) "con %d, axis %s, > value 0x%x" > input_event_sync(void) "" > -input_mouse_mode(int absolute) "absolute %d" > > # sdl2-input.c > sdl2_process_key(int sdl_scancode, int qcode, const char *action) > "translated SDL scancode %d to QKeyCode %d (%s)" > -- > 2.41.0 > > -- Marc-André Lureau