Changeset 20

Show
Ignore:
Timestamp:
01/22/07 17:28:44 (2 years ago)
Author:
inz
Message:

Make toolbar shortcuts configurable.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • osso-xterm/trunk/configure.ac

    r19 r20  
    1 AC_INIT([osso-xterm],[0.13.mh15]) 
     1AC_INIT([osso-xterm],[0.13.mh16]) 
    22 
    33dnl Initialize automake 
  • osso-xterm/trunk/debian/changelog

    r19 r20  
     1osso-xterm (0.13.mh16) unstable; urgency=low 
     2 
     3  * Make toolbar shortcuts configurable. 
     4 
     5 -- Santtu Lakkala <inz@inz.fi>  Mon, 22 Jan 2007 17:28:15 +0200 
     6 
    17osso-xterm (0.13.mh15) unstable; urgency=low 
    28 
  • osso-xterm/trunk/etc/osso-xterm.schemas

    r18 r20  
    3333                </schema> 
    3434                <schema> 
    35                         <key>/schemas/apps/osso/xterm/screenkeys</key> 
    36                         <applyto>/apps/osso/xterm/screenkeys</applyto> 
     35                        <key>/schemas/apps/osso/xterm/keys</key> 
     36                        <applyto>/apps/osso/xterm/keys</applyto> 
    3737                        <owner>osso-xterm</owner> 
    38                         <type>bool</type> 
    39                         <default>true</default> 
     38                        <type>list</type> 
     39                        <list_type>string</list_type> 
     40                        <default>[Page_Up, Page_Down, &lt;ctrl&gt;p, &lt;ctrl&gt;n, &lt;ctrl&gt;a\,p, &lt;ctrl&gt;a\,n]</default> 
    4041                        <locale name="C"> 
    41                                 <short>Show screen keys in toolbar</short> 
     42                                <short>Keys shown in toolbar</short> 
     43                        </locale> 
     44                </schema> 
     45                <schema> 
     46                        <key>/schemas/apps/osso/xterm/key_labels</key> 
     47                        <applyto>/apps/osso/xterm/key_labels</applyto> 
     48                        <owner>osso-xterm</owner> 
     49                        <type>list</type> 
     50                        <list_type>string</list_type> 
     51                        <default>[PgUp, PgDn, Ctrl-p, Ctrl-n, Ctrl-ap, Ctrl-an]</default> 
     52                        <locale name="C"> 
     53                                <short>Labels for keys in toolbar</short> 
    4254                        </locale> 
    4355                </schema> 
  • osso-xterm/trunk/src/terminal-app.c

    r19 r20  
    9696static void            terminal_app_action_toolbar        (GtkToggleAction *action, 
    9797                                                             TerminalApp     *app); 
    98 static void            terminal_app_action_screenkeys        (GtkToggleAction *action, 
    99                                                              TerminalApp     *app); 
    10098static void            terminal_app_action_prev_tab         (GtkAction       *action, 
    10199                                                             TerminalApp     *app); 
     
    170168  { "scrollbar", NULL, N_ ("Scrollbar"), NULL, NULL, G_CALLBACK (terminal_app_action_scrollbar), TRUE }, 
    171169  { "toolbar", NULL, N_ ("Toolbar"), NULL, NULL, G_CALLBACK (terminal_app_action_toolbar), TRUE }, 
    172   { "screenkeys", NULL, N_ ("Screen keys"), NULL, NULL, G_CALLBACK (terminal_app_action_screenkeys), TRUE }, 
    173170}; 
    174171 
     
    187184 "    <menuitem action='scrollbar'/>" 
    188185 "    <menuitem action='toolbar'/>" 
    189  "    <menuitem action='screenkeys'/>" 
    190186 "    <menuitem action='fullscreen'/>" 
    191187 "    <separator/>" 
     
    277273  attach_item(parent, actiongroup, accelgroup, "scrollbar"); 
    278274  attach_item(parent, actiongroup, accelgroup, "toolbar"); 
    279   attach_item(parent, actiongroup, accelgroup, "screenkeys"); 
    280275  attach_item(parent, actiongroup, accelgroup, "fullscreen"); 
    281276  gtk_menu_shell_append(GTK_MENU_SHELL(parent), 
     
    415410  gchar               *role; 
    416411  gint                 font_size; 
    417   gboolean             scrollbar, toolbar, screenkeys, reverse; 
     412  gboolean             scrollbar, toolbar, reverse; 
    418413  GConfClient         *gconf_client; 
    419414  GConfValue          *gconf_value; 
     
    471466          if (gconf_value->type == GCONF_VALUE_BOOL) 
    472467                  toolbar = gconf_value_get_bool(gconf_value); 
    473           gconf_value_free(gconf_value); 
    474   } 
    475  
    476   gconf_value = gconf_client_get(gconf_client, 
    477                                  OSSO_XTERM_GCONF_SCREENKEYS, 
    478                                  &error); 
    479  
    480   if (error != NULL) { 
    481       g_printerr("Unable to get screenkeys setting from gconf: %s\n", 
    482                  error->message); 
    483       g_error_free(error); 
    484       error = NULL; 
    485   } 
    486   screenkeys = OSSO_XTERM_DEFAULT_SCREENKEYS; 
    487   if (gconf_value) { 
    488           if (gconf_value->type == GCONF_VALUE_BOOL) 
    489                   screenkeys = gconf_value_get_bool(gconf_value); 
    490468          gconf_value_free(gconf_value); 
    491469  } 
     
    533511  action = gtk_action_group_get_action(app->action_group, "toolbar"); 
    534512  gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), toolbar); 
    535  
    536   action = gtk_action_group_get_action(app->action_group, "screenkeys"); 
    537   gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), screenkeys); 
    538513 
    539514  action = gtk_action_group_get_action(app->action_group, "reverse"); 
     
    947922 
    948923static void 
    949 terminal_app_action_screenkeys (GtkToggleAction *action, 
    950                                TerminalApp     *app) 
    951 { 
    952     GConfClient *client; 
    953     gboolean show; 
    954  
    955     client = gconf_client_get_default(); 
    956     show = gtk_toggle_action_get_active (action); 
    957  
    958     gconf_client_set_bool (client, 
    959                            OSSO_XTERM_GCONF_SCREENKEYS, 
    960                            show, 
    961                            NULL); 
    962  
    963     g_object_unref(G_OBJECT(client)); 
    964 } 
    965  
    966 static void 
    967924terminal_app_action_scrollbar (GtkToggleAction *action, 
    968925                               TerminalApp     *app) 
  • osso-xterm/trunk/src/terminal-gconf.h

    r18 r20  
    5555#define OSSO_XTERM_DEFAULT_TOOLBAR TRUE 
    5656 
    57 /* Boolean */ 
    58 #define OSSO_XTERM_GCONF_SCREENKEYS   OSSO_XTERM_GCONF_PATH "/screenkeys" 
    59 #define OSSO_XTERM_DEFAULT_SCREENKEYS TRUE 
     57/* List of strings */ 
     58#define OSSO_XTERM_GCONF_KEYS   OSSO_XTERM_GCONF_PATH "/keys" 
     59 
     60/* List of strings */ 
     61#define OSSO_XTERM_GCONF_KEY_LABELS   OSSO_XTERM_GCONF_PATH "/key_labels" 
    6062 
    6163/* Boolean */ 
  • osso-xterm/trunk/src/terminal-widget.c

    r18 r20  
    128128                                                               GConfEntry     *entry, 
    129129                                                               TerminalWidget *widget); 
    130 static void     terminal_widget_gconf_screenkeys               (GConfClient    *client, 
     130static void     terminal_widget_gconf_keys               (GConfClient    *client, 
    131131                                                               guint           conn_id, 
    132132                                                               GConfEntry     *entry, 
     
    147147static void     terminal_widget_update_tool_bar          (TerminalWidget *widget, 
    148148                                                               gboolean show); 
    149 static void     terminal_widget_update_screen_keys          (TerminalWidget *widget, 
    150                                                                gboolean show); 
     149static void     terminal_widget_update_keys          (TerminalWidget *widget, 
     150                                                               GSList *keys, 
     151                                                               GSList *key_labels); 
    151152static void     terminal_widget_update_colors                 (TerminalWidget *widget, 
    152153                                                               const gchar *fg_name, 
     
    163164static void     terminal_widget_ctrlify_notify               (GtkToggleToolButton *item, 
    164165                                                              TerminalWidget *widget); 
    165 static void     terminal_widget_next_window                  (GtkToolButton *button, 
     166static void     terminal_widget_do_keys                      (TerminalWidget *widget, 
     167                                                              const gchar *key_string); 
     168static void     terminal_widget_do_key_button                (GObject *button, 
    166169                                                              TerminalWidget *widget); 
    167 static void     terminal_widget_prev_window                  (GtkToolButton *button, 
    168                                                               TerminalWidget *widget); 
    169  
    170170 
    171171static GObjectClass *parent_class; 
     
    302302  gboolean scrollbar; 
    303303  gboolean toolbar; 
    304   gboolean screenkeys; 
     304  GSList *keys; 
     305  GSList *key_labels; 
    305306  GConfValue *gconf_value; 
    306307 
     
    329330          widget, 
    330331          NULL, &err); 
    331   widget->screenkeys_conid = gconf_client_notify_add(widget->gconf_client, 
    332           OSSO_XTERM_GCONF_SCREENKEYS, 
    333           (GConfClientNotifyFunc)terminal_widget_gconf_screenkeys, 
     332  widget->keys_conid = gconf_client_notify_add(widget->gconf_client, 
     333          OSSO_XTERM_GCONF_KEYS, 
     334          (GConfClientNotifyFunc)terminal_widget_gconf_keys, 
     335          widget, 
     336          NULL, &err); 
     337  widget->key_labels_conid = gconf_client_notify_add(widget->gconf_client, 
     338          OSSO_XTERM_GCONF_KEY_LABELS, 
     339          (GConfClientNotifyFunc)terminal_widget_gconf_keys, 
    334340          widget, 
    335341          NULL, &err); 
     
    444450                  NULL); 
    445451  widget->cbutton = gtk_toggle_tool_button_new(); 
     452  gtk_tool_item_set_expand(widget->cbutton, TRUE); 
    446453  gtk_tool_button_set_label(GTK_TOOL_BUTTON(widget->cbutton), "C"); 
    447454  gtk_widget_show(GTK_WIDGET(widget->cbutton)); 
     
    454461                    widget); 
    455462 
    456   widget->nbutton = gtk_tool_button_new(NULL, ">"); 
    457  
    458   g_signal_connect (G_OBJECT(widget->nbutton), "clicked", 
    459                     G_CALLBACK(terminal_widget_next_window), 
    460                     widget); 
    461  
    462   widget->pbutton = gtk_tool_button_new(NULL, "<"); 
    463  
    464   g_signal_connect (G_OBJECT(widget->pbutton), "clicked", 
    465                     G_CALLBACK(terminal_widget_prev_window), 
    466                     widget); 
    467  
    468   gtk_toolbar_insert(GTK_TOOLBAR(widget->tbar), 
    469                   widget->pbutton, 
    470                   -1); 
    471   gtk_toolbar_insert(GTK_TOOLBAR(widget->tbar), 
    472                   widget->nbutton, 
    473                   -1); 
    474463  gtk_toolbar_insert(GTK_TOOLBAR(widget->tbar), 
    475464                  widget->cbutton, 
     
    509498  } 
    510499 
    511   gconf_value = gconf_client_get(widget->gconf_client, 
    512                                  OSSO_XTERM_GCONF_SCREENKEYS, 
     500  keys = gconf_client_get_list(widget->gconf_client, 
     501                                 OSSO_XTERM_GCONF_KEYS, 
     502                                 GCONF_VALUE_STRING, 
    513503                                 &err); 
    514   if (err != NULL) { 
    515       g_printerr("Unable to get toolbar setting from gconf: %s\n", 
    516                  err->message); 
    517       g_clear_error(&err); 
    518   } 
    519   screenkeys = OSSO_XTERM_DEFAULT_SCREENKEYS; 
    520   if (gconf_value) { 
    521           if (gconf_value->type == GCONF_VALUE_BOOL) 
    522                   screenkeys = gconf_value_get_bool(gconf_value); 
    523           gconf_value_free(gconf_value); 
    524   } 
     504  key_labels = gconf_client_get_list(widget->gconf_client, 
     505                                 OSSO_XTERM_GCONF_KEY_LABELS, 
     506                                 GCONF_VALUE_STRING, 
     507                                 &err); 
    525508 
    526509  terminal_widget_update_scrolling_bar(TERMINAL_WIDGET(widget), scrollbar); 
    527510  terminal_widget_update_tool_bar(TERMINAL_WIDGET(widget), toolbar); 
    528   terminal_widget_update_screen_keys(TERMINAL_WIDGET(widget), screenkeys); 
     511  terminal_widget_update_keys(TERMINAL_WIDGET(widget), keys, key_labels); 
     512 
     513  g_slist_foreach(keys, (GFunc)g_free, NULL); 
     514  g_slist_foreach(key_labels, (GFunc)g_free, NULL); 
     515  g_slist_free(keys); 
     516  g_slist_free(key_labels); 
     517 
    529518  terminal_widget_gconf_font_size(widget->gconf_client, 0, NULL, widget); 
    530519  terminal_widget_gconf_reverse (widget->gconf_client, 0, NULL, widget); 
     
    585574                             widget->toolbar_conid); 
    586575  gconf_client_notify_remove(widget->gconf_client, 
    587                              widget->screenkeys_conid); 
     576                             widget->keys_conid); 
     577  gconf_client_notify_remove(widget->gconf_client, 
     578                             widget->key_labels_conid); 
    588579  gconf_client_notify_remove(widget->gconf_client, 
    589580                             widget->font_name_conid); 
     
    10791070 
    10801071static void 
    1081 terminal_widget_update_screen_keys (TerminalWidget *widget, gboolean show) 
    1082 
    1083     if (show) { 
    1084         gtk_widget_show (GTK_WIDGET(widget->nbutton)); 
    1085         gtk_widget_show (GTK_WIDGET(widget->pbutton)); 
    1086     } 
    1087     else { 
    1088         gtk_widget_hide (GTK_WIDGET(widget->nbutton)); 
    1089         gtk_widget_hide (GTK_WIDGET(widget->pbutton)); 
    1090     } 
     1072terminal_widget_update_keys (TerminalWidget *widget, GSList *keys, GSList *key_labels) 
     1073
     1074        g_slist_foreach(widget->keys, (GFunc)gtk_widget_destroy, NULL); 
     1075        g_slist_free(widget->keys); 
     1076        widget->keys = NULL; 
     1077        guint i = 0; 
     1078 
     1079        while (keys && key_labels) { 
     1080                GtkToolItem *button = gtk_tool_button_new(NULL, 
     1081                                key_labels->data); 
     1082/*              GtkToolItem *separator = gtk_separator_tool_item_new(); */ 
     1083                g_object_set_data_full(G_OBJECT(button), "keys", g_strdup(keys->data), g_free); 
     1084/*              g_object_set_data_full(G_OBJECT(button), "separator", separator, (GDestroyNotify)gtk_widget_destroy); */ 
     1085 
     1086                gtk_tool_item_set_expand(button, TRUE); 
     1087                gtk_toolbar_insert(GTK_TOOLBAR(widget->tbar),  
     1088                                button, i++); 
     1089/*              gtk_toolbar_insert(GTK_TOOLBAR(widget->tbar),  
     1090                                separator, i++); */ 
     1091 
     1092                gtk_widget_show(GTK_WIDGET(button)); 
     1093/*              gtk_widget_show(GTK_WIDGET(separator)); */ 
     1094 
     1095                g_signal_connect(G_OBJECT(button), 
     1096                                "clicked", 
     1097                                G_CALLBACK(terminal_widget_do_key_button), 
     1098                                widget); 
     1099 
     1100                widget->keys = g_slist_append(widget->keys, 
     1101                                button); 
     1102 
     1103                keys = g_slist_next(keys); 
     1104                key_labels = g_slist_next(key_labels); 
     1105        } 
    10911106} 
    10921107 
     
    11421157 
    11431158static void 
    1144 terminal_widget_gconf_screenkeys(GConfClient    *client, 
     1159terminal_widget_gconf_keys(GConfClient    *client, 
    11451160                                guint           conn_id, 
    11461161                                GConfEntry     *entry, 
    11471162                                TerminalWidget *widget) { 
    11481163    GConfValue *value; 
    1149     gboolean screenkeys; 
     1164    GSList *keys; 
     1165    GSList *key_labels; 
     1166    GSList *freeme; 
    11501167 
    11511168    value = gconf_entry_get_value(entry); 
    1152     screenkeys = gconf_value_get_bool(value); 
    1153     terminal_widget_update_screen_keys(widget, screenkeys); 
     1169 
     1170    if (!strcmp(entry->key, OSSO_XTERM_GCONF_KEYS)) { 
     1171        keys = gconf_value_get_list(value); 
     1172        freeme = key_labels = gconf_client_get_list(client, 
     1173                OSSO_XTERM_GCONF_KEY_LABELS, 
     1174                GCONF_VALUE_STRING, 
     1175                NULL); 
     1176    } else { 
     1177        key_labels = gconf_value_get_list(value); 
     1178        freeme = keys = gconf_client_get_list(client, 
     1179                OSSO_XTERM_GCONF_KEYS, 
     1180                GCONF_VALUE_STRING, 
     1181                NULL); 
     1182    } 
     1183 
     1184    terminal_widget_update_keys(widget, keys, key_labels); 
     1185 
     1186    g_slist_foreach(freeme, (GFunc)g_free, NULL); 
     1187    g_slist_free(freeme); 
    11541188} 
    11551189 
     
    16811715static void 
    16821716terminal_widget_send_key(TerminalWidget *widget, 
    1683                          const char *str
     1717                         guint keyval
    16841718                         guint state) 
    16851719{ 
     
    16911725  key->time = GDK_CURRENT_TIME; 
    16921726  key->state = state; 
    1693   key->keyval = gdk_keyval_from_name(str)
     1727  key->keyval = keyval
    16941728  gdk_event_put ((GdkEvent *) key); 
    16951729 
     
    17021736} 
    17031737 
    1704 static void 
    1705 terminal_widget_next_window (GtkToolButton *button, 
    1706                              TerminalWidget *widget) 
    1707 
    1708         terminal_widget_send_key(widget, "a", GDK_CONTROL_MASK); 
    1709         terminal_widget_send_key(widget, "n", 0); 
    1710 
    1711  
    1712 static void 
    1713 terminal_widget_prev_window (GtkToolButton *button, 
    1714                              TerminalWidget *widget) 
    1715 
    1716         terminal_widget_send_key(widget, "a", GDK_CONTROL_MASK); 
    1717         terminal_widget_send_key(widget, "p", 0); 
    1718 
     1738static const struct { 
     1739        const gchar *name; 
     1740        GdkModifierType mask; 
     1741} modifier_table[11] = { 
     1742        { "shift", GDK_SHIFT_MASK }, 
     1743        { "lock", GDK_LOCK_MASK }, 
     1744        { "ctrl", GDK_CONTROL_MASK }, 
     1745        { "control", GDK_CONTROL_MASK }, 
     1746        { "mod1", GDK_MOD1_MASK }, 
     1747        { "alt", GDK_MOD1_MASK }, 
     1748        { "mod2", GDK_MOD2_MASK }, 
     1749        { "mod3", GDK_MOD3_MASK }, 
     1750        { "mod4", GDK_MOD4_MASK }, 
     1751        { "mod5", GDK_MOD5_MASK }, 
     1752        { NULL, 0 } 
     1753}; 
     1754 
     1755static GdkModifierType get_mask(const gchar *name, const gchar *end) { 
     1756        int i; 
     1757 
     1758        for (i = 0; modifier_table[i].name; i++) { 
     1759                if (!strncmp(name, modifier_table[i].name, end - name)) { 
     1760                        break; 
     1761                } 
     1762        } 
     1763        return modifier_table[i].mask; 
     1764
     1765 
     1766static const gchar *parse_key(const gchar *source, 
     1767                guint *keyval, 
     1768                guint *state) 
     1769
     1770        const gchar *tag_start = NULL; 
     1771        const gchar *key_start = NULL; 
     1772 
     1773        if (!source || !keyval || !state) { 
     1774                return NULL; 
     1775        } 
     1776 
     1777        *keyval = 0; 
     1778        *state = 0; 
     1779 
     1780        while (*source) { 
     1781                switch (*source) { 
     1782                case '<': 
     1783                        if (!tag_start) { 
     1784                                tag_start = source + 1; 
     1785                        } 
     1786                        break; 
     1787                case '>': 
     1788                        if (tag_start) { 
     1789                                *state |= get_mask(tag_start, source - 1); 
     1790                                tag_start = NULL; 
     1791                        } else { 
     1792                                key_start = source; 
     1793                        } 
     1794                        break; 
     1795                case '\\': 
     1796                        if (!key_start) { 
     1797                                key_start = source + 1; 
     1798                        } 
     1799                        break; 
     1800                case ',': 
     1801                case ' ': 
     1802                case '\t': 
     1803                case '\n': 
     1804                case '\r': 
     1805                        if (key_start && !tag_start) { 
     1806                                gchar *temp = g_strndup(key_start, 
     1807                                                source - key_start); 
     1808                                *keyval = gdk_keyval_from_name(temp); 
     1809                                g_free(temp); 
     1810                                return source + 1; 
     1811                        } 
     1812                        break; 
     1813                default: 
     1814                        if (!tag_start && !key_start) { 
     1815                                key_start = source; 
     1816                        } 
     1817                        break; 
     1818                } 
     1819                source++; 
     1820        } 
     1821        if (key_start) { 
     1822                *keyval = gdk_keyval_from_name(key_start); 
     1823                return source; 
     1824        } 
     1825
     1826 
     1827static void terminal_widget_do_keys(TerminalWidget *widget, 
     1828                const gchar *key_string) 
     1829
     1830        guint keyval = 0; 
     1831        guint state = 0; 
     1832 
     1833        while (key_string && *key_string) { 
     1834                key_string = parse_key(key_string, &keyval, &state); 
     1835                terminal_widget_send_key(widget, keyval, state); 
     1836        } 
     1837
     1838static void terminal_widget_do_key_button(GObject *button, 
     1839                TerminalWidget *widget) 
     1840
     1841        terminal_widget_do_keys(widget, g_object_get_data(button, "keys")); 
     1842
  • osso-xterm/trunk/src/terminal-widget.h

    r18 r20  
    5454  GtkWidget           *tbar; 
    5555  GtkToolItem         *cbutton; 
    56   GtkToolItem         *nbutton; 
    57   GtkToolItem         *pbutton; 
     56  GSList              *keys; 
    5857 
    5958  GPid                 pid; 
     
    6665  guint                scrollbar_conid; 
    6766  guint                toolbar_conid; 
    68   guint                screenkeys_conid; 
     67  guint                keys_conid; 
     68  guint                key_labels_conid; 
    6969  guint                font_size_conid; 
    7070  guint                font_base_size_conid;