summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnas Nashif <anas.nashif@intel.com>2012-11-10 07:14:07 -0800
committerAnas Nashif <anas.nashif@intel.com>2012-11-10 07:14:07 -0800
commite5e3ddd765e3a5ab31e47fd0664c4a531c805803 (patch)
tree6e7c1d1030e866da14b69540a055a1062b78e466
parent9b9d173d07231f3833de120360fef5c2c122a875 (diff)
downloadxdg-utils-e5e3ddd765e3a5ab31e47fd0664c4a531c805803.tar.gz
xdg-utils-e5e3ddd765e3a5ab31e47fd0664c4a531c805803.tar.bz2
xdg-utils-e5e3ddd765e3a5ab31e47fd0664c4a531c805803.zip
screensaver gnome perl
-rw-r--r--scripts/xdg-screensaver.in56
1 files changed, 48 insertions, 8 deletions
diff --git a/scripts/xdg-screensaver.in b/scripts/xdg-screensaver.in
index 07c3fc1..0513ee2 100644
--- a/scripts/xdg-screensaver.in
+++ b/scripts/xdg-screensaver.in
@@ -435,14 +435,54 @@ screensaver_gnome_screensaver()
# http://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html
case "$1" in
suspend)
- screensaver_suspend_loop \
- dbus-send --session \
- --dest=org.gnome.ScreenSaver \
- --type=method_call \
- /org/gnome/ScreenSaver \
- org.gnome.ScreenSaver.SimulateUserActivity \
- 2> /dev/null
- result=$?
+ perl -e '
+use strict;
+use warnings;
+use IO::File;
+use Net::DBus;
+use X11::Protocol;
+
+my ($window_id, $screensaver_file) = @ARGV;
+
+# Find window name to pass to session manager.
+my $x = X11::Protocol->new();
+my $named_window_id = hex($window_id);
+my $window_name;
+while (1) {
+ ($window_name) = $x->GetProperty($named_window_id, $x->atom("WM_NAME"),
+ $x->atom("STRING"), 0, 1000, 0);
+ last if defined($window_name) && $window_name ne "";
+ (undef, $named_window_id) = $x->QueryTree($named_window_id);
+ if (!defined($named_window_id)) {
+ $window_name = "?";
+ last;
+ }
+}
+
+# Inhibit idle detection (flags = 8) with window name and ID.
+# We have no reason so just send the window name again.
+my $bus = Net::DBus->session();
+my $sm_svc = $bus->get_service("org.gnome.SessionManager");
+my $sm = $sm_svc->get_object("/org/gnome/SessionManager",
+ "org.gnome.SessionManager");
+$sm->Inhibit($window_name, hex($window_id), $window_name, 8);
+
+# Wait until removed from the status file.
+while (1) {
+ sleep(10);
+ my $status = new IO::File($screensaver_file, "r")
+ or exit 0;
+ my $found;
+ while (<$status>) {
+ if (/^$window_id:/) {
+ $found = 1;
+ last;
+ }
+ }
+ exit 0 unless $found;
+}
+' $window_id $screensaver_file &
+ result=0
;;
resume)