| Index: base/message_loop/message_pump_x11.cc
|
| diff --git a/base/message_loop/message_pump_x11.cc b/base/message_loop/message_pump_x11.cc
|
| index a86e4fe386cc1f42936ac5c99e7dc8433d49cb35..6a4db101474239447ab2130903688b19a088645b 100644
|
| --- a/base/message_loop/message_pump_x11.cc
|
| +++ b/base/message_loop/message_pump_x11.cc
|
| @@ -16,33 +16,6 @@ namespace base {
|
|
|
| namespace {
|
|
|
| -gboolean XSourcePrepare(GSource* source, gint* timeout_ms) {
|
| - if (XPending(MessagePumpX11::GetDefaultXDisplay()))
|
| - *timeout_ms = 0;
|
| - else
|
| - *timeout_ms = -1;
|
| - return FALSE;
|
| -}
|
| -
|
| -gboolean XSourceCheck(GSource* source) {
|
| - return XPending(MessagePumpX11::GetDefaultXDisplay());
|
| -}
|
| -
|
| -gboolean XSourceDispatch(GSource* source,
|
| - GSourceFunc unused_func,
|
| - gpointer data) {
|
| - MessagePumpX11* pump = static_cast<MessagePumpX11*>(data);
|
| - pump->DispatchXEvents();
|
| - return TRUE;
|
| -}
|
| -
|
| -GSourceFuncs XSourceFuncs = {
|
| - XSourcePrepare,
|
| - XSourceCheck,
|
| - XSourceDispatch,
|
| - NULL
|
| -};
|
| -
|
| // The connection is essentially a global that's accessed through a static
|
| // method and destroyed whenever ~MessagePumpX11() is called. We do this
|
| // for historical reasons so user code can call
|
| @@ -52,94 +25,16 @@ GSourceFuncs XSourceFuncs = {
|
| // TODO(erg): This can be changed to something more sane like
|
| // MessagePumpX11::Current()->display() once MessagePumpGtk goes away.
|
| Display* g_xdisplay = NULL;
|
| -int g_xinput_opcode = -1;
|
| -
|
| -bool InitializeXInput2() {
|
| - Display* display = MessagePumpX11::GetDefaultXDisplay();
|
| - if (!display)
|
| - return false;
|
| -
|
| - int event, err;
|
| -
|
| - int xiopcode;
|
| - if (!XQueryExtension(display, "XInputExtension", &xiopcode, &event, &err)) {
|
| - DVLOG(1) << "X Input extension not available.";
|
| - return false;
|
| - }
|
| - g_xinput_opcode = xiopcode;
|
| -
|
| -#if defined(USE_XI2_MT)
|
| - // USE_XI2_MT also defines the required XI2 minor minimum version.
|
| - int major = 2, minor = USE_XI2_MT;
|
| -#else
|
| - int major = 2, minor = 0;
|
| -#endif
|
| - if (XIQueryVersion(display, &major, &minor) == BadRequest) {
|
| - DVLOG(1) << "XInput2 not supported in the server.";
|
| - return false;
|
| - }
|
| -#if defined(USE_XI2_MT)
|
| - if (major < 2 || (major == 2 && minor < USE_XI2_MT)) {
|
| - DVLOG(1) << "XI version on server is " << major << "." << minor << ". "
|
| - << "But 2." << USE_XI2_MT << " is required.";
|
| - return false;
|
| - }
|
| -#endif
|
| -
|
| - return true;
|
| -}
|
| -
|
| -Window FindEventTarget(const NativeEvent& xev) {
|
| - Window target = xev->xany.window;
|
| - if (xev->type == GenericEvent &&
|
| - static_cast<XIEvent*>(xev->xcookie.data)->extension == g_xinput_opcode) {
|
| - target = static_cast<XIDeviceEvent*>(xev->xcookie.data)->event;
|
| - }
|
| - return target;
|
| -}
|
| -
|
| -bool InitializeXkb() {
|
| - Display* display = MessagePumpX11::GetDefaultXDisplay();
|
| - if (!display)
|
| - return false;
|
| -
|
| - int opcode, event, error;
|
| - int major = XkbMajorVersion;
|
| - int minor = XkbMinorVersion;
|
| - if (!XkbQueryExtension(display, &opcode, &event, &error, &major, &minor)) {
|
| - DVLOG(1) << "Xkb extension not available.";
|
| - return false;
|
| - }
|
| -
|
| - // Ask the server not to send KeyRelease event when the user holds down a key.
|
| - // crbug.com/138092
|
| - Bool supported_return;
|
| - if (!XkbSetDetectableAutoRepeat(display, True, &supported_return)) {
|
| - DVLOG(1) << "XKB not supported in the server.";
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
|
|
| } // namespace
|
|
|
| -MessagePumpX11::MessagePumpX11() : MessagePumpGlib(),
|
| - x_source_(NULL) {
|
| - InitializeXInput2();
|
| - InitializeXkb();
|
| - InitXSource();
|
| -
|
| - // Can't put this in the initializer list because g_xdisplay may not exist
|
| - // until after InitXSource().
|
| - x_root_window_ = DefaultRootWindow(g_xdisplay);
|
| -}
|
| +MessagePumpX11::MessagePumpX11() : MessagePumpGlib() {}
|
|
|
| MessagePumpX11::~MessagePumpX11() {
|
| - g_source_destroy(x_source_);
|
| - g_source_unref(x_source_);
|
| - XCloseDisplay(g_xdisplay);
|
| - g_xdisplay = NULL;
|
| + if (g_xdisplay) {
|
| + XCloseDisplay(g_xdisplay);
|
| + g_xdisplay = NULL;
|
| + }
|
| }
|
|
|
| // static
|
| @@ -163,26 +58,6 @@ MessagePumpX11* MessagePumpX11::Current() {
|
| }
|
| #endif
|
|
|
| -void MessagePumpX11::AddDispatcherForWindow(
|
| - MessagePumpDispatcher* dispatcher,
|
| - unsigned long xid) {
|
| - dispatchers_.insert(std::make_pair(xid, dispatcher));
|
| -}
|
| -
|
| -void MessagePumpX11::RemoveDispatcherForWindow(unsigned long xid) {
|
| - dispatchers_.erase(xid);
|
| -}
|
| -
|
| -void MessagePumpX11::AddDispatcherForRootWindow(
|
| - MessagePumpDispatcher* dispatcher) {
|
| - root_window_dispatchers_.AddObserver(dispatcher);
|
| -}
|
| -
|
| -void MessagePumpX11::RemoveDispatcherForRootWindow(
|
| - MessagePumpDispatcher* dispatcher) {
|
| - root_window_dispatchers_.RemoveObserver(dispatcher);
|
| -}
|
| -
|
| void MessagePumpX11::AddObserver(MessagePumpObserver* observer) {
|
| observers_.AddObserver(observer);
|
| }
|
| @@ -191,86 +66,10 @@ void MessagePumpX11::RemoveObserver(MessagePumpObserver* observer) {
|
| observers_.RemoveObserver(observer);
|
| }
|
|
|
| -void MessagePumpX11::DispatchXEvents() {
|
| - Display* display = GetDefaultXDisplay();
|
| - DCHECK(display);
|
| - MessagePumpDispatcher* dispatcher = GetDispatcher();
|
| - if (!dispatcher)
|
| - dispatcher = this;
|
| -
|
| - // In the general case, we want to handle all pending events before running
|
| - // the tasks. This is what happens in the message_pump_glib case.
|
| - while (XPending(display)) {
|
| - XEvent xev;
|
| - XNextEvent(display, &xev);
|
| - ProcessXEvent(dispatcher, &xev);
|
| - if (ShouldQuit())
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void MessagePumpX11::BlockUntilWindowMapped(unsigned long xid) {
|
| - XEvent event;
|
| -
|
| - Display* display = GetDefaultXDisplay();
|
| - DCHECK(display);
|
| -
|
| - MessagePumpDispatcher* dispatcher = GetDispatcher();
|
| - if (!dispatcher)
|
| - dispatcher = this;
|
| -
|
| - do {
|
| - // Block until there's a message of |event_mask| type on |w|. Then remove
|
| - // it from the queue and stuff it in |event|.
|
| - XWindowEvent(display, xid, StructureNotifyMask, &event);
|
| - ProcessXEvent(dispatcher, &event);
|
| - } while (event.type != MapNotify);
|
| -}
|
| -
|
| -void MessagePumpX11::InitXSource() {
|
| - // CHECKs are to help track down crbug.com/113106.
|
| - CHECK(!x_source_);
|
| - Display* display = GetDefaultXDisplay();
|
| - CHECK(display) << "Unable to get connection to X server";
|
| - x_poll_.reset(new GPollFD());
|
| - CHECK(x_poll_.get());
|
| - x_poll_->fd = ConnectionNumber(display);
|
| - x_poll_->events = G_IO_IN;
|
| -
|
| - x_source_ = g_source_new(&XSourceFuncs, sizeof(GSource));
|
| - g_source_add_poll(x_source_, x_poll_.get());
|
| - g_source_set_can_recurse(x_source_, TRUE);
|
| - g_source_set_callback(x_source_, NULL, this, NULL);
|
| - g_source_attach(x_source_, g_main_context_default());
|
| -}
|
| -
|
| -void MessagePumpX11::ProcessXEvent(MessagePumpDispatcher* dispatcher,
|
| - XEvent* xev) {
|
| - CHECK(dispatcher);
|
| - bool have_cookie = false;
|
| - if (xev->type == GenericEvent &&
|
| - XGetEventData(xev->xgeneric.display, &xev->xcookie)) {
|
| - have_cookie = true;
|
| - }
|
| -
|
| - if (!WillProcessXEvent(xev)) {
|
| - uint32_t action = dispatcher->Dispatch(xev);
|
| - bool should_quit = (action & POST_DISPATCH_QUIT_LOOP);
|
| - if (dispatcher != this && (action & POST_DISPATCH_PERFORM_DEFAULT))
|
| - action = Dispatch(xev);
|
| - if ((action & POST_DISPATCH_QUIT_LOOP) || should_quit)
|
| - Quit();
|
| - DidProcessXEvent(xev);
|
| - }
|
| -
|
| - if (have_cookie)
|
| - XFreeEventData(xev->xgeneric.display, &xev->xcookie);
|
| -}
|
| -
|
| bool MessagePumpX11::WillProcessXEvent(XEvent* xevent) {
|
| - if (!observers().might_have_observers())
|
| + if (!observers_.might_have_observers())
|
| return false;
|
| - ObserverListBase<MessagePumpObserver>::Iterator it(observers());
|
| + ObserverListBase<MessagePumpObserver>::Iterator it(observers_);
|
| MessagePumpObserver* obs;
|
| while ((obs = it.GetNext()) != NULL) {
|
| if (obs->WillProcessEvent(xevent))
|
| @@ -280,35 +79,7 @@ bool MessagePumpX11::WillProcessXEvent(XEvent* xevent) {
|
| }
|
|
|
| void MessagePumpX11::DidProcessXEvent(XEvent* xevent) {
|
| - FOR_EACH_OBSERVER(MessagePumpObserver, observers(), DidProcessEvent(xevent));
|
| -}
|
| -
|
| -MessagePumpDispatcher* MessagePumpX11::GetDispatcherForXEvent(
|
| - const NativeEvent& xev) const {
|
| - ::Window x_window = FindEventTarget(xev);
|
| - DispatchersMap::const_iterator it = dispatchers_.find(x_window);
|
| - return it != dispatchers_.end() ? it->second : NULL;
|
| -}
|
| -
|
| -uint32_t MessagePumpX11::Dispatch(const NativeEvent& xev) {
|
| - // MappingNotify events (meaning that the keyboard or pointer buttons have
|
| - // been remapped) aren't associated with a window; send them to all
|
| - // dispatchers.
|
| - if (xev->type == MappingNotify) {
|
| - for (DispatchersMap::const_iterator it = dispatchers_.begin();
|
| - it != dispatchers_.end(); ++it) {
|
| - it->second->Dispatch(xev);
|
| - }
|
| - return POST_DISPATCH_NONE;
|
| - }
|
| -
|
| - if (FindEventTarget(xev) == x_root_window_) {
|
| - FOR_EACH_OBSERVER(MessagePumpDispatcher, root_window_dispatchers_,
|
| - Dispatch(xev));
|
| - return POST_DISPATCH_NONE;
|
| - }
|
| - MessagePumpDispatcher* dispatcher = GetDispatcherForXEvent(xev);
|
| - return dispatcher ? dispatcher->Dispatch(xev) : POST_DISPATCH_NONE;
|
| + FOR_EACH_OBSERVER(MessagePumpObserver, observers_, DidProcessEvent(xevent));
|
| }
|
|
|
| } // namespace base
|
|
|