Mercurial > pidgin
comparison 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 |
comparison
equal
deleted
inserted
replaced
14342:12156328fb4f | 14343:0387a167f342 |
---|---|
461 { | 461 { |
462 gpointer key = g_list_nth_data(tree->list, n); | 462 gpointer key = g_list_nth_data(tree->list, n); |
463 return g_hash_table_lookup(tree->hash, key); | 463 return g_hash_table_lookup(tree->hash, key); |
464 } | 464 } |
465 | 465 |
466 static void | |
467 action_down(GntTree *tree) | |
468 { | |
469 int dist; | |
470 GntTreeRow *row = get_next(tree->current); | |
471 if (row == NULL) | |
472 return; | |
473 tree->current = row; | |
474 if ((dist = get_distance(tree->current, tree->bottom)) < 0) | |
475 gnt_tree_scroll(tree, -dist); | |
476 else | |
477 redraw_tree(tree); | |
478 } | |
479 | |
480 static void | |
481 action_up(GntTree *tree) | |
482 { | |
483 int dist; | |
484 GntTreeRow *row = get_prev(tree->current); | |
485 if (!row) | |
486 return; | |
487 tree->current = row; | |
488 if ((dist = get_distance(tree->current, tree->top)) > 0) | |
489 gnt_tree_scroll(tree, -dist); | |
490 else | |
491 redraw_tree(tree); | |
492 } | |
493 | |
466 static gboolean | 494 static gboolean |
467 gnt_tree_key_pressed(GntWidget *widget, const char *text) | 495 gnt_tree_key_pressed(GntWidget *widget, const char *text) |
468 { | 496 { |
469 GntTree *tree = GNT_TREE(widget); | 497 GntTree *tree = GNT_TREE(widget); |
470 GntTreeRow *old = tree->current; | 498 GntTreeRow *old = tree->current; |
471 GntTreeRow *row; | 499 GntTreeRow *row; |
472 int dist; | 500 int dist; |
473 | 501 |
474 if (text[0] == 27) | 502 if (text[0] == 27) |
475 { | 503 { |
476 if (strcmp(text+1, GNT_KEY_DOWN) == 0 && (row = get_next(tree->current)) != NULL) | 504 if (strcmp(text+1, GNT_KEY_DOWN) == 0) |
477 { | 505 { |
478 tree->current = row; | 506 action_down(tree); |
479 if ((dist = get_distance(tree->current, tree->bottom)) < 0) | 507 } |
480 gnt_tree_scroll(tree, -dist); | 508 else if (strcmp(text+1, GNT_KEY_UP) == 0) |
481 else | 509 { |
482 redraw_tree(tree); | 510 action_up(tree); |
483 } | |
484 else if (strcmp(text+1, GNT_KEY_UP) == 0 && (row = get_prev(tree->current)) != NULL) | |
485 { | |
486 tree->current = row; | |
487 | |
488 if ((dist = get_distance(tree->current, tree->top)) > 0) | |
489 gnt_tree_scroll(tree, -dist); | |
490 else | |
491 redraw_tree(tree); | |
492 } | 511 } |
493 else if (strcmp(text+1, GNT_KEY_PGDOWN) == 0) | 512 else if (strcmp(text+1, GNT_KEY_PGDOWN) == 0) |
494 { | 513 { |
495 row = get_next(tree->bottom); | 514 row = get_next(tree->bottom); |
496 if (row) | 515 if (row) |
590 g_free(tree->columns[i].title); | 609 g_free(tree->columns[i].title); |
591 } | 610 } |
592 g_free(tree->columns); | 611 g_free(tree->columns); |
593 } | 612 } |
594 | 613 |
614 static gboolean | |
615 gnt_tree_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) | |
616 { | |
617 if (event == GNT_MOUSE_SCROLL_UP) { | |
618 action_up(GNT_TREE(widget)); | |
619 } else if (event == GNT_MOUSE_SCROLL_DOWN) { | |
620 action_down(GNT_TREE(widget)); | |
621 } else if (event == GNT_LEFT_MOUSE_DOWN) { | |
622 GntTreeRow *row; | |
623 GntTree *tree = GNT_TREE(widget); | |
624 int pos = 1; | |
625 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) | |
626 pos = 0; | |
627 if (tree->show_title) | |
628 pos += 2; | |
629 pos = y - widget->priv.y - pos; | |
630 row = get_next_n(tree->top, pos); | |
631 if (row && tree->current != row) { | |
632 GntTreeRow *old = tree->current; | |
633 tree->current = row; | |
634 redraw_tree(tree); | |
635 tree_selection_changed(tree, old, tree->current); | |
636 } else if (row == tree->current && row->choice) { | |
637 row->isselected = !row->isselected; | |
638 g_signal_emit(tree, signals[SIG_TOGGLED], 0, row->key); | |
639 redraw_tree(tree); | |
640 } | |
641 } else { | |
642 return FALSE; | |
643 } | |
644 return TRUE; | |
645 } | |
646 | |
595 static void | 647 static void |
596 gnt_tree_class_init(GntTreeClass *klass) | 648 gnt_tree_class_init(GntTreeClass *klass) |
597 { | 649 { |
598 parent_class = GNT_WIDGET_CLASS(klass); | 650 parent_class = GNT_WIDGET_CLASS(klass); |
599 parent_class->destroy = gnt_tree_destroy; | 651 parent_class->destroy = gnt_tree_destroy; |
600 parent_class->draw = gnt_tree_draw; | 652 parent_class->draw = gnt_tree_draw; |
601 parent_class->map = gnt_tree_map; | 653 parent_class->map = gnt_tree_map; |
602 parent_class->size_request = gnt_tree_size_request; | 654 parent_class->size_request = gnt_tree_size_request; |
603 parent_class->key_pressed = gnt_tree_key_pressed; | 655 parent_class->key_pressed = gnt_tree_key_pressed; |
656 parent_class->clicked = gnt_tree_clicked; | |
604 | 657 |
605 signals[SIG_SELECTION_CHANGED] = | 658 signals[SIG_SELECTION_CHANGED] = |
606 g_signal_new("selection-changed", | 659 g_signal_new("selection-changed", |
607 G_TYPE_FROM_CLASS(klass), | 660 G_TYPE_FROM_CLASS(klass), |
608 G_SIGNAL_RUN_LAST, | 661 G_SIGNAL_RUN_LAST, |