diff options
Diffstat (limited to 'chromium/ui/gtk/x')
-rw-r--r-- | chromium/ui/gtk/x/gtk_event_loop_x11.cc | 47 | ||||
-rw-r--r-- | chromium/ui/gtk/x/gtk_ui_delegate_x11.cc | 9 |
2 files changed, 39 insertions, 17 deletions
diff --git a/chromium/ui/gtk/x/gtk_event_loop_x11.cc b/chromium/ui/gtk/x/gtk_event_loop_x11.cc index aab1a9c3581..abda48cbf04 100644 --- a/chromium/ui/gtk/x/gtk_event_loop_x11.cc +++ b/chromium/ui/gtk/x/gtk_event_loop_x11.cc @@ -7,9 +7,12 @@ #include <gdk/gdk.h> #include <gdk/gdkx.h> #include <gtk/gtk.h> +#include <xcb/xcb.h> +#include <xcb/xproto.h> #include "base/memory/singleton.h" #include "ui/events/platform/x11/x11_event_source.h" +#include "ui/gfx/x/event.h" #include "ui/gfx/x/x11.h" namespace ui { @@ -66,26 +69,42 @@ void GtkEventLoopX11::ProcessGdkEventKey(const GdkEventKey& gdk_event_key) { // corresponding key event in the X event queue. So we have to handle this // case. ibus-gtk is used through gtk-immodule to support IMEs. - XEvent x_event; - x_event.xkey = {}; - x_event.xkey.type = - gdk_event_key.type == GDK_KEY_PRESS ? KeyPress : KeyRelease; - x_event.xkey.send_event = gdk_event_key.send_event; - x_event.xkey.display = gfx::GetXDisplay(); - x_event.xkey.window = GDK_WINDOW_XID(gdk_event_key.window); - x_event.xkey.root = DefaultRootWindow(x_event.xkey.display); - x_event.xkey.time = gdk_event_key.time; - x_event.xkey.keycode = gdk_event_key.hardware_keycode; - x_event.xkey.same_screen = true; - x_event.xkey.state = + auto* conn = x11::Connection::Get(); + XDisplay* display = conn->display(); + + xcb_generic_event_t generic_event; + memset(&generic_event, 0, sizeof(generic_event)); + auto* key_event = reinterpret_cast<xcb_key_press_event_t*>(&generic_event); + key_event->response_type = gdk_event_key.type == GDK_KEY_PRESS + ? x11::KeyEvent::Press + : x11::KeyEvent::Release; + if (gdk_event_key.send_event) + key_event->response_type |= x11::kSendEventMask; + key_event->event = GDK_WINDOW_XID(gdk_event_key.window); + key_event->root = DefaultRootWindow(display); + key_event->time = gdk_event_key.time; + key_event->detail = gdk_event_key.hardware_keycode; + key_event->same_screen = true; + + x11::Event event(&generic_event, conn, false); + + // The key state is 16 bits on the wire, but ibus-gtk adds additional flags + // that may be outside this range, so set the state after conversion from + // the wire format. + // TODO(https://crbug.com/1066670): Add a test to ensure this subtle logic + // doesn't regress after all X11 event code is refactored from using Xlib to + // XProto. + int state = BuildXkbStateFromGdkEvent(gdk_event_key.state, gdk_event_key.group); + event.xlib_event().xkey.state = state; + event.As<x11::KeyEvent>()->state = static_cast<x11::KeyButMask>(state); // We want to process the gtk event; mapped to an X11 event immediately // otherwise if we put it back on the queue we may get items out of order. if (ui::X11EventSource* x11_source = ui::X11EventSource::GetInstance()) - x11_source->DispatchXEventNow(&x_event); + x11_source->DispatchXEvent(&event); else - XPutBackEvent(x_event.xkey.display, &x_event); + conn->events().push_front(std::move(event)); } } // namespace ui diff --git a/chromium/ui/gtk/x/gtk_ui_delegate_x11.cc b/chromium/ui/gtk/x/gtk_ui_delegate_x11.cc index 8967d4af8ac..8ae0f44fe54 100644 --- a/chromium/ui/gtk/x/gtk_ui_delegate_x11.cc +++ b/chromium/ui/gtk/x/gtk_ui_delegate_x11.cc @@ -33,17 +33,20 @@ GdkKeymap* GtkUiDelegateX11::GetGdkKeymap() { GdkWindow* GtkUiDelegateX11::GetGdkWindow(gfx::AcceleratedWidget window_id) { GdkDisplay* display = GetGdkDisplay(); - GdkWindow* gdk_window = gdk_x11_window_lookup_for_display(display, window_id); + GdkWindow* gdk_window = gdk_x11_window_lookup_for_display( + display, static_cast<uint32_t>(window_id)); if (gdk_window) g_object_ref(gdk_window); else - gdk_window = gdk_x11_window_foreign_new_for_display(display, window_id); + gdk_window = gdk_x11_window_foreign_new_for_display( + display, static_cast<uint32_t>(window_id)); return gdk_window; } bool GtkUiDelegateX11::SetGdkWindowTransientFor(GdkWindow* window, gfx::AcceleratedWidget parent) { - XSetTransientForHint(xdisplay_, GDK_WINDOW_XID(window), parent); + XSetTransientForHint(xdisplay_, GDK_WINDOW_XID(window), + static_cast<uint32_t>(parent)); return true; } |