nkeynes@1015 | 1 | /**
|
nkeynes@1015 | 2 | * $Id: $
|
nkeynes@1015 | 3 | *
|
nkeynes@1015 | 4 | * GTK dialog for defining hotkeys
|
nkeynes@1015 | 5 | *
|
nkeynes@1015 | 6 | * Copyright (c) 2009 wahrhaft.
|
nkeynes@1015 | 7 | *
|
nkeynes@1015 | 8 | * This program is free software; you can redistribute it and/or modify
|
nkeynes@1015 | 9 | * it under the terms of the GNU General Public License as published by
|
nkeynes@1015 | 10 | * the Free Software Foundation; either version 2 of the License, or
|
nkeynes@1015 | 11 | * (at your option) any later version.
|
nkeynes@1015 | 12 | *
|
nkeynes@1015 | 13 | * This program is distributed in the hope that it will be useful,
|
nkeynes@1015 | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
nkeynes@1015 | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
nkeynes@1015 | 16 | * GNU General Public License for more details.
|
nkeynes@1015 | 17 | */
|
nkeynes@1015 | 18 |
|
nkeynes@1015 | 19 | #include <assert.h>
|
nkeynes@1015 | 20 | #include <string.h>
|
nkeynes@1015 | 21 | #include <gtk/gtk.h>
|
nkeynes@1015 | 22 | #include <gdk/gdkkeysyms.h>
|
nkeynes@1015 | 23 |
|
nkeynes@1015 | 24 | #include "lxdream.h"
|
nkeynes@1015 | 25 | #include "display.h"
|
nkeynes@1015 | 26 | #include "gtkui/gtkui.h"
|
nkeynes@1015 | 27 | #include "hotkeys.h"
|
nkeynes@1015 | 28 |
|
nkeynes@1015 | 29 |
|
nkeynes@1015 | 30 |
|
nkeynes@1015 | 31 | static void config_keysym_hook( void *data, const gchar *keysym )
|
nkeynes@1015 | 32 | {
|
nkeynes@1015 | 33 | GtkWidget *widget = (GtkWidget *)data;
|
nkeynes@1015 | 34 | gtk_entry_set_text( GTK_ENTRY(widget), keysym );
|
nkeynes@1015 | 35 | g_object_set_data( G_OBJECT(widget), "keypress_mode", GINT_TO_POINTER(FALSE) );
|
nkeynes@1015 | 36 | input_set_keysym_hook(NULL, NULL);
|
nkeynes@1015 | 37 | }
|
nkeynes@1015 | 38 |
|
nkeynes@1015 | 39 | static gboolean config_key_buttonpress( GtkWidget *widget, GdkEventButton *event, gpointer user_data )
|
nkeynes@1015 | 40 | {
|
nkeynes@1015 | 41 | gboolean keypress_mode = GPOINTER_TO_INT(g_object_get_data( G_OBJECT(widget), "keypress_mode"));
|
nkeynes@1015 | 42 | if( keypress_mode ) {
|
nkeynes@1015 | 43 | gchar *keysym = input_keycode_to_keysym( &system_mouse_driver, event->button);
|
nkeynes@1015 | 44 | if( keysym != NULL ) {
|
nkeynes@1015 | 45 | config_keysym_hook( widget, keysym );
|
nkeynes@1015 | 46 | g_free(keysym);
|
nkeynes@1015 | 47 | }
|
nkeynes@1015 | 48 | return TRUE;
|
nkeynes@1015 | 49 | } else {
|
nkeynes@1015 | 50 | gtk_entry_set_text( GTK_ENTRY(widget), _("<press key>") );
|
nkeynes@1015 | 51 | g_object_set_data( G_OBJECT(widget), "keypress_mode", GINT_TO_POINTER(TRUE) );
|
nkeynes@1015 | 52 | input_set_keysym_hook(config_keysym_hook, widget);
|
nkeynes@1015 | 53 | }
|
nkeynes@1015 | 54 | return FALSE;
|
nkeynes@1015 | 55 | }
|
nkeynes@1015 | 56 |
|
nkeynes@1015 | 57 | static gboolean config_key_keypress( GtkWidget *widget, GdkEventKey *event, gpointer user_data )
|
nkeynes@1015 | 58 | {
|
nkeynes@1015 | 59 | gboolean keypress_mode = GPOINTER_TO_INT(g_object_get_data( G_OBJECT(widget), "keypress_mode"));
|
nkeynes@1015 | 60 | if( keypress_mode ) {
|
nkeynes@1015 | 61 | if( event->keyval == GDK_Escape ) {
|
nkeynes@1015 | 62 | gtk_entry_set_text( GTK_ENTRY(widget), "" );
|
nkeynes@1015 | 63 | g_object_set_data( G_OBJECT(widget), "keypress_mode", GINT_TO_POINTER(FALSE) );
|
nkeynes@1015 | 64 | return TRUE;
|
nkeynes@1015 | 65 | }
|
nkeynes@1015 | 66 | GdkKeymap *keymap = gdk_keymap_get_default();
|
nkeynes@1015 | 67 | guint keyval;
|
nkeynes@1015 | 68 |
|
nkeynes@1015 | 69 | gdk_keymap_translate_keyboard_state( keymap, event->hardware_keycode, 0, 0, &keyval,
|
nkeynes@1015 | 70 | NULL, NULL, NULL );
|
nkeynes@1015 | 71 | gtk_entry_set_text( GTK_ENTRY(widget), gdk_keyval_name(keyval) );
|
nkeynes@1015 | 72 | g_object_set_data( G_OBJECT(widget), "keypress_mode", GINT_TO_POINTER(FALSE) );
|
nkeynes@1015 | 73 | input_set_keysym_hook(NULL, NULL);
|
nkeynes@1015 | 74 | return TRUE;
|
nkeynes@1015 | 75 | } else {
|
nkeynes@1015 | 76 | switch( event->keyval ) {
|
nkeynes@1015 | 77 | case GDK_Return:
|
nkeynes@1015 | 78 | case GDK_KP_Enter:
|
nkeynes@1015 | 79 | gtk_entry_set_text( GTK_ENTRY(widget), _("<press key>") );
|
nkeynes@1015 | 80 | g_object_set_data( G_OBJECT(widget), "keypress_mode", GINT_TO_POINTER(TRUE) );
|
nkeynes@1015 | 81 | input_set_keysym_hook(config_keysym_hook, widget);
|
nkeynes@1015 | 82 | return TRUE;
|
nkeynes@1015 | 83 | case GDK_BackSpace:
|
nkeynes@1015 | 84 | case GDK_Delete:
|
nkeynes@1015 | 85 | gtk_entry_set_text( GTK_ENTRY(widget), "" );
|
nkeynes@1015 | 86 | return TRUE;
|
nkeynes@1015 | 87 | }
|
nkeynes@1015 | 88 | return FALSE;
|
nkeynes@1015 | 89 | }
|
nkeynes@1015 | 90 |
|
nkeynes@1015 | 91 | }
|
nkeynes@1015 | 92 |
|
nkeynes@1015 | 93 | void hotkeys_dialog_done( GtkWidget *panel, gboolean isOK )
|
nkeynes@1015 | 94 | {
|
nkeynes@1015 | 95 | if( isOK ) {
|
nkeynes@1015 | 96 | hotkeys_unregister_keys();
|
nkeynes@1015 | 97 | lxdream_config_entry_t conf = hotkeys_get_config();
|
nkeynes@1015 | 98 | int i;
|
nkeynes@1015 | 99 | for( i=0; conf[i].key != NULL; i++ ) {
|
nkeynes@1015 | 100 | char buf[64];
|
nkeynes@1015 | 101 | GtkWidget *entry1, *entry2;
|
nkeynes@1015 | 102 | const gchar *key1, *key2;
|
nkeynes@1015 | 103 | snprintf( buf, sizeof(buf), "%s.1", conf[i].key );
|
nkeynes@1015 | 104 | entry1 = GTK_WIDGET(g_object_get_qdata( G_OBJECT(panel), g_quark_from_string(buf)));
|
nkeynes@1015 | 105 | key1 = gtk_entry_get_text(GTK_ENTRY(entry1));
|
nkeynes@1015 | 106 | snprintf( buf, sizeof(buf), "%s.2", conf[i].key );
|
nkeynes@1015 | 107 | entry2 = GTK_WIDGET(g_object_get_qdata( G_OBJECT(panel), g_quark_from_string(buf)));
|
nkeynes@1015 | 108 | key2 = gtk_entry_get_text(GTK_ENTRY(entry2));
|
nkeynes@1015 | 109 | if( key1 == NULL || key1[0] == '\0') {
|
nkeynes@1015 | 110 | lxdream_set_config_value( &conf[i], key2 );
|
nkeynes@1015 | 111 | } else if( key2 == NULL || key2[0] == '\0') {
|
nkeynes@1015 | 112 | lxdream_set_config_value( &conf[i], key1 );
|
nkeynes@1015 | 113 | } else {
|
nkeynes@1015 | 114 | char buf[64];
|
nkeynes@1015 | 115 | snprintf( buf, sizeof(buf), "%s, %s", key1, key2 );
|
nkeynes@1015 | 116 | lxdream_set_config_value( &conf[i], buf );
|
nkeynes@1015 | 117 | }
|
nkeynes@1015 | 118 | }
|
nkeynes@1015 | 119 | lxdream_save_config();
|
nkeynes@1015 | 120 | hotkeys_register_keys();
|
nkeynes@1015 | 121 | }
|
nkeynes@1015 | 122 | }
|
nkeynes@1015 | 123 |
|
nkeynes@1015 | 124 | GtkWidget *hotkeys_panel_new()
|
nkeynes@1015 | 125 | {
|
nkeynes@1015 | 126 | lxdream_config_entry_t conf = hotkeys_get_config();
|
nkeynes@1015 | 127 | int count, i;
|
nkeynes@1015 | 128 | for( count=0; conf[count].key != NULL; count++ );
|
nkeynes@1015 | 129 |
|
nkeynes@1015 | 130 | GtkWidget *table = gtk_table_new( (count+1)>>1, 6, FALSE );
|
nkeynes@1015 | 131 | GList *focus_chain = NULL;
|
nkeynes@1015 | 132 | //gtk_object_set_data( GTK_OBJECT(table), "maple_device", device );
|
nkeynes@1015 | 133 | for( i=0; i<count; i++ ) {
|
nkeynes@1015 | 134 | GtkWidget *text, *text2;
|
nkeynes@1015 | 135 | char buf[64];
|
nkeynes@1015 | 136 | int x=0;
|
nkeynes@1015 | 137 | int y=i;
|
nkeynes@1015 | 138 | if( i >= (count+1)>>1 ) {
|
nkeynes@1015 | 139 | x = 3;
|
nkeynes@1015 | 140 | y -= (count+1)>>1;
|
nkeynes@1015 | 141 | }
|
nkeynes@1015 | 142 | gtk_table_attach( GTK_TABLE(table), gtk_label_new(gettext(conf[i].label)), x, x+1, y, y+1,
|
nkeynes@1015 | 143 | GTK_SHRINK, GTK_SHRINK, 0, 0 );
|
nkeynes@1015 | 144 | text = gtk_entry_new();
|
nkeynes@1015 | 145 | gtk_entry_set_width_chars( GTK_ENTRY(text), 11 );
|
nkeynes@1015 | 146 | gtk_entry_set_editable( GTK_ENTRY(text), FALSE );
|
nkeynes@1015 | 147 | g_signal_connect( text, "key_press_event",
|
nkeynes@1015 | 148 | G_CALLBACK(config_key_keypress), NULL );
|
nkeynes@1015 | 149 | g_signal_connect( text, "button_press_event",
|
nkeynes@1015 | 150 | G_CALLBACK(config_key_buttonpress), NULL );
|
nkeynes@1015 | 151 | snprintf( buf, sizeof(buf), "%s.1", conf[i].key );
|
nkeynes@1015 | 152 | g_object_set_data( G_OBJECT(text), "keypress_mode", GINT_TO_POINTER(FALSE) );
|
nkeynes@1015 | 153 | g_object_set_qdata( G_OBJECT(table), g_quark_from_string(buf), text );
|
nkeynes@1015 | 154 | gtk_table_attach_defaults( GTK_TABLE(table), text, x+1, x+2, y, y+1);
|
nkeynes@1015 | 155 | focus_chain = g_list_append( focus_chain, text );
|
nkeynes@1015 | 156 | text2 = gtk_entry_new();
|
nkeynes@1015 | 157 | gtk_entry_set_width_chars( GTK_ENTRY(text2), 11 );
|
nkeynes@1015 | 158 | gtk_entry_set_editable( GTK_ENTRY(text2), FALSE );
|
nkeynes@1015 | 159 | g_signal_connect( text2, "key_press_event",
|
nkeynes@1015 | 160 | G_CALLBACK(config_key_keypress), NULL );
|
nkeynes@1015 | 161 | g_signal_connect( text2, "button_press_event",
|
nkeynes@1015 | 162 | G_CALLBACK(config_key_buttonpress), NULL );
|
nkeynes@1015 | 163 | snprintf( buf, sizeof(buf), "%s.2", conf[i].key );
|
nkeynes@1015 | 164 | g_object_set_data( G_OBJECT(text2), "keypress_mode", GINT_TO_POINTER(FALSE) );
|
nkeynes@1015 | 165 | g_object_set_qdata( G_OBJECT(table), g_quark_from_string(buf), text2 );
|
nkeynes@1015 | 166 | gtk_table_attach_defaults( GTK_TABLE(table), text2, x+2, x+3, y, y+1);
|
nkeynes@1015 | 167 | focus_chain = g_list_append( focus_chain, text2 );
|
nkeynes@1015 | 168 | if( conf[i].value != NULL ) {
|
nkeynes@1015 | 169 | gchar **parts = g_strsplit(conf[i].value,",",3);
|
nkeynes@1015 | 170 | if( parts[0] != NULL ) {
|
nkeynes@1015 | 171 | gtk_entry_set_text( GTK_ENTRY(text), g_strstrip(parts[0]) );
|
nkeynes@1015 | 172 | if( parts[1] != NULL ) {
|
nkeynes@1015 | 173 | gtk_entry_set_text( GTK_ENTRY(text2), g_strstrip(parts[1]) );
|
nkeynes@1015 | 174 | }
|
nkeynes@1015 | 175 | }
|
nkeynes@1015 | 176 | g_strfreev(parts);
|
nkeynes@1015 | 177 | }
|
nkeynes@1015 | 178 | }
|
nkeynes@1015 | 179 | gtk_container_set_focus_chain( GTK_CONTAINER(table), focus_chain );
|
nkeynes@1015 | 180 |
|
nkeynes@1015 | 181 | return table;
|
nkeynes@1015 | 182 | }
|
nkeynes@1015 | 183 |
|
nkeynes@1015 | 184 | void hotkeys_dialog_run( )
|
nkeynes@1015 | 185 | {
|
nkeynes@1015 | 186 | gtk_gui_run_property_dialog( _("Hotkey Settings"), hotkeys_panel_new(), hotkeys_dialog_done );
|
nkeynes@1015 | 187 | }
|