]> git.mxchange.org Git - flightgear.git/blob - src/Main/screensaver_control.cxx
Disable screensaver: initial Linux-only implementation
[flightgear.git] / src / Main / screensaver_control.cxx
1 // screensaver_control.cxx -- disable the screensaver
2 //
3 // Written by Rebecca Palmer, December 2013.
4 //
5 // Copyright (C) 2013 Rebecca Palmer
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 // General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 //
21 // $Id$
22
23 #ifdef HAVE_CONFIG_H
24 #  include <config.h>
25 #endif
26 #ifdef HAVE_DBUS
27 #include <dbus/dbus.h>//Uses the low-level libdbus rather than GDBus/QtDBus to avoid adding more dependencies than necessary.  http://dbus.freedesktop.org/doc/api/html/index.html
28 #endif
29 /** Attempt to disable the screensaver.
30
31 * Screensavers/powersavers often do not monitor the joystick, and it is hence advisable to disable them while FlightGear is running.
32 * This function always exists, but currently only actually does anything on Linux, where it will disable gnome-screensaver/kscreensaver until FlightGear exits.
33 *
34 * The following might be useful to anyone wishing to add Windows support:
35 * http://msdn.microsoft.com/en-us/library/windows/desktop/aa373233%28v=vs.85%29.aspx
36 * http://msdn.microsoft.com/en-us/library/windows/desktop/aa373208%28v=vs.85%29.aspx (While this documentation says it only disables powersave, it is elsewhere reported to also disable screensaver)
37 * http://msdn.microsoft.com/en-us/library/windows/desktop/dd405534%28v=vs.85%29.aspx
38 */
39 void fgOSDisableScreensaver()
40 {
41 #ifdef HAVE_DBUS
42     DBusConnection *dbus_connection;
43     DBusMessage *dbus_inhibit_screenlock;
44     unsigned int window_id=1000;//fake-it doesn't seem to care
45     unsigned int inhibit_idle=8;//8=idle inhibit flag
46     const char *app_name="org.flightgear";
47     const char *inhibit_reason="Uses joystick input";
48     
49     dbus_connection=dbus_bus_get(DBUS_BUS_SESSION,NULL);
50     dbus_connection_set_exit_on_disconnect(dbus_connection,FALSE);//Don't close us if we lose the DBus connection
51     
52     //Two possible interfaces; we send on both, as that is easier than trying to determine which will work
53     //GNOME: https://people.gnome.org/~mccann/gnome-session/docs/gnome-session.html
54     dbus_inhibit_screenlock=dbus_message_new_method_call("org.gnome.SessionManager","/org/gnome/SessionManager","org.gnome.SessionManager","Inhibit");
55     dbus_message_append_args(dbus_inhibit_screenlock,DBUS_TYPE_STRING,&app_name,DBUS_TYPE_UINT32,&window_id,DBUS_TYPE_STRING,&inhibit_reason,DBUS_TYPE_UINT32,&inhibit_idle,DBUS_TYPE_INVALID);
56     dbus_connection_send(dbus_connection,dbus_inhibit_screenlock,NULL);
57     
58     //KDE, GNOME 3.6+: http://standards.freedesktop.org/idle-inhibit-spec/0.1/re01.html
59     dbus_inhibit_screenlock=dbus_message_new_method_call("org.freedesktop.ScreenSaver","/ScreenSaver","org.freedesktop.ScreenSaver","Inhibit");
60     dbus_message_append_args(dbus_inhibit_screenlock,DBUS_TYPE_STRING,&app_name,DBUS_TYPE_STRING,&inhibit_reason,DBUS_TYPE_INVALID);
61     dbus_connection_send(dbus_connection,dbus_inhibit_screenlock,NULL);
62     dbus_connection_flush(dbus_connection);
63     //Currently ignores the reply; it would need to read it if we wanted to determine whether we've succeeded and/or allow explicitly re-enabling the screensaver
64     //Don't disconnect, that ends the inhibition
65 #endif
66 }