mousetweaks r120 - in trunk: . src
- From: gerdk svn gnome org
- To: svn-commits-list gnome org
- Subject: mousetweaks r120 - in trunk: . src
- Date: Thu, 27 Mar 2008 11:10:48 +0000 (GMT)
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]