ui/gtk: pass horizontal scroll information to the device code

Signed-off-by: Dmitry Petrov <dpetroff@gmail.com>
Message-Id: <20220108153947.171861-4-dpetroff@gmail.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Dmitry Petrov 2022-01-08 16:39:45 +01:00 committed by Gerd Hoffmann
parent d70a5de441
commit 13cb360f6e

View File

@ -968,33 +968,63 @@ static gboolean gd_scroll_event(GtkWidget *widget, GdkEventScroll *scroll,
void *opaque)
{
VirtualConsole *vc = opaque;
InputButton btn;
InputButton btn_vertical;
InputButton btn_horizontal;
bool has_vertical = false;
bool has_horizontal = false;
if (scroll->direction == GDK_SCROLL_UP) {
btn = INPUT_BUTTON_WHEEL_UP;
btn_vertical = INPUT_BUTTON_WHEEL_UP;
has_vertical = true;
} else if (scroll->direction == GDK_SCROLL_DOWN) {
btn = INPUT_BUTTON_WHEEL_DOWN;
btn_vertical = INPUT_BUTTON_WHEEL_DOWN;
has_vertical = true;
} else if (scroll->direction == GDK_SCROLL_LEFT) {
btn_horizontal = INPUT_BUTTON_WHEEL_LEFT;
has_horizontal = true;
} else if (scroll->direction == GDK_SCROLL_RIGHT) {
btn_horizontal = INPUT_BUTTON_WHEEL_RIGHT;
has_horizontal = true;
} else if (scroll->direction == GDK_SCROLL_SMOOTH) {
gdouble delta_x, delta_y;
if (!gdk_event_get_scroll_deltas((GdkEvent *)scroll,
&delta_x, &delta_y)) {
return TRUE;
}
if (delta_y == 0) {
return TRUE;
} else if (delta_y > 0) {
btn = INPUT_BUTTON_WHEEL_DOWN;
if (delta_y > 0) {
btn_vertical = INPUT_BUTTON_WHEEL_DOWN;
has_vertical = true;
} else if (delta_y < 0) {
btn_vertical = INPUT_BUTTON_WHEEL_UP;
has_vertical = true;
} else if (delta_x > 0) {
btn_horizontal = INPUT_BUTTON_WHEEL_RIGHT;
has_horizontal = true;
} else if (delta_x < 0) {
btn_horizontal = INPUT_BUTTON_WHEEL_LEFT;
has_horizontal = true;
} else {
btn = INPUT_BUTTON_WHEEL_UP;
return TRUE;
}
} else {
return TRUE;
}
qemu_input_queue_btn(vc->gfx.dcl.con, btn, true);
if (has_vertical) {
qemu_input_queue_btn(vc->gfx.dcl.con, btn_vertical, true);
qemu_input_event_sync();
qemu_input_queue_btn(vc->gfx.dcl.con, btn, false);
qemu_input_queue_btn(vc->gfx.dcl.con, btn_vertical, false);
qemu_input_event_sync();
}
if (has_horizontal) {
qemu_input_queue_btn(vc->gfx.dcl.con, btn_horizontal, true);
qemu_input_event_sync();
qemu_input_queue_btn(vc->gfx.dcl.con, btn_horizontal, false);
qemu_input_event_sync();
}
return TRUE;
}