Mercurial > pidgin
diff console/libgnt/gnttree.c @ 14343:0387a167f342
[gaim-migrate @ 17044]
A WM can now act on keystrokes. As an example, the sample WM will toggle
the buddylist on pressing Alt+b.
Mouse clicking and scrolling is now supported in most/all widgets.
To use a WM, you need to add "wm=/path/to/wm.so" under [general] in ~/.gntrc.
committer: Tailor Script <tailor@pidgin.im>
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Sat, 26 Aug 2006 12:54:39 +0000 |
parents | f3ef96e8428f |
children | 1bd09d355f9e |
line wrap: on
line diff
--- a/console/libgnt/gnttree.c Sat Aug 26 07:11:55 2006 +0000 +++ b/console/libgnt/gnttree.c Sat Aug 26 12:54:39 2006 +0000 @@ -463,6 +463,34 @@ return g_hash_table_lookup(tree->hash, key); } +static void +action_down(GntTree *tree) +{ + int dist; + GntTreeRow *row = get_next(tree->current); + if (row == NULL) + return; + tree->current = row; + if ((dist = get_distance(tree->current, tree->bottom)) < 0) + gnt_tree_scroll(tree, -dist); + else + redraw_tree(tree); +} + +static void +action_up(GntTree *tree) +{ + int dist; + GntTreeRow *row = get_prev(tree->current); + if (!row) + return; + tree->current = row; + if ((dist = get_distance(tree->current, tree->top)) > 0) + gnt_tree_scroll(tree, -dist); + else + redraw_tree(tree); +} + static gboolean gnt_tree_key_pressed(GntWidget *widget, const char *text) { @@ -473,22 +501,13 @@ if (text[0] == 27) { - if (strcmp(text+1, GNT_KEY_DOWN) == 0 && (row = get_next(tree->current)) != NULL) + if (strcmp(text+1, GNT_KEY_DOWN) == 0) { - tree->current = row; - if ((dist = get_distance(tree->current, tree->bottom)) < 0) - gnt_tree_scroll(tree, -dist); - else - redraw_tree(tree); + action_down(tree); } - else if (strcmp(text+1, GNT_KEY_UP) == 0 && (row = get_prev(tree->current)) != NULL) + else if (strcmp(text+1, GNT_KEY_UP) == 0) { - tree->current = row; - - if ((dist = get_distance(tree->current, tree->top)) > 0) - gnt_tree_scroll(tree, -dist); - else - redraw_tree(tree); + action_up(tree); } else if (strcmp(text+1, GNT_KEY_PGDOWN) == 0) { @@ -592,6 +611,39 @@ g_free(tree->columns); } +static gboolean +gnt_tree_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) +{ + if (event == GNT_MOUSE_SCROLL_UP) { + action_up(GNT_TREE(widget)); + } else if (event == GNT_MOUSE_SCROLL_DOWN) { + action_down(GNT_TREE(widget)); + } else if (event == GNT_LEFT_MOUSE_DOWN) { + GntTreeRow *row; + GntTree *tree = GNT_TREE(widget); + int pos = 1; + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) + pos = 0; + if (tree->show_title) + pos += 2; + pos = y - widget->priv.y - pos; + row = get_next_n(tree->top, pos); + if (row && tree->current != row) { + GntTreeRow *old = tree->current; + tree->current = row; + redraw_tree(tree); + tree_selection_changed(tree, old, tree->current); + } else if (row == tree->current && row->choice) { + row->isselected = !row->isselected; + g_signal_emit(tree, signals[SIG_TOGGLED], 0, row->key); + redraw_tree(tree); + } + } else { + return FALSE; + } + return TRUE; +} + static void gnt_tree_class_init(GntTreeClass *klass) { @@ -601,6 +653,7 @@ parent_class->map = gnt_tree_map; parent_class->size_request = gnt_tree_size_request; parent_class->key_pressed = gnt_tree_key_pressed; + parent_class->clicked = gnt_tree_clicked; signals[SIG_SELECTION_CHANGED] = g_signal_new("selection-changed",