mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 09:30:45 -05:00
backends: Remove X11 idle-monitor backend
And use the old "native" backend for both X11 and Wayland. This will allow us to share fixes between implementations without having to delve into the XSync X11 extension code. https://bugzilla.gnome.org/show_bug.cgi?id=705942
This commit is contained in:
parent
34644b2133
commit
e3e76d658b
@ -183,8 +183,6 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
|
|||||||
backends/x11/nested/meta-cursor-renderer-x11-nested.h \
|
backends/x11/nested/meta-cursor-renderer-x11-nested.h \
|
||||||
backends/x11/nested/meta-renderer-x11-nested.c \
|
backends/x11/nested/meta-renderer-x11-nested.c \
|
||||||
backends/x11/nested/meta-renderer-x11-nested.h \
|
backends/x11/nested/meta-renderer-x11-nested.h \
|
||||||
backends/x11/meta-idle-monitor-xsync.c \
|
|
||||||
backends/x11/meta-idle-monitor-xsync.h \
|
|
||||||
backends/x11/meta-input-settings-x11.c \
|
backends/x11/meta-input-settings-x11.c \
|
||||||
backends/x11/meta-input-settings-x11.h \
|
backends/x11/meta-input-settings-x11.h \
|
||||||
backends/x11/meta-monitor-manager-xrandr.c \
|
backends/x11/meta-monitor-manager-xrandr.c \
|
||||||
@ -487,8 +485,6 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES += \
|
|||||||
backends/native/meta-default-modes.h \
|
backends/native/meta-default-modes.h \
|
||||||
backends/native/meta-gpu-kms.c \
|
backends/native/meta-gpu-kms.c \
|
||||||
backends/native/meta-gpu-kms.h \
|
backends/native/meta-gpu-kms.h \
|
||||||
backends/native/meta-idle-monitor-native.c \
|
|
||||||
backends/native/meta-idle-monitor-native.h \
|
|
||||||
backends/native/meta-input-settings-native.c \
|
backends/native/meta-input-settings-native.c \
|
||||||
backends/native/meta-input-settings-native.h \
|
backends/native/meta-input-settings-native.h \
|
||||||
backends/native/meta-monitor-manager-kms.c \
|
backends/native/meta-monitor-manager-kms.c \
|
||||||
|
@ -59,8 +59,6 @@ struct _MetaBackendClass
|
|||||||
|
|
||||||
void (* post_init) (MetaBackend *backend);
|
void (* post_init) (MetaBackend *backend);
|
||||||
|
|
||||||
MetaIdleMonitor * (* create_idle_monitor) (MetaBackend *backend,
|
|
||||||
int device_id);
|
|
||||||
MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend,
|
MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend,
|
||||||
GError **error);
|
GError **error);
|
||||||
MetaCursorRenderer * (* create_cursor_renderer) (MetaBackend *backend);
|
MetaCursorRenderer * (* create_cursor_renderer) (MetaBackend *backend);
|
||||||
|
@ -222,7 +222,9 @@ static MetaIdleMonitor *
|
|||||||
meta_backend_create_idle_monitor (MetaBackend *backend,
|
meta_backend_create_idle_monitor (MetaBackend *backend,
|
||||||
int device_id)
|
int device_id)
|
||||||
{
|
{
|
||||||
return META_BACKEND_GET_CLASS (backend)->create_idle_monitor (backend, device_id);
|
return g_object_new (META_TYPE_IDLE_MONITOR,
|
||||||
|
"device-id", device_id,
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -26,9 +26,6 @@
|
|||||||
#include <meta/meta-idle-monitor.h>
|
#include <meta/meta-idle-monitor.h>
|
||||||
#include "display-private.h"
|
#include "display-private.h"
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/extensions/sync.h>
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
MetaIdleMonitor *monitor;
|
MetaIdleMonitor *monitor;
|
||||||
@ -38,6 +35,7 @@ typedef struct
|
|||||||
GDestroyNotify notify;
|
GDestroyNotify notify;
|
||||||
guint64 timeout_msec;
|
guint64 timeout_msec;
|
||||||
int idle_source_id;
|
int idle_source_id;
|
||||||
|
GSource *timeout_source;
|
||||||
} MetaIdleMonitorWatch;
|
} MetaIdleMonitorWatch;
|
||||||
|
|
||||||
struct _MetaIdleMonitor
|
struct _MetaIdleMonitor
|
||||||
@ -46,20 +44,15 @@ struct _MetaIdleMonitor
|
|||||||
|
|
||||||
GHashTable *watches;
|
GHashTable *watches;
|
||||||
int device_id;
|
int device_id;
|
||||||
|
guint64 last_event_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaIdleMonitorClass
|
struct _MetaIdleMonitorClass
|
||||||
{
|
{
|
||||||
GObjectClass parent_class;
|
GObjectClass parent_class;
|
||||||
|
|
||||||
gint64 (*get_idletime) (MetaIdleMonitor *monitor);
|
|
||||||
MetaIdleMonitorWatch * (*make_watch) (MetaIdleMonitor *monitor,
|
|
||||||
guint64 timeout_msec,
|
|
||||||
MetaIdleMonitorWatchFunc callback,
|
|
||||||
gpointer user_data,
|
|
||||||
GDestroyNotify notify);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void _meta_idle_monitor_watch_fire (MetaIdleMonitorWatch *watch);
|
void _meta_idle_monitor_watch_fire (MetaIdleMonitorWatch *watch);
|
||||||
|
void meta_idle_monitor_reset_idletime (MetaIdleMonitor *monitor);
|
||||||
|
|
||||||
#endif /* META_IDLE_MONITOR_PRIVATE_H */
|
#endif /* META_IDLE_MONITOR_PRIVATE_H */
|
||||||
|
@ -151,9 +151,35 @@ meta_idle_monitor_class_init (MetaIdleMonitorClass *klass)
|
|||||||
g_object_class_install_property (object_class, PROP_DEVICE_ID, obj_props[PROP_DEVICE_ID]);
|
g_object_class_install_property (object_class, PROP_DEVICE_ID, obj_props[PROP_DEVICE_ID]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_watch (gpointer data)
|
||||||
|
{
|
||||||
|
MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) data;
|
||||||
|
MetaIdleMonitor *monitor = watch->monitor;
|
||||||
|
|
||||||
|
g_object_ref (monitor);
|
||||||
|
|
||||||
|
if (watch->idle_source_id)
|
||||||
|
{
|
||||||
|
g_source_remove (watch->idle_source_id);
|
||||||
|
watch->idle_source_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (watch->notify != NULL)
|
||||||
|
watch->notify (watch->user_data);
|
||||||
|
|
||||||
|
if (watch->timeout_source != NULL)
|
||||||
|
g_source_destroy (watch->timeout_source);
|
||||||
|
|
||||||
|
g_object_unref (monitor);
|
||||||
|
g_slice_free (MetaIdleMonitorWatch, watch);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_idle_monitor_init (MetaIdleMonitor *monitor)
|
meta_idle_monitor_init (MetaIdleMonitor *monitor)
|
||||||
{
|
{
|
||||||
|
monitor->watches = g_hash_table_new_full (NULL, NULL, NULL, free_watch);
|
||||||
|
monitor->last_event_time = g_get_monotonic_time ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -185,6 +211,36 @@ meta_idle_monitor_get_for_device (int device_id)
|
|||||||
return meta_backend_get_idle_monitor (backend, device_id);
|
return meta_backend_get_idle_monitor (backend, device_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint32
|
||||||
|
get_next_watch_serial (void)
|
||||||
|
{
|
||||||
|
static guint32 serial = 0;
|
||||||
|
|
||||||
|
g_atomic_int_inc (&serial);
|
||||||
|
|
||||||
|
return serial;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
idle_monitor_dispatch_timeout (GSource *source,
|
||||||
|
GSourceFunc callback,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) user_data;
|
||||||
|
|
||||||
|
_meta_idle_monitor_watch_fire (watch);
|
||||||
|
g_source_set_ready_time (watch->timeout_source, -1);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GSourceFuncs idle_monitor_source_funcs = {
|
||||||
|
.prepare = NULL,
|
||||||
|
.check = NULL,
|
||||||
|
.dispatch = idle_monitor_dispatch_timeout,
|
||||||
|
.finalize = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
static MetaIdleMonitorWatch *
|
static MetaIdleMonitorWatch *
|
||||||
make_watch (MetaIdleMonitor *monitor,
|
make_watch (MetaIdleMonitor *monitor,
|
||||||
guint64 timeout_msec,
|
guint64 timeout_msec,
|
||||||
@ -194,11 +250,28 @@ make_watch (MetaIdleMonitor *monitor,
|
|||||||
{
|
{
|
||||||
MetaIdleMonitorWatch *watch;
|
MetaIdleMonitorWatch *watch;
|
||||||
|
|
||||||
watch = META_IDLE_MONITOR_GET_CLASS (monitor)->make_watch (monitor,
|
watch = g_slice_new0 (MetaIdleMonitorWatch);
|
||||||
timeout_msec,
|
|
||||||
callback,
|
watch->monitor = monitor;
|
||||||
user_data,
|
watch->id = get_next_watch_serial ();
|
||||||
notify);
|
watch->callback = callback;
|
||||||
|
watch->user_data = user_data;
|
||||||
|
watch->notify = notify;
|
||||||
|
watch->timeout_msec = timeout_msec;
|
||||||
|
|
||||||
|
if (timeout_msec != 0)
|
||||||
|
{
|
||||||
|
GSource *source = g_source_new (&idle_monitor_source_funcs,
|
||||||
|
sizeof (GSource));
|
||||||
|
|
||||||
|
g_source_set_callback (source, NULL, watch, NULL);
|
||||||
|
g_source_set_ready_time (source,
|
||||||
|
monitor->last_event_time + timeout_msec * 1000);
|
||||||
|
g_source_attach (source, NULL);
|
||||||
|
g_source_unref (source);
|
||||||
|
|
||||||
|
watch->timeout_source = source;
|
||||||
|
}
|
||||||
|
|
||||||
g_hash_table_insert (monitor->watches,
|
g_hash_table_insert (monitor->watches,
|
||||||
GUINT_TO_POINTER (watch->id),
|
GUINT_TO_POINTER (watch->id),
|
||||||
@ -314,5 +387,39 @@ meta_idle_monitor_remove_watch (MetaIdleMonitor *monitor,
|
|||||||
gint64
|
gint64
|
||||||
meta_idle_monitor_get_idletime (MetaIdleMonitor *monitor)
|
meta_idle_monitor_get_idletime (MetaIdleMonitor *monitor)
|
||||||
{
|
{
|
||||||
return META_IDLE_MONITOR_GET_CLASS (monitor)->get_idletime (monitor);
|
return (g_get_monotonic_time () - monitor->last_event_time) / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_idle_monitor_reset_idletime (MetaIdleMonitor *monitor)
|
||||||
|
{
|
||||||
|
GList *node, *watch_ids;
|
||||||
|
|
||||||
|
monitor->last_event_time = g_get_monotonic_time ();
|
||||||
|
|
||||||
|
watch_ids = g_hash_table_get_keys (monitor->watches);
|
||||||
|
|
||||||
|
for (node = watch_ids; node != NULL; node = node->next)
|
||||||
|
{
|
||||||
|
guint watch_id = GPOINTER_TO_UINT (node->data);
|
||||||
|
MetaIdleMonitorWatch *watch;
|
||||||
|
|
||||||
|
watch = g_hash_table_lookup (monitor->watches,
|
||||||
|
GUINT_TO_POINTER (watch_id));
|
||||||
|
if (!watch)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (watch->timeout_msec == 0)
|
||||||
|
{
|
||||||
|
_meta_idle_monitor_watch_fire ((MetaIdleMonitorWatch *) watch);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_source_set_ready_time (watch->timeout_source,
|
||||||
|
monitor->last_event_time +
|
||||||
|
watch->timeout_msec * 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_list_free (watch_ids);
|
||||||
}
|
}
|
||||||
|
@ -578,8 +578,6 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
|
|||||||
&error))
|
&error))
|
||||||
{
|
{
|
||||||
g_clear_object (&config);
|
g_clear_object (&config);
|
||||||
g_warning ("Failed to use linear monitor configuration: %s",
|
|
||||||
error->message);
|
|
||||||
g_clear_error (&error);
|
g_clear_error (&error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -597,8 +595,6 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
|
|||||||
&error))
|
&error))
|
||||||
{
|
{
|
||||||
g_clear_object (&config);
|
g_clear_object (&config);
|
||||||
g_warning ("Failed to use fallback monitor configuration: %s",
|
|
||||||
error->message);
|
|
||||||
g_clear_error (&error);
|
g_clear_error (&error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -35,11 +35,11 @@
|
|||||||
#include "clutter/evdev/clutter-evdev.h"
|
#include "clutter/evdev/clutter-evdev.h"
|
||||||
#include "meta-barrier-native.h"
|
#include "meta-barrier-native.h"
|
||||||
#include "meta-border.h"
|
#include "meta-border.h"
|
||||||
#include "meta-idle-monitor-native.h"
|
|
||||||
#include "meta-monitor-manager-kms.h"
|
#include "meta-monitor-manager-kms.h"
|
||||||
#include "meta-cursor-renderer-native.h"
|
#include "meta-cursor-renderer-native.h"
|
||||||
#include "meta-launcher.h"
|
#include "meta-launcher.h"
|
||||||
#include "backends/meta-cursor-tracker-private.h"
|
#include "backends/meta-cursor-tracker-private.h"
|
||||||
|
#include "backends/meta-idle-monitor-private.h"
|
||||||
#include "backends/meta-logical-monitor.h"
|
#include "backends/meta-logical-monitor.h"
|
||||||
#include "backends/meta-monitor-manager-private.h"
|
#include "backends/meta-monitor-manager-private.h"
|
||||||
#include "backends/meta-pointer-constraint.h"
|
#include "backends/meta-pointer-constraint.h"
|
||||||
@ -108,7 +108,7 @@ prepare_for_sleep_cb (GDBusConnection *connection,
|
|||||||
g_variant_get (parameters, "(b)", &suspending);
|
g_variant_get (parameters, "(b)", &suspending);
|
||||||
if (suspending)
|
if (suspending)
|
||||||
return;
|
return;
|
||||||
meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
|
meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -145,7 +145,7 @@ lid_is_closed_changed_cb (UpClient *client,
|
|||||||
if (up_client_get_lid_is_closed (client))
|
if (up_client_get_lid_is_closed (client))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
|
meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -398,15 +398,6 @@ meta_backend_native_post_init (MetaBackend *backend)
|
|||||||
meta_backend_get_monitor_manager (backend));
|
meta_backend_get_monitor_manager (backend));
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaIdleMonitor *
|
|
||||||
meta_backend_native_create_idle_monitor (MetaBackend *backend,
|
|
||||||
int device_id)
|
|
||||||
{
|
|
||||||
return g_object_new (META_TYPE_IDLE_MONITOR_NATIVE,
|
|
||||||
"device-id", device_id,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static MetaMonitorManager *
|
static MetaMonitorManager *
|
||||||
meta_backend_native_create_monitor_manager (MetaBackend *backend,
|
meta_backend_native_create_monitor_manager (MetaBackend *backend,
|
||||||
GError **error)
|
GError **error)
|
||||||
@ -604,7 +595,6 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
|
|||||||
|
|
||||||
backend_class->post_init = meta_backend_native_post_init;
|
backend_class->post_init = meta_backend_native_post_init;
|
||||||
|
|
||||||
backend_class->create_idle_monitor = meta_backend_native_create_idle_monitor;
|
|
||||||
backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager;
|
backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager;
|
||||||
backend_class->create_cursor_renderer = meta_backend_native_create_cursor_renderer;
|
backend_class->create_cursor_renderer = meta_backend_native_create_cursor_renderer;
|
||||||
backend_class->create_renderer = meta_backend_native_create_renderer;
|
backend_class->create_renderer = meta_backend_native_create_renderer;
|
||||||
@ -747,5 +737,5 @@ void meta_backend_native_resume (MetaBackendNative *native)
|
|||||||
meta_cursor_renderer_native_force_update (cursor_renderer_native);
|
meta_cursor_renderer_native_force_update (cursor_renderer_native);
|
||||||
|
|
||||||
idle_monitor = meta_backend_get_idle_monitor (backend, 0);
|
idle_monitor = meta_backend_get_idle_monitor (backend, 0);
|
||||||
meta_idle_monitor_native_reset_idletime (idle_monitor);
|
meta_idle_monitor_reset_idletime (idle_monitor);
|
||||||
}
|
}
|
||||||
|
@ -1,200 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 2013 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Adapted from gnome-session/gnome-session/gs-idle-monitor.c and
|
|
||||||
* from gnome-desktop/libgnome-desktop/gnome-idle-monitor.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "meta-idle-monitor-native.h"
|
|
||||||
#include "meta-idle-monitor-private.h"
|
|
||||||
|
|
||||||
#include <meta/util.h>
|
|
||||||
#include "display-private.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
struct _MetaIdleMonitorNative
|
|
||||||
{
|
|
||||||
MetaIdleMonitor parent;
|
|
||||||
|
|
||||||
guint64 last_event_time;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaIdleMonitorNativeClass
|
|
||||||
{
|
|
||||||
MetaIdleMonitorClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
MetaIdleMonitorWatch base;
|
|
||||||
|
|
||||||
GSource *timeout_source;
|
|
||||||
} MetaIdleMonitorWatchNative;
|
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaIdleMonitorNative, meta_idle_monitor_native, META_TYPE_IDLE_MONITOR)
|
|
||||||
|
|
||||||
static gint64
|
|
||||||
meta_idle_monitor_native_get_idletime (MetaIdleMonitor *monitor)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorNative *monitor_native = META_IDLE_MONITOR_NATIVE (monitor);
|
|
||||||
|
|
||||||
return (g_get_monotonic_time () - monitor_native->last_event_time) / 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
static guint32
|
|
||||||
get_next_watch_serial (void)
|
|
||||||
{
|
|
||||||
static guint32 serial = 0;
|
|
||||||
g_atomic_int_inc (&serial);
|
|
||||||
return serial;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
native_dispatch_timeout (GSource *source,
|
|
||||||
GSourceFunc callback,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorWatchNative *watch_native = user_data;
|
|
||||||
MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) watch_native;
|
|
||||||
|
|
||||||
_meta_idle_monitor_watch_fire (watch);
|
|
||||||
g_source_set_ready_time (watch_native->timeout_source, -1);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GSourceFuncs native_source_funcs = {
|
|
||||||
NULL, /* prepare */
|
|
||||||
NULL, /* check */
|
|
||||||
native_dispatch_timeout,
|
|
||||||
NULL, /* finalize */
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
free_watch (gpointer data)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorWatchNative *watch_native = data;
|
|
||||||
MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) watch_native;
|
|
||||||
MetaIdleMonitor *monitor = watch->monitor;
|
|
||||||
|
|
||||||
g_object_ref (monitor);
|
|
||||||
|
|
||||||
if (watch->idle_source_id)
|
|
||||||
{
|
|
||||||
g_source_remove (watch->idle_source_id);
|
|
||||||
watch->idle_source_id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (watch->notify != NULL)
|
|
||||||
watch->notify (watch->user_data);
|
|
||||||
|
|
||||||
if (watch_native->timeout_source != NULL)
|
|
||||||
g_source_destroy (watch_native->timeout_source);
|
|
||||||
|
|
||||||
g_object_unref (monitor);
|
|
||||||
g_slice_free (MetaIdleMonitorWatchNative, watch_native);
|
|
||||||
}
|
|
||||||
|
|
||||||
static MetaIdleMonitorWatch *
|
|
||||||
meta_idle_monitor_native_make_watch (MetaIdleMonitor *monitor,
|
|
||||||
guint64 timeout_msec,
|
|
||||||
MetaIdleMonitorWatchFunc callback,
|
|
||||||
gpointer user_data,
|
|
||||||
GDestroyNotify notify)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorWatchNative *watch_native;
|
|
||||||
MetaIdleMonitorWatch *watch;
|
|
||||||
MetaIdleMonitorNative *monitor_native = META_IDLE_MONITOR_NATIVE (monitor);
|
|
||||||
|
|
||||||
watch_native = g_slice_new0 (MetaIdleMonitorWatchNative);
|
|
||||||
watch = (MetaIdleMonitorWatch *) watch_native;
|
|
||||||
|
|
||||||
watch->monitor = monitor;
|
|
||||||
watch->id = get_next_watch_serial ();
|
|
||||||
watch->callback = callback;
|
|
||||||
watch->user_data = user_data;
|
|
||||||
watch->notify = notify;
|
|
||||||
watch->timeout_msec = timeout_msec;
|
|
||||||
|
|
||||||
if (timeout_msec != 0)
|
|
||||||
{
|
|
||||||
GSource *source = g_source_new (&native_source_funcs, sizeof (GSource));
|
|
||||||
|
|
||||||
g_source_set_callback (source, NULL, watch, NULL);
|
|
||||||
g_source_set_ready_time (source, monitor_native->last_event_time + timeout_msec * 1000);
|
|
||||||
g_source_attach (source, NULL);
|
|
||||||
g_source_unref (source);
|
|
||||||
|
|
||||||
watch_native->timeout_source = source;
|
|
||||||
}
|
|
||||||
|
|
||||||
return watch;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_idle_monitor_native_class_init (MetaIdleMonitorNativeClass *klass)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorClass *idle_monitor_class = META_IDLE_MONITOR_CLASS (klass);
|
|
||||||
|
|
||||||
idle_monitor_class->get_idletime = meta_idle_monitor_native_get_idletime;
|
|
||||||
idle_monitor_class->make_watch = meta_idle_monitor_native_make_watch;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_idle_monitor_native_init (MetaIdleMonitorNative *monitor_native)
|
|
||||||
{
|
|
||||||
MetaIdleMonitor *monitor = META_IDLE_MONITOR (monitor_native);
|
|
||||||
|
|
||||||
monitor->watches = g_hash_table_new_full (NULL, NULL, NULL, free_watch);
|
|
||||||
monitor_native->last_event_time = g_get_monotonic_time ();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_idle_monitor_native_reset_idletime (MetaIdleMonitor *monitor)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorNative *monitor_native = META_IDLE_MONITOR_NATIVE (monitor);
|
|
||||||
GList *node, *watch_ids;
|
|
||||||
|
|
||||||
monitor_native->last_event_time = g_get_monotonic_time ();
|
|
||||||
|
|
||||||
watch_ids = g_hash_table_get_keys (monitor->watches);
|
|
||||||
|
|
||||||
for (node = watch_ids; node != NULL; node = node->next)
|
|
||||||
{
|
|
||||||
guint watch_id = GPOINTER_TO_UINT (node->data);
|
|
||||||
MetaIdleMonitorWatchNative *watch;
|
|
||||||
|
|
||||||
watch = g_hash_table_lookup (monitor->watches, GUINT_TO_POINTER (watch_id));
|
|
||||||
if (!watch)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (watch->base.timeout_msec == 0)
|
|
||||||
{
|
|
||||||
_meta_idle_monitor_watch_fire ((MetaIdleMonitorWatch *) watch);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_source_set_ready_time (watch->timeout_source,
|
|
||||||
monitor_native->last_event_time +
|
|
||||||
watch->base.timeout_msec * 1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
g_list_free (watch_ids);
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 2013 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Adapted from gnome-session/gnome-session/gs-idle-monitor.c and
|
|
||||||
* from gnome-desktop/libgnome-desktop/gnome-idle-monitor.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef META_IDLE_MONITOR_NATIVE_H
|
|
||||||
#define META_IDLE_MONITOR_NATIVE_H
|
|
||||||
|
|
||||||
#include <glib-object.h>
|
|
||||||
#include <meta/meta-idle-monitor.h>
|
|
||||||
|
|
||||||
#define META_TYPE_IDLE_MONITOR_NATIVE (meta_idle_monitor_native_get_type ())
|
|
||||||
#define META_IDLE_MONITOR_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_IDLE_MONITOR_NATIVE, MetaIdleMonitorNative))
|
|
||||||
#define META_IDLE_MONITOR_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_IDLE_MONITOR_NATIVE, MetaIdleMonitorNativeClass))
|
|
||||||
#define META_IS_IDLE_MONITOR_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_IDLE_MONITOR_NATIVE))
|
|
||||||
#define META_IS_IDLE_MONITOR_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_IDLE_MONITOR_NATIVE))
|
|
||||||
#define META_IDLE_MONITOR_NATIVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_IDLE_MONITOR_NATIVE, MetaIdleMonitorNativeClass))
|
|
||||||
|
|
||||||
typedef struct _MetaIdleMonitorNative MetaIdleMonitorNative;
|
|
||||||
typedef struct _MetaIdleMonitorNativeClass MetaIdleMonitorNativeClass;
|
|
||||||
|
|
||||||
GType meta_idle_monitor_native_get_type (void);
|
|
||||||
|
|
||||||
void meta_idle_monitor_native_reset_idletime (MetaIdleMonitor *monitor);
|
|
||||||
|
|
||||||
#endif /* META_IDLE_MONITOR_NATIVE_H */
|
|
@ -44,7 +44,6 @@
|
|||||||
#include "backends/meta-backend-private.h"
|
#include "backends/meta-backend-private.h"
|
||||||
#include "backends/native/meta-backend-native.h"
|
#include "backends/native/meta-backend-native.h"
|
||||||
#include "meta-cursor-renderer-native.h"
|
#include "meta-cursor-renderer-native.h"
|
||||||
#include "meta-idle-monitor-native.h"
|
|
||||||
#include "meta-renderer-native.h"
|
#include "meta-renderer-native.h"
|
||||||
|
|
||||||
struct _MetaLauncher
|
struct _MetaLauncher
|
||||||
|
@ -37,7 +37,6 @@
|
|||||||
#include <X11/Xlib-xcb.h>
|
#include <X11/Xlib-xcb.h>
|
||||||
#include <xkbcommon/xkbcommon-x11.h>
|
#include <xkbcommon/xkbcommon-x11.h>
|
||||||
|
|
||||||
#include "meta-idle-monitor-xsync.h"
|
|
||||||
#include "backends/meta-stage.h"
|
#include "backends/meta-stage.h"
|
||||||
#include "backends/x11/meta-clutter-backend-x11.h"
|
#include "backends/x11/meta-clutter-backend-x11.h"
|
||||||
#include "backends/x11/meta-renderer-x11.h"
|
#include "backends/x11/meta-renderer-x11.h"
|
||||||
@ -83,15 +82,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaBackendX11, meta_backend_x11, META_TYPE_BACKEND,
|
|||||||
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
|
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
|
||||||
initable_iface_init));
|
initable_iface_init));
|
||||||
|
|
||||||
static void
|
|
||||||
handle_alarm_notify (MetaBackend *backend,
|
|
||||||
XEvent *event)
|
|
||||||
{
|
|
||||||
meta_backend_foreach_device_monitor (backend,
|
|
||||||
(GFunc) meta_idle_monitor_xsync_handle_xevent,
|
|
||||||
event);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_backend_x11_translate_device_event (MetaBackendX11 *x11,
|
meta_backend_x11_translate_device_event (MetaBackendX11 *x11,
|
||||||
XIDeviceEvent *device_event)
|
XIDeviceEvent *device_event)
|
||||||
@ -274,9 +264,6 @@ handle_host_xevent (MetaBackend *backend,
|
|||||||
bypass_clutter = (meta_backend_x11_handle_host_xevent (x11, event) ||
|
bypass_clutter = (meta_backend_x11_handle_host_xevent (x11, event) ||
|
||||||
bypass_clutter);
|
bypass_clutter);
|
||||||
|
|
||||||
if (event->type == (priv->xsync_event_base + XSyncAlarmNotify))
|
|
||||||
handle_alarm_notify (backend, event);
|
|
||||||
|
|
||||||
if (event->type == priv->xkb_event_base)
|
if (event->type == priv->xkb_event_base)
|
||||||
{
|
{
|
||||||
XkbEvent *xkb_ev = (XkbEvent *) event;
|
XkbEvent *xkb_ev = (XkbEvent *) event;
|
||||||
@ -464,15 +451,6 @@ meta_backend_x11_create_clutter_backend (MetaBackend *backend)
|
|||||||
return g_object_new (META_TYPE_CLUTTER_BACKEND_X11, NULL);
|
return g_object_new (META_TYPE_CLUTTER_BACKEND_X11, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaIdleMonitor *
|
|
||||||
meta_backend_x11_create_idle_monitor (MetaBackend *backend,
|
|
||||||
int device_id)
|
|
||||||
{
|
|
||||||
return g_object_new (META_TYPE_IDLE_MONITOR_XSYNC,
|
|
||||||
"device-id", device_id,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_backend_x11_grab_device (MetaBackend *backend,
|
meta_backend_x11_grab_device (MetaBackend *backend,
|
||||||
int device_id,
|
int device_id,
|
||||||
@ -686,7 +664,6 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
|
|||||||
|
|
||||||
backend_class->create_clutter_backend = meta_backend_x11_create_clutter_backend;
|
backend_class->create_clutter_backend = meta_backend_x11_create_clutter_backend;
|
||||||
backend_class->post_init = meta_backend_x11_post_init;
|
backend_class->post_init = meta_backend_x11_post_init;
|
||||||
backend_class->create_idle_monitor = meta_backend_x11_create_idle_monitor;
|
|
||||||
backend_class->grab_device = meta_backend_x11_grab_device;
|
backend_class->grab_device = meta_backend_x11_grab_device;
|
||||||
backend_class->ungrab_device = meta_backend_x11_ungrab_device;
|
backend_class->ungrab_device = meta_backend_x11_ungrab_device;
|
||||||
backend_class->warp_pointer = meta_backend_x11_warp_pointer;
|
backend_class->warp_pointer = meta_backend_x11_warp_pointer;
|
||||||
|
@ -1,373 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 2013 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Adapted from gnome-session/gnome-session/gs-idle-monitor.c and
|
|
||||||
* from gnome-desktop/libgnome-desktop/gnome-idle-monitor.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "meta-idle-monitor-xsync.h"
|
|
||||||
#include "meta-idle-monitor-private.h"
|
|
||||||
|
|
||||||
#include "meta-backend-x11.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
struct _MetaIdleMonitorXSync
|
|
||||||
{
|
|
||||||
MetaIdleMonitor parent;
|
|
||||||
|
|
||||||
GHashTable *alarms;
|
|
||||||
Display *display;
|
|
||||||
XSyncCounter counter;
|
|
||||||
XSyncAlarm user_active_alarm;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaIdleMonitorXSyncClass
|
|
||||||
{
|
|
||||||
MetaIdleMonitorClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
MetaIdleMonitorWatch base;
|
|
||||||
|
|
||||||
XSyncAlarm xalarm;
|
|
||||||
} MetaIdleMonitorWatchXSync;
|
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaIdleMonitorXSync, meta_idle_monitor_xsync, META_TYPE_IDLE_MONITOR)
|
|
||||||
|
|
||||||
static gint64
|
|
||||||
_xsyncvalue_to_int64 (XSyncValue value)
|
|
||||||
{
|
|
||||||
return ((guint64) XSyncValueHigh32 (value)) << 32
|
|
||||||
| (guint64) XSyncValueLow32 (value);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GUINT64_TO_XSYNCVALUE(value, ret) XSyncIntsToValue (ret, (value) & 0xFFFFFFFF, ((guint64)(value)) >> 32)
|
|
||||||
|
|
||||||
static XSyncAlarm
|
|
||||||
_xsync_alarm_set (MetaIdleMonitorXSync *monitor_xsync,
|
|
||||||
XSyncTestType test_type,
|
|
||||||
guint64 interval,
|
|
||||||
gboolean want_events)
|
|
||||||
{
|
|
||||||
XSyncAlarmAttributes attr;
|
|
||||||
XSyncValue delta;
|
|
||||||
guint flags;
|
|
||||||
|
|
||||||
flags = XSyncCACounter | XSyncCAValueType | XSyncCATestType |
|
|
||||||
XSyncCAValue | XSyncCADelta | XSyncCAEvents;
|
|
||||||
|
|
||||||
XSyncIntToValue (&delta, 0);
|
|
||||||
attr.trigger.counter = monitor_xsync->counter;
|
|
||||||
attr.trigger.value_type = XSyncAbsolute;
|
|
||||||
attr.delta = delta;
|
|
||||||
attr.events = want_events;
|
|
||||||
|
|
||||||
GUINT64_TO_XSYNCVALUE (interval, &attr.trigger.wait_value);
|
|
||||||
attr.trigger.test_type = test_type;
|
|
||||||
return XSyncCreateAlarm (monitor_xsync->display, flags, &attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ensure_alarm_rescheduled (Display *dpy,
|
|
||||||
XSyncAlarm alarm)
|
|
||||||
{
|
|
||||||
XSyncAlarmAttributes attr;
|
|
||||||
|
|
||||||
/* Some versions of Xorg have an issue where alarms aren't
|
|
||||||
* always rescheduled. Calling XSyncChangeAlarm, even
|
|
||||||
* without any attributes, will reschedule the alarm. */
|
|
||||||
XSyncChangeAlarm (dpy, alarm, 0, &attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_alarm_enabled (Display *dpy,
|
|
||||||
XSyncAlarm alarm,
|
|
||||||
gboolean enabled)
|
|
||||||
{
|
|
||||||
XSyncAlarmAttributes attr;
|
|
||||||
attr.events = enabled;
|
|
||||||
XSyncChangeAlarm (dpy, alarm, XSyncCAEvents, &attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *
|
|
||||||
counter_name_for_device (int device_id)
|
|
||||||
{
|
|
||||||
if (device_id > 0)
|
|
||||||
return g_strdup_printf ("DEVICEIDLETIME %d", device_id);
|
|
||||||
|
|
||||||
return g_strdup ("IDLETIME");
|
|
||||||
}
|
|
||||||
|
|
||||||
static XSyncCounter
|
|
||||||
find_idletime_counter (MetaIdleMonitorXSync *monitor_xsync)
|
|
||||||
{
|
|
||||||
MetaIdleMonitor *monitor = META_IDLE_MONITOR (monitor_xsync);
|
|
||||||
int i;
|
|
||||||
int ncounters;
|
|
||||||
XSyncSystemCounter *counters;
|
|
||||||
XSyncCounter counter = None;
|
|
||||||
char *counter_name;
|
|
||||||
|
|
||||||
counter_name = counter_name_for_device (monitor->device_id);
|
|
||||||
counters = XSyncListSystemCounters (monitor_xsync->display, &ncounters);
|
|
||||||
for (i = 0; i < ncounters; i++)
|
|
||||||
{
|
|
||||||
if (counters[i].name != NULL && strcmp (counters[i].name, counter_name) == 0)
|
|
||||||
{
|
|
||||||
counter = counters[i].counter;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
XSyncFreeSystemCounterList (counters);
|
|
||||||
g_free (counter_name);
|
|
||||||
|
|
||||||
return counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
init_xsync (MetaIdleMonitorXSync *monitor_xsync)
|
|
||||||
{
|
|
||||||
monitor_xsync->counter = find_idletime_counter (monitor_xsync);
|
|
||||||
/* IDLETIME counter not found? */
|
|
||||||
if (monitor_xsync->counter == None)
|
|
||||||
{
|
|
||||||
g_warning ("IDLETIME counter not found\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
monitor_xsync->user_active_alarm = _xsync_alarm_set (monitor_xsync, XSyncNegativeTransition, 1, FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_idle_monitor_xsync_dispose (GObject *object)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorXSync *monitor_xsync = META_IDLE_MONITOR_XSYNC (object);
|
|
||||||
|
|
||||||
if (monitor_xsync->user_active_alarm != None)
|
|
||||||
{
|
|
||||||
XSyncDestroyAlarm (monitor_xsync->display, monitor_xsync->user_active_alarm);
|
|
||||||
monitor_xsync->user_active_alarm = None;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_clear_pointer (&monitor_xsync->alarms, g_hash_table_destroy);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_idle_monitor_xsync_parent_class)->dispose (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_idle_monitor_xsync_constructed (GObject *object)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorXSync *monitor_xsync = META_IDLE_MONITOR_XSYNC (object);
|
|
||||||
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
|
|
||||||
|
|
||||||
monitor_xsync->display = meta_backend_x11_get_xdisplay (backend);
|
|
||||||
init_xsync (monitor_xsync);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_idle_monitor_xsync_parent_class)->constructed (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gint64
|
|
||||||
meta_idle_monitor_xsync_get_idletime (MetaIdleMonitor *monitor)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorXSync *monitor_xsync = META_IDLE_MONITOR_XSYNC (monitor);
|
|
||||||
XSyncValue value;
|
|
||||||
|
|
||||||
if (!XSyncQueryCounter (monitor_xsync->display, monitor_xsync->counter, &value))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return _xsyncvalue_to_int64 (value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
fire_watch_idle (gpointer data)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorWatch *watch = data;
|
|
||||||
|
|
||||||
watch->idle_source_id = 0;
|
|
||||||
_meta_idle_monitor_watch_fire (watch);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static guint32
|
|
||||||
get_next_watch_serial (void)
|
|
||||||
{
|
|
||||||
static guint32 serial = 0;
|
|
||||||
g_atomic_int_inc (&serial);
|
|
||||||
return serial;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
free_watch (gpointer data)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorWatchXSync *watch_xsync = data;
|
|
||||||
MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) watch_xsync;
|
|
||||||
MetaIdleMonitor *monitor = watch->monitor;
|
|
||||||
MetaIdleMonitorXSync *monitor_xsync = META_IDLE_MONITOR_XSYNC (monitor);
|
|
||||||
|
|
||||||
g_object_ref (monitor);
|
|
||||||
|
|
||||||
if (watch->idle_source_id)
|
|
||||||
{
|
|
||||||
g_source_remove (watch->idle_source_id);
|
|
||||||
watch->idle_source_id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (watch->notify != NULL)
|
|
||||||
watch->notify (watch->user_data);
|
|
||||||
|
|
||||||
if (watch_xsync->xalarm != monitor_xsync->user_active_alarm &&
|
|
||||||
watch_xsync->xalarm != None)
|
|
||||||
{
|
|
||||||
XSyncDestroyAlarm (monitor_xsync->display, watch_xsync->xalarm);
|
|
||||||
g_hash_table_remove (monitor_xsync->alarms, (gpointer) watch_xsync->xalarm);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_object_unref (monitor);
|
|
||||||
g_slice_free (MetaIdleMonitorWatchXSync, watch_xsync);
|
|
||||||
}
|
|
||||||
|
|
||||||
static MetaIdleMonitorWatch *
|
|
||||||
meta_idle_monitor_xsync_make_watch (MetaIdleMonitor *monitor,
|
|
||||||
guint64 timeout_msec,
|
|
||||||
MetaIdleMonitorWatchFunc callback,
|
|
||||||
gpointer user_data,
|
|
||||||
GDestroyNotify notify)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorXSync *monitor_xsync = META_IDLE_MONITOR_XSYNC (monitor);
|
|
||||||
MetaIdleMonitorWatchXSync *watch_xsync;
|
|
||||||
MetaIdleMonitorWatch *watch;
|
|
||||||
|
|
||||||
watch_xsync = g_slice_new0 (MetaIdleMonitorWatchXSync);
|
|
||||||
watch = (MetaIdleMonitorWatch *) watch_xsync;
|
|
||||||
|
|
||||||
watch->monitor = monitor;
|
|
||||||
watch->id = get_next_watch_serial ();
|
|
||||||
watch->callback = callback;
|
|
||||||
watch->user_data = user_data;
|
|
||||||
watch->notify = notify;
|
|
||||||
watch->timeout_msec = timeout_msec;
|
|
||||||
|
|
||||||
if (monitor_xsync->user_active_alarm != None)
|
|
||||||
{
|
|
||||||
if (timeout_msec != 0)
|
|
||||||
{
|
|
||||||
watch_xsync->xalarm = _xsync_alarm_set (monitor_xsync, XSyncPositiveTransition, timeout_msec, TRUE);
|
|
||||||
|
|
||||||
g_hash_table_add (monitor_xsync->alarms, (gpointer) watch_xsync->xalarm);
|
|
||||||
|
|
||||||
if (meta_idle_monitor_get_idletime (monitor) > (gint64)timeout_msec)
|
|
||||||
{
|
|
||||||
watch->idle_source_id = g_idle_add (fire_watch_idle, watch);
|
|
||||||
g_source_set_name_by_id (watch->idle_source_id, "[mutter] fire_watch_idle");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
watch_xsync->xalarm = monitor_xsync->user_active_alarm;
|
|
||||||
|
|
||||||
set_alarm_enabled (monitor_xsync->display, monitor_xsync->user_active_alarm, TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return watch;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_idle_monitor_xsync_class_init (MetaIdleMonitorXSyncClass *klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
||||||
MetaIdleMonitorClass *idle_monitor_class = META_IDLE_MONITOR_CLASS (klass);
|
|
||||||
|
|
||||||
object_class->dispose = meta_idle_monitor_xsync_dispose;
|
|
||||||
object_class->constructed = meta_idle_monitor_xsync_constructed;
|
|
||||||
|
|
||||||
idle_monitor_class->get_idletime = meta_idle_monitor_xsync_get_idletime;
|
|
||||||
idle_monitor_class->make_watch = meta_idle_monitor_xsync_make_watch;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_idle_monitor_xsync_init (MetaIdleMonitorXSync *monitor_xsync)
|
|
||||||
{
|
|
||||||
MetaIdleMonitor *monitor = META_IDLE_MONITOR (monitor_xsync);
|
|
||||||
|
|
||||||
monitor->watches = g_hash_table_new_full (NULL, NULL, NULL, free_watch);
|
|
||||||
monitor_xsync->alarms = g_hash_table_new (NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
check_x11_watches (MetaIdleMonitor *monitor,
|
|
||||||
XSyncAlarm alarm)
|
|
||||||
{
|
|
||||||
GList *node, *watch_ids;
|
|
||||||
|
|
||||||
/* we get the keys and do explicit look ups in case
|
|
||||||
* an early iteration of the loop ends up leading
|
|
||||||
* to watches from later iterations getting invalidated
|
|
||||||
*/
|
|
||||||
watch_ids = g_hash_table_get_keys (monitor->watches);
|
|
||||||
|
|
||||||
for (node = watch_ids; node != NULL; node = node->next)
|
|
||||||
{
|
|
||||||
guint watch_id = GPOINTER_TO_UINT (node->data);
|
|
||||||
MetaIdleMonitorWatchXSync *watch;
|
|
||||||
|
|
||||||
watch = g_hash_table_lookup (monitor->watches, GUINT_TO_POINTER (watch_id));
|
|
||||||
|
|
||||||
if (watch && watch->xalarm == alarm)
|
|
||||||
_meta_idle_monitor_watch_fire ((MetaIdleMonitorWatch *) watch);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_list_free (watch_ids);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_idle_monitor_xsync_handle_xevent (MetaIdleMonitor *monitor,
|
|
||||||
XSyncAlarmNotifyEvent *alarm_event)
|
|
||||||
{
|
|
||||||
MetaIdleMonitorXSync *monitor_xsync = META_IDLE_MONITOR_XSYNC (monitor);
|
|
||||||
XSyncAlarm alarm;
|
|
||||||
gboolean has_alarm;
|
|
||||||
|
|
||||||
if (alarm_event->state != XSyncAlarmActive)
|
|
||||||
return;
|
|
||||||
|
|
||||||
alarm = alarm_event->alarm;
|
|
||||||
|
|
||||||
has_alarm = FALSE;
|
|
||||||
|
|
||||||
if (alarm == monitor_xsync->user_active_alarm)
|
|
||||||
{
|
|
||||||
set_alarm_enabled (monitor_xsync->display,
|
|
||||||
alarm,
|
|
||||||
FALSE);
|
|
||||||
has_alarm = TRUE;
|
|
||||||
}
|
|
||||||
else if (g_hash_table_contains (monitor_xsync->alarms, (gpointer) alarm))
|
|
||||||
{
|
|
||||||
ensure_alarm_rescheduled (monitor_xsync->display,
|
|
||||||
alarm);
|
|
||||||
has_alarm = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (has_alarm)
|
|
||||||
check_x11_watches (monitor, alarm);
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 2013 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Adapted from gnome-session/gnome-session/gs-idle-monitor.c and
|
|
||||||
* from gnome-desktop/libgnome-desktop/gnome-idle-monitor.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef META_IDLE_MONITOR_XSYNC_H
|
|
||||||
#define META_IDLE_MONITOR_XSYNC_H
|
|
||||||
|
|
||||||
#include <glib-object.h>
|
|
||||||
#include <meta/meta-idle-monitor.h>
|
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/extensions/sync.h>
|
|
||||||
|
|
||||||
#define META_TYPE_IDLE_MONITOR_XSYNC (meta_idle_monitor_xsync_get_type ())
|
|
||||||
#define META_IDLE_MONITOR_XSYNC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_IDLE_MONITOR_XSYNC, MetaIdleMonitorXSync))
|
|
||||||
#define META_IDLE_MONITOR_XSYNC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_IDLE_MONITOR_XSYNC, MetaIdleMonitorXSyncClass))
|
|
||||||
#define META_IS_IDLE_MONITOR_XSYNC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_IDLE_MONITOR_XSYNC))
|
|
||||||
#define META_IS_IDLE_MONITOR_XSYNC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_IDLE_MONITOR_XSYNC))
|
|
||||||
#define META_IDLE_MONITOR_XSYNC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_IDLE_MONITOR_XSYNC, MetaIdleMonitorXSyncClass))
|
|
||||||
|
|
||||||
typedef struct _MetaIdleMonitorXSync MetaIdleMonitorXSync;
|
|
||||||
typedef struct _MetaIdleMonitorXSyncClass MetaIdleMonitorXSyncClass;
|
|
||||||
|
|
||||||
GType meta_idle_monitor_xsync_get_type (void);
|
|
||||||
|
|
||||||
void meta_idle_monitor_xsync_handle_xevent (MetaIdleMonitor *monitor,
|
|
||||||
XSyncAlarmNotifyEvent *xevent);
|
|
||||||
|
|
||||||
#endif /* META_IDLE_MONITOR_XSYNC_H */
|
|
@ -32,9 +32,10 @@
|
|||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
#ifdef HAVE_NATIVE_BACKEND
|
||||||
#include "backends/native/meta-backend-native.h"
|
#include "backends/native/meta-backend-native.h"
|
||||||
#include "backends/native/meta-idle-monitor-native.h"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "backends/meta-idle-monitor-private.h"
|
||||||
|
|
||||||
#ifdef HAVE_WAYLAND
|
#ifdef HAVE_WAYLAND
|
||||||
#include "wayland/meta-wayland-private.h"
|
#include "wayland/meta-wayland-private.h"
|
||||||
#endif
|
#endif
|
||||||
@ -92,46 +93,38 @@ get_window_for_event (MetaDisplay *display,
|
|||||||
static void
|
static void
|
||||||
handle_idletime_for_event (const ClutterEvent *event)
|
handle_idletime_for_event (const ClutterEvent *event)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
ClutterInputDevice *device, *source_device;
|
||||||
/* This is handled by XSync under X11. */
|
MetaIdleMonitor *core_monitor, *device_monitor;
|
||||||
MetaBackend *backend = meta_get_backend ();
|
int device_id;
|
||||||
|
|
||||||
if (META_IS_BACKEND_NATIVE (backend))
|
device = clutter_event_get_device (event);
|
||||||
|
if (device == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (event->any.flags & CLUTTER_EVENT_FLAG_SYNTHETIC ||
|
||||||
|
event->type == CLUTTER_ENTER ||
|
||||||
|
event->type == CLUTTER_LEAVE ||
|
||||||
|
event->type == CLUTTER_STAGE_STATE ||
|
||||||
|
event->type == CLUTTER_DESTROY_NOTIFY ||
|
||||||
|
event->type == CLUTTER_CLIENT_MESSAGE ||
|
||||||
|
event->type == CLUTTER_DELETE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
device_id = clutter_input_device_get_device_id (device);
|
||||||
|
|
||||||
|
core_monitor = meta_idle_monitor_get_core ();
|
||||||
|
device_monitor = meta_idle_monitor_get_for_device (device_id);
|
||||||
|
|
||||||
|
meta_idle_monitor_reset_idletime (core_monitor);
|
||||||
|
meta_idle_monitor_reset_idletime (device_monitor);
|
||||||
|
|
||||||
|
source_device = clutter_event_get_source_device (event);
|
||||||
|
if (source_device != device)
|
||||||
{
|
{
|
||||||
ClutterInputDevice *device, *source_device;
|
|
||||||
MetaIdleMonitor *core_monitor, *device_monitor;
|
|
||||||
int device_id;
|
|
||||||
|
|
||||||
device = clutter_event_get_device (event);
|
|
||||||
if (device == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (event->any.flags & CLUTTER_EVENT_FLAG_SYNTHETIC ||
|
|
||||||
event->type == CLUTTER_ENTER ||
|
|
||||||
event->type == CLUTTER_LEAVE ||
|
|
||||||
event->type == CLUTTER_STAGE_STATE ||
|
|
||||||
event->type == CLUTTER_DESTROY_NOTIFY ||
|
|
||||||
event->type == CLUTTER_CLIENT_MESSAGE ||
|
|
||||||
event->type == CLUTTER_DELETE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
device_id = clutter_input_device_get_device_id (device);
|
device_id = clutter_input_device_get_device_id (device);
|
||||||
|
|
||||||
core_monitor = meta_idle_monitor_get_core ();
|
|
||||||
device_monitor = meta_idle_monitor_get_for_device (device_id);
|
device_monitor = meta_idle_monitor_get_for_device (device_id);
|
||||||
|
meta_idle_monitor_reset_idletime (device_monitor);
|
||||||
meta_idle_monitor_native_reset_idletime (core_monitor);
|
|
||||||
meta_idle_monitor_native_reset_idletime (device_monitor);
|
|
||||||
|
|
||||||
source_device = clutter_event_get_source_device (event);
|
|
||||||
if (source_device != device)
|
|
||||||
{
|
|
||||||
device_id = clutter_input_device_get_device_id (device);
|
|
||||||
device_monitor = meta_idle_monitor_get_for_device (device_id);
|
|
||||||
meta_idle_monitor_native_reset_idletime (device_monitor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* HAVE_NATIVE_BACKEND */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
Loading…
Reference in New Issue
Block a user