• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdenetwork API Reference
  • KDE Home
  • Contact Us
 

kopete/libkopete

  • sources
  • kde-4.14
  • kdenetwork
  • kopete
  • libkopete
  • private
kopeteidleplatform_x11.cpp
Go to the documentation of this file.
1 /*
2  kopeteidleplatform_x11.cpp - Kopete Idle Platform
3 
4  Copyright (C) 2003 by Justin Karneges <justin@affinix.com> (from KVIrc source code)
5  Copyright (c) 2008 by Roman Jarosz <kedgedev@centrum.cz>
6  Kopete (c) 2008 by the Kopete developers <kopete-devel@kde.org>
7 
8  *************************************************************************
9  * *
10  * This library is free software; you can redistribute it and/or *
11  * modify it under the terms of the GNU Lesser General Public *
12  * License as published by the Free Software Foundation; either *
13  * version 2 of the License, or (at your option) any later version. *
14  * *
15  *************************************************************************
16 */
17 
18 #include "kopeteidleplatform_p.h"
19 
20 #include <QtCore/QObject>
21 #include <QtCore/QDateTime>
22 #include <QtGui/QX11Info>
23 #include <QtDBus/QDBusInterface>
24 #include <QtDBus/QDBusReply>
25 
26 #include <X11/Xlib.h>
27 #include <X11/Xutil.h>
28 #include <X11/extensions/scrnsaver.h>
29 
30 static XErrorHandler old_handler = 0;
31 extern "C" int xerrhandler( Display* dpy, XErrorEvent* err )
32 {
33  if ( err->error_code == BadDrawable )
34  return 0;
35 
36  return (*old_handler)(dpy, err);
37 }
38 
39 
40 class Kopete::IdlePlatform::Private : public QObject
41 {
42  Q_OBJECT
43 public:
44  Private() {}
45 
46  XScreenSaverInfo *ss_info;
47  QDateTime screenSaverIdleSince;
48 private slots:
49  void activeChanged( bool active )
50  {
51  if ( active )
52  {
53  if ( ss_info && XScreenSaverQueryInfo( QX11Info::display(), QX11Info::appRootWindow(), ss_info ) )
54  screenSaverIdleSince = QDateTime::currentDateTime().addMSecs(-ss_info->idle);
55  else
56  screenSaverIdleSince = QDateTime::currentDateTime();
57  }
58  else
59  {
60  screenSaverIdleSince = QDateTime();
61  }
62  }
63 };
64 
65 Kopete::IdlePlatform::IdlePlatform()
66 : d( new Private() )
67 {
68  d->ss_info = 0;
69 }
70 
71 Kopete::IdlePlatform::~IdlePlatform()
72 {
73  if ( d->ss_info )
74  XFree(d->ss_info);
75 
76  if ( old_handler )
77  {
78  XSetErrorHandler( old_handler );
79  old_handler = 0;
80  }
81 
82  delete d;
83 }
84 
85 bool Kopete::IdlePlatform::init()
86 {
87  if ( d->ss_info )
88  return true;
89 
90  old_handler = XSetErrorHandler( xerrhandler );
91 
92  int event_base, error_base;
93  if ( XScreenSaverQueryExtension( QX11Info::display(), &event_base, &error_base ) )
94  {
95  d->ss_info = XScreenSaverAllocInfo();
96 
97  // Init ScreenSaver so we can detect screen lock and screen saver.
98  QDBusConnection::sessionBus().connect("org.freedesktop.ScreenSaver", "/ScreenSaver",
99  "org.freedesktop.ScreenSaver", "ActiveChanged",
100  d, SLOT(activeChanged(bool)));
101 
102  // If screen saver is already active set the screenSaverIdleSince
103  QDBusInterface screenSaver("org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver");
104  QDBusReply<bool> reply = screenSaver.call("GetActive");
105  if ( reply.isValid() && reply.value() )
106  d->screenSaverIdleSince = QDateTime::currentDateTime();
107 
108  return true;
109  }
110 
111  return false;
112 }
113 
114 int Kopete::IdlePlatform::secondsIdle()
115 {
116  if ( !d->ss_info )
117  return 0;
118 
119  // Take idle from screenSaverIdleSince if screen saver/lock is enabled.
120  if ( d->screenSaverIdleSince.isValid() ) {
121  return d->screenSaverIdleSince.secsTo(QDateTime::currentDateTime());
122  }
123 
124  if ( !XScreenSaverQueryInfo( QX11Info::display(), QX11Info::appRootWindow(), d->ss_info ) )
125  return 0;
126 
127  return d->ss_info->idle / 1000;
128 }
129 
130 #include "kopeteidleplatform_x11.moc"
old_handler
static XErrorHandler old_handler
Definition: kopeteidleplatform_x11.cpp:30
Kopete::IdlePlatform::~IdlePlatform
~IdlePlatform()
Definition: kopeteidleplatform_dummy.cpp:23
xerrhandler
int xerrhandler(Display *dpy, XErrorEvent *err)
Definition: kopeteidleplatform_x11.cpp:31
Kopete::IdlePlatform::IdlePlatform
IdlePlatform()
Definition: kopeteidleplatform_dummy.cpp:19
QDBusReply
QX11Info::appRootWindow
Qt::HANDLE appRootWindow(int screen)
QX11Info::display
Display * display()
QDBusReply::isValid
bool isValid() const
QDBusConnection::sessionBus
QDBusConnection sessionBus()
Kopete::IdlePlatform::secondsIdle
int secondsIdle()
Definition: kopeteidleplatform_dummy.cpp:33
QObject
QDBusReply::value
Type value() const
QDBusInterface
QDateTime::currentDateTime
QDateTime currentDateTime()
QDBusConnection::connect
bool connect(const QString &service, const QString &path, const QString &interface, const QString &name, QObject *receiver, const char *slot)
Kopete::IdlePlatform::init
bool init()
Definition: kopeteidleplatform_dummy.cpp:28
kopeteidleplatform_p.h
QDateTime
QDateTime::addMSecs
QDateTime addMSecs(qint64 msecs) const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:29:19 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kopete/libkopete

Skip menu "kopete/libkopete"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal