Search
lxdream.org :: lxdream/src/gtkui/gtk_hotkeys.c
lxdream 0.9.1
released Jun 29
Download Now
filename src/gtkui/gtk_hotkeys.c
changeset 1015:ad448bedc48a
author nkeynes
date Sat Jun 27 09:55:00 2009 +0000 (14 years ago)
permissions -rw-r--r--
last change Ensure each VMU is only attached once
Handle removal of sub-devices when detaching parent device
file annotate diff log raw
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
}
.