mousetweaks r120 - in trunk: . src



Author: gerdk
Date: Thu Mar 27 11:10:48 2008
New Revision: 120
URL: http://svn.gnome.org/viewvc/mousetweaks?rev=120&view=rev

Log:
2008-03-27 Gerd Kohlberger <gerdk svn gnome org>

	* src/mt-service.c:
	* src/mt-service.h:
	* src/mousetweaks-service.xml:
	* src/Makefile.am:

	Added new dbus object with introspection.

	* src/mt-main.c:
	* src/mt-main.h:
	* src/mt-common.h:
	* src/dwell-click-applet.c:
	* src/mt-ctw.c:
	* src/mt-ctw.h:

	Use new dbus object and some general code clean up.



Added:
   trunk/src/mousetweaks-service.xml
   trunk/src/mt-service.c
   trunk/src/mt-service.h
Removed:
   trunk/src/mt-dbus.c
   trunk/src/mt-dbus.h
Modified:
   trunk/ChangeLog
   trunk/src/Makefile.am
   trunk/src/dwell-click-applet.c
   trunk/src/mt-common.h
   trunk/src/mt-ctw.c
   trunk/src/mt-ctw.h
   trunk/src/mt-main.c
   trunk/src/mt-main.h

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am	(original)
+++ trunk/src/Makefile.am	Thu Mar 27 11:10:48 2008
@@ -20,8 +20,8 @@
 	mt-common.h	\
 	mt-pidfile.c	\
 	mt-pidfile.h	\
-	mt-dbus.c	\
-	mt-dbus.h	\
+	mt-service.c	\
+	mt-service.h	\
 	mt-ctw.c	\
 	mt-ctw.h	\
 	mt-timer.c	\
@@ -42,3 +42,11 @@
 	mt-common.h
 
 pointer_capture_applet_LDFLAGS = $(DEPENDENCIES_LIBS)
+
+BUILT_SOURCES = mt-service-glue.h
+
+mt-service-glue.h: mousetweaks-service.xml
+	-dbus-binding-tool --prefix=mt_service --mode=glib-server $<> $@
+
+EXTRA_DIST = mousetweaks-service.xml
+CLEANFILES = $(BUILT_SOURCES)

Modified: trunk/src/dwell-click-applet.c
==============================================================================
--- trunk/src/dwell-click-applet.c	(original)
+++ trunk/src/dwell-click-applet.c	Thu Mar 27 11:10:48 2008
@@ -18,21 +18,20 @@
 #include <gtk/gtk.h>
 #include <glade/glade.h>
 #include <panel-applet.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gconf/gconf-client.h>
+#include <dbus/dbus-glib.h>
 #include <libgnomeui/gnome-help.h>
 
 #include "mt-common.h"
-#include "mt-dbus.h"
 
 typedef struct _DwellData DwellData;
 struct _DwellData {
-    DBusConnection *conn;
-    GConfClient    *client;
-
-    GladeXML  *xml;
-    GtkWidget *box;
-    GtkWidget *button;
-    GdkPixbuf *click[4];
+    GConfClient *client;
+    DBusGProxy  *proxy;
+    GladeXML    *xml;
+    GtkWidget   *box;
+    GtkWidget   *button;
+    GdkPixbuf   *click[4];
 
     gint button_width;
     gint button_height;
@@ -73,69 +72,6 @@
     BONOBO_UI_VERB_END
 };
 
-static void
-send_dbus_signal (DBusConnection *conn, const gchar *type, gint arg)
-{
-    DBusMessage *msg;
-
-    msg = dbus_message_new_signal (MOUSETWEAKS_DBUS_PATH_MAIN,
-				   MOUSETWEAKS_DBUS_INTERFACE,
-				   type);
-    dbus_message_append_args (msg,
-			      DBUS_TYPE_INT32, &arg,
-			      DBUS_TYPE_INVALID);
-    dbus_connection_send (conn, msg, NULL);
-    dbus_connection_flush (conn);
-    dbus_message_unref (msg);
-}
-
-static DBusHandlerResult
-receive_dbus_signal (DBusConnection *conn, DBusMessage *msg, void *data)
-{
-    DwellData *dd = (DwellData *) data;
-
-    if (dbus_message_is_signal (msg,
-				MOUSETWEAKS_DBUS_INTERFACE,
-				CLICK_TYPE_SIGNAL)) {
-	if (dbus_message_get_args (msg,
-				   NULL, 
-				   DBUS_TYPE_INT32,
-				   &dd->cct,
-				   DBUS_TYPE_INVALID)) {
-	    GSList *group;
-	    gpointer data;
-
-	    group = gtk_radio_button_get_group (GTK_RADIO_BUTTON(dd->button));
-	    data = g_slist_nth_data (group, dd->cct);
-	    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data), TRUE);
-
-	    return DBUS_HANDLER_RESULT_HANDLED;
-	}
-    }
-    else if (dbus_message_is_signal (msg,
-				     MOUSETWEAKS_DBUS_INTERFACE,
-				     RESTORE_SIGNAL)) {
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dd->button), TRUE);
-
-	return DBUS_HANDLER_RESULT_HANDLED;
-    }
-    else if (dbus_message_is_signal (msg,
-				     MOUSETWEAKS_DBUS_INTERFACE,
-				     ACTIVE_SIGNAL)) {
-	if (dbus_message_get_args (msg,
-			       NULL, 
-			       DBUS_TYPE_INT32,
-			       &dd->active,
-			       DBUS_TYPE_INVALID)) {
-	    update_sensitivity (dd);
-
-	    return DBUS_HANDLER_RESULT_HANDLED;
-	}
-    }
-
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
 static gboolean
 do_not_eat (GtkWidget *widget, GdkEventButton *bev, gpointer user)
 {
@@ -154,9 +90,10 @@
 	GSList *group;
 
 	group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
-	dd->cct = g_slist_index (group, (gconstpointer) button);
-
-	send_dbus_signal (dd->conn, CLICK_TYPE_SIGNAL, dd->cct);
+	dd->cct = g_slist_index (group, button);
+	dbus_g_proxy_call_no_reply (dd->proxy, "SetClicktype",
+				    G_TYPE_UINT, dd->cct,
+				    G_TYPE_INVALID);
     }
 }
 
@@ -215,36 +152,13 @@
     dd->button_height = alloc->height;
 }
 
-static void
-fini_dwell_data (DwellData *dd)
-{
-    GtkWidget *w;
-    gint i;
-
-    w = glade_xml_get_widget (dd->xml, "box_vert");
-    g_object_unref (w);
-    w = glade_xml_get_widget (dd->xml, "box_hori");
-    g_object_unref (w);
-
-    if (dd->conn)
-	dbus_connection_unref (dd->conn);
-
-    if (dd->client)
-	g_object_unref (dd->client);
-
-    for (i = 0; i < N_CLICK_TYPES; i++)
-	g_object_unref (dd->click[i]);
-
-    g_free (dd);
-}
-
 /* applet callbacks */
 static void
 applet_orient_changed (PanelApplet *applet, guint orient, gpointer data)
 {
     DwellData *dd = (DwellData *) data;
 
-    gtk_container_remove (GTK_CONTAINER(applet), dd->box);
+    gtk_container_remove (GTK_CONTAINER (applet), dd->box);
 
     switch (orient) {
     case PANEL_APPLET_ORIENT_UP:
@@ -261,15 +175,27 @@
     }
 
     if (dd->box->parent)
-	gtk_widget_reparent (dd->box, GTK_WIDGET(applet));
+	gtk_widget_reparent (dd->box, GTK_WIDGET (applet));
     else
-	gtk_container_add (GTK_CONTAINER(applet), dd->box);
+	gtk_container_add (GTK_CONTAINER (applet), dd->box);
 }
 
 static void
 applet_unrealized (GtkWidget *widget, gpointer data)
 {
-    fini_dwell_data ((DwellData *) data);
+    DwellData *dd = (DwellData *) data;
+    gint i;
+
+    for (i = 0; i < N_CLICK_TYPES; i++)
+	g_object_unref (dd->click[i]);
+
+    g_object_unref (glade_xml_get_widget (dd->xml, "box_vert"));
+    g_object_unref (glade_xml_get_widget (dd->xml, "box_hori"));
+    g_object_unref (dd->client);
+    g_object_unref (dd->proxy);
+    g_object_unref (dd->xml);
+
+    g_slice_free (DwellData, dd);
 }
 
 static void
@@ -305,8 +231,8 @@
 
     about = glade_xml_get_widget (dd->xml, "about");
 
-    if (GTK_WIDGET_VISIBLE(about))
-	gtk_window_present (GTK_WINDOW(about));
+    if (GTK_WIDGET_VISIBLE (about))
+	gtk_window_present (GTK_WINDOW (about));
     else
 	gtk_widget_show (about);
 }
@@ -322,11 +248,11 @@
 static inline void
 init_button (DwellData *dd, GtkWidget *button)
 {
-    gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON(button), FALSE);
-    g_signal_connect (G_OBJECT(button), "button-press-event",
-		      G_CALLBACK(do_not_eat), NULL);
-    g_signal_connect (G_OBJECT(button), "toggled",
-		      G_CALLBACK(button_cb), dd);
+    gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
+    g_signal_connect (button, "button-press-event",
+		      G_CALLBACK (do_not_eat), NULL);
+    g_signal_connect (button, "toggled",
+		      G_CALLBACK (button_cb), dd);
 }
 
 static void
@@ -339,8 +265,8 @@
     g_object_ref (w);
 
     w = glade_xml_get_widget (dd->xml, "single_click");
-    g_signal_connect (G_OBJECT(w), "size-allocate",
-		      G_CALLBACK(box_size_allocate), dd);
+    g_signal_connect (w, "size-allocate",
+		      G_CALLBACK (box_size_allocate), dd);
     init_button (dd, w);
 
     w = glade_xml_get_widget (dd->xml, "double_click");
@@ -401,6 +327,65 @@
 }
 
 static void
+clicktype_changed (DBusGProxy *proxy,
+		   guint       clicktype,
+		   gpointer    data)
+{
+    DwellData *dd = (DwellData *) data;
+    GtkToggleButton *button;
+    GSList *group;
+
+    group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (dd->button));
+    button = GTK_TOGGLE_BUTTON (g_slist_nth_data (group, clicktype));
+
+    g_signal_handlers_block_by_func (button, button_cb, dd);
+    gtk_toggle_button_set_active (button, TRUE);
+    g_signal_handlers_unblock_by_func (button, button_cb, dd);
+}
+
+static void
+status_changed (DBusGProxy *proxy,
+		gboolean    status,
+		gpointer    data)
+{
+    DwellData *dd = (DwellData *) data;
+
+    dd->active = status;
+    update_sensitivity (dd);
+}
+
+static gboolean
+setup_dbus_proxy (DwellData *dd)
+{
+    DBusGConnection *bus;
+    GError *error = NULL;
+
+    bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+    if (error != NULL) {
+	g_print ("Unable to connect to session bus: %s\n", error->message);
+	g_error_free (error);
+	return FALSE;
+    }
+
+    dd->proxy = dbus_g_proxy_new_for_name (bus,
+					   "org.gnome.Mousetweaks",
+					   "/org/gnome/Mousetweaks",
+					   "org.gnome.Mousetweaks");
+
+    dbus_g_proxy_add_signal (dd->proxy, "ClicktypeChanged",
+			     G_TYPE_UINT, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (dd->proxy, "ClicktypeChanged",
+				 G_CALLBACK (clicktype_changed), dd, NULL);
+
+    dbus_g_proxy_add_signal (dd->proxy, "StatusChanged",
+			     G_TYPE_BOOLEAN, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal (dd->proxy, "StatusChanged",
+				 G_CALLBACK (status_changed), dd, NULL);
+
+    return TRUE;
+}
+
+static void
 gconf_value_changed (GConfClient *client,
 		     const gchar *key,
 		     GConfValue *value,
@@ -417,7 +402,7 @@
     GtkWidget *about;
     PanelAppletOrient orient;
 
-    dd = g_new0 (DwellData, 1);
+    dd = g_slice_new0 (DwellData);
     if (!dd)
 	return FALSE;
 
@@ -427,51 +412,33 @@
     bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
     textdomain (GETTEXT_PACKAGE);
 
+    g_set_application_name (_("Dwell Click Applet"));
+    gtk_window_set_default_icon_name (MT_ICON_NAME);
+
     dd->xml = glade_xml_new (DATADIR "/dwell-click-applet.glade", NULL, NULL);
     if (!dd->xml) {
-	fini_dwell_data (dd);
+	g_slice_free (DwellData, dd);
 	return FALSE;
     }
 
-    /* about dialog */
-    gtk_window_set_default_icon_name (MT_ICON_NAME);
-
-    about = glade_xml_get_widget (dd->xml, "about");
-    g_object_set (about, "version", VERSION, NULL);
-
-    g_signal_connect (G_OBJECT(about), "delete-event",
-		      G_CALLBACK(gtk_widget_hide_on_delete), NULL);
-    g_signal_connect (G_OBJECT(about), "response",
-		      G_CALLBACK(about_response), dd);
-
-    dd->conn = dbus_bus_get (DBUS_BUS_SESSION, NULL);
-    if (!dd->conn) {
-	fini_dwell_data (dd);
+    if (!setup_dbus_proxy (dd)) {
+	g_object_unref (dd->xml);
+	g_slice_free (DwellData, dd);
 	return FALSE;
     }
 
-    dbus_bus_add_match (dd->conn,
-			"type='signal',"
-			"sender='"   MOUSETWEAKS_DBUS_SERVICE"',"
-			"interface='"MOUSETWEAKS_DBUS_INTERFACE"',"
-			"path='"     MOUSETWEAKS_DBUS_PATH_APPLET"'",
-			NULL);
-    dbus_connection_add_filter (dd->conn,
-				receive_dbus_signal,
-				dd,
-				NULL);
-    dbus_connection_setup_with_g_main (dd->conn, NULL);
-
-    if (dbus_bus_name_has_owner (dd->conn, MOUSETWEAKS_DBUS_SERVICE, NULL))
-	dd->active = 1;
+    about = glade_xml_get_widget (dd->xml, "about");
+    g_object_set (about, "version", VERSION, NULL);
+    g_signal_connect (about, "delete-event",
+		      G_CALLBACK (gtk_widget_hide_on_delete), NULL);
+    g_signal_connect (about, "response",
+		      G_CALLBACK (about_response), dd);
 
     dd->client = gconf_client_get_default ();
-    gconf_client_add_dir (dd->client,
-			  MT_GCONF_HOME,
-			  GCONF_CLIENT_PRELOAD_ONELEVEL,
-			  NULL);
-    g_signal_connect (G_OBJECT(dd->client), "value_changed",
-		      G_CALLBACK(gconf_value_changed), dd);
+    gconf_client_add_dir (dd->client, MT_GCONF_HOME,
+			  GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+    g_signal_connect (dd->client, "value_changed",
+		      G_CALLBACK (gconf_value_changed), dd);
 
     dd->click[DWELL_CLICK_TYPE_SINGLE] =
 	gdk_pixbuf_new_from_file (DATADIR "/single-click.png", NULL);
@@ -491,9 +458,9 @@
 				       NULL, menu_verb, dd);
 
     g_signal_connect (applet, "change-orient",
-		      G_CALLBACK(applet_orient_changed), dd);
+		      G_CALLBACK (applet_orient_changed), dd);
     g_signal_connect (applet, "unrealize",
-		      G_CALLBACK(applet_unrealized), dd);
+		      G_CALLBACK (applet_unrealized), dd);
 
     orient = panel_applet_get_orient (applet);
     if (orient == PANEL_APPLET_ORIENT_UP ||
@@ -509,8 +476,8 @@
     init_horizontal_box (dd);
     init_vertical_box (dd);
 
-    gtk_widget_reparent (dd->box, GTK_WIDGET(applet));
-    gtk_widget_show (GTK_WIDGET(applet));
+    gtk_widget_reparent (dd->box, GTK_WIDGET (applet));
+    gtk_widget_show (GTK_WIDGET (applet));
 
     update_sensitivity (dd);
 
@@ -529,6 +496,6 @@
 PANEL_APPLET_BONOBO_FACTORY ("OAFIID:DwellClickApplet_Factory",
 			     PANEL_TYPE_APPLET,
 			     "Dwell Click Factory",
-			     "0",
+			     VERSION,
 			     applet_factory,
 			     NULL);

Added: trunk/src/mousetweaks-service.xml
==============================================================================
--- (empty file)
+++ trunk/src/mousetweaks-service.xml	Thu Mar 27 11:10:48 2008
@@ -0,0 +1,22 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+  "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd";>
+
+<node name="/org/gnome/Mousetweaks">
+  <interface name="org.gnome.Mousetweaks">
+    <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="mt_service"/>
+    <signal name="StatusChanged">
+      <arg name="status" type="b"/>
+    </signal>
+    <signal name="ClicktypeChanged">
+      <arg name="clicktype" type="u"/>
+    </signal>
+    <method name="GetClicktype">
+      <arg name="clicktype" type="u" direction="out">
+        <annotation name="org.freedesktop.DBus.GLib.ReturnVal" value=""/>
+      </arg>
+    </method>
+    <method name="SetClicktype">
+      <arg name="clicktype" type="u" direction="in"/>
+    </method>
+  </interface>
+</node>

Modified: trunk/src/mt-common.h
==============================================================================
--- trunk/src/mt-common.h	(original)
+++ trunk/src/mt-common.h	Thu Mar 27 11:10:48 2008
@@ -24,7 +24,6 @@
 #include "config.h"
 #endif
 
-#include <gconf/gconf-client.h>
 #include <glib/gi18n.h>
 
 G_BEGIN_DECLS

Modified: trunk/src/mt-ctw.c
==============================================================================
--- trunk/src/mt-ctw.c	(original)
+++ trunk/src/mt-ctw.c	Thu Mar 27 11:10:48 2008
@@ -21,9 +21,11 @@
 #include <glade/glade.h>
 
 #include "mt-main.h"
-#include "mt-dbus.h"
+#include "mt-service.h"
 #include "mt-common.h"
 
+#define WID(n) (glade_xml_get_widget (xml, n))
+
 enum {
     BUTTON_STYLE_TEXT = 0,
     BUTTON_STYLE_ICON,
@@ -33,27 +35,24 @@
 static GladeXML *xml = NULL;
 
 void
-mt_ctw_set_click_type (gint ct)
+mt_ctw_set_clicktype (guint clicktype)
 {
-    GtkWidget *button;
     GSList *group;
     gpointer data;
 
-    button = glade_xml_get_widget (xml, "single");
-    group = gtk_radio_button_get_group (GTK_RADIO_BUTTON(button));
-    data = g_slist_nth_data (group, ct);
-
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(data), TRUE);
-    gtk_widget_grab_focus (GTK_WIDGET(data));
+    group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (WID ("single")));
+    data = g_slist_nth_data (group, clicktype);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data), TRUE);
+    gtk_widget_grab_focus (GTK_WIDGET (data));
 }
 
 void
 mt_ctw_update_visibility (MTClosure *mt)
 {
     if (mt->dwell_enabled && mt->dwell_show_ctw)
-	gtk_widget_show (glade_xml_get_widget (xml, "ctw"));
+	gtk_widget_show (WID ("ctw"));
     else
-	gtk_widget_hide (glade_xml_get_widget (xml, "ctw"));
+	gtk_widget_hide (WID ("ctw"));
 }
 
 void
@@ -62,7 +61,7 @@
     gboolean sensitive;
 
     sensitive = mt->dwell_enabled && mt->dwell_mode == DWELL_MODE_CTW;
-    gtk_widget_set_sensitive (glade_xml_get_widget (xml, "box"), sensitive);
+    gtk_widget_set_sensitive (WID ("box"), sensitive);
 }
 
 void
@@ -74,8 +73,8 @@
     gint i;
 
     for (i = 0; i < N_CLICK_TYPES; i++) {
-	label = glade_xml_get_widget (xml, l[i]);
-	icon = glade_xml_get_widget (xml, img[i]);
+	label = WID (l[i]);
+	icon = WID (img[i]);
 
 	switch (style) {
 	case BUTTON_STYLE_BOTH:
@@ -109,10 +108,10 @@
     if (gtk_toggle_button_get_active (button)) {
 	GSList *group;
 
-	group = gtk_radio_button_get_group (GTK_RADIO_BUTTON(button));
-	mt->dwell_cct = g_slist_index (group, (gconstpointer) button);
-
-	mt_dbus_send_signal (mt->conn, CLICK_TYPE_SIGNAL, mt->dwell_cct);
+	group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
+	mt_service_set_clicktype (mt->service, 
+				  g_slist_index (group, button),
+				  NULL);
     }
 }
 
@@ -120,7 +119,7 @@
 ctw_context_menu (GtkWidget *widget, GdkEventButton *bev, gpointer data)
 {
     if (bev->button == 3) {
-	gtk_menu_popup (GTK_MENU(glade_xml_get_widget (xml, "popup")),
+	gtk_menu_popup (GTK_MENU (WID ("popup")),
 			0, 0, 0, 0, bev->button, bev->time);
 	return TRUE;
     }
@@ -138,8 +137,8 @@
     if (!gtk_check_menu_item_get_active (item))
 	return;
 
-    group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM(item));
-    index = g_slist_index (group, (gconstpointer) item);
+    group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (item));
+    index = g_slist_index (group, item);
     gconf_client_set_int (mt->client, OPT_STYLE, index, NULL);
 }
 
@@ -156,7 +155,7 @@
 gboolean
 mt_ctw_init (MTClosure *mt, gint x, gint y)
 {
-    GtkWidget *ctw, *button, *item;
+    GtkWidget *ctw, *w;
     const gchar *b[] = { "single", "double", "drag", "right" };
     GSList *group;
     gpointer data;
@@ -166,42 +165,36 @@
     if (!xml)
 	return FALSE;
 
-    ctw = glade_xml_get_widget (xml, "ctw");
-    gtk_window_stick (GTK_WINDOW(ctw));
-    gtk_window_set_keep_above (GTK_WINDOW(ctw), TRUE);
-    g_signal_connect (G_OBJECT(ctw), "delete-event", 
-		      G_CALLBACK(ctw_delete_cb), mt);
+    ctw = WID ("ctw");
+    gtk_window_stick (GTK_WINDOW (ctw));
+    gtk_window_set_keep_above (GTK_WINDOW (ctw), TRUE);
+    g_signal_connect (ctw, "delete-event", G_CALLBACK (ctw_delete_cb), mt);
 
     for (i = 0; i < N_CLICK_TYPES; i++) {
-	button = glade_xml_get_widget (xml, b[i]);
-	gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON(button), FALSE);
-
-	g_signal_connect (G_OBJECT(button), "toggled", 
-			  G_CALLBACK(ctw_button_cb), (gpointer) mt);
-	g_signal_connect (G_OBJECT(button), "button-press-event", 
-			  G_CALLBACK(ctw_context_menu), NULL);
+	w = WID (b[i]);
+	gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (w), FALSE);
+	g_signal_connect (w, "toggled", G_CALLBACK (ctw_button_cb), mt);
+	g_signal_connect (w, "button-press-event",
+			  G_CALLBACK (ctw_context_menu), NULL);
     }
 
-    item = glade_xml_get_widget (xml, "text");
-    g_signal_connect (G_OBJECT(item), "toggled", 
-		      G_CALLBACK(ctw_menu_toggled), (gpointer) mt);
-    item = glade_xml_get_widget (xml, "icon");
-    g_signal_connect (G_OBJECT(item), "toggled", 
-		      G_CALLBACK(ctw_menu_toggled), (gpointer) mt);
-    item = glade_xml_get_widget (xml, "both");
-    g_signal_connect (G_OBJECT(item), "toggled", 
-		      G_CALLBACK(ctw_menu_toggled), (gpointer) mt);
-
-    group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM(item));
+    g_signal_connect (WID ("text"), "toggled", 
+		      G_CALLBACK (ctw_menu_toggled), mt);
+    g_signal_connect (WID ("icon"), "toggled", 
+		      G_CALLBACK (ctw_menu_toggled), mt);
+    w = WID ("both");
+    g_signal_connect (w, "toggled", 
+		      G_CALLBACK (ctw_menu_toggled), mt);
+    group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (w));
     data = g_slist_nth_data (group, mt->style);
-    gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(data), TRUE);
+    gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (data), TRUE);
 
     mt_ctw_update_style (mt->style);
     mt_ctw_update_sensitivity (mt);
     mt_ctw_update_visibility (mt);
 
     if (x != -1 && y != -1)
-	gtk_window_move (GTK_WINDOW(ctw), x, y);
+	gtk_window_move (GTK_WINDOW (ctw), x, y);
 
     return TRUE;
 }

Modified: trunk/src/mt-ctw.h
==============================================================================
--- trunk/src/mt-ctw.h	(original)
+++ trunk/src/mt-ctw.h	Thu Mar 27 11:10:48 2008
@@ -20,13 +20,17 @@
 #ifndef __MT_CTW_H__
 #define __MT_CTW_H__
 
+#include "mt-main.h"
+
 G_BEGIN_DECLS
 
-gboolean mt_ctw_init		   (MTClosure *mt, gint x, gint y);
-void	 mt_ctw_set_click_type	   (gint ct);
+gboolean mt_ctw_init		   (MTClosure *mt,
+				    gint       x,
+				    gint       y);
+void	 mt_ctw_set_clicktype	   (guint      ct);
 void	 mt_ctw_update_sensitivity (MTClosure *mt);
 void	 mt_ctw_update_visibility  (MTClosure *mt);
-void	 mt_ctw_update_style	   (gint style);
+void	 mt_ctw_update_style	   (gint       style);
 
 
 G_END_DECLS

Modified: trunk/src/mt-main.c
==============================================================================
--- trunk/src/mt-main.c	(original)
+++ trunk/src/mt-main.c	Thu Mar 27 11:10:48 2008
@@ -28,14 +28,11 @@
 #include <cspi/spi.h>
 
 #include "mt-common.h"
-#include "mt-dbus.h"
-#include "mt-main.h"
+#include "mt-service.h"
 #include "mt-pidfile.h"
 #include "mt-ctw.h"
 #include "mt-timer.h"
-
-static AccessibleDeviceListener *button_listener = NULL;
-static AccessibleEventListener  *motion_listener = NULL;
+#include "mt-main.h"
 
 static int fixes_event_base = 0;
 
@@ -43,29 +40,29 @@
 mt_cursor_set (GdkCursorType type)
 {
     GdkCursor *cursor;
-    GdkWindow *root;
 
     cursor = gdk_cursor_new (type);
-    root = gdk_get_default_root_window ();
-    gdk_window_set_cursor (root, cursor);
+    gdk_window_set_cursor (gdk_get_default_root_window (), cursor);
     gdk_cursor_unref (cursor);
 }
 
 static void
 dwell_restore_single_click (MTClosure *mt)
 {
-    if (mt->dwell_mode == DWELL_MODE_CTW) {
-	mt_ctw_set_click_type (DWELL_CLICK_TYPE_SINGLE);
-	mt_dbus_send_signal (mt->conn, RESTORE_SIGNAL, 0);
-    }
-    else
-	mt->dwell_cct = DWELL_CLICK_TYPE_SINGLE;
+    if (mt->dwell_mode == DWELL_MODE_CTW)
+	mt_ctw_set_clicktype (DWELL_CLICK_TYPE_SINGLE);
+
+    mt_service_set_clicktype (mt->service, DWELL_CLICK_TYPE_SINGLE, NULL);
 }
 
 static void
 dwell_do_pointer_click (MTClosure *mt, gint x, gint y)
 {
-    switch (mt->dwell_cct) {
+    guint clicktype;
+
+    clicktype = mt_service_get_clicktype (mt->service);
+
+    switch (clicktype) {
     case DWELL_CLICK_TYPE_SINGLE:
 	SPI_generateMouseEvent (x, y, "b1c");
 	break;
@@ -134,7 +131,7 @@
     /* get click type for direction */
     for (i = 0; i < N_CLICK_TYPES; i++)
 	if (mt->dwell_dirs[i] == gd) {
-	    mt->dwell_cct = i;
+	    mt_service_set_clicktype (mt->service, i, NULL);
 	    return TRUE;
 	}
 
@@ -181,7 +178,7 @@
     MTClosure *mt = (MTClosure *) data;
     gint x, y;
 
-    gdk_display_get_pointer (gdk_display_get_default(), NULL, &x, &y, NULL);
+    gdk_display_get_pointer (gdk_display_get_default (), NULL, &x, &y, NULL);
 
     /* stop active drag */
     if (mt->dwell_drag_started) {
@@ -208,7 +205,7 @@
 	else
 	    dwell_start_gesture (mt);
     default:
-	    break;
+	break;
     }
 }
 
@@ -240,32 +237,24 @@
 	    mt_timer_stop (mt->delay_timer);
 }
 
-static SPIBoolean
-spi_button_event (const AccessibleDeviceEvent *event, void *data)
+static void
+spi_button_event (const AccessibleEvent *event, void *data)
 {
     MTClosure *mt = (MTClosure *) data;
 
-    if (event->keycode != 1)
-	return FALSE;
-
-    switch (event->type) {
-    case SPI_BUTTON_PRESSED:
+    if (g_str_equal (event->type, "mouse:button:b1p")) {
 	if (mt->delay_enabled) {
 	    gdk_display_get_pointer (gdk_display_get_default (), NULL,
 				     &mt->pointer_x, &mt->pointer_y, NULL);
 	    mt_timer_start (mt->delay_timer);
 	}
+
 	if (mt->dwell_gesture_started)
 	    dwell_stop_gesture (mt);
-	break;
-    case SPI_BUTTON_RELEASED:
+    }
+    else if (g_str_equal (event->type, "mouse:button:b1r"))
 	if (mt_timer_is_running (mt->delay_timer))
 	    mt_timer_stop (mt->delay_timer);
-    default:
-	break;
-    }
-
-    return FALSE;
 }
 
 static GdkFilterReturn
@@ -288,23 +277,17 @@
     return GDK_FILTER_CONTINUE;
 }
 
-void
-spi_shutdown (void)
-{
-    SPI_event_quit ();
-}
-
 static void
 signal_handler (int sig)
 {
-    spi_shutdown ();
+    SPI_event_quit ();
 }
 
 static void
-mt_gconf_notify (GConfClient *client,
-		 const gchar *key,
-		 GConfValue  *value,
-		 gpointer     data)
+gconf_value_changed (GConfClient *client,
+		     const gchar *key,
+		     GConfValue  *value,
+		     gpointer     data)
 {
     MTClosure *mt = (MTClosure *) data;
 
@@ -346,8 +329,10 @@
 }
 
 static void
-mt_gconf_read_options (MTClosure *mt)
+get_gconf_options (MTClosure *mt)
 {
+    gdouble val;
+
     mt->threshold = gconf_client_get_int (mt->client, OPT_THRESHOLD, NULL);
     mt->delay_enabled = gconf_client_get_bool (mt->client, OPT_DELAY, NULL);
     mt->dwell_enabled = gconf_client_get_bool (mt->client, OPT_DWELL, NULL);
@@ -355,15 +340,19 @@
     mt->dwell_mode = gconf_client_get_int (mt->client, OPT_MODE, NULL);
     mt->style = gconf_client_get_int (mt->client, OPT_STYLE, NULL);
 
-    mt_timer_set_target_time (mt->delay_timer,
-			      gconf_client_get_float (mt->client, OPT_DELAY_T, NULL));
-    mt_timer_set_target_time (mt->dwell_timer,
-			      gconf_client_get_float (mt->client, OPT_DWELL_T, NULL));
-
-    mt->dwell_dirs[DWELL_CLICK_TYPE_SINGLE] = gconf_client_get_int (mt->client, OPT_G_SINGLE, NULL);
-    mt->dwell_dirs[DWELL_CLICK_TYPE_DOUBLE] = gconf_client_get_int (mt->client, OPT_G_DOUBLE, NULL);
-    mt->dwell_dirs[DWELL_CLICK_TYPE_DRAG] = gconf_client_get_int (mt->client, OPT_G_DRAG, NULL);
-    mt->dwell_dirs[DWELL_CLICK_TYPE_RIGHT] = gconf_client_get_int (mt->client, OPT_G_RIGHT, NULL);
+    val = gconf_client_get_float (mt->client, OPT_DELAY_T, NULL);
+    mt_timer_set_target_time (mt->delay_timer, val);
+    val = gconf_client_get_float (mt->client, OPT_DWELL_T, NULL);
+    mt_timer_set_target_time (mt->dwell_timer, val);
+
+    mt->dwell_dirs[DWELL_CLICK_TYPE_SINGLE] =
+	gconf_client_get_int (mt->client, OPT_G_SINGLE, NULL);
+    mt->dwell_dirs[DWELL_CLICK_TYPE_DOUBLE] =
+	gconf_client_get_int (mt->client, OPT_G_DOUBLE, NULL);
+    mt->dwell_dirs[DWELL_CLICK_TYPE_DRAG] =
+	gconf_client_get_int (mt->client, OPT_G_DRAG, NULL);
+    mt->dwell_dirs[DWELL_CLICK_TYPE_RIGHT] =
+	gconf_client_get_int (mt->client, OPT_G_RIGHT, NULL);
 }
 
 static MTClosure *
@@ -371,12 +360,15 @@
 {
     MTClosure *mt;
 
-    mt = g_try_new0 (MTClosure, 1);
+    mt = g_slice_new0 (MTClosure);
     if (!mt)
 	return NULL;
 
     mt->client = gconf_client_get_default ();
-    mt->dwell_cct = DWELL_CLICK_TYPE_SINGLE;
+    gconf_client_add_dir (mt->client, MT_GCONF_HOME,
+			  GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+    g_signal_connect (mt->client, "value_changed",
+		      G_CALLBACK (gconf_value_changed), mt);
 
     mt->delay_timer = mt_timer_new ();
     g_signal_connect (mt->delay_timer, "finished",
@@ -386,6 +378,9 @@
     g_signal_connect (mt->dwell_timer, "finished",
 		      G_CALLBACK (dwell_time_elapsed), mt);
 
+    mt->service = mt_service_get_default ();
+    mt_service_set_clicktype (mt->service, DWELL_CLICK_TYPE_SINGLE, NULL);
+
     return mt;
 }
 
@@ -394,14 +389,17 @@
 {
     g_object_unref (mt->delay_timer);
     g_object_unref (mt->dwell_timer);
+    g_object_unref (mt->service);
     g_object_unref (mt->client);
-    g_free (mt);
+
+    g_slice_free (MTClosure, mt);
 }
 
 int
 main (int argc, char **argv)
 {
     MTClosure *mt;
+    AccessibleEventListener *bl, *ml;
     int fixes_error_base;
     pid_t pid;
     gboolean shutdown = FALSE, ctw = FALSE;
@@ -434,8 +432,6 @@
     g_option_context_parse (context, &argc, &argv, NULL);
     g_option_context_free (context);
 
-    gtk_init (&argc, &argv);
-
     if (shutdown) {
 	int ret;
 
@@ -448,16 +444,19 @@
     }
 
     if ((pid = mt_pidfile_is_running()) >= 0) {
-	g_print ("Already running on PID file %u.\n", pid);
+	g_print ("Daemon is already running. (PID %u)\n", pid);
 	return 1;
     }
 
     g_print ("Starting daemon.\n");
 
-    if ((pid = fork ()) < 0)
+    if ((pid = fork ()) < 0) {
+	g_print ("Fork failed.\n");
 	return 1;
-    else if (pid)
+    }
+    else if (pid) {
 	return 0;
+    }
     else {
 	if (mt_pidfile_create () < 0)
 	    goto FINISH;
@@ -467,11 +466,13 @@
 	signal (SIGQUIT, signal_handler);
 	signal (SIGHUP, signal_handler);
 
+	gtk_init (&argc, &argv);
+
 	mt = mt_closure_init ();
 	if (!mt)
 	    goto FINISH;
 
-	if (SPI_init ()) {
+	if (SPI_init () != 0) {
 	    mt_show_dialog (_("Assistive Technologies not enabled"),
 			    _("Mousetweaks requires Assistive Technologies."),
 			    GTK_MESSAGE_ERROR);
@@ -492,25 +493,15 @@
 				     GDK_ROOT_WINDOW(),
 				     XFixesDisplayCursorNotifyMask);
 	    gdk_window_add_filter (gdk_get_default_root_window (),
-				   cursor_changed,
-				   (gpointer) mt);
+				   cursor_changed, mt);
 	}
 
 	/* add at-spi listeners */
-	motion_listener = SPI_createAccessibleEventListener
-	    (spi_motion_event, (void *) mt);
-	SPI_registerGlobalEventListener (motion_listener, "mouse:abs");
-
-	button_listener = SPI_createAccessibleDeviceListener
-	    (spi_button_event, (void *) mt);
-	SPI_registerDeviceEventListener (button_listener,
-					 SPI_BUTTON_PRESSED |
-					 SPI_BUTTON_RELEASED,
-					 NULL);
-
-	mt->conn = mt_dbus_init (mt);
-	if (!mt->conn)
-	    goto CLEANUP;
+	ml = SPI_createAccessibleEventListener (spi_motion_event, (void *) mt);
+	SPI_registerGlobalEventListener (ml, "mouse:abs");
+	bl = SPI_createAccessibleEventListener (spi_button_event, (void *) mt);
+	SPI_registerGlobalEventListener (bl, "mouse:button:1p");
+	SPI_registerGlobalEventListener (bl, "mouse:button:1r");
 
 	/* command-line options */
 	if (enable) {
@@ -523,8 +514,10 @@
 		gconf_client_set_bool (mt->client, OPT_DELAY, TRUE, NULL);
 	    }
 	}
+
 	if (ctw)
 	    gconf_client_set_bool (mt->client, OPT_CTW, TRUE, NULL);
+
 	if (mode) {
 	    if (g_str_equal (mode, "gesture"))
 		gconf_client_set_int (mt->client, OPT_MODE,
@@ -534,32 +527,19 @@
 				      DWELL_MODE_CTW, NULL);
 	}
 
-	/* gconf stuff */
-	mt_gconf_read_options (mt);
-	gconf_client_add_dir (mt->client,
-			      MT_GCONF_HOME,
-			      GCONF_CLIENT_PRELOAD_ONELEVEL,
-			      NULL);
-	g_signal_connect (G_OBJECT(mt->client), "value_changed",
-			  G_CALLBACK(mt_gconf_notify), (gpointer) mt);
+	get_gconf_options (mt);
 
-	if (!mt_ctw_init (mt, pos_x, pos_y)) {
-	    mt_dbus_fini (mt->conn);
+	if (!mt_ctw_init (mt, pos_x, pos_y))
 	    goto CLEANUP;
-	}
-
-	/* tell the dwell click applet we are here */
-	mt_dbus_send_signal (mt->conn, ACTIVE_SIGNAL, 1);
 
 	SPI_event_main ();
-
-	mt_dbus_send_signal (mt->conn, ACTIVE_SIGNAL, 0);
-	mt_dbus_fini (mt->conn);
     }
 
 CLEANUP:
-    AccessibleEventListener_unref (motion_listener);
-    AccessibleDeviceListener_unref (button_listener);
+    SPI_deregisterGlobalEventListenerAll (bl);
+    AccessibleDeviceListener_unref (bl);
+    SPI_deregisterGlobalEventListenerAll (ml);
+    AccessibleEventListener_unref (ml);
     SPI_exit ();
     mt_closure_free (mt);
 

Modified: trunk/src/mt-main.h
==============================================================================
--- trunk/src/mt-main.h	(original)
+++ trunk/src/mt-main.h	Thu Mar 27 11:10:48 2008
@@ -20,21 +20,20 @@
 #ifndef __MT_MAIN_H__
 #define __MT_MAIN_H__
 
-#include <dbus/dbus-glib-lowlevel.h>
 #include <gconf/gconf-client.h>
 
 #include "mt-timer.h"
+#include "mt-service.h"
 
 G_BEGIN_DECLS
 
 typedef struct _MTClosure MTClosure;
 struct _MTClosure {
-    DBusConnection *conn;
-    GConfClient    *client;
+    GConfClient *client;
+    MtService   *service;
+    MtTimer     *delay_timer;
+    MtTimer     *dwell_timer;
 
-    MtTimer *delay_timer;
-    MtTimer *dwell_timer;
-    gint     dwell_cct;
     gboolean dwell_drag_started;
     gboolean dwell_gesture_started;
     gboolean override_cursor;
@@ -53,8 +52,6 @@
     gint     dwell_dirs[4];
 };
 
-void spi_shutdown (void);
-
 G_END_DECLS
 
 #endif /* __MT_MAIN_H__ */

Added: trunk/src/mt-service.c
==============================================================================
--- (empty file)
+++ trunk/src/mt-service.c	Thu Mar 27 11:10:48 2008
@@ -0,0 +1,171 @@
+/*
+ * Copyright  2007-2008 Gerd Kohlberger <lowfi chello at>
+ *
+ * This file is part of Mousetweaks.
+ *
+ * Mousetweaks 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Mousetweaks 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/>.
+ */
+
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-bindings.h>
+
+#include "mt-service.h"
+#include "mt-service-glue.h"
+
+#define MOUSETWEAKS_DBUS_SERVICE "org.gnome.Mousetweaks"
+#define MOUSETWEAKS_DBUS_PATH    "/org/gnome/Mousetweaks"
+
+#define MT_SERVICE_GET_PRIVATE(o) \
+    (G_TYPE_INSTANCE_GET_PRIVATE ((o), MT_TYPE_SERVICE, MtServicePrivate))
+
+typedef struct _MtServicePrivate MtServicePrivate;
+struct _MtServicePrivate {
+    guint clicktype;
+};
+
+enum {
+    STATUS_CHANGED,
+    CLICKTYPE_CHANGED,
+    LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (MtService, mt_service, G_TYPE_OBJECT)
+
+static void mt_service_finalize (GObject *object);
+
+static void
+mt_service_class_init (MtServiceClass *klass)
+{
+    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+    gobject_class->finalize = mt_service_finalize;
+
+    signals[STATUS_CHANGED] =
+	g_signal_new (g_intern_static_string ("status_changed"),
+		      G_OBJECT_CLASS_TYPE (klass),
+		      G_SIGNAL_RUN_LAST,
+		      0, NULL, NULL,
+		      g_cclosure_marshal_VOID__BOOLEAN,
+		      G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+    signals[CLICKTYPE_CHANGED] =
+	g_signal_new (g_intern_static_string ("clicktype_changed"),
+		      G_OBJECT_CLASS_TYPE (klass),
+		      G_SIGNAL_RUN_LAST,
+		      0, NULL, NULL,
+		      g_cclosure_marshal_VOID__UINT,
+		      G_TYPE_NONE, 1, G_TYPE_UINT);
+
+    g_type_class_add_private (klass, sizeof (MtServicePrivate));
+
+    dbus_g_object_type_install_info (MT_TYPE_SERVICE,
+				     &dbus_glib_mt_service_object_info);
+}
+
+static void
+mt_service_init (MtService *service)
+{
+    DBusGConnection *bus;
+    DBusGProxy *proxy;
+    GError *error = NULL;
+    guint result;
+
+    MT_SERVICE_GET_PRIVATE (service)->clicktype = 0;
+
+    bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+    if (bus == NULL) {
+	g_warning ("Unable to connect to session bus: %s", error->message);
+	g_error_free (error);
+	return;
+    }
+
+    proxy = dbus_g_proxy_new_for_name (bus,
+				       DBUS_SERVICE_DBUS,
+				       DBUS_PATH_DBUS,
+				       DBUS_INTERFACE_DBUS);
+
+    if (!dbus_g_proxy_call (proxy, "RequestName", &error,
+			    G_TYPE_STRING, MOUSETWEAKS_DBUS_SERVICE,
+			    G_TYPE_UINT, DBUS_NAME_FLAG_DO_NOT_QUEUE,
+			    G_TYPE_INVALID,
+			    G_TYPE_UINT, &result,
+			    G_TYPE_INVALID)) {
+	g_warning ("Unable to acquire name: %s", error->message);
+	g_error_free (error);
+	g_object_unref (proxy);
+	return;
+    }
+
+    if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
+	g_warning ("DBus: Not primary name owner.");
+
+    g_object_unref (proxy);
+
+    dbus_g_connection_register_g_object (bus,
+					 MOUSETWEAKS_DBUS_PATH,
+					 G_OBJECT (service));
+}
+
+static void
+mt_service_finalize (GObject *object)
+{
+    g_signal_emit (object, signals[STATUS_CHANGED], 0, FALSE);
+
+    G_OBJECT_CLASS (mt_service_parent_class)->finalize (object);
+}
+
+static MtService *
+mt_service_new (void)
+{
+    MtService *service;
+
+    service = g_object_new (MT_TYPE_SERVICE, NULL);
+    g_signal_emit (service, signals[STATUS_CHANGED], 0, TRUE);
+
+    return service;
+}
+
+MtService *
+mt_service_get_default (void)
+{
+    static MtService *service = NULL;
+
+    if (service == NULL)
+	service = mt_service_new ();
+
+    return service;
+}
+
+gboolean
+mt_service_set_clicktype (MtService *service,
+			  guint      clicktype,
+			  GError   **error)
+{
+    MtServicePrivate *priv;
+
+    priv = MT_SERVICE_GET_PRIVATE (service);
+    priv->clicktype = clicktype;
+    g_signal_emit (service, signals[CLICKTYPE_CHANGED], 0, priv->clicktype);
+
+    return TRUE;
+}
+
+guint
+mt_service_get_clicktype (MtService *service)
+{
+    g_return_val_if_fail (MT_IS_SERVICE (service), 0);
+
+    return MT_SERVICE_GET_PRIVATE (service)->clicktype;
+}

Added: trunk/src/mt-service.h
==============================================================================
--- (empty file)
+++ trunk/src/mt-service.h	Thu Mar 27 11:10:48 2008
@@ -0,0 +1,55 @@
+/*
+ * Copyright  2007-2008 Gerd Kohlberger <lowfi chello at>
+ *
+ * This file is part of Mousetweaks.
+ *
+ * Mousetweaks 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Mousetweaks 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/>.
+ */
+
+#ifndef __MT_SERVICE_H__
+#define __MT_SERVICE_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define MT_TYPE_SERVICE            (mt_service_get_type ())
+#define MT_SERVICE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), MT_TYPE_SERVICE, MtService))
+#define MT_SERVICE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), MT_TYPE_SERVICE, MtServiceClass))
+#define MT_IS_SERVICE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MT_TYPE_SERVICE))
+#define MT_IS_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MT_TYPE_SERVICE))
+#define MT_SERVICE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), MT_TYPE_SERVICE, MtServiceClass))
+
+typedef struct _MtService MtService;
+typedef struct _MtServiceClass MtServiceClass;
+
+struct _MtService {
+    GObject parent;
+};
+
+struct _MtServiceClass {
+    GObjectClass parent;
+};
+
+GType mt_service_get_type (void) G_GNUC_CONST;
+
+MtService * mt_service_get_default   (void);
+gboolean    mt_service_set_clicktype (MtService *service,
+				      guint      clicktype,
+				      GError   **error);
+guint       mt_service_get_clicktype (MtService *service);
+
+G_END_DECLS
+
+#endif /* __MT_SERVICE_H__ */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]