diff options
Diffstat (limited to 'plugins/typing-break/gsd-typing-break-manager.c')
-rw-r--r-- | plugins/typing-break/gsd-typing-break-manager.c | 339 |
1 files changed, 0 insertions, 339 deletions
diff --git a/plugins/typing-break/gsd-typing-break-manager.c b/plugins/typing-break/gsd-typing-break-manager.c deleted file mode 100644 index 113f6be..0000000 --- a/plugins/typing-break/gsd-typing-break-manager.c +++ /dev/null @@ -1,339 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright (C) 2007 William Jon McCann <[email protected]> - * - * 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. - * - */ - -#include "config.h" - -#include <sys/types.h> -#include <sys/wait.h> -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> -#include <signal.h> - -#include <locale.h> - -#include <glib.h> -#include <glib/gi18n.h> -#include <gdk/gdk.h> -#include <gdk/gdkx.h> -#include <gtk/gtk.h> -#include <mateconf/mateconf-client.h> - -#include "mate-settings-profile.h" -#include "msd-typing-break-manager.h" - -#define MSD_TYPING_BREAK_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MSD_TYPE_TYPING_BREAK_MANAGER, MsdTypingBreakManagerPrivate)) - -#define MATECONF_BREAK_DIR "/desktop/mate/typing_break" - -struct MsdTypingBreakManagerPrivate -{ - GPid typing_monitor_pid; - guint typing_monitor_idle_id; - guint child_watch_id; - guint setup_id; - guint notify; -}; - -static void msd_typing_break_manager_class_init (MsdTypingBreakManagerClass *klass); -static void msd_typing_break_manager_init (MsdTypingBreakManager *typing_break_manager); -static void msd_typing_break_manager_finalize (GObject *object); - -G_DEFINE_TYPE (MsdTypingBreakManager, msd_typing_break_manager, G_TYPE_OBJECT) - -static gpointer manager_object = NULL; - -static gboolean -typing_break_timeout (MsdTypingBreakManager *manager) -{ - if (manager->priv->typing_monitor_pid > 0) { - kill (manager->priv->typing_monitor_pid, SIGKILL); - } - - manager->priv->typing_monitor_idle_id = 0; - - return FALSE; -} - -static void -child_watch (GPid pid, - int status, - MsdTypingBreakManager *manager) -{ - if (pid == manager->priv->typing_monitor_pid) { - manager->priv->typing_monitor_pid = 0; - g_spawn_close_pid (pid); - } -} - -static void -setup_typing_break (MsdTypingBreakManager *manager, - gboolean enabled) -{ - mate_settings_profile_start (NULL); - - if (! enabled) { - if (manager->priv->typing_monitor_pid != 0) { - manager->priv->typing_monitor_idle_id = g_timeout_add_seconds (3, (GSourceFunc) typing_break_timeout, manager); - } - return; - } - - if (manager->priv->typing_monitor_idle_id != 0) { - g_source_remove (manager->priv->typing_monitor_idle_id); - manager->priv->typing_monitor_idle_id = 0; - } - - if (manager->priv->typing_monitor_pid == 0) { - GError *error; - char *argv[] = { "mate-typing-monitor", "-n", NULL }; - gboolean res; - - error = NULL; - res = g_spawn_async ("/", - argv, - NULL, - G_SPAWN_STDOUT_TO_DEV_NULL - | G_SPAWN_STDERR_TO_DEV_NULL - | G_SPAWN_SEARCH_PATH - | G_SPAWN_DO_NOT_REAP_CHILD, - NULL, - NULL, - &manager->priv->typing_monitor_pid, - &error); - if (! res) { - /* FIXME: put up a warning */ - g_warning ("failed: %s\n", error->message); - g_error_free (error); - manager->priv->typing_monitor_pid = 0; - return; - } - - manager->priv->child_watch_id = g_child_watch_add (manager->priv->typing_monitor_pid, - (GChildWatchFunc)child_watch, - manager); - } - - mate_settings_profile_end (NULL); -} - -static void -typing_break_callback (MateConfClient *client, - guint cnxn_id, - MateConfEntry *entry, - MsdTypingBreakManager *manager) -{ - if (! strcmp (entry->key, "/desktop/mate/typing_break/enabled")) { - if (entry->value->type == MATECONF_VALUE_BOOL) { - setup_typing_break (manager, mateconf_value_get_bool (entry->value)); - } - } -} - -static gboolean -really_setup_typing_break (MsdTypingBreakManager *manager) -{ - setup_typing_break (manager, TRUE); - manager->priv->setup_id = 0; - return FALSE; -} - -gboolean -msd_typing_break_manager_start (MsdTypingBreakManager *manager, - GError **error) -{ - MateConfClient *client; - gboolean enabled; - - g_debug ("Starting typing_break manager"); - mate_settings_profile_start (NULL); - - client = mateconf_client_get_default (); - - mateconf_client_add_dir (client, MATECONF_BREAK_DIR, MATECONF_CLIENT_PRELOAD_ONELEVEL, NULL); - manager->priv->notify = - mateconf_client_notify_add (client, - MATECONF_BREAK_DIR, - (MateConfClientNotifyFunc) typing_break_callback, manager, - NULL, NULL); - - enabled = mateconf_client_get_bool (client, MATECONF_BREAK_DIR "/enabled", NULL); - g_object_unref (client); - if (enabled) { - manager->priv->setup_id = - g_timeout_add_seconds (3, - (GSourceFunc) really_setup_typing_break, - manager); - } - - mate_settings_profile_end (NULL); - - return TRUE; -} - -void -msd_typing_break_manager_stop (MsdTypingBreakManager *manager) -{ - MsdTypingBreakManagerPrivate *p = manager->priv; - - g_debug ("Stopping typing_break manager"); - - if (p->setup_id != 0) { - g_source_remove (p->setup_id); - p->setup_id = 0; - } - - if (p->child_watch_id != 0) { - g_source_remove (p->child_watch_id); - p->child_watch_id = 0; - } - - if (p->typing_monitor_idle_id != 0) { - g_source_remove (p->typing_monitor_idle_id); - p->typing_monitor_idle_id = 0; - } - - if (p->typing_monitor_pid > 0) { - kill (p->typing_monitor_pid, SIGKILL); - g_spawn_close_pid (p->typing_monitor_pid); - p->typing_monitor_pid = 0; - } - - if (p->notify != 0) { - MateConfClient *client = mateconf_client_get_default (); - mateconf_client_remove_dir (client, MATECONF_BREAK_DIR, NULL); - mateconf_client_notify_remove (client, p->notify); - g_object_unref (client); - p->notify = 0; - } -} - -static void -msd_typing_break_manager_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - MsdTypingBreakManager *self; - - self = MSD_TYPING_BREAK_MANAGER (object); - - switch (prop_id) { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -msd_typing_break_manager_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - MsdTypingBreakManager *self; - - self = MSD_TYPING_BREAK_MANAGER (object); - - switch (prop_id) { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static GObject * -msd_typing_break_manager_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) -{ - MsdTypingBreakManager *typing_break_manager; - MsdTypingBreakManagerClass *klass; - - klass = MSD_TYPING_BREAK_MANAGER_CLASS (g_type_class_peek (MSD_TYPE_TYPING_BREAK_MANAGER)); - - typing_break_manager = MSD_TYPING_BREAK_MANAGER (G_OBJECT_CLASS (msd_typing_break_manager_parent_class)->constructor (type, - n_construct_properties, - construct_properties)); - - return G_OBJECT (typing_break_manager); -} - -static void -msd_typing_break_manager_dispose (GObject *object) -{ - MsdTypingBreakManager *typing_break_manager; - - typing_break_manager = MSD_TYPING_BREAK_MANAGER (object); - - G_OBJECT_CLASS (msd_typing_break_manager_parent_class)->dispose (object); -} - -static void -msd_typing_break_manager_class_init (MsdTypingBreakManagerClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->get_property = msd_typing_break_manager_get_property; - object_class->set_property = msd_typing_break_manager_set_property; - object_class->constructor = msd_typing_break_manager_constructor; - object_class->dispose = msd_typing_break_manager_dispose; - object_class->finalize = msd_typing_break_manager_finalize; - - g_type_class_add_private (klass, sizeof (MsdTypingBreakManagerPrivate)); -} - -static void -msd_typing_break_manager_init (MsdTypingBreakManager *manager) -{ - manager->priv = MSD_TYPING_BREAK_MANAGER_GET_PRIVATE (manager); - -} - -static void -msd_typing_break_manager_finalize (GObject *object) -{ - MsdTypingBreakManager *typing_break_manager; - - g_return_if_fail (object != NULL); - g_return_if_fail (MSD_IS_TYPING_BREAK_MANAGER (object)); - - typing_break_manager = MSD_TYPING_BREAK_MANAGER (object); - - g_return_if_fail (typing_break_manager->priv != NULL); - - G_OBJECT_CLASS (msd_typing_break_manager_parent_class)->finalize (object); -} - -MsdTypingBreakManager * -msd_typing_break_manager_new (void) -{ - if (manager_object != NULL) { - g_object_ref (manager_object); - } else { - manager_object = g_object_new (MSD_TYPE_TYPING_BREAK_MANAGER, NULL); - g_object_add_weak_pointer (manager_object, - (gpointer *) &manager_object); - } - - return MSD_TYPING_BREAK_MANAGER (manager_object); -} |