summaryrefslogtreecommitdiff
path: root/chromium/ui/gtk/x
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/gtk/x')
-rw-r--r--chromium/ui/gtk/x/gtk_event_loop_x11.cc47
-rw-r--r--chromium/ui/gtk/x/gtk_ui_delegate_x11.cc9
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;
}