Mercurial > pidgin
diff console/libgnt/gntentry.c @ 14793:8a0cfee11af8
[gaim-migrate @ 17558]
Introduce actions. You can specify the bindings for the actions. Right now, only the tree and the entry widget have them. The manual includes the details. I believe Ethan had suggested something like this a while back. It made sense, so here it is.
committer: Tailor Script <tailor@pidgin.im>
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Sat, 21 Oct 2006 21:08:24 +0000 |
parents | 61416f315d1c |
children | 02b70dc43044 |
line wrap: on
line diff
--- a/console/libgnt/gntentry.c Sat Oct 21 20:40:12 2006 +0000 +++ b/console/libgnt/gntentry.c Sat Oct 21 21:08:24 2006 +0000 @@ -157,35 +157,40 @@ gnt_widget_queue_update(widget); } -static void -move_back(GntEntry *entry) +static gboolean +move_back(GntWidget *widget, GList *null) { + GntEntry *entry = GNT_ENTRY(widget); if (entry->cursor <= entry->start) - return; + return FALSE; entry->cursor = g_utf8_find_prev_char(entry->start, entry->cursor); if (entry->cursor < entry->scroll) entry->scroll = entry->cursor; entry_redraw(GNT_WIDGET(entry)); + return TRUE; } -static void -move_forward(GntEntry *entry) +static gboolean +move_forward(GntWidget *widget, GList *list) { + GntEntry *entry = GNT_ENTRY(widget); if (entry->cursor >= entry->end) - return; + return FALSE; entry->cursor = g_utf8_find_next_char(entry->cursor, NULL); while (gnt_util_onscreen_width(entry->scroll, entry->cursor) >= GNT_WIDGET(entry)->priv.width) entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); entry_redraw(GNT_WIDGET(entry)); + return TRUE; } -static void -backspace(GntEntry *entry) +static gboolean +backspace(GntWidget *widget, GList *null) { int len; + GntEntry *entry = GNT_ENTRY(widget); if (entry->cursor <= entry->start) - return; + return TRUE; len = entry->cursor - g_utf8_find_prev_char(entry->start, entry->cursor); entry->cursor -= len; @@ -198,15 +203,17 @@ entry_redraw(GNT_WIDGET(entry)); if (entry->ddown) show_suggest_dropdown(entry); + return TRUE; } -static void -delkey(GntEntry *entry) +static gboolean +delkey(GntWidget *widget, GList *null) { int len; + GntEntry *entry = GNT_ENTRY(widget); if (entry->cursor >= entry->end) - return; + return FALSE; len = g_utf8_find_next_char(entry->cursor, NULL) - entry->cursor; memmove(entry->cursor, entry->cursor + len, entry->end - entry->cursor - len + 1); @@ -215,23 +222,116 @@ if (entry->ddown) show_suggest_dropdown(entry); + return TRUE; } -static void -move_start(GntEntry *entry) +static gboolean +move_start(GntWidget *widget, GList *null) { + GntEntry *entry = GNT_ENTRY(widget); entry->scroll = entry->cursor = entry->start; entry_redraw(GNT_WIDGET(entry)); + return TRUE; } -static void -move_end(GntEntry *entry) +static gboolean +move_end(GntWidget *widget, GList *null) { + GntEntry *entry = GNT_ENTRY(widget); entry->cursor = entry->end; /* This should be better than this */ while (gnt_util_onscreen_width(entry->scroll, entry->cursor) >= GNT_WIDGET(entry)->priv.width) entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); entry_redraw(GNT_WIDGET(entry)); + return TRUE; +} + +static gboolean +history_prev(GntWidget *widget, GList *null) +{ + GntEntry *entry = GNT_ENTRY(widget); + if (entry->histlength && entry->history->prev) + { + entry->history = entry->history->prev; + gnt_entry_set_text(entry, entry->history->data); + destroy_suggest(entry); + + return TRUE; + } + return FALSE; +} + +static gboolean +history_next(GntWidget *widget, GList *null) +{ + GntEntry *entry = GNT_ENTRY(widget); + if (entry->histlength && entry->history->next) + { + if (entry->history->prev == NULL) + { + /* Save the current contents */ + char *text = g_strdup(gnt_entry_get_text(entry)); + g_free(entry->history->data); + entry->history->data = text; + } + + entry->history = entry->history->next; + gnt_entry_set_text(entry, entry->history->data); + destroy_suggest(entry); + + return TRUE; + } + return FALSE; +} + +static gboolean +suggest_show(GntWidget *widget, GList *null) +{ + return show_suggest_dropdown(GNT_ENTRY(widget)); +} + +static gboolean +suggest_next(GntWidget *widget, GList *null) +{ + GntEntry *entry = GNT_ENTRY(widget); + if (entry->ddown) { + gnt_widget_perform_action_named(entry->ddown, "move-down", NULL); + return TRUE; + } + return FALSE; +} + +static gboolean +suggest_prev(GntWidget *widget, GList *null) +{ + GntEntry *entry = GNT_ENTRY(widget); + if (entry->ddown) { + gnt_widget_perform_action_named(entry->ddown, "move-up", NULL); + return TRUE; + } + return FALSE; +} + +static gboolean +del_to_home(GntWidget *widget, GList *null) +{ + GntEntry *entry = GNT_ENTRY(widget); + memmove(entry->start, entry->cursor, entry->end - entry->cursor); + entry->end -= (entry->cursor - entry->start); + entry->cursor = entry->scroll = entry->start; + memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); + entry_redraw(widget); + return TRUE; +} + +static gboolean +del_to_end(GntWidget *widget, GList *null) +{ + GntEntry *entry = GNT_ENTRY(widget); + entry->end = entry->cursor; + memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); + entry_redraw(widget); + return TRUE; } static gboolean @@ -241,73 +341,10 @@ if (text[0] == 27) { - if (strcmp(text + 1, GNT_KEY_DEL) == 0 && entry->cursor < entry->end) - { - delkey(entry); - return TRUE; - } - else if (strcmp(text + 1, GNT_KEY_LEFT) == 0) - { - move_back(entry); - return TRUE; - } - else if (strcmp(text + 1, GNT_KEY_RIGHT) == 0) - { - move_forward(entry); - return TRUE; - } - else if (strcmp(text + 1, GNT_KEY_HOME) == 0) - { - move_start(entry); - return TRUE; - } - else if (strcmp(text + 1, GNT_KEY_END) == 0) - { - move_end(entry); - return TRUE; - } - else if (strcmp(text + 1, GNT_KEY_CTRL_DOWN) == 0 && entry->histlength) - { - if (entry->history->prev) - { - entry->history = entry->history->prev; - gnt_entry_set_text(entry, entry->history->data); - destroy_suggest(entry); - - return TRUE; - } - } - else if (strcmp(text + 1, GNT_KEY_UP) == 0 || - strcmp(text + 1, GNT_KEY_DOWN) == 0) - { - if (entry->ddown) - { - gnt_widget_key_pressed(entry->ddown, text); - return TRUE; - } - } - else if (strcmp(text + 1, GNT_KEY_CTRL_UP) == 0 && entry->histlength) - { - if (entry->history->next) - { - if (entry->history->prev == NULL) - { - /* Save the current contents */ - char *text = g_strdup(gnt_entry_get_text(entry)); - g_free(entry->history->data); - entry->history->data = text; - } - - entry->history = entry->history->next; - gnt_entry_set_text(entry, entry->history->data); - destroy_suggest(entry); - - return TRUE; - } - } - else if (text[1] == 0) + if (text[1] == 0) { destroy_suggest(entry); + return TRUE; } return FALSE; @@ -400,60 +437,6 @@ entry_redraw(widget); return TRUE; } - else - { - if (strcmp(text, GNT_KEY_BACKSPACE) == 0 && entry->cursor > entry->start) - { - backspace(entry); - return TRUE; - } - else if (strcmp(text, GNT_KEY_CTRL_A) == 0) - { - move_start(entry); - return TRUE; - } - else if (strcmp(text, GNT_KEY_CTRL_B) == 0) - { - move_back(entry); - return TRUE; - } - else if (strcmp(text, GNT_KEY_CTRL_D) == 0) - { - delkey(entry); - return TRUE; - } - else if (strcmp(text, GNT_KEY_CTRL_E) == 0) - { - move_end(entry); - return TRUE; - } - else if (strcmp(text, GNT_KEY_CTRL_F) == 0) - { - move_forward(entry); - return TRUE; - } - else if (strcmp(text, GNT_KEY_CTRL_H) == 0) - { - backspace(entry); - return TRUE; - } - else if (strcmp(text, GNT_KEY_CTRL_K) == 0) - { - entry->end = entry->cursor; - memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); - entry_redraw(widget); - return TRUE; - } - else if (strcmp(text, GNT_KEY_CTRL_U) == 0) - { - memmove(entry->start, entry->cursor, entry->end - entry->cursor); - entry->end -= (entry->cursor - entry->start); - entry->cursor = entry->scroll = entry->start; - memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); - entry_redraw(widget); - return TRUE; - } - } } return FALSE; @@ -503,6 +486,49 @@ parent_class->key_pressed = gnt_entry_key_pressed; parent_class->lost_focus = gnt_entry_lost_focus; + parent_class->actions = g_hash_table_duplicate(parent_class->actions, g_str_hash, + g_str_equal, g_free, (GDestroyNotify)gnt_widget_action_free); + parent_class->bindings = g_hash_table_duplicate(parent_class->bindings, g_str_hash, + g_str_equal, g_free, (GDestroyNotify)gnt_widget_action_param_free); + + gnt_widget_class_register_action(parent_class, "cursor-home", move_start, + GNT_KEY_CTRL_A, NULL); + gnt_widget_register_binding(parent_class, "cursor-home", "\033" GNT_KEY_HOME, NULL); + gnt_widget_class_register_action(parent_class, "cursor-end", move_end, + GNT_KEY_CTRL_E, NULL); + gnt_widget_register_binding(parent_class, "cursor-end", "\033" GNT_KEY_END, NULL); + gnt_widget_class_register_action(parent_class, "delete-prev", backspace, + GNT_KEY_BACKSPACE, NULL); + gnt_widget_class_register_action(parent_class, "delete-next", delkey, + "\033" GNT_KEY_DEL, NULL); + gnt_widget_register_binding(parent_class, "delete-next", GNT_KEY_CTRL_D, NULL); + gnt_widget_class_register_action(parent_class, "delete-start", del_to_home, + GNT_KEY_CTRL_U, NULL); + gnt_widget_class_register_action(parent_class, "delete-end", del_to_end, + GNT_KEY_CTRL_K, NULL); +#if 0 + gnt_widget_class_register_action(parent_class, "delete-prev-word", del_prev_word, + NULL, 1, NULL); + gnt_widget_class_register_action(parent_class, "delete-next-word", del_next_word, + NULL, 1, NULL); +#endif + gnt_widget_class_register_action(parent_class, "cursor-prev", move_back, + "\033" GNT_KEY_LEFT, NULL); + gnt_widget_class_register_action(parent_class, "cursor-next", move_forward, + "\033" GNT_KEY_RIGHT, NULL); + gnt_widget_class_register_action(parent_class, "suggest-show", suggest_show, + "\t", NULL); + gnt_widget_class_register_action(parent_class, "suggest-next", suggest_next, + "\033" GNT_KEY_DOWN, NULL); + gnt_widget_class_register_action(parent_class, "suggest-prev", suggest_prev, + "\033" GNT_KEY_UP, NULL); + gnt_widget_class_register_action(parent_class, "history-prev", history_prev, + "\033" GNT_KEY_CTRL_UP, NULL); + gnt_widget_class_register_action(parent_class, "history-next", history_next, + "\033" GNT_KEY_CTRL_DOWN, NULL); + + gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), klass); + GNTDEBUG; }