Port to GnomeIdleMonitor
https://bugzilla.gnome.org/show_bug.cgi?id=682224
This commit is contained in:
parent
418cf6281e
commit
d106191e6a
@ -74,7 +74,7 @@ TELEPATHY_LOGGER_MIN_VERSION=0.2.4
|
|||||||
POLKIT_MIN_VERSION=0.100
|
POLKIT_MIN_VERSION=0.100
|
||||||
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
||||||
GCR_MIN_VERSION=3.3.90
|
GCR_MIN_VERSION=3.3.90
|
||||||
GNOME_DESKTOP_REQUIRED_VERSION=3.5.1
|
GNOME_DESKTOP_REQUIRED_VERSION=3.6.0
|
||||||
GNOME_MENUS_REQUIRED_VERSION=3.5.3
|
GNOME_MENUS_REQUIRED_VERSION=3.5.3
|
||||||
|
|
||||||
# Collect more than 20 libraries for a prize!
|
# Collect more than 20 libraries for a prize!
|
||||||
|
@ -4,6 +4,7 @@ const Clutter = imports.gi.Clutter;
|
|||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
|
const GnomeDesktop = imports.gi.GnomeDesktop;
|
||||||
const Atk = imports.gi.Atk;
|
const Atk = imports.gi.Atk;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
@ -1452,10 +1453,10 @@ const MessageTray = new Lang.Class({
|
|||||||
this._closeButton.connect('clicked', Lang.bind(this, this._onCloseClicked));
|
this._closeButton.connect('clicked', Lang.bind(this, this._onCloseClicked));
|
||||||
this._notificationWidget.add_actor(this._closeButton);
|
this._notificationWidget.add_actor(this._closeButton);
|
||||||
|
|
||||||
this._idleMonitorWatchId = 0;
|
this._idleMonitorBecameActiveId = 0;
|
||||||
this._userActiveWhileNotificationShown = false;
|
this._userActiveWhileNotificationShown = false;
|
||||||
|
|
||||||
this.idleMonitor = Shell.IdleMonitor.get();
|
this.idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||||
|
|
||||||
this._grabHelper = new GrabHelper.GrabHelper(this.actor);
|
this._grabHelper = new GrabHelper.GrabHelper(this.actor);
|
||||||
this._grabHelper.addActor(this._summaryBoxPointer.actor);
|
this._grabHelper.addActor(this._summaryBoxPointer.actor);
|
||||||
@ -2167,20 +2168,26 @@ const MessageTray = new Lang.Class({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_onIdleMonitorWatch: function(monitor, id, userBecameIdle) {
|
_onIdleMonitorBecameActive: function() {
|
||||||
this.idleMonitor.remove_watch(this._idleMonitorWatchId);
|
this.idleMonitor.disconnect(this._idleMonitorBecameActiveId);
|
||||||
this._idleMonitorWatchId = 0;
|
this._idleMonitorBecameActiveId = 0;
|
||||||
if (!userBecameIdle)
|
|
||||||
this._updateNotificationTimeout(2000);
|
|
||||||
this._userActiveWhileNotificationShown = true;
|
this._userActiveWhileNotificationShown = true;
|
||||||
|
this._updateNotificationTimeout(2000);
|
||||||
this._updateState();
|
this._updateState();
|
||||||
},
|
},
|
||||||
|
|
||||||
_showNotification: function() {
|
_showNotification: function() {
|
||||||
this._notification = this._notificationQueue.shift();
|
this._notification = this._notificationQueue.shift();
|
||||||
this._userActiveWhileNotificationShown = this.idleMonitor.get_idletime() <= IDLE_TIME;
|
|
||||||
this._idleMonitorWatchId = this.idleMonitor.add_watch(IDLE_TIME,
|
let userIdle = this.idleMonitor.get_idletime() > IDLE_TIME;
|
||||||
Lang.bind(this, this._onIdleMonitorWatch));
|
if (userIdle) {
|
||||||
|
this._userActiveWhileNotificationShown = false;
|
||||||
|
this._idleMonitorBecameActiveId = this.idleMonitor.connect('became-active', Lang.bind(this, this._onIdleMonitorBecameActive));
|
||||||
|
} else {
|
||||||
|
this._userActiveWhileNotificationShown = true;
|
||||||
|
}
|
||||||
|
|
||||||
this._notificationClickedId = this._notification.connect('done-displaying',
|
this._notificationClickedId = this._notification.connect('done-displaying',
|
||||||
Lang.bind(this, this._escapeTray));
|
Lang.bind(this, this._escapeTray));
|
||||||
this._notification.connect('unfocused', Lang.bind(this, function() {
|
this._notification.connect('unfocused', Lang.bind(this, function() {
|
||||||
@ -2293,6 +2300,11 @@ const MessageTray = new Lang.Class({
|
|||||||
_hideNotification: function() {
|
_hideNotification: function() {
|
||||||
this._grabHelper.ungrab({ actor: this._notification.actor });
|
this._grabHelper.ungrab({ actor: this._notification.actor });
|
||||||
|
|
||||||
|
if (this._idleMonitorBecameActiveId) {
|
||||||
|
this.idleMonitor.disconnect(this._idleMonitorBecameActiveId);
|
||||||
|
this._idleMonitorBecameActiveId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (this._notificationExpandedId) {
|
if (this._notificationExpandedId) {
|
||||||
this._notification.disconnect(this._notificationExpandedId);
|
this._notification.disconnect(this._notificationExpandedId);
|
||||||
this._notificationExpandedId = 0;
|
this._notificationExpandedId = 0;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
|
const GnomeDesktop = imports.gi.GnomeDesktop;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
// We stop polling if the user is idle for more than this amount of time
|
// We stop polling if the user is idle for more than this amount of time
|
||||||
@ -40,9 +41,9 @@ const PointerWatcher = new Lang.Class({
|
|||||||
Name: 'PointerWatcher',
|
Name: 'PointerWatcher',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
let idleMonitor = Shell.IdleMonitor.get();
|
let idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||||
idleMonitor.add_watch(IDLE_TIME,
|
idleMonitor.connect('became-active', Lang.bind(this, this._onIdleMonitorBecameActive));
|
||||||
Lang.bind(this, this._onIdleMonitorWatch));
|
idleMonitor.add_watch(IDLE_TIME, Lang.bind(this, this._onIdleMonitorBecameIdle));
|
||||||
this._idle = idleMonitor.get_idletime() > IDLE_TIME;
|
this._idle = idleMonitor.get_idletime() > IDLE_TIME;
|
||||||
this._watches = [];
|
this._watches = [];
|
||||||
this.pointerX = null;
|
this.pointerX = null;
|
||||||
@ -78,11 +79,14 @@ const PointerWatcher = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_onIdleMonitorWatch: function(monitor, id, userBecameIdle) {
|
_onIdleMonitorBecameActive: function(monitor) {
|
||||||
this._idle = userBecameIdle;
|
this._idle = false;
|
||||||
if (!userBecameIdle)
|
|
||||||
this._updatePointer();
|
this._updatePointer();
|
||||||
|
this._updateTimeout();
|
||||||
|
},
|
||||||
|
|
||||||
|
_onIdleMonitorBecameIdle: function(monitor) {
|
||||||
|
this._idle = true;
|
||||||
this._updateTimeout();
|
this._updateTimeout();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ const Clutter = imports.gi.Clutter;
|
|||||||
const Gdm = imports.gi.Gdm;
|
const Gdm = imports.gi.Gdm;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
|
const GnomeDesktop = imports.gi.GnomeDesktop;
|
||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
@ -195,9 +196,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
return false;
|
return false;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._idleMonitor = Shell.IdleMonitor.get();
|
this._idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||||
// this dialog is only created after user activity (curtain drag or
|
|
||||||
// escape key press), so the timeout will fire after IDLE_TIMEOUT seconds of inactivity
|
|
||||||
this._idleWatchId = this._idleMonitor.add_watch(IDLE_TIMEOUT * 1000, Lang.bind(this, this._escape));
|
this._idleWatchId = this._idleMonitor.add_watch(IDLE_TIMEOUT * 1000, Lang.bind(this, this._escape));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -113,7 +113,6 @@ shell_public_headers_h = \
|
|||||||
shell-generic-container.h \
|
shell-generic-container.h \
|
||||||
shell-gtk-embed.h \
|
shell-gtk-embed.h \
|
||||||
shell-global.h \
|
shell-global.h \
|
||||||
shell-idle-monitor.h \
|
|
||||||
shell-invert-lightness-effect.h \
|
shell-invert-lightness-effect.h \
|
||||||
shell-mobile-providers.h \
|
shell-mobile-providers.h \
|
||||||
shell-mount-operation.h \
|
shell-mount-operation.h \
|
||||||
@ -158,7 +157,6 @@ libgnome_shell_la_SOURCES = \
|
|||||||
shell-generic-container.c \
|
shell-generic-container.c \
|
||||||
shell-gtk-embed.c \
|
shell-gtk-embed.c \
|
||||||
shell-global.c \
|
shell-global.c \
|
||||||
shell-idle-monitor.c \
|
|
||||||
shell-invert-lightness-effect.c \
|
shell-invert-lightness-effect.c \
|
||||||
shell-keyring-prompt.h \
|
shell-keyring-prompt.h \
|
||||||
shell-keyring-prompt.c \
|
shell-keyring-prompt.c \
|
||||||
|
@ -1,429 +0,0 @@
|
|||||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
|
|
||||||
*
|
|
||||||
* Adapted from gnome-session/gnome-session/gs-idle-monitor.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Authors: William Jon McCann <mccann@jhu.edu>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/extensions/sync.h>
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
#include <gdk/gdkx.h>
|
|
||||||
#include <gdk/gdk.h>
|
|
||||||
|
|
||||||
#include "shell-idle-monitor.h"
|
|
||||||
|
|
||||||
#define SHELL_IDLE_MONITOR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SHELL_TYPE_IDLE_MONITOR, ShellIdleMonitorPrivate))
|
|
||||||
|
|
||||||
struct ShellIdleMonitorPrivate
|
|
||||||
{
|
|
||||||
Display *display;
|
|
||||||
|
|
||||||
GHashTable *watches;
|
|
||||||
int sync_event_base;
|
|
||||||
XSyncCounter counter;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
Display *display;
|
|
||||||
guint id;
|
|
||||||
XSyncValue interval;
|
|
||||||
ShellIdleMonitorWatchFunc callback;
|
|
||||||
gpointer user_data;
|
|
||||||
GDestroyNotify notify;
|
|
||||||
XSyncAlarm xalarm_positive;
|
|
||||||
XSyncAlarm xalarm_negative;
|
|
||||||
} ShellIdleMonitorWatch;
|
|
||||||
|
|
||||||
static guint32 watch_serial = 1;
|
|
||||||
|
|
||||||
G_DEFINE_TYPE (ShellIdleMonitor, shell_idle_monitor, G_TYPE_OBJECT)
|
|
||||||
|
|
||||||
static gint64
|
|
||||||
_xsyncvalue_to_int64 (XSyncValue value)
|
|
||||||
{
|
|
||||||
return ((guint64) XSyncValueHigh32 (value)) << 32
|
|
||||||
| (guint64) XSyncValueLow32 (value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static XSyncValue
|
|
||||||
_int64_to_xsyncvalue (gint64 value)
|
|
||||||
{
|
|
||||||
XSyncValue ret;
|
|
||||||
|
|
||||||
XSyncIntsToValue (&ret, value, ((guint64)value) >> 32);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
shell_idle_monitor_dispose (GObject *object)
|
|
||||||
{
|
|
||||||
ShellIdleMonitor *monitor;
|
|
||||||
|
|
||||||
monitor = SHELL_IDLE_MONITOR (object);
|
|
||||||
|
|
||||||
if (monitor->priv->watches != NULL) {
|
|
||||||
g_hash_table_destroy (monitor->priv->watches);
|
|
||||||
monitor->priv->watches = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (shell_idle_monitor_parent_class)->dispose (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
_find_alarm (gpointer key,
|
|
||||||
ShellIdleMonitorWatch *watch,
|
|
||||||
XSyncAlarm *alarm)
|
|
||||||
{
|
|
||||||
/* g_debug ("Searching for %d in %d,%d", (int)*alarm, (int)watch->xalarm_positive, (int)watch->xalarm_negative); */
|
|
||||||
if (watch->xalarm_positive == *alarm
|
|
||||||
|| watch->xalarm_negative == *alarm) {
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ShellIdleMonitorWatch *
|
|
||||||
find_watch_for_alarm (ShellIdleMonitor *monitor,
|
|
||||||
XSyncAlarm alarm)
|
|
||||||
{
|
|
||||||
ShellIdleMonitorWatch *watch;
|
|
||||||
|
|
||||||
watch = g_hash_table_find (monitor->priv->watches,
|
|
||||||
(GHRFunc)_find_alarm,
|
|
||||||
&alarm);
|
|
||||||
return watch;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
handle_alarm_notify_event (ShellIdleMonitor *monitor,
|
|
||||||
XSyncAlarmNotifyEvent *alarm_event)
|
|
||||||
{
|
|
||||||
ShellIdleMonitorWatch *watch;
|
|
||||||
gboolean condition;
|
|
||||||
|
|
||||||
if (alarm_event->state == XSyncAlarmDestroyed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
watch = find_watch_for_alarm (monitor, alarm_event->alarm);
|
|
||||||
|
|
||||||
if (watch == NULL) {
|
|
||||||
/* g_debug ("Unable to find watch for alarm %d", (int)alarm_event->alarm); */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* g_debug ("Watch %d fired, idle time = %" G_GINT64_FORMAT,
|
|
||||||
watch->id,
|
|
||||||
_xsyncvalue_to_int64 (alarm_event->counter_value)); */
|
|
||||||
|
|
||||||
if (alarm_event->alarm == watch->xalarm_positive) {
|
|
||||||
condition = TRUE;
|
|
||||||
} else {
|
|
||||||
condition = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (watch->callback != NULL) {
|
|
||||||
watch->callback (monitor,
|
|
||||||
watch->id,
|
|
||||||
condition,
|
|
||||||
watch->user_data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkFilterReturn
|
|
||||||
xevent_filter (GdkXEvent *xevent,
|
|
||||||
GdkEvent *event,
|
|
||||||
ShellIdleMonitor *monitor)
|
|
||||||
{
|
|
||||||
XEvent *ev;
|
|
||||||
XSyncAlarmNotifyEvent *alarm_event;
|
|
||||||
|
|
||||||
ev = xevent;
|
|
||||||
if (ev->xany.type != monitor->priv->sync_event_base + XSyncAlarmNotify) {
|
|
||||||
return GDK_FILTER_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
alarm_event = xevent;
|
|
||||||
|
|
||||||
handle_alarm_notify_event (monitor, alarm_event);
|
|
||||||
|
|
||||||
return GDK_FILTER_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
init_xsync (ShellIdleMonitor *monitor)
|
|
||||||
{
|
|
||||||
int sync_error_base;
|
|
||||||
int res;
|
|
||||||
int major;
|
|
||||||
int minor;
|
|
||||||
int i;
|
|
||||||
int ncounters;
|
|
||||||
XSyncSystemCounter *counters;
|
|
||||||
|
|
||||||
res = XSyncQueryExtension (monitor->priv->display,
|
|
||||||
&monitor->priv->sync_event_base,
|
|
||||||
&sync_error_base);
|
|
||||||
if (! res) {
|
|
||||||
g_warning ("ShellIdleMonitor: Sync extension not present");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = XSyncInitialize (monitor->priv->display, &major, &minor);
|
|
||||||
if (! res) {
|
|
||||||
g_warning ("ShellIdleMonitor: Unable to initialize Sync extension");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
counters = XSyncListSystemCounters (monitor->priv->display, &ncounters);
|
|
||||||
for (i = 0; i < ncounters; i++) {
|
|
||||||
if (counters[i].name != NULL
|
|
||||||
&& strcmp (counters[i].name, "IDLETIME") == 0) {
|
|
||||||
monitor->priv->counter = counters[i].counter;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
XSyncFreeSystemCounterList (counters);
|
|
||||||
|
|
||||||
if (monitor->priv->counter == None) {
|
|
||||||
g_warning ("ShellIdleMonitor: IDLETIME counter not found");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gdk_window_add_filter (NULL, (GdkFilterFunc)xevent_filter, monitor);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GObject *
|
|
||||||
shell_idle_monitor_constructor (GType type,
|
|
||||||
guint n_construct_properties,
|
|
||||||
GObjectConstructParam *construct_properties)
|
|
||||||
{
|
|
||||||
ShellIdleMonitor *monitor;
|
|
||||||
|
|
||||||
monitor = SHELL_IDLE_MONITOR (G_OBJECT_CLASS (shell_idle_monitor_parent_class)->constructor (type,
|
|
||||||
n_construct_properties,
|
|
||||||
construct_properties));
|
|
||||||
|
|
||||||
monitor->priv->display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
|
|
||||||
|
|
||||||
if (! init_xsync (monitor)) {
|
|
||||||
g_object_unref (monitor);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return G_OBJECT (monitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
shell_idle_monitor_class_init (ShellIdleMonitorClass *klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
object_class->dispose = shell_idle_monitor_dispose;
|
|
||||||
object_class->constructor = shell_idle_monitor_constructor;
|
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (ShellIdleMonitorPrivate));
|
|
||||||
}
|
|
||||||
|
|
||||||
static guint32
|
|
||||||
get_next_watch_serial (void)
|
|
||||||
{
|
|
||||||
guint32 serial;
|
|
||||||
|
|
||||||
serial = watch_serial++;
|
|
||||||
|
|
||||||
if ((gint32)watch_serial < 0) {
|
|
||||||
watch_serial = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME: make sure it isn't in the hash */
|
|
||||||
|
|
||||||
return serial;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ShellIdleMonitorWatch *
|
|
||||||
idle_monitor_watch_new (guint interval)
|
|
||||||
{
|
|
||||||
ShellIdleMonitorWatch *watch;
|
|
||||||
|
|
||||||
watch = g_slice_new0 (ShellIdleMonitorWatch);
|
|
||||||
watch->interval = _int64_to_xsyncvalue ((gint64)interval);
|
|
||||||
watch->id = get_next_watch_serial ();
|
|
||||||
watch->xalarm_positive = None;
|
|
||||||
watch->xalarm_negative = None;
|
|
||||||
|
|
||||||
return watch;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
idle_monitor_watch_free (ShellIdleMonitorWatch *watch)
|
|
||||||
{
|
|
||||||
if (watch == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (watch->notify != NULL) {
|
|
||||||
watch->notify (watch->user_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (watch->xalarm_positive != None) {
|
|
||||||
XSyncDestroyAlarm (watch->display, watch->xalarm_positive);
|
|
||||||
}
|
|
||||||
if (watch->xalarm_negative != None) {
|
|
||||||
XSyncDestroyAlarm (watch->display, watch->xalarm_negative);
|
|
||||||
}
|
|
||||||
g_slice_free (ShellIdleMonitorWatch, watch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
shell_idle_monitor_init (ShellIdleMonitor *monitor)
|
|
||||||
{
|
|
||||||
monitor->priv = SHELL_IDLE_MONITOR_GET_PRIVATE (monitor);
|
|
||||||
|
|
||||||
monitor->priv->watches = g_hash_table_new_full (NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
(GDestroyNotify)idle_monitor_watch_free);
|
|
||||||
|
|
||||||
monitor->priv->counter = None;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_idle_monitor_get:
|
|
||||||
*
|
|
||||||
* Returns: (transfer none): the global #ShellIdleMonitor.
|
|
||||||
*/
|
|
||||||
ShellIdleMonitor *
|
|
||||||
shell_idle_monitor_get (void)
|
|
||||||
{
|
|
||||||
static ShellIdleMonitor *idle_monitor;
|
|
||||||
|
|
||||||
if (G_UNLIKELY (idle_monitor == NULL))
|
|
||||||
idle_monitor = g_object_new (SHELL_TYPE_IDLE_MONITOR,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
return idle_monitor;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
_xsync_alarm_set (ShellIdleMonitor *monitor,
|
|
||||||
ShellIdleMonitorWatch *watch)
|
|
||||||
{
|
|
||||||
XSyncAlarmAttributes attr;
|
|
||||||
XSyncValue delta;
|
|
||||||
guint flags;
|
|
||||||
|
|
||||||
flags = XSyncCACounter
|
|
||||||
| XSyncCAValueType
|
|
||||||
| XSyncCATestType
|
|
||||||
| XSyncCAValue
|
|
||||||
| XSyncCADelta
|
|
||||||
| XSyncCAEvents;
|
|
||||||
|
|
||||||
XSyncIntToValue (&delta, 0);
|
|
||||||
attr.trigger.counter = monitor->priv->counter;
|
|
||||||
attr.trigger.value_type = XSyncAbsolute;
|
|
||||||
attr.trigger.wait_value = watch->interval;
|
|
||||||
attr.delta = delta;
|
|
||||||
attr.events = TRUE;
|
|
||||||
|
|
||||||
attr.trigger.test_type = XSyncPositiveTransition;
|
|
||||||
if (watch->xalarm_positive != None) {
|
|
||||||
/* g_debug ("ShellIdleMonitor: updating alarm for positive transition wait=%" G_GINT64_FORMAT,
|
|
||||||
_xsyncvalue_to_int64 (attr.trigger.wait_value)); */
|
|
||||||
XSyncChangeAlarm (monitor->priv->display, watch->xalarm_positive, flags, &attr);
|
|
||||||
} else {
|
|
||||||
/* g_debug ("ShellIdleMonitor: creating new alarm for positive transition wait=%" G_GINT64_FORMAT,
|
|
||||||
_xsyncvalue_to_int64 (attr.trigger.wait_value)); */
|
|
||||||
watch->xalarm_positive = XSyncCreateAlarm (monitor->priv->display, flags, &attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
attr.trigger.wait_value = _int64_to_xsyncvalue (_xsyncvalue_to_int64 (watch->interval) - 1);
|
|
||||||
attr.trigger.test_type = XSyncNegativeTransition;
|
|
||||||
if (watch->xalarm_negative != None) {
|
|
||||||
/* g_debug ("ShellIdleMonitor: updating alarm for negative transition wait=%" G_GINT64_FORMAT,
|
|
||||||
_xsyncvalue_to_int64 (attr.trigger.wait_value)); */
|
|
||||||
XSyncChangeAlarm (monitor->priv->display, watch->xalarm_negative, flags, &attr);
|
|
||||||
} else {
|
|
||||||
/* g_debug ("ShellIdleMonitor: creating new alarm for negative transition wait=%" G_GINT64_FORMAT,
|
|
||||||
_xsyncvalue_to_int64 (attr.trigger.wait_value)); */
|
|
||||||
watch->xalarm_negative = XSyncCreateAlarm (monitor->priv->display, flags, &attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
guint
|
|
||||||
shell_idle_monitor_add_watch (ShellIdleMonitor *monitor,
|
|
||||||
guint interval,
|
|
||||||
ShellIdleMonitorWatchFunc callback,
|
|
||||||
gpointer user_data,
|
|
||||||
GDestroyNotify notify)
|
|
||||||
{
|
|
||||||
ShellIdleMonitorWatch *watch;
|
|
||||||
|
|
||||||
g_return_val_if_fail (SHELL_IS_IDLE_MONITOR (monitor), 0);
|
|
||||||
g_return_val_if_fail (callback != NULL, 0);
|
|
||||||
|
|
||||||
watch = idle_monitor_watch_new (interval);
|
|
||||||
watch->display = monitor->priv->display;
|
|
||||||
watch->callback = callback;
|
|
||||||
watch->user_data = user_data;
|
|
||||||
watch->notify = notify;
|
|
||||||
|
|
||||||
_xsync_alarm_set (monitor, watch);
|
|
||||||
|
|
||||||
g_hash_table_insert (monitor->priv->watches,
|
|
||||||
GUINT_TO_POINTER (watch->id),
|
|
||||||
watch);
|
|
||||||
return watch->id;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
shell_idle_monitor_remove_watch (ShellIdleMonitor *monitor,
|
|
||||||
guint id)
|
|
||||||
{
|
|
||||||
g_return_if_fail (SHELL_IS_IDLE_MONITOR (monitor));
|
|
||||||
|
|
||||||
g_hash_table_remove (monitor->priv->watches,
|
|
||||||
GUINT_TO_POINTER (id));
|
|
||||||
}
|
|
||||||
|
|
||||||
gint64
|
|
||||||
shell_idle_monitor_get_idletime (ShellIdleMonitor *monitor)
|
|
||||||
{
|
|
||||||
XSyncValue value;
|
|
||||||
|
|
||||||
if (!XSyncQueryCounter (monitor->priv->display, monitor->priv->counter, &value))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return _xsyncvalue_to_int64 (value);
|
|
||||||
}
|
|
@ -1,74 +0,0 @@
|
|||||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
|
|
||||||
*
|
|
||||||
* Adapted from gnome-session/gnome-session/gs-idle-monitor.h
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Authors: William Jon McCann <mccann@jhu.edu>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __SHELL_IDLE_MONITOR_H
|
|
||||||
#define __SHELL_IDLE_MONITOR_H
|
|
||||||
|
|
||||||
#include <glib-object.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define SHELL_TYPE_IDLE_MONITOR (shell_idle_monitor_get_type ())
|
|
||||||
#define SHELL_IDLE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SHELL_TYPE_IDLE_MONITOR, ShellIdleMonitor))
|
|
||||||
#define SHELL_IDLE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SHELL_TYPE_IDLE_MONITOR, ShellIdleMonitorClass))
|
|
||||||
#define SHELL_IS_IDLE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SHELL_TYPE_IDLE_MONITOR))
|
|
||||||
#define SHELL_IS_IDLE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SHELL_TYPE_IDLE_MONITOR))
|
|
||||||
#define SHELL_IDLE_MONITOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), SHELL_TYPE_IDLE_MONITOR, ShellIdleMonitorClass))
|
|
||||||
|
|
||||||
typedef struct ShellIdleMonitorPrivate ShellIdleMonitorPrivate;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
GObject parent;
|
|
||||||
ShellIdleMonitorPrivate *priv;
|
|
||||||
} ShellIdleMonitor;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
GObjectClass parent_class;
|
|
||||||
} ShellIdleMonitorClass;
|
|
||||||
|
|
||||||
typedef void (*ShellIdleMonitorWatchFunc) (ShellIdleMonitor *monitor,
|
|
||||||
guint id,
|
|
||||||
gboolean condition,
|
|
||||||
gpointer user_data);
|
|
||||||
|
|
||||||
GType shell_idle_monitor_get_type (void);
|
|
||||||
|
|
||||||
ShellIdleMonitor * shell_idle_monitor_get (void);
|
|
||||||
|
|
||||||
guint shell_idle_monitor_add_watch (ShellIdleMonitor *monitor,
|
|
||||||
guint interval,
|
|
||||||
ShellIdleMonitorWatchFunc callback,
|
|
||||||
gpointer user_data,
|
|
||||||
GDestroyNotify notify);
|
|
||||||
|
|
||||||
void shell_idle_monitor_remove_watch (ShellIdleMonitor *monitor,
|
|
||||||
guint id);
|
|
||||||
|
|
||||||
gint64 shell_idle_monitor_get_idletime (ShellIdleMonitor *monitor);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __SHELL_IDLE_MONITOR_H */
|
|
Loading…
Reference in New Issue
Block a user