Index: mouse_plugin.c =================================================================== --- mouse_plugin.c (revision 23103) +++ mouse_plugin.c (working copy) @@ -80,6 +80,72 @@ " ...... ", " "}; +static const char * mouse_tray_image_xpm_1[] = { +"16 16 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" ", +" ...... ", +" ...++.+. ", +" ...++.+. ", +" ....++.++. ", +" ....++.++. ", +" .......... ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++. ", +" ...... ", +" "}; + +static const char * mouse_tray_image_xpm_2[] = { +"16 16 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" ", +" ...... ", +" .+....+. ", +" .+....+. ", +" .++....++. ", +" .++....++. ", +" .......... ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++. ", +" ...... ", +" "}; + +static const char * mouse_tray_image_xpm_3[] = { +"16 16 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" ", +" ...... ", +" .+.++... ", +" .+.++... ", +" .++.++.... ", +" .++.++.... ", +" .......... ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++++. ", +" .++++++. ", +" ...... ", +" "}; + static void create_channel(McsPlugin * mcs_plugin); static void run_dialog(McsPlugin * mcs_plugin); @@ -93,13 +159,62 @@ #ifdef USE_XKB static gboolean mouse_key = FALSE; -static int mouse_keys_delay = 200; -static int mouse_keys_interval = 200; -static int mouse_keys_ttm = 200; -static int mouse_keys_max_speed = 200; +static int mouse_keys_delay = 500; +static int mouse_keys_interval = 250; +static int mouse_keys_ttm = 5000; +static int mouse_keys_max_speed = 1000; static gboolean xkbpresent = FALSE; GtkWidget *mouse_tray_icon = NULL; GtkWidget *mouse_tray_image = NULL; + +static int mouse_keys_default_button = -1; +#define MOUSE_KEYS_SYSTRAY_UPDATE_INTERVAL 100 +#define MOUSE_KEYS_MAX_SPEED_MIN 1 +#define MOUSE_KEYS_MAX_SPEED_MAX 2000 +#define MOUSE_KEYS_TTM_MIN 100 +#define MOUSE_KEYS_TTM_MAX 10000 +#define MOUSE_KEYS_DELAY_MIN 10 +#define MOUSE_KEYS_DELAY_MAX 1000 +#define MOUSE_KEYS_INTERVAL_MIN 10 +#define MOUSE_KEYS_INTERVAL_MAX 500 + + +static gint +mousekeys_systray_timer_cb(Itf *itf) +{ + GdkPixbuf *pixbuf; + XkbDescPtr xkb = XkbAllocKeyboard (); + if(!mouse_key) + return FALSE; + if (xkb) + { + gdk_error_trap_push (); + XkbGetControls (GDK_DISPLAY (), XkbAllControlsMask, xkb); + if(mouse_keys_default_button != xkb->ctrls->mk_dflt_btn) + { + switch(xkb->ctrls->mk_dflt_btn) + { + case(1): + pixbuf = gdk_pixbuf_new_from_xpm_data(mouse_tray_image_xpm_1); + break; + case(2): + pixbuf = gdk_pixbuf_new_from_xpm_data(mouse_tray_image_xpm_2); + break; + case(3): + pixbuf = gdk_pixbuf_new_from_xpm_data(mouse_tray_image_xpm_3); + break; + default: + pixbuf = gdk_pixbuf_new_from_xpm_data(mouse_tray_image_xpm); + } + gtk_image_set_from_pixbuf(GTK_IMAGE(mouse_tray_image), pixbuf); + mouse_keys_default_button = xkb->ctrls->mk_dflt_btn; + } + XFree (xkb); + gdk_flush (); + gdk_error_trap_pop (); + } + return TRUE; +} #endif static void get_mouse_values(int *accel_return, int *denom_return, int *thresh_return) @@ -274,7 +389,7 @@ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - dialog->scale_mouse_keys_delay = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (mouse_keys_delay, 10, 500, 10, 10, 0))); + dialog->scale_mouse_keys_delay = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (mouse_keys_delay, MOUSE_KEYS_DELAY_MIN, MOUSE_KEYS_DELAY_MAX, 10, 10, 0))); gtk_widget_show(dialog->scale_mouse_keys_delay); gtk_scale_set_draw_value (GTK_SCALE (dialog->scale_mouse_keys_delay), FALSE); gtk_range_set_update_policy (GTK_RANGE (dialog->scale_mouse_keys_delay), GTK_UPDATE_DISCONTINUOUS); @@ -287,7 +402,7 @@ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - dialog->scale_mouse_keys_interval = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (mouse_keys_interval, 10, 500, 10, 10, 0))); + dialog->scale_mouse_keys_interval = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (mouse_keys_interval, MOUSE_KEYS_INTERVAL_MIN, MOUSE_KEYS_INTERVAL_MAX, 10, 10, 0))); gtk_widget_show(dialog->scale_mouse_keys_interval); gtk_scale_set_draw_value (GTK_SCALE (dialog->scale_mouse_keys_interval), FALSE); gtk_range_set_update_policy (GTK_RANGE (dialog->scale_mouse_keys_interval), GTK_UPDATE_DISCONTINUOUS); @@ -304,7 +419,7 @@ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - dialog->scale_mouse_keys_ttm= gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (mouse_keys_ttm, 10, 500, 10, 10, 0))); + dialog->scale_mouse_keys_ttm= gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (mouse_keys_ttm, MOUSE_KEYS_TTM_MIN, MOUSE_KEYS_TTM_MAX, 10, 10, 0))); gtk_widget_show(dialog->scale_mouse_keys_ttm); gtk_scale_set_draw_value (GTK_SCALE (dialog->scale_mouse_keys_ttm), FALSE); gtk_range_set_update_policy (GTK_RANGE (dialog->scale_mouse_keys_ttm), GTK_UPDATE_DISCONTINUOUS); @@ -317,7 +432,7 @@ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - dialog->scale_mouse_keys_max_speed = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (mouse_keys_max_speed, 10, 500, 10, 10, 0))); + dialog->scale_mouse_keys_max_speed = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (mouse_keys_max_speed, MOUSE_KEYS_MAX_SPEED_MIN, MOUSE_KEYS_MAX_SPEED_MAX, 10, 10, 0))); gtk_widget_show(dialog->scale_mouse_keys_max_speed); gtk_scale_set_draw_value (GTK_SCALE (dialog->scale_mouse_keys_max_speed), FALSE); gtk_range_set_update_policy (GTK_RANGE (dialog->scale_mouse_keys_max_speed), GTK_UPDATE_DISCONTINUOUS); @@ -570,9 +685,10 @@ static void cb_mouse_tray_icon_destroy(GtkWidget *tray_icon, GtkWidget *image) { - gtk_widget_ref(image); + gtk_widget_ref(mouse_tray_image); gtk_container_remove(GTK_CONTAINER(tray_icon), image); - mouse_tray_icon_reconnect(); + if(mouse_key) + mouse_tray_icon_reconnect(); } static void @@ -601,6 +717,7 @@ 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); + g_timeout_add(MOUSE_KEYS_SYSTRAY_UPDATE_INTERVAL, (GtkFunction)mousekeys_systray_timer_cb, mouse_tray_icon); } if(mouse_tray_icon) gtk_widget_show_all(mouse_tray_icon); @@ -609,7 +726,11 @@ { xkb->ctrls->enabled_ctrls &= ~XkbMouseKeysMask; if(mouse_tray_icon) - gtk_widget_hide(mouse_tray_icon); + { + gtk_widget_destroy(mouse_tray_icon); + mouse_tray_icon = NULL; + mouse_keys_default_button = -1; + } } XkbSetControls (GDK_DISPLAY (), XkbControlsEnabledMask | XkbMouseKeysMask | XkbMouseKeysAccelMask, xkb); @@ -661,6 +782,7 @@ mcs_manager_notify(mcs_plugin->manager, CHANNEL2); mouse_plugin_write_options (mcs_plugin); } + #endif static void setup_dialog(Itf * itf)