Index: plugins/mouse_plugin/mouse_plugin.c =================================================================== --- plugins/mouse_plugin/mouse_plugin.c (revision 23059) +++ plugins/mouse_plugin/mouse_plugin.c (working copy) @@ -37,6 +37,7 @@ #include #include #include +#include #include "mouse-plugin-internal.h" @@ -57,6 +58,28 @@ #define DEFAULT_ICON_SIZE 48 #define DEFAULT_PTR_MAP_SIZE 128 +static const char * mouse_tray_image_xpm[] = { +"16 16 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" ", +" ...... ", +" .+.++.+. ", +" .+.++.+. ", +" .++.++.++. ", +" .++.++.++. ", +" .......... ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++. ", +" ...... ", +" "}; + static void create_channel(McsPlugin * mcs_plugin); static void run_dialog(McsPlugin * mcs_plugin); @@ -75,6 +98,8 @@ static int mouse_keys_ttm = 200; static int mouse_keys_max_speed = 200; static gboolean xkbpresent = FALSE; +GtkWidget *mouse_tray_icon = NULL; +GtkWidget *mouse_tray_image = NULL; #endif static void get_mouse_values(int *accel_return, int *denom_return, int *thresh_return) @@ -221,7 +246,6 @@ void create_accessx_page(Itf *dialog) { - GtkWidget *frame; GtkWidget *label; GtkWidget *vbox; GtkWidget *hbox; @@ -231,7 +255,7 @@ gtk_widget_show (vbox); gtk_box_pack_start (GTK_BOX (main_vbox), vbox, FALSE, FALSE, 0); - dialog->checkbutton_mouse = gtk_check_button_new_with_mnemonic(_("Enable Mouse keys")); + dialog->checkbutton_mouse = gtk_check_button_new_with_mnemonic(_("Enable mouse emulation")); gtk_widget_show(dialog->checkbutton_mouse); gtk_box_pack_start(GTK_BOX(vbox), dialog->checkbutton_mouse, FALSE, FALSE, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->checkbutton_mouse), mouse_key); @@ -530,6 +554,28 @@ #ifdef USE_XKB static void +cb_mouse_tray_icon_embedded(GtkWidget *tray_icon, gpointer user_data) +{ + gtk_container_add(GTK_CONTAINER(tray_icon), mouse_tray_image); + gtk_widget_show_all(tray_icon); +} + +static void +mouse_tray_icon_reconnect() +{ + mouse_tray_icon = netk_tray_icon_new(DefaultScreenOfDisplay(GDK_DISPLAY())); + g_signal_connect(G_OBJECT(mouse_tray_icon), "embedded", G_CALLBACK(cb_mouse_tray_icon_embedded), NULL); +} + +static void +cb_mouse_tray_icon_destroy(GtkWidget *tray_icon, GtkWidget *image) +{ + gtk_widget_ref(image); + gtk_container_remove(GTK_CONTAINER(tray_icon), image); + mouse_tray_icon_reconnect(); +} + +static void toggle_accessx() { if (xkbpresent) @@ -547,9 +593,24 @@ xkb->ctrls->mk_interval = 1000 / mouse_keys_interval; xkb->ctrls->mk_time_to_max = mouse_keys_ttm; xkb->ctrls->mk_max_speed = mouse_keys_max_speed; + + if(!mouse_tray_icon) + { + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data(mouse_tray_image_xpm); + mouse_tray_image = gtk_image_new_from_pixbuf(pixbuf); + mouse_tray_icon = netk_tray_icon_new(DefaultScreenOfDisplay(GDK_DISPLAY())); + gtk_container_add(GTK_CONTAINER(mouse_tray_icon), mouse_tray_image); + g_signal_connect(G_OBJECT(mouse_tray_icon), "destroy", G_CALLBACK(cb_mouse_tray_icon_destroy), mouse_tray_image); + } + if(mouse_tray_icon) + gtk_widget_show_all(mouse_tray_icon); } else + { xkb->ctrls->enabled_ctrls &= ~XkbMouseKeysMask; + if(mouse_tray_icon) + gtk_widget_hide(mouse_tray_icon); + } XkbSetControls (GDK_DISPLAY (), XkbControlsEnabledMask | XkbMouseKeysMask | XkbMouseKeysAccelMask, xkb); XFree (xkb); @@ -579,6 +640,8 @@ mcs_manager_set_int (mcs_plugin->manager, "Mouse/MouseKeysInterval", CHANNEL2, mouse_keys_interval); mcs_manager_set_int (mcs_plugin->manager, "Mouse/MouseKeysTimeToMax", CHANNEL2, mouse_keys_ttm); mcs_manager_set_int (mcs_plugin->manager, "Mouse/MouseKeysMaxSpeed", CHANNEL2, mouse_keys_max_speed); + mcs_manager_notify(mcs_plugin->manager, CHANNEL2); + mouse_plugin_write_options (mcs_plugin); } static void @@ -594,8 +657,8 @@ gtk_widget_set_sensitive(itf->scale_mouse_keys_max_speed, mouse_key); toggle_accessx(); - mcs_manager_set_int (mcs_plugin->manager, "Mouse/MouseKeys", CHANNEL2, mouse_key ? 1 : 0); + mcs_manager_notify(mcs_plugin->manager, CHANNEL2); mouse_plugin_write_options (mcs_plugin); } #endif @@ -784,10 +847,6 @@ #endif xkbpresent = FALSE; } -#else -#ifdef DEBUG - g_warning ("This build doesn't include support for Xkb extension"); -#endif setting = mcs_manager_setting_lookup (mcs_plugin->manager, "Mouse/MouseKeys", CHANNEL2); if(setting) { @@ -842,7 +901,8 @@ mouse_keys_ttm = 200; mcs_manager_set_int (mcs_plugin->manager, "Mouse/MouseKeysTimeToMax", CHANNEL2, mouse_keys_ttm); } - toggle_accessx; + + toggle_accessx(); #endif set_mouse_values(right_handed, acceleration, threshold);