static void meta_input_settings_x11_set_keyboard_repeat (MetaInputSettings *settings, gboolean enabled, guint delay, guint interval) { MetaBackend *backend = meta_get_backend (); Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); if (enabled) { XAutoRepeatOn (xdisplay); XkbSetAutoRepeatRate (xdisplay, XkbUseCoreKbd, delay, interval); } else { XAutoRepeatOff (xdisplay); } }
int main(int argc, char** argv) { GtkBuilder* builder; char* str = NULL; GKeyFile* kf = g_key_file_new(); const char* session_name = g_getenv("DESKTOP_SESSION"); /* load settings from current session config files */ if(!session_name) session_name = "LXDE"; char* rel_path = g_strconcat("lxsession/", session_name, "/desktop.conf", NULL); char* user_config_file = g_build_filename(g_get_user_config_dir(), rel_path, NULL); #ifdef ENABLE_NLS bindtextdomain ( GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR ); bind_textdomain_codeset ( GETTEXT_PACKAGE, "UTF-8" ); textdomain ( GETTEXT_PACKAGE ); #endif gtk_init(&argc, &argv); gtk_icon_theme_prepend_search_path(gtk_icon_theme_get_default(), PACKAGE_DATA_DIR); /* build the UI */ builder = gtk_builder_new(); gtk_builder_add_from_file( builder, PACKAGE_DATA_DIR "/lxinput.ui", NULL ); dlg = (GtkWidget*)gtk_builder_get_object( builder, "dlg" ); gtk_dialog_set_alternative_button_order( (GtkDialog*)dlg, GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, -1 ); mouse_accel = (GtkRange*)gtk_builder_get_object(builder,"mouse_accel"); mouse_threshold = (GtkRange*)gtk_builder_get_object(builder,"mouse_threshold"); mouse_left_handed = (GtkToggleButton*)gtk_builder_get_object(builder,"left_handed"); mouse_dclick = (GtkRange*)gtk_builder_get_object(builder, "mouse_dclick"); kb_delay = (GtkRange*)gtk_builder_get_object(builder,"kb_delay"); kb_interval = (GtkRange*)gtk_builder_get_object(builder,"kb_interval"); kb_beep = (GtkToggleButton*)gtk_builder_get_object(builder,"beep"); kb_layout = (GtkButton*)gtk_builder_get_object(builder,"keyboard_layout"); const gchar *program = detect_keymap_program(); if (program == NULL) { /* Hide the button if there is no program to set keymap */ kb_layout_label = (GtkLabel*)gtk_builder_get_object(builder,"keyboard_layout_label"); gtk_widget_set_visible(GTK_WIDGET(kb_layout_label), FALSE); gtk_widget_set_visible(GTK_WIDGET(kb_layout), FALSE); } else { gtk_button_set_label(kb_layout, _("Keyboard Layout...")); } g_object_unref( builder ); /* read the config flie */ load_settings(); /* init the UI */ gtk_range_set_value(mouse_accel, (gdouble)accel / 10.0); gtk_range_set_value(mouse_threshold, threshold); gtk_range_set_value(mouse_dclick, dclick); gtk_toggle_button_set_active(mouse_left_handed, left_handed); gtk_range_set_value(kb_delay, delay); gtk_range_set_value(kb_interval, interval); gtk_toggle_button_set_active(kb_beep, beep); set_range_stops(mouse_accel, 10); g_signal_connect(mouse_accel, "value-changed", G_CALLBACK(on_mouse_accel_changed), NULL); set_range_stops(mouse_threshold, 10); g_signal_connect(mouse_threshold, "value-changed", G_CALLBACK(on_mouse_threshold_changed), NULL); g_signal_connect(mouse_left_handed, "toggled", G_CALLBACK(on_left_handed_toggle), NULL); g_signal_connect(mouse_dclick, "value-changed", G_CALLBACK(on_mouse_dclick_changed), NULL); set_range_stops(kb_delay, 10); g_signal_connect(kb_delay, "value-changed", G_CALLBACK(on_kb_range_changed), &delay); set_range_stops(kb_interval, 10); g_signal_connect(kb_interval, "value-changed", G_CALLBACK(on_kb_range_changed), &interval); g_signal_connect(kb_beep, "toggled", G_CALLBACK(on_kb_beep_toggle), NULL); g_signal_connect(kb_layout, "clicked", G_CALLBACK(on_kb_layout_clicked), NULL); if( gtk_dialog_run( (GtkDialog*)dlg ) == GTK_RESPONSE_OK ) { gsize len; if(!g_key_file_load_from_file(kf, user_config_file, G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, NULL)) { /* the user config file doesn't exist, create its parent dir */ len = strlen(user_config_file) - strlen("/desktop.conf"); user_config_file[len] = '\0'; g_debug("user_config_file = %s", user_config_file); g_mkdir_with_parents(user_config_file, 0700); user_config_file[len] = '/'; g_key_file_load_from_dirs(kf, rel_path, (const char**)g_get_system_config_dirs(), NULL, G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, NULL); } g_free(rel_path); g_key_file_set_integer(kf, "Mouse", "AccFactor", accel); g_key_file_set_integer(kf, "Mouse", "AccThreshold", threshold); g_key_file_set_integer(kf, "Mouse", "LeftHanded", !!left_handed); g_key_file_set_integer(kf, "Keyboard", "Delay", delay); g_key_file_set_integer(kf, "Keyboard", "Interval", interval); g_key_file_set_integer(kf, "Keyboard", "Beep", !!beep); str = g_key_file_to_data(kf, &len, NULL); g_file_set_contents(user_config_file, str, len, NULL); g_free(str); /* ask the settigns daemon to reload */ /* FIXME: is this needed? */ /* g_spawn_command_line_sync("lxde-settings-daemon reload", NULL, NULL, NULL, NULL); */ /* also save settings into autostart file for non-lxsession sessions */ g_free(user_config_file); rel_path = g_build_filename(g_get_user_config_dir(), "autostart", NULL); user_config_file = g_build_filename(rel_path, "LXinput-setup.desktop", NULL); if (g_mkdir_with_parents(rel_path, 0755) == 0) { str = g_strdup_printf("[Desktop Entry]\n" "Type=Application\n" "Name=%s\n" "Comment=%s\n" "NoDisplay=true\n" "Exec=sh -c 'xset m %d/10 %d r rate %d %d b %s'\n" "NotShowIn=GNOME;KDE;XFCE;\n", _("LXInput autostart"), _("Setup keyboard and mouse using settings done in LXInput"), /* FIXME: how to setup left-handed mouse? */ accel, threshold, delay, interval, beep ? "on" : "off"); g_file_set_contents(user_config_file, str, -1, NULL); g_free(str); } } else { /* restore to original settings */ /* keyboard */ delay = old_delay; interval = old_interval; beep = old_beep; XkbSetAutoRepeatRate(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), XkbUseCoreKbd, delay, interval); /* FIXME: beep? */ /* mouse */ accel = old_accel; threshold = old_threshold; left_handed = old_left_handed; XChangePointerControl(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), True, True, accel, 10, threshold); set_left_handed_mouse(); set_dclick_time (old_dclick); } gtk_widget_destroy( dlg ); g_free( file ); g_key_file_free( kf ); g_free(user_config_file); return 0; }
static void on_kb_range_changed(GtkRange* range, int* val) { *val = (int)gtk_range_get_value(range); /* apply keyboard values */ XkbSetAutoRepeatRate(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), XkbUseCoreKbd, delay, interval); }