x11_event_waiter.cc 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/events/test/x11_event_waiter.h"
  5. #include "base/threading/thread_task_runner_handle.h"
  6. #include "ui/gfx/x/x11_atom_cache.h"
  7. #include "ui/gfx/x/xproto.h"
  8. #include "ui/gfx/x/xproto_util.h"
  9. namespace ui {
  10. // static
  11. XEventWaiter* XEventWaiter::Create(x11::Window window,
  12. base::OnceClosure callback) {
  13. auto* connection = x11::Connection::Get();
  14. x11::ClientMessageEvent marker_event{
  15. .format = 8,
  16. .window = window,
  17. .type = MarkerEventAtom(),
  18. };
  19. x11::SendEvent(marker_event, window, x11::EventMask::NoEvent);
  20. connection->Flush();
  21. // Will be deallocated when the expected event is received.
  22. return new XEventWaiter(std::move(callback));
  23. }
  24. // XEventWaiter implementation
  25. XEventWaiter::XEventWaiter(base::OnceClosure callback)
  26. : success_callback_(std::move(callback)) {
  27. x11::Connection::Get()->AddEventObserver(this);
  28. }
  29. XEventWaiter::~XEventWaiter() {
  30. x11::Connection::Get()->RemoveEventObserver(this);
  31. }
  32. void XEventWaiter::OnEvent(const x11::Event& xev) {
  33. auto* client = xev.As<x11::ClientMessageEvent>();
  34. if (client && client->type == MarkerEventAtom()) {
  35. base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
  36. std::move(success_callback_));
  37. delete this;
  38. }
  39. }
  40. // Returns atom that indidates that the XEvent is marker event.
  41. x11::Atom XEventWaiter::MarkerEventAtom() {
  42. return x11::GetAtom("marker_event");
  43. }
  44. } // namespace ui