diff --git a/kcms/touchpad/src/backends/x11/xlibbackend.cpp b/kcms/touchpad/src/backends/x11/xlibbackend.cpp --- a/kcms/touchpad/src/backends/x11/xlibbackend.cpp +++ b/kcms/touchpad/src/backends/x11/xlibbackend.cpp @@ -291,7 +291,7 @@ void XlibBackend::watchForEvents(bool keyboard) { if (!m_notifications) { - m_notifications.reset(new XlibNotifications(m_display.data(), m_device ? m_device->deviceId() : XIAllDevices)); + m_notifications.reset(new XlibNotifications(m_device ? m_device->deviceId() : XIAllDevices)); connect(m_notifications.data(), SIGNAL(devicePlugged(int)), SLOT(devicePlugged(int))); connect(m_notifications.data(), SIGNAL(touchpadDetached()), diff --git a/kcms/touchpad/src/backends/x11/xlibnotifications.h b/kcms/touchpad/src/backends/x11/xlibnotifications.h --- a/kcms/touchpad/src/backends/x11/xlibnotifications.h +++ b/kcms/touchpad/src/backends/x11/xlibnotifications.h @@ -30,7 +30,7 @@ { Q_OBJECT public: - XlibNotifications(Display *display, int device); + XlibNotifications(int device); ~XlibNotifications(); Q_SIGNALS: diff --git a/kcms/touchpad/src/backends/x11/xlibnotifications.cpp b/kcms/touchpad/src/backends/x11/xlibnotifications.cpp --- a/kcms/touchpad/src/backends/x11/xlibnotifications.cpp +++ b/kcms/touchpad/src/backends/x11/xlibnotifications.cpp @@ -26,10 +26,17 @@ #include #include -XlibNotifications::XlibNotifications(Display *display, int device) - : m_display(display), m_device(device) +XlibNotifications::XlibNotifications(int device) + : m_display(XOpenDisplay(0)), m_device(device) { - m_connection = XGetXCBConnection(display); + if (!m_display) { + return; + } + + m_connection = XGetXCBConnection(m_display); + if (!m_connection) { + return; + } m_notifier = new QSocketNotifier(xcb_get_file_descriptor(m_connection), QSocketNotifier::Read, this); @@ -66,9 +73,9 @@ masks[1].mask_len = sizeof(allMask); XISetMask(allMask, XI_HierarchyChanged); - XISelectEvents(display, XDefaultRootWindow(display), masks, + XISelectEvents(m_display, XDefaultRootWindow(m_display), masks, sizeof(masks) / sizeof(XIEventMask)); - XFlush(display); + XFlush(m_display); connect(m_notifier, SIGNAL(activated(int)), SLOT(processEvents())); m_notifier->setEnabled(true); @@ -149,8 +156,14 @@ XlibNotifications::~XlibNotifications() { - xcb_destroy_window(m_connection, m_inputWindow); - xcb_flush(m_connection); + if (m_connection) { + xcb_destroy_window(m_connection, m_inputWindow); + xcb_flush(m_connection); + } + + if (m_display) { + XCloseDisplay(m_display); + } } #include "moc_xlibnotifications.cpp"