From: <sa...@us...> - 2006-10-28 15:23:05
|
Revision: 17601 http://svn.sourceforge.net/gaim/?rev=17601&view=rev Author: sadrul Date: 2006-10-28 08:22:30 -0700 (Sat, 28 Oct 2006) Log Message: ----------- Add another action "context-menu" for all widgets. This will allow to popup the context-menu for adding buddies. etc. in the buddylist with some custom binding for keyboards that don't have the menu-key (like the one at my work). Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gntmarshal.c trunk/console/libgnt/gntmarshal.h trunk/console/libgnt/gntwidget.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-10-28 14:24:10 UTC (rev 17600) +++ trunk/console/gntblist.c 2006-10-28 15:22:30 UTC (rev 17601) @@ -1258,6 +1258,13 @@ } static gboolean +context_menu(GntWidget *widget, GGBlist *ggblist) +{ + draw_context_menu(ggblist); + return TRUE; +} + +static gboolean key_pressed(GntWidget *widget, const char *text, GGBlist *ggblist) { gboolean stop = FALSE, ret = FALSE; @@ -1275,17 +1282,8 @@ stop = TRUE; } - if (text[0] == 27) + if (strcmp(text, GNT_KEY_CTRL_O) == 0) { - if (strcmp(text + 1, GNT_KEY_POPUP) == 0) - { - draw_context_menu(ggblist); - stop = TRUE; - ret = TRUE; - } - } - else if (strcmp(text, GNT_KEY_CTRL_O) == 0) - { gaim_prefs_set_bool(PREF_ROOT "/showoffline", !gaim_prefs_get_bool(PREF_ROOT "/showoffline")); ret = TRUE; @@ -1933,6 +1931,7 @@ g_signal_connect(G_OBJECT(ggblist->tree), "selection_changed", G_CALLBACK(selection_changed), ggblist); g_signal_connect(G_OBJECT(ggblist->tree), "key_pressed", G_CALLBACK(key_pressed), ggblist); + g_signal_connect(G_OBJECT(ggblist->tree), "context-menu", G_CALLBACK(context_menu), ggblist); g_signal_connect_after(G_OBJECT(ggblist->tree), "clicked", G_CALLBACK(blist_clicked), ggblist); g_signal_connect(G_OBJECT(ggblist->tree), "activate", G_CALLBACK(selection_activate), ggblist); g_signal_connect_data(G_OBJECT(ggblist->tree), "gained-focus", G_CALLBACK(draw_tooltip), Modified: trunk/console/libgnt/gntmarshal.c =================================================================== --- trunk/console/libgnt/gntmarshal.c 2006-10-28 14:24:10 UTC (rev 17600) +++ trunk/console/libgnt/gntmarshal.c 2006-10-28 15:22:30 UTC (rev 17601) @@ -1,5 +1,37 @@ #include "gntmarshal.h" +void gnt_closure_marshal_BOOLEAN__VOID(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef gboolean (*func) (gpointer data1, gpointer data2); + register func callback; + register GCClosure *cc = (GCClosure*)closure; + register gpointer data1, data2; + gboolean ret; + + g_return_if_fail(ret_value != NULL); + g_return_if_fail(n_param_values == 1); + + if (G_CCLOSURE_SWAP_DATA(closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer(param_values + 0); + } + else + { + data1 = g_value_peek_pointer(param_values + 0); + data2 = closure->data; + } + + callback = (func) (marshal_data ? marshal_data : cc->callback); + ret = callback(data1, data2); + g_value_set_boolean(ret_value, ret); +} + void gnt_closure_marshal_BOOLEAN__STRING(GClosure *closure, GValue *ret_value, guint n_param_values, Modified: trunk/console/libgnt/gntmarshal.h =================================================================== --- trunk/console/libgnt/gntmarshal.h 2006-10-28 14:24:10 UTC (rev 17600) +++ trunk/console/libgnt/gntmarshal.h 2006-10-28 15:22:30 UTC (rev 17601) @@ -1,5 +1,12 @@ #include "gntwidget.h" +void gnt_closure_marshal_BOOLEAN__VOID(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + void gnt_closure_marshal_BOOLEAN__STRING(GClosure *closure, GValue *ret_value, guint n_param_values, Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-10-28 14:24:10 UTC (rev 17600) +++ trunk/console/libgnt/gntwidget.c 2006-10-28 15:22:30 UTC (rev 17601) @@ -21,6 +21,7 @@ SIG_SIZE_CHANGED, SIG_POSITION, SIG_CLICKED, + SIG_CONTEXT_MENU, SIGS }; @@ -83,6 +84,14 @@ } static gboolean +context_menu(GntWidget *widget, GList *null) +{ + gboolean ret = FALSE; + g_signal_emit(widget, signals[SIG_CONTEXT_MENU], 0, &ret); + return ret; +} + +static gboolean gnt_boolean_handled_accumulator(GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, @@ -234,11 +243,24 @@ gnt_closure_marshal_BOOLEAN__INT_INT_INT, G_TYPE_BOOLEAN, 3, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); + signals[SIG_CONTEXT_MENU] = + g_signal_new("context-menu", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + 0, + gnt_boolean_handled_accumulator, NULL, + gnt_closure_marshal_BOOLEAN__VOID, + G_TYPE_BOOLEAN, 0); + klass->actions = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)gnt_widget_action_free); klass->bindings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)gnt_widget_action_param_free); + /* This is relevant for all widgets */ + gnt_widget_class_register_action(klass, "context-menu", context_menu, + "\033" GNT_KEY_POPUP, NULL); + gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), klass); GNTDEBUG; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-10-28 22:15:08
|
Revision: 17612 http://svn.sourceforge.net/gaim/?rev=17612&view=rev Author: sadrul Date: 2006-10-28 15:14:52 -0700 (Sat, 28 Oct 2006) Log Message: ----------- Add a 'MenuItemCheck' thing. Use GntMenu for the context-menu in the buddylist. This patch has 666 lines ... but I'm sure it's a good patch! Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/Makefile.am trunk/console/libgnt/gntmenu.c trunk/console/libgnt/gntmenuitem.h trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h trunk/console/plugins/gntgf.c Added Paths: ----------- trunk/console/libgnt/gntmenuitemcheck.c trunk/console/libgnt/gntmenuitemcheck.h Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-10-28 20:38:25 UTC (rev 17611) +++ trunk/console/gntblist.c 2006-10-28 22:14:52 UTC (rev 17612) @@ -39,6 +39,9 @@ #include "gntentry.h" #include "gntlabel.h" #include "gntline.h" +#include "gntmenu.h" +#include "gntmenuitem.h" +#include "gntmenuitemcheck.h" #include "gnttree.h" #include "gntwindow.h" @@ -597,29 +600,39 @@ } static void -remove_context_menu(GGBlist *ggblist) +context_menu_callback(GntMenuItem *item, gpointer data) { - if (ggblist->context) - gnt_widget_destroy(ggblist->context->parent); - ggblist->context = NULL; - ggblist->cnode = NULL; + GaimMenuAction *action = data; + GaimBlistNode *node = ggblist->cnode; + if (action) { + void (*callback)(GaimBlistNode *, gpointer); + callback = (void (*)(GaimBlistNode *, gpointer))action->callback; + if (callback) + callback(action->data, node); + else + return; + } } static void -gnt_append_menu_action(GntTree *tree, GaimMenuAction *action, gpointer parent) +gnt_append_menu_action(GntMenu *menu, GaimMenuAction *action, gpointer parent) { GList *list; + GntMenuItem *item; + if (action == NULL) return; - gnt_tree_add_row_last(tree, action, - gnt_tree_create_row(tree, action->label), parent); + item = gnt_menuitem_new(action->label); + gnt_menuitem_set_callback(GNT_MENUITEM(item), context_menu_callback, action); + gnt_menu_add_item(menu, GNT_MENUITEM(item)); + for (list = action->children; list; list = list->next) - gnt_append_menu_action(tree, list->data, action); + gnt_append_menu_action(menu, list->data, action); } static void -append_proto_menu(GntTree *tree, GaimConnection *gc, GaimBlistNode *node) +append_proto_menu(GntMenu *menu, GaimConnection *gc, GaimBlistNode *node) { GList *list; GaimPluginProtocolInfo *prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); @@ -632,28 +645,21 @@ { GaimMenuAction *act = (GaimMenuAction *) list->data; act->data = node; - gnt_append_menu_action(tree, act, NULL); + gnt_append_menu_action(menu, act, NULL); } } static void -add_custom_action(GntTree *tree, const char *label, GaimCallback callback, +add_custom_action(GntMenu *menu, const char *label, GaimCallback callback, gpointer data) { GaimMenuAction *action = gaim_menu_action_new(label, callback, data, NULL); - gnt_append_menu_action(tree, action, NULL); - g_signal_connect_swapped(G_OBJECT(tree), "destroy", + gnt_append_menu_action(menu, action, NULL); + g_signal_connect_swapped(G_OBJECT(menu), "destroy", G_CALLBACK(gaim_menu_action_free), action); } static void -context_menu_toggle(GntTree *tree, GaimMenuAction *action, gpointer null) -{ - gboolean sel = gnt_tree_get_choice(tree, action); - gaim_blist_node_set_bool(action->data, "gnt-autojoin", sel); -} - -static void chat_components_edit_ok(GaimChat *chat, GaimRequestFields *allfields) { GList *groups, *fields; @@ -713,19 +719,26 @@ } static void -create_chat_menu(GntTree *tree, GaimChat *chat) +autojoin_toggled(GntMenuItem *item, gpointer data) { - GaimMenuAction *action = gaim_menu_action_new(_("Auto-join"), NULL, chat, NULL); + GaimMenuAction *action = data; + gaim_blist_node_set_bool(action->data, "gnt-autojoin", + gnt_menuitem_check_get_checked(GNT_MENUITEM_CHECK(item))); +} - gnt_tree_add_choice(tree, action, gnt_tree_create_row(tree, action->label), NULL, NULL); - gnt_tree_set_choice(tree, action, gaim_blist_node_get_bool((GaimBlistNode*)chat, "gnt-autojoin")); - - g_signal_connect_swapped(G_OBJECT(tree), "destroy", +static void +create_chat_menu(GntMenu *menu, GaimChat *chat) +{ + GaimMenuAction *action = gaim_menu_action_new(_("Auto-join"), NULL, chat, NULL); + GntMenuItem *check = gnt_menuitem_check_new(action->label); + gnt_menuitem_check_set_checked(GNT_MENUITEM_CHECK(check), + gaim_blist_node_get_bool((GaimBlistNode*)chat, "gnt-autojoin")); + gnt_menu_add_item(menu, check); + gnt_menuitem_set_callback(check, autojoin_toggled, action); + g_signal_connect_swapped(G_OBJECT(menu), "destroy", G_CALLBACK(gaim_menu_action_free), action); - add_custom_action(tree, _("Edit Settings"), (GaimCallback)chat_components_edit, chat); - - g_signal_connect(G_OBJECT(tree), "toggled", G_CALLBACK(context_menu_toggle), NULL); + add_custom_action(menu, _("Edit Settings"), (GaimCallback)chat_components_edit, chat); } static void @@ -747,13 +760,13 @@ } static void -create_group_menu(GntTree *tree, GaimGroup *group) +create_group_menu(GntMenu *menu, GaimGroup *group) { - add_custom_action(tree, _("Add Buddy"), + add_custom_action(menu, _("Add Buddy"), GAIM_CALLBACK(gg_add_buddy), group); - add_custom_action(tree, _("Add Chat"), + add_custom_action(menu, _("Add Chat"), GAIM_CALLBACK(gg_add_chat), group); - add_custom_action(tree, _("Add Group"), + add_custom_action(menu, _("Add Group"), GAIM_CALLBACK(gg_add_group), group); } @@ -764,14 +777,14 @@ } static void -create_buddy_menu(GntTree *tree, GaimBuddy *buddy) +create_buddy_menu(GntMenu *menu, GaimBuddy *buddy) { GaimPluginProtocolInfo *prpl_info; prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(buddy->account->gc->prpl); if (prpl_info && prpl_info->get_info) { - add_custom_action(tree, _("Get Info"), + add_custom_action(menu, _("Get Info"), GAIM_CALLBACK(gg_blist_get_buddy_info_cb), buddy); } @@ -792,42 +805,23 @@ #endif /* Protocol actions */ - append_proto_menu(tree, + append_proto_menu(menu, gaim_account_get_connection(gaim_buddy_get_account(buddy)), (GaimBlistNode*)buddy); } static void -append_extended_menu(GntTree *tree, GaimBlistNode *node) +append_extended_menu(GntMenu *menu, GaimBlistNode *node) { GList *iter; for (iter = gaim_blist_node_get_extended_menu(node); iter; iter = g_list_delete_link(iter, iter)) { - gnt_append_menu_action(tree, iter->data, NULL); + gnt_append_menu_action(menu, iter->data, NULL); } } -static void -context_menu_callback(GntTree *tree, GGBlist *ggblist) -{ - GaimMenuAction *action = gnt_tree_get_selection_data(tree); - GaimBlistNode *node = ggblist->cnode; - - if (action) - { - void (*callback)(GaimBlistNode *, gpointer); - callback = (void (*)(GaimBlistNode *, gpointer))action->callback; - if (callback) - callback(action->data, node); - else - return; - } - - remove_context_menu(ggblist); -} - /* Xerox'd from gtkdialogs.c:gaim_gtkdialogs_remove_contact_cb */ static void remove_contact(GaimContact *contact) @@ -1007,79 +1001,71 @@ } static void +context_menu_destroyed(GntWidget *widget, GGBlist *ggblist) +{ + ggblist->context = NULL; +} + +static void draw_context_menu(GGBlist *ggblist) { GaimBlistNode *node = NULL; - GntWidget *context = NULL, *window = NULL; + GntWidget *context = NULL; GntTree *tree = NULL; int x, y, top, width; char *title = NULL; tree = GNT_TREE(ggblist->tree); - if (ggblist->context) - { - remove_context_menu(ggblist); - } - node = gnt_tree_get_selection_data(tree); if (ggblist->tooltip) remove_tooltip(ggblist); ggblist->cnode = node; - ggblist->context = context = gnt_tree_new(); - GNT_WIDGET_SET_FLAGS(context, GNT_WIDGET_NO_BORDER); - gnt_widget_set_name(context, "context menu"); - g_signal_connect(G_OBJECT(context), "activate", G_CALLBACK(context_menu_callback), ggblist); + ggblist->context = context = gnt_menu_new(GNT_MENU_POPUP); + g_signal_connect(G_OBJECT(context), "destroy", G_CALLBACK(context_menu_destroyed), ggblist); + if (!node) { - create_group_menu(GNT_TREE(context), NULL); + create_group_menu(GNT_MENU(context), NULL); title = g_strdup(_("Buddy List")); } else if (GAIM_BLIST_NODE_IS_CONTACT(node)) { - create_buddy_menu(GNT_TREE(context), + create_buddy_menu(GNT_MENU(context), gaim_contact_get_priority_buddy((GaimContact*)node)); title = g_strdup(gaim_contact_get_alias((GaimContact*)node)); } else if (GAIM_BLIST_NODE_IS_BUDDY(node)) { GaimBuddy *buddy = (GaimBuddy *)node; - create_buddy_menu(GNT_TREE(context), buddy); + create_buddy_menu(GNT_MENU(context), buddy); title = g_strdup(gaim_buddy_get_name(buddy)); } else if (GAIM_BLIST_NODE_IS_CHAT(node)) { GaimChat *chat = (GaimChat*)node; - create_chat_menu(GNT_TREE(context), chat); + create_chat_menu(GNT_MENU(context), chat); title = g_strdup(gaim_chat_get_name(chat)); } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { GaimGroup *group = (GaimGroup *)node; - create_group_menu(GNT_TREE(context), group); + create_group_menu(GNT_MENU(context), group); title = g_strdup(group->name); } - append_extended_menu(GNT_TREE(context), node); + append_extended_menu(GNT_MENU(context), node); /* These are common for everything */ if (node) { - add_custom_action(GNT_TREE(context), _("Rename"), + add_custom_action(GNT_MENU(context), _("Rename"), GAIM_CALLBACK(gg_blist_rename_node_cb), node); - add_custom_action(GNT_TREE(context), _("Remove"), + add_custom_action(GNT_MENU(context), _("Remove"), GAIM_CALLBACK(gg_blist_remove_node_cb), node); if (ggblist->tagged && (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_GROUP(node))) { - add_custom_action(GNT_TREE(context), _("Place tagged"), + add_custom_action(GNT_MENU(context), _("Place tagged"), GAIM_CALLBACK(gg_blist_place_tagged), node); } else if (GAIM_BLIST_NODE_IS_BUDDY(node)) { - add_custom_action(GNT_TREE(context), _("Tag"), + add_custom_action(GNT_MENU(context), _("Tag"), GAIM_CALLBACK(gg_blist_tag_buddy), node); } } - window = gnt_vbox_new(FALSE); - GNT_WIDGET_SET_FLAGS(window, GNT_WIDGET_TRANSIENT); - gnt_box_set_toplevel(GNT_BOX(window), TRUE); - gnt_box_set_title(GNT_BOX(window), title); - - gnt_widget_set_size(context, 0, g_list_length(GNT_TREE(context)->list)); - gnt_box_add_widget(GNT_BOX(window), context); - /* Set the position for the popup */ gnt_widget_get_position(GNT_WIDGET(tree), &x, &y); gnt_widget_get_size(GNT_WIDGET(tree), &width, NULL); @@ -1088,8 +1074,8 @@ x += width; y += top - 1; - gnt_widget_set_position(window, x, y); - gnt_widget_draw(window); + gnt_widget_set_position(context, x, y); + gnt_screen_menu_show(GNT_MENU(context)); g_free(title); } @@ -1151,9 +1137,6 @@ if (!gnt_widget_has_focus(ggblist->tree)) return; - if (ggblist->context) - return; - if (ggblist->tooltip) { /* XXX: Once we can properly redraw on expose events, this can be removed at the end @@ -1252,8 +1235,6 @@ static void selection_changed(GntWidget *widget, gpointer old, gpointer current, GGBlist *ggblist) { - if (ggblist->context) - remove_context_menu(ggblist); draw_tooltip(ggblist); } @@ -1276,12 +1257,6 @@ ret = TRUE; } - if (ggblist->context) - { - ret = gnt_widget_key_pressed(ggblist->context, text); - stop = TRUE; - } - if (strcmp(text, GNT_KEY_CTRL_O) == 0) { gaim_prefs_set_bool(PREF_ROOT "/showoffline", @@ -1336,7 +1311,7 @@ if (ggblist->tooltip) remove_tooltip(ggblist); else if (ggblist->context) - remove_context_menu(ggblist); + gnt_widget_destroy(ggblist->context); } static void Modified: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am 2006-10-28 20:38:25 UTC (rev 17611) +++ trunk/console/libgnt/Makefile.am 2006-10-28 22:14:52 UTC (rev 17612) @@ -18,6 +18,7 @@ gntmarshal.c \ gntmenu.c \ gntmenuitem.c \ + gntmenuitemcheck.c \ gntstyle.c \ gnttextview.c \ gnttree.c \ @@ -39,6 +40,7 @@ gntmarshal.h \ gntmenu.h \ gntmenuitem.h \ + gntmenuitemcheck.h \ gntstyle.h \ gnttextview.h \ gnttree.h \ Modified: trunk/console/libgnt/gntmenu.c =================================================================== --- trunk/console/libgnt/gntmenu.c 2006-10-28 20:38:25 UTC (rev 17611) +++ trunk/console/libgnt/gntmenu.c 2006-10-28 22:14:52 UTC (rev 17612) @@ -1,4 +1,5 @@ #include "gntmenu.h" +#include "gntmenuitemcheck.h" #include <string.h> @@ -60,8 +61,14 @@ static void menu_tree_add(GntMenu *menu, GntMenuItem *item, GntMenuItem *parent) { - gnt_tree_add_row_last(GNT_TREE(menu), item, - gnt_tree_create_row(GNT_TREE(menu), item->text, item->submenu ? ">" : " "), parent); + if (GNT_IS_MENUITEM_CHECK(item)) { + gnt_tree_add_choice(GNT_TREE(menu), item, + gnt_tree_create_row(GNT_TREE(menu), item->text, " "), parent, NULL); + gnt_tree_set_choice(GNT_TREE(menu), item, gnt_menuitem_check_get_checked(GNT_MENUITEM_CHECK(item))); + } else + gnt_tree_add_row_last(GNT_TREE(menu), item, + gnt_tree_create_row(GNT_TREE(menu), item->text, item->submenu ? ">" : " "), parent); + if (0 && item->submenu) { GntMenu *sub = GNT_MENU(item->submenu); GList *iter; @@ -126,8 +133,6 @@ int current = menu->selected; if (menu->submenu) { - /*if (gnt_widget_key_pressed(GNT_WIDGET(menu->submenu), text))*/ - /*return TRUE;*/ return (gnt_widget_key_pressed(GNT_WIDGET(menu->submenu), text)); } @@ -178,6 +183,21 @@ } static void +gnt_menu_toggled(GntTree *tree, gpointer key) +{ + GntMenuItem *item = GNT_MENUITEM(key); + GntMenu *menu = GNT_MENU(tree); + gboolean check = gnt_menuitem_check_get_checked(GNT_MENUITEM_CHECK(item)); + gnt_menuitem_check_set_checked(GNT_MENUITEM_CHECK(item), !check); + if (item->callback) + item->callback(item, item->callbackdata); + while (menu) { + gnt_widget_hide(GNT_WIDGET(menu)); + menu = menu->parentmenu; + } +} + +static void gnt_menu_activate(GntWidget *widget) { GntMenu *menu = GNT_MENU(widget); @@ -189,8 +209,12 @@ item = gnt_tree_get_selection_data(GNT_TREE(menu)); } - if (item) - menuitem_activate(menu, item); + if (item) { + if (GNT_MENUITEM_CHECK(item)) + gnt_menu_toggled(GNT_TREE(widget), item); + else + menuitem_activate(menu, item); + } } static void @@ -220,6 +244,8 @@ wid_class->activate = gnt_menu_activate; wid_class->hide = gnt_menu_hide; + parent_class->toggled = gnt_menu_toggled; + GNTDEBUG; } Modified: trunk/console/libgnt/gntmenuitem.h =================================================================== --- trunk/console/libgnt/gntmenuitem.h 2006-10-28 20:38:25 UTC (rev 17611) +++ trunk/console/libgnt/gntmenuitem.h 2006-10-28 22:14:52 UTC (rev 17612) @@ -19,6 +19,8 @@ typedef struct _GnMenuItemPriv GntMenuItemPriv; typedef struct _GnMenuItemClass GntMenuItemClass; +#include "gntmenu.h" + struct _GnMenuItemPriv { /* These will be used to determine the position of the submenu */ Added: trunk/console/libgnt/gntmenuitemcheck.c =================================================================== --- trunk/console/libgnt/gntmenuitemcheck.c (rev 0) +++ trunk/console/libgnt/gntmenuitemcheck.c 2006-10-28 22:14:52 UTC (rev 17612) @@ -0,0 +1,67 @@ +#include "gntmenuitemcheck.h" + +static GntMenuItemClass *parent_class = NULL; + +static void +gnt_menuitem_check_class_init(GntMenuItemCheckClass *klass) +{ + parent_class = GNT_MENUITEM_CLASS(klass); + + GNTDEBUG; +} + +static void +gnt_menuitem_check_init(GTypeInstance *instance, gpointer class) +{ + GNTDEBUG; +} + +/****************************************************************************** + * GntMenuItemCheck API + *****************************************************************************/ +GType +gnt_menuitem_check_get_gtype(void) +{ + static GType type = 0; + + if(type == 0) + { + static const GTypeInfo info = { + sizeof(GntMenuItemCheckClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc)gnt_menuitem_check_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof(GntMenuItemCheck), + 0, /* n_preallocs */ + gnt_menuitem_check_init, /* instance_init */ + }; + + type = g_type_register_static(GNT_TYPE_MENUITEM, + "GntMenuItemCheck", + &info, 0); + } + + return type; +} + +GntMenuItem *gnt_menuitem_check_new(const char *text) +{ + GntMenuItem *item = g_object_new(GNT_TYPE_MENUITEM_CHECK, NULL); + GntMenuItem *menuitem = GNT_MENUITEM(item); + + menuitem->text = g_strdup(text); + return item; +} + +gboolean gnt_menuitem_check_get_checked(GntMenuItemCheck *item) +{ + return item->checked; +} + +void gnt_menuitem_check_set_checked(GntMenuItemCheck *item, gboolean set) +{ + item->checked = set; +} + Property changes on: trunk/console/libgnt/gntmenuitemcheck.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/gntmenuitemcheck.h =================================================================== --- trunk/console/libgnt/gntmenuitemcheck.h (rev 0) +++ trunk/console/libgnt/gntmenuitemcheck.h 2006-10-28 22:14:52 UTC (rev 17612) @@ -0,0 +1,52 @@ +#ifndef GNT_MENUITEM_CHECK_H +#define GNT_MENUITEM_CHECK_H + +#include "gnt.h" +#include "gntcolors.h" +#include "gntkeys.h" +#include "gntmenuitem.h" + +#define GNT_TYPE_MENUITEM_CHECK (gnt_menuitem_check_get_gtype()) +#define GNT_MENUITEM_CHECK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_MENUITEM_CHECK, GntMenuItemCheck)) +#define GNT_MENUITEM_CHECK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_MENUITEM_CHECK, GntMenuItemCheckClass)) +#define GNT_IS_MENUITEM_CHECK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNT_TYPE_MENUITEM_CHECK)) +#define GNT_IS_MENUITEM_CHECK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_MENUITEM_CHECK)) +#define GNT_MENUITEM_CHECK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_MENUITEM_CHECK, GntMenuItemCheckClass)) + +#define GNT_MENUITEM_CHECK_FLAGS(obj) (GNT_MENUITEM_CHECK(obj)->priv.flags) +#define GNT_MENUITEM_CHECK_SET_FLAGS(obj, flags) (GNT_MENUITEM_CHECK_FLAGS(obj) |= flags) +#define GNT_MENUITEM_CHECK_UNSET_FLAGS(obj, flags) (GNT_MENUITEM_CHECK_FLAGS(obj) &= ~(flags)) + +typedef struct _GnMenuItemCheck GntMenuItemCheck; +typedef struct _GnMenuItemCheckPriv GntMenuItemCheckPriv; +typedef struct _GnMenuItemCheckClass GntMenuItemCheckClass; + +struct _GnMenuItemCheck +{ + GntMenuItem parent; + gboolean checked; +}; + +struct _GnMenuItemCheckClass +{ + GntMenuItemClass parent; + + void (*gnt_reserved1)(void); + void (*gnt_reserved2)(void); + void (*gnt_reserved3)(void); + void (*gnt_reserved4)(void); +}; + +G_BEGIN_DECLS + +GType gnt_menuitem_check_get_gtype(void); + +GntMenuItem *gnt_menuitem_check_new(const char *text); + +gboolean gnt_menuitem_check_get_checked(GntMenuItemCheck *item); + +void gnt_menuitem_check_set_checked(GntMenuItemCheck *item, gboolean set); + +G_END_DECLS + +#endif /* GNT_MENUITEM_CHECK_H */ Property changes on: trunk/console/libgnt/gntmenuitemcheck.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-10-28 20:38:25 UTC (rev 17611) +++ trunk/console/libgnt/gnttree.c 2006-10-28 22:14:52 UTC (rev 17612) @@ -691,7 +691,7 @@ g_signal_new("toggled", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - 0, + G_STRUCT_OFFSET(GntTreeClass, toggled), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-10-28 20:38:25 UTC (rev 17611) +++ trunk/console/libgnt/gnttree.h 2006-10-28 22:14:52 UTC (rev 17612) @@ -56,6 +56,7 @@ GntWidgetClass parent; void (*selection_changed)(GntTreeRow *old, GntTreeRow * current); + void (*toggled)(GntTree *tree, gpointer key); void (*gnt_reserved1)(void); void (*gnt_reserved2)(void); Modified: trunk/console/plugins/gntgf.c =================================================================== --- trunk/console/plugins/gntgf.c 2006-10-28 20:38:25 UTC (rev 17611) +++ trunk/console/plugins/gntgf.c 2006-10-28 22:14:52 UTC (rev 17612) @@ -354,8 +354,8 @@ "gntgf", N_("GntGf"), VERSION, - N_("Toaster plugin for GntGaim."), - N_("Toaster plugin for GntGaim."), + N_("Toaster plugin for Gaim-Text."), + N_("Toaster plugin for Gaim-Text."), "Sadrul H Chowdhury <sa...@us...>", "http://gaim.sourceforge.net", plugin_load, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-10-29 01:32:17
|
Revision: 17615 http://svn.sourceforge.net/gaim/?rev=17615&view=rev Author: sadrul Date: 2006-10-28 18:32:04 -0700 (Sat, 28 Oct 2006) Log Message: ----------- Patch from Richard Nelson (wabz) to fix the blist-width, and do ellipsization in the trees. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gntbox.c trunk/console/libgnt/gnttree.c trunk/console/plugins/gnthistory.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-10-29 00:15:32 UTC (rev 17614) +++ trunk/console/gntblist.c 2006-10-29 01:32:04 UTC (rev 17615) @@ -1315,10 +1315,13 @@ } static void -size_changed_cb(GntWidget *w, int width, int height) +size_changed_cb(GntWidget *w, int wi, int h) { + int width, height; + gnt_widget_get_size(w, &width, &height); gaim_prefs_set_int(PREF_ROOT "/size/width", width); gaim_prefs_set_int(PREF_ROOT "/size/height", height); + gnt_tree_set_col_width(GNT_TREE(ggblist->tree), 0, width - 1); } static void @@ -1864,12 +1867,14 @@ ggblist->tree = gnt_tree_new(); GNT_WIDGET_SET_FLAGS(ggblist->tree, GNT_WIDGET_NO_BORDER); - gnt_tree_set_col_width(GNT_TREE(ggblist->tree), 0, 25); gnt_widget_set_size(ggblist->tree, gaim_prefs_get_int(PREF_ROOT "/size/width"), gaim_prefs_get_int(PREF_ROOT "/size/height")); gnt_widget_set_position(ggblist->window, gaim_prefs_get_int(PREF_ROOT "/position/x"), gaim_prefs_get_int(PREF_ROOT "/position/y")); + gnt_tree_set_col_width(GNT_TREE(ggblist->tree), 0, + gaim_prefs_get_int(PREF_ROOT "/size/width") - 1); + gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->tree); ggblist->status = gnt_combo_box_new(); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-10-29 00:15:32 UTC (rev 17614) +++ trunk/console/libgnt/gntbox.c 2006-10-29 01:32:04 UTC (rev 17615) @@ -704,6 +704,9 @@ GntWidget *wid; int width, height; + if (GNT_WIDGET(box)->parent != NULL) + return; + for (iter = box->list; iter; iter = iter->next) { GntWidget *w = iter->data; Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-10-29 00:15:32 UTC (rev 17614) +++ trunk/console/libgnt/gnttree.c 2006-10-29 01:32:04 UTC (rev 17615) @@ -200,6 +200,7 @@ const char *text; int len = gnt_util_onscreen_width(col->text, NULL); int fl = 0; + gboolean cut = FALSE; if (i == 0) { @@ -231,13 +232,20 @@ else g_string_append_c(string, '|'); - if (len > tree->columns[i].width) - { - len = tree->columns[i].width; + if (len > tree->columns[i].width) { + len = tree->columns[i].width - 1; + cut = TRUE; } - text = gnt_util_onscreen_width_to_pointer(col->text, len - fl, NULL); string = g_string_append_len(string, col->text, text - col->text); + if (cut) { /* ellipsis */ + if (gnt_ascii_only()) + g_string_append_c(string, '~'); + else + string = g_string_append(string, "\342\200\246"); + len++; + } + if (len < tree->columns[i].width && iter->next) g_string_append_printf(string, "%*s", tree->columns[i].width - len, ""); } @@ -339,7 +347,6 @@ if ((wr = gnt_util_onscreen_width(str, NULL)) > scrcol) { - /* XXX: ellipsize */ char *s = (char*)gnt_util_onscreen_width_to_pointer(str, scrcol, &wr); *s = '\0'; } Modified: trunk/console/plugins/gnthistory.c =================================================================== --- trunk/console/plugins/gnthistory.c 2006-10-29 00:15:32 UTC (rev 17614) +++ trunk/console/plugins/gnthistory.c 2006-10-29 01:32:04 UTC (rev 17615) @@ -21,7 +21,6 @@ /* Ripped from gtk/plugins/history.c */ #include "internal.h" -#include "gntgaim.h" #include "conversation.h" #include "debug.h" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-10-29 03:43:29
|
Revision: 17616 http://svn.sourceforge.net/gaim/?rev=17616&view=rev Author: sadrul Date: 2006-10-28 20:43:15 -0700 (Sat, 28 Oct 2006) Log Message: ----------- Fix bug #1582629. The terminal should now always go back to normal state after quitting from gaim-text. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntgaim.c trunk/console/gntui.c trunk/console/gntui.h trunk/console/libgnt/gntwidget.c trunk/console/libgnt/wms/s.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-10-29 01:32:04 UTC (rev 17615) +++ trunk/console/gntblist.c 2006-10-29 03:43:15 UTC (rev 17616) @@ -101,6 +101,7 @@ static void remove_peripherals(GGBlist *ggblist); static const char * get_display_name(GaimBlistNode *node); static void savedstatus_changed(GaimSavedStatus *now, GaimSavedStatus *old); +static void blist_show(GaimBuddyList *list); /* Sort functions */ static int blist_node_compare_text(GaimBlistNode *n1, GaimBlistNode *n2); @@ -228,6 +229,11 @@ static void new_list(GaimBuddyList *list) { + if (ggblist) + return; + + ggblist = g_new0(GGBlist, 1); + list->ui_data = ggblist; } static void @@ -398,7 +404,7 @@ { new_list, new_node, - NULL, + blist_show, node_update, node_remove, NULL, @@ -1470,8 +1476,6 @@ gaim_prefs_add_bool(PREF_ROOT "/showoffline", FALSE); gaim_prefs_add_string(PREF_ROOT "/sort_type", "text"); - gg_blist_show(); - gaim_prefs_connect_callback(gg_blist_get_handle(), PREF_ROOT "/showoffline", redraw_blist, NULL); gaim_prefs_connect_callback(gg_blist_get_handle(), @@ -1851,13 +1855,17 @@ void gg_blist_show() { - if (ggblist) + blist_show(gaim_get_blist()); +} + +static void +blist_show(GaimBuddyList *list) +{ + if (ggblist == NULL) + new_list(list); + else if (ggblist->window) return; - ggblist = g_new0(GGBlist, 1); - - gaim_get_blist()->ui_data = ggblist; - ggblist->window = gnt_vwindow_new(FALSE); gnt_widget_set_name(ggblist->window, "buddylist"); gnt_box_set_toplevel(GNT_BOX(ggblist->window), TRUE); Modified: trunk/console/gntgaim.c =================================================================== --- trunk/console/gntgaim.c 2006-10-29 01:32:04 UTC (rev 17615) +++ trunk/console/gntgaim.c 2006-10-29 03:43:15 UTC (rev 17616) @@ -57,8 +57,8 @@ { gg_prefs_init, debug_init, - NULL, /*gaim_gtk_ui_init,*/ - NULL, /*gaim_gtk_quit*/ + gnt_ui_init, + gnt_ui_uninit }; static GaimCoreUiOps * @@ -332,8 +332,9 @@ if (!init_libgaim(argc, argv)) return 0; - /* Initialize and run the UI */ - init_gnt_ui(); + gaim_blist_show(); + gnt_main(); + #ifdef STANDALONE gaim_core_quit(); #endif Modified: trunk/console/gntui.c =================================================================== --- trunk/console/gntui.c 2006-10-29 01:32:04 UTC (rev 17615) +++ trunk/console/gntui.c 2006-10-29 03:43:15 UTC (rev 17616) @@ -36,7 +36,7 @@ #include <prefs.h> -void init_gnt_ui() +void gnt_ui_init() { #ifdef STANDALONE gnt_init(); @@ -77,9 +77,10 @@ #ifdef STANDALONE gg_plugins_save_loaded(); +} - gnt_main(); - +void gnt_ui_uninit() +{ gaim_accounts_set_ui_ops(NULL); gg_accounts_uninit(); Modified: trunk/console/gntui.h =================================================================== --- trunk/console/gntui.h 2006-10-29 01:32:04 UTC (rev 17615) +++ trunk/console/gntui.h 2006-10-29 03:43:15 UTC (rev 17616) @@ -24,6 +24,7 @@ #include "gnt.h" -void init_gnt_ui(void); +void gnt_ui_init(void); +void gnt_ui_uninit(void); #endif Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-10-29 01:32:04 UTC (rev 17615) +++ trunk/console/libgnt/gntwidget.c 2006-10-29 03:43:15 UTC (rev 17616) @@ -581,6 +581,10 @@ width--; height--; } + if (width <= 0) + width = widget->priv.width; + if (height <= 0) + height = widget->priv.height; if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) { Modified: trunk/console/libgnt/wms/s.c =================================================================== --- trunk/console/libgnt/wms/s.c 2006-10-29 01:32:04 UTC (rev 17615) +++ trunk/console/libgnt/wms/s.c 2006-10-29 03:43:15 UTC (rev 17616) @@ -76,7 +76,7 @@ gnt_widget_set_position(win, x, y); mvwin(win->window, y, x); - gnt_widget_set_size(win, w, h); + gnt_widget_set_size(win, -1, h); gnt_widget_draw(win); envelope_buddylist(win); } else if (name && strcmp(name, "conversation-window") == 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-10-30 21:48:49
|
Revision: 17630 http://svn.sourceforge.net/gaim/?rev=17630&view=rev Author: sadrul Date: 2006-10-30 13:48:42 -0800 (Mon, 30 Oct 2006) Log Message: ----------- Remember the size of the debug window, and remember the correct size of the conversation windows after resizing. Modified Paths: -------------- trunk/console/gntconv.c trunk/console/gntdebug.c Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-10-30 05:27:31 UTC (rev 17629) +++ trunk/console/gntconv.c 2006-10-30 21:48:42 UTC (rev 17630) @@ -157,10 +157,12 @@ } static void -size_changed_cb(GntWidget *w, int width, int height) +size_changed_cb(GntWidget *widget, int width, int height) { - gaim_prefs_set_int(PREF_ROOT "/size/width", width); - gaim_prefs_set_int(PREF_ROOT "/size/height", height); + int w, h; + gnt_widget_get_size(widget, &w, &h); + gaim_prefs_set_int(PREF_ROOT "/size/width", w); + gaim_prefs_set_int(PREF_ROOT "/size/height", h); } static void Modified: trunk/console/gntdebug.c =================================================================== --- trunk/console/gntdebug.c 2006-10-30 05:27:31 UTC (rev 17629) +++ trunk/console/gntdebug.c 2006-10-30 21:48:42 UTC (rev 17630) @@ -36,6 +36,8 @@ #include <stdio.h> #include <string.h> +#define PREF_ROOT "/gaim/gnt/debug" + static struct { GntWidget *window; @@ -191,6 +193,15 @@ g_free(new_domain); } +static void +size_changed_cb(GntWidget *widget, int oldw, int oldh) +{ + int w, h; + gnt_widget_get_size(widget, &w, &h); + gaim_prefs_set_int(PREF_ROOT "/size/width", w); + gaim_prefs_set_int(PREF_ROOT "/size/height", h); +} + void gg_debug_window_show() { debug.paused = FALSE; @@ -206,6 +217,10 @@ debug.tview = gnt_text_view_new(); gnt_box_add_widget(GNT_BOX(debug.window), debug.tview); + gnt_widget_set_size(debug.tview, + gaim_prefs_get_int(PREF_ROOT "/size/width"), + gaim_prefs_get_int(PREF_ROOT "/size/height")); + g_signal_connect(G_OBJECT(debug.tview), "size_changed", G_CALLBACK(size_changed_cb), NULL); gnt_box_add_widget(GNT_BOX(debug.window), gnt_line_new(FALSE)); @@ -268,6 +283,12 @@ REGISTER_G_LOG_HANDLER("GThread"); g_set_print_handler(print_stderr); /* Redirect the debug messages to stderr */ + + gaim_prefs_add_none(PREF_ROOT); + gaim_prefs_add_none(PREF_ROOT "/size"); + gaim_prefs_add_int(PREF_ROOT "/size/width", 60); + gaim_prefs_add_int(PREF_ROOT "/size/height", 15); + if (gaim_debug_is_enabled()) g_timeout_add(0, start_with_debugwin, NULL); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-11-01 05:53:30
|
Revision: 17646 http://svn.sourceforge.net/gaim/?rev=17646&view=rev Author: sadrul Date: 2006-10-31 21:53:09 -0800 (Tue, 31 Oct 2006) Log Message: ----------- Fix things to work with the last commit. Modified Paths: -------------- trunk/console/gntconv.c trunk/console/gntdebug.c trunk/console/libgnt/gntkeys.c trunk/console/libgnt/gntkeys.h trunk/console/libgnt/gnttextview.h trunk/console/libgnt/gnttree.h Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-11-01 03:38:23 UTC (rev 17645) +++ trunk/console/gntconv.c 2006-11-01 05:53:09 UTC (rev 17646) @@ -128,13 +128,13 @@ } else if (key[0] == 27) { - if (strcmp(key+1, GNT_KEY_DOWN) == 0) + if (strcmp(key, GNT_KEY_DOWN) == 0) gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 1); - else if (strcmp(key+1, GNT_KEY_UP) == 0) + else if (strcmp(key, GNT_KEY_UP) == 0) gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), -1); - else if (strcmp(key+1, GNT_KEY_PGDOWN) == 0) + else if (strcmp(key, GNT_KEY_PGDOWN) == 0) gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), ggconv->tv->priv.height - 2); - else if (strcmp(key+1, GNT_KEY_PGUP) == 0) + else if (strcmp(key, GNT_KEY_PGUP) == 0) gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), -(ggconv->tv->priv.height - 2)); else return FALSE; Modified: trunk/console/gntdebug.c =================================================================== --- trunk/console/gntdebug.c 2006-11-01 03:38:23 UTC (rev 17645) +++ trunk/console/gntdebug.c 2006-11-01 05:53:09 UTC (rev 17646) @@ -51,13 +51,13 @@ { if (key[0] == 27) { - if (strcmp(key+1, GNT_KEY_DOWN) == 0) + if (strcmp(key, GNT_KEY_DOWN) == 0) gnt_text_view_scroll(view, 1); - else if (strcmp(key+1, GNT_KEY_UP) == 0) + else if (strcmp(key, GNT_KEY_UP) == 0) gnt_text_view_scroll(view, -1); - else if (strcmp(key+1, GNT_KEY_PGDOWN) == 0) + else if (strcmp(key, GNT_KEY_PGDOWN) == 0) gnt_text_view_scroll(view, wid->priv.height - 2); - else if (strcmp(key+1, GNT_KEY_PGUP) == 0) + else if (strcmp(key, GNT_KEY_PGUP) == 0) gnt_text_view_scroll(view, -(wid->priv.height - 2)); else return FALSE; Modified: trunk/console/libgnt/gntkeys.c =================================================================== --- trunk/console/libgnt/gntkeys.c 2006-11-01 03:38:23 UTC (rev 17645) +++ trunk/console/libgnt/gntkeys.c 2006-11-01 05:53:09 UTC (rev 17646) @@ -1,5 +1,6 @@ #include "gntkeys.h" +#include <stdlib.h> #include <string.h> const char *term; Modified: trunk/console/libgnt/gntkeys.h =================================================================== --- trunk/console/libgnt/gntkeys.h 2006-11-01 03:38:23 UTC (rev 17645) +++ trunk/console/libgnt/gntkeys.h 2006-11-01 05:53:09 UTC (rev 17646) @@ -71,4 +71,13 @@ */ void gnt_keys_refine(char *text); + +/* A lot of commonly used variable names are defined in <term.h>. + * #undef them to make life easier for everyone. */ + +#undef columns +#undef lines +#undef buttons +#undef newline + #endif Modified: trunk/console/libgnt/gnttextview.h =================================================================== --- trunk/console/libgnt/gnttextview.h 2006-11-01 03:38:23 UTC (rev 17645) +++ trunk/console/libgnt/gnttextview.h 2006-11-01 05:53:09 UTC (rev 17646) @@ -6,10 +6,6 @@ #include "gntcolors.h" #include "gntkeys.h" -#ifdef lines -#undef lines -#endif - #define GNT_TYPE_TEXTVIEW (gnt_text_view_get_gtype()) #define GNT_TEXT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_TEXTVIEW, GntTextView)) #define GNT_TEXT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_TEXTVIEW, GntTextViewClass)) Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-11-01 03:38:23 UTC (rev 17645) +++ trunk/console/libgnt/gnttree.h 2006-11-01 05:53:09 UTC (rev 17646) @@ -7,10 +7,6 @@ #include "gntkeys.h" #include "gnttextview.h" -#ifdef columns -#undef columns -#endif - #define GNT_TYPE_TREE (gnt_tree_get_gtype()) #define GNT_TREE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_TREE, GntTree)) #define GNT_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_TREE, GntTreeClass)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-11-02 00:18:42
|
Revision: 17652 http://svn.sourceforge.net/gaim/?rev=17652&view=rev Author: sadrul Date: 2006-11-01 16:18:34 -0800 (Wed, 01 Nov 2006) Log Message: ----------- Add a 'Plugins' item in the buddylist menu (ctrl-o). Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gntmenuitem.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-11-01 21:39:36 UTC (rev 17651) +++ trunk/console/gntblist.c 2006-11-02 00:18:34 UTC (rev 17652) @@ -69,6 +69,11 @@ GntWidget *status; /* Dropdown with the statuses */ GntWidget *statustext; /* Status message */ int typing; + + GntWidget *menu; + /* These are the menuitems that get regenerated */ + GntMenuItem *accounts; + GntMenuItem *plugins; } GGBlist; typedef enum @@ -1766,17 +1771,76 @@ action->callback(action); } -static GntMenuItem *reconstruct_accounts_menu() +static void +build_plugin_actions(GntMenuItem *item, GaimPlugin *plugin, gpointer context) { + GntWidget *sub = gnt_menu_new(GNT_MENU_POPUP); + GList *actions; + GntMenuItem *menuitem; + + gnt_menuitem_set_submenu(item, GNT_MENU(sub)); + for (actions = GAIM_PLUGIN_ACTIONS(plugin, context); actions; + actions = g_list_delete_link(actions, actions)) { + if (actions->data) { + GaimPluginAction *action = actions->data; + action->plugin = plugin; + action->context = context; + menuitem = gnt_menuitem_new(action->label); + gnt_menu_add_item(GNT_MENU(sub), menuitem); + + gnt_menuitem_set_callback(menuitem, plugin_action, action); + g_object_set_data_full(G_OBJECT(menuitem), "plugin_action", + action, (GDestroyNotify)gaim_plugin_action_free); + } + } +} + +static void +reconstruct_plugins_menu() +{ GntWidget *sub; + GntMenuItem *plg; + GList *iter; + + if (!ggblist) + return; + + if (ggblist->plugins == NULL) + ggblist->plugins = gnt_menuitem_new(_("Plugins")); + + plg = ggblist->plugins; + sub = gnt_menu_new(GNT_MENU_POPUP); + gnt_menuitem_set_submenu(plg, GNT_MENU(sub)); + + for (iter = gaim_plugins_get_loaded(); iter; iter = iter->next) { + GaimPlugin *plugin = iter->data; + GntMenuItem *item; + if (GAIM_IS_PROTOCOL_PLUGIN(plugin)) + continue; + + if (!GAIM_PLUGIN_HAS_ACTIONS(plugin)) + continue; + + item = gnt_menuitem_new(_(plugin->info->name)); + gnt_menu_add_item(GNT_MENU(sub), item); + build_plugin_actions(item, plugin, NULL); + } +} + +static void +reconstruct_accounts_menu() +{ + GntWidget *sub; GntMenuItem *acc, *item; GList *iter; if (!ggblist) - return NULL; + return; - acc = gnt_menuitem_new(_("Accounts")); + if (ggblist->accounts == NULL) + ggblist->accounts = gnt_menuitem_new(_("Accounts")); + acc = ggblist->accounts; sub = gnt_menu_new(GNT_MENU_POPUP); gnt_menuitem_set_submenu(acc, GNT_MENU(sub)); @@ -1791,33 +1855,11 @@ prpl = gc->prpl; if (GAIM_PLUGIN_HAS_ACTIONS(prpl)) { - GList *acts; - GntWidget *s; - item = gnt_menuitem_new(gaim_account_get_username(account)); - s = gnt_menu_new(GNT_MENU_POPUP); - gnt_menuitem_set_submenu(item, GNT_MENU(s)); gnt_menu_add_item(GNT_MENU(sub), item); - - for (acts = GAIM_PLUGIN_ACTIONS(prpl, gc); acts; - acts = g_list_delete_link(acts, acts)) { - GaimPluginAction *action = acts->data; - if (!action) - continue; - - action->plugin = prpl; - action->context = gc; - - item = gnt_menuitem_new(action->label); - gnt_menuitem_set_callback(item, plugin_action, action); - /* This is to make sure the action is freed when the menu is destroyed */ - g_object_set_data_full(G_OBJECT(item), "plugin_action", action, - (GDestroyNotify)gaim_plugin_action_free); - gnt_menu_add_item(GNT_MENU(s), item); - } + build_plugin_actions(item, prpl, gc); } } - return acc; } static void show_offline_cb(GntMenuItem *item, gpointer n) @@ -1842,7 +1884,7 @@ return; window = GNT_WINDOW(ggblist->window); - menu = gnt_menu_new(GNT_MENU_TOPLEVEL); + ggblist->menu = menu = gnt_menu_new(GNT_MENU_TOPLEVEL); gnt_window_set_menu(window, GNT_MENU(menu)); item = gnt_menuitem_new(_("Options")); @@ -1867,8 +1909,11 @@ gnt_menu_add_item(GNT_MENU(sub), item); gnt_menuitem_set_callback(GNT_MENUITEM(item), sort_blist_change_cb, "log"); - item = reconstruct_accounts_menu(); - gnt_menu_add_item(GNT_MENU(menu), item); + reconstruct_accounts_menu(); + gnt_menu_add_item(GNT_MENU(menu), ggblist->accounts); + + reconstruct_plugins_menu(); + gnt_menu_add_item(GNT_MENU(menu), ggblist->plugins); } void gg_blist_show() @@ -1911,14 +1956,19 @@ gnt_widget_show(ggblist->window); gaim_signal_connect(gaim_connections_get_handle(), "signed-on", gg_blist_get_handle(), - GAIM_CALLBACK(create_menu), NULL); + GAIM_CALLBACK(reconstruct_accounts_menu), NULL); gaim_signal_connect(gaim_connections_get_handle(), "signed-off", gg_blist_get_handle(), - GAIM_CALLBACK(create_menu), NULL); + GAIM_CALLBACK(reconstruct_accounts_menu), NULL); gaim_signal_connect(gaim_blist_get_handle(), "buddy-status-changed", gg_blist_get_handle(), GAIM_CALLBACK(buddy_status_changed), ggblist); gaim_signal_connect(gaim_blist_get_handle(), "buddy-idle-changed", gg_blist_get_handle(), GAIM_CALLBACK(buddy_idle_changed), ggblist); + gaim_signal_connect(gaim_plugins_get_handle(), "plugin-load", gg_blist_get_handle(), + GAIM_CALLBACK(reconstruct_plugins_menu), NULL); + gaim_signal_connect(gaim_plugins_get_handle(), "plugin-unload", gg_blist_get_handle(), + GAIM_CALLBACK(reconstruct_plugins_menu), NULL); + #if 0 gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-on", gg_blist_get_handle(), GAIM_CALLBACK(buddy_signed_on), ggblist); Modified: trunk/console/libgnt/gntmenuitem.c =================================================================== --- trunk/console/libgnt/gntmenuitem.c 2006-11-01 21:39:36 UTC (rev 17651) +++ trunk/console/libgnt/gntmenuitem.c 2006-11-02 00:18:34 UTC (rev 17652) @@ -74,6 +74,8 @@ void gnt_menuitem_set_submenu(GntMenuItem *item, GntMenu *menu) { + if (item->submenu) + gnt_widget_destroy(item->submenu); item->submenu = menu; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-11-07 02:59:40
|
Revision: 17691 http://svn.sourceforge.net/gaim/?rev=17691&view=rev Author: sadrul Date: 2006-11-06 18:59:24 -0800 (Mon, 06 Nov 2006) Log Message: ----------- Change some minor stuff. This should get rid of the blinking in the buddylist (and the tooltip) when a new account signs on. This just might get rid of some crashes too. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gntwidget.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-11-07 02:53:42 UTC (rev 17690) +++ trunk/console/gntblist.c 2006-11-07 02:59:24 UTC (rev 17691) @@ -1163,7 +1163,8 @@ widget = ggblist->tree; tree = GNT_TREE(widget); - if (!gnt_widget_has_focus(ggblist->tree)) + if (!gnt_widget_has_focus(ggblist->tree) || + (ggblist->context && !GNT_WIDGET_IS_FLAG_SET(ggblist->context, GNT_WIDGET_INVISIBLE))) return; if (ggblist->tooltip) @@ -1183,8 +1184,12 @@ GaimBuddy *pr = gaim_contact_get_priority_buddy((GaimContact*)node); gboolean offline = !GAIM_BUDDY_IS_ONLINE(pr); gboolean showoffline = gaim_prefs_get_bool(PREF_ROOT "/showoffline"); + const char *alias = gaim_contact_get_alias((GaimContact*)node); + const char *name = gaim_buddy_get_name(pr); - title = g_strdup(gaim_contact_get_alias((GaimContact*)node)); + title = g_strdup(alias); + if (g_utf8_collate(alias, name)) + g_string_append_printf(str, _("Nickname: %s\n"), gaim_buddy_get_name(pr)); tooltip_for_buddy(pr, str); for (node = node->child; node; node = node->next) { if (offline) { @@ -1887,7 +1892,7 @@ } static void -send_im_select(void) +send_im_select(GntMenuItem *item, gpointer n) { GaimRequestFields *fields; GaimRequestFieldGroup *group; Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-11-07 02:53:42 UTC (rev 17690) +++ trunk/console/libgnt/gntwidget.c 2006-11-07 02:59:24 UTC (rev 17691) @@ -303,11 +303,8 @@ void gnt_widget_show(GntWidget *widget) { - /* Draw the widget and take focus */ - /*if (GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_CAN_TAKE_FOCUS) {*/ - /*gnt_widget_take_focus(widget);*/ - /*}*/ gnt_widget_draw(widget); + gnt_screen_occupy(widget); } void @@ -324,39 +321,38 @@ if (widget->window == NULL) { + int x, y, maxx, maxy, w, h; gboolean shadow = TRUE; if (!gnt_widget_has_shadow(widget)) shadow = FALSE; - widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, - widget->priv.y, widget->priv.x); - if (widget->window == NULL) /* The size is probably too large for the screen */ - { - int x = widget->priv.x, y = widget->priv.y; - int w = widget->priv.width + shadow, h = widget->priv.height + shadow; - int maxx, maxy; /* Max-X is cool */ + x = widget->priv.x; + y = widget->priv.y; + w = widget->priv.width + shadow; + h = widget->priv.height + shadow; - getmaxyx(stdscr, maxy, maxx); + getmaxyx(stdscr, maxy, maxx); + maxy -= 1; /* room for the taskbar */ - if (x + w >= maxx) - x = MAX(0, maxx - w); - if (y + h >= maxy) - y = MAX(0, maxy - h); + x = MAX(0, x); + y = MAX(0, y); + if (x + w >= maxx) + x = MAX(0, maxx - w); + if (y + h >= maxy) + y = MAX(0, maxy - h); - w = MIN(w, maxx); - h = MIN(h, maxy); + w = MIN(w, maxx); + h = MIN(h, maxy); - widget->priv.x = x; - widget->priv.y = y; - widget->priv.width = w - shadow; - widget->priv.height = h - shadow; + widget->priv.x = x; + widget->priv.y = y; + widget->priv.width = w - shadow; + widget->priv.height = h - shadow; - widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, - widget->priv.y, widget->priv.x); - } + widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, + widget->priv.y, widget->priv.x); init_widget(widget); - gnt_screen_occupy(widget); } g_signal_emit(widget, signals[SIG_DRAW], 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-11-16 00:27:31
|
Revision: 17756 http://svn.sourceforge.net/gaim/?rev=17756&view=rev Author: sadrul Date: 2006-11-15 16:27:30 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Make it easy to move buddies around. Press 't' in the buddylist to tag/untag buddies/contacts (more than one if necessary). Then select the target contact or group and press 'a' to attach the tagged nodes. This should also fix LSchiere's earlier crash, if the bug I thought I was seeing. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gnttree.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-11-15 20:39:32 UTC (rev 17755) +++ trunk/console/gntblist.c 2006-11-16 00:27:30 UTC (rev 17756) @@ -61,7 +61,7 @@ GntWidget *tooltip; GaimBlistNode *tnode; /* Who is the tooltip being displayed for? */ - GaimBuddy *tagged; + GList *tagged; /* A list of tagged blistnodes */ GntWidget *context; GaimBlistNode *cnode; @@ -108,6 +108,7 @@ static const char * get_display_name(GaimBlistNode *node); static void savedstatus_changed(GaimSavedStatus *now, GaimSavedStatus *old); static void blist_show(GaimBuddyList *list); +static void update_buddy_display(GaimBuddy *buddy, GGBlist *ggblist); /* Sort functions */ static int blist_node_compare_text(GaimBlistNode *n1, GaimBlistNode *n2); @@ -174,6 +175,8 @@ gnt_tree_remove(GNT_TREE(ggblist->tree), node); node->ui_data = NULL; + if (ggblist->tagged) + ggblist->tagged = g_list_remove(ggblist->tagged, node); if (GAIM_BLIST_NODE_IS_BUDDY(node)) { GaimContact *contact = (GaimContact*)node->parent; @@ -185,6 +188,8 @@ if ((!gaim_prefs_get_bool(PREF_ROOT "/showoffline") && !is_group_online(group)) || group->currentsize < 1) node_remove(list, node->parent); + for (node = node->child; node; node = node->next) + node->ui_data = NULL; } draw_tooltip(ggblist); @@ -998,23 +1003,52 @@ } static void -gg_blist_tag_buddy(GaimBlistNode *node) +gg_blist_toggle_tag_buddy(GaimBlistNode *node) { - ggblist->tagged = (GaimBuddy *)node; + GList *iter; + if (ggblist->tagged && (iter = g_list_find(ggblist->tagged, node)) != NULL) { + ggblist->tagged = g_list_delete_link(ggblist->tagged, iter); + } else { + ggblist->tagged = g_list_prepend(ggblist->tagged, node); + } + if (GAIM_BLIST_NODE_IS_CONTACT(node)) + node = (GaimBlistNode*)gaim_contact_get_priority_buddy((GaimContact*)node); + update_buddy_display((GaimBuddy*)node, ggblist); gaim_debug_info("blist", "Tagged buddy\n"); } static void -gg_blist_place_tagged(GaimBlistNode *node) +gg_blist_place_tagged(GaimBlistNode *target) { - if (GAIM_BLIST_NODE_IS_GROUP(node)) { - gaim_blist_add_buddy(ggblist->tagged, NULL, (GaimGroup *)node, NULL); - } else { - GaimContact *contact = (GaimContact *)node; - gaim_blist_add_buddy(ggblist->tagged, contact, - gaim_buddy_get_group(gaim_contact_get_priority_buddy(contact)), NULL); + GaimGroup *tg = NULL; + GaimContact *tc = NULL; + + if (GAIM_BLIST_NODE_IS_GROUP(target)) + tg = (GaimGroup*)target; + else + tc = (GaimContact*)target; + + if (ggblist->tagged) { + GList *list = ggblist->tagged; + ggblist->tagged = NULL; + + while (list) { + GaimBlistNode *node = list->data; + list = g_list_delete_link(list, list); + if (tg) { + if (GAIM_BLIST_NODE_IS_CONTACT(node)) + gaim_blist_add_contact((GaimContact*)node, tg, NULL); + else + gaim_blist_add_buddy((GaimBuddy*)node, NULL, tg, NULL); + } else { + if (GAIM_BLIST_NODE_IS_BUDDY(node)) + gaim_blist_add_buddy((GaimBuddy*)node, tc, + gaim_buddy_get_group(gaim_contact_get_priority_buddy(tc)), NULL); + else if (GAIM_BLIST_NODE_IS_CONTACT(node)) + gaim_blist_merge_contact((GaimContact*)node, target); + } + } } - ggblist->tagged = NULL; gaim_debug_info("blist", "Placed buddy\n"); } @@ -1074,14 +1108,17 @@ GAIM_CALLBACK(gg_blist_rename_node_cb), node); add_custom_action(GNT_MENU(context), _("Remove"), GAIM_CALLBACK(gg_blist_remove_node_cb), node); + if (ggblist->tagged && (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_GROUP(node))) { add_custom_action(GNT_MENU(context), _("Place tagged"), GAIM_CALLBACK(gg_blist_place_tagged), node); - } else if (GAIM_BLIST_NODE_IS_BUDDY(node)) { - add_custom_action(GNT_MENU(context), _("Tag"), - GAIM_CALLBACK(gg_blist_tag_buddy), node); } + + if (GAIM_BLIST_NODE_IS_BUDDY(node) || GAIM_BLIST_NODE_IS_CONTACT(node)) { + add_custom_action(GNT_MENU(context), _("Toggle Tag"), + GAIM_CALLBACK(gg_blist_toggle_tag_buddy), node); + } } /* Set the position for the popup */ @@ -1285,7 +1322,7 @@ * top of that, if the selected buddy belongs to the disconnected * account, then retreiving the tooltip for that causes crash. So * let's make sure we wait for all the buddies to be removed first.*/ - int id = g_timeout_add(0, draw_tooltip_real, ggblist); + int id = g_timeout_add(0, (GSourceFunc)draw_tooltip_real, ggblist); g_object_set_data_full(G_OBJECT(ggblist->window), "draw_tooltip_calback", GINT_TO_POINTER(id), (GDestroyNotify)g_source_remove); } @@ -1306,48 +1343,50 @@ static gboolean key_pressed(GntWidget *widget, const char *text, GGBlist *ggblist) { - gboolean stop = FALSE, ret = FALSE; - if (text[0] == 27 && text[1] == 0) - { + if (text[0] == 27 && text[1] == 0) { /* Escape was pressed */ remove_peripherals(ggblist); - stop = TRUE; - ret = TRUE; - } - - if (strcmp(text, GNT_KEY_CTRL_O) == 0) - { + } else if (strcmp(text, GNT_KEY_CTRL_O) == 0) { gaim_prefs_set_bool(PREF_ROOT "/showoffline", !gaim_prefs_get_bool(PREF_ROOT "/showoffline")); - ret = TRUE; - stop = TRUE; - } + } else if (strcmp(text, "t") == 0) { + gg_blist_toggle_tag_buddy(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree))); + } else if (strcmp(text, "a") == 0) { + gg_blist_place_tagged(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree))); + } else + return FALSE; - if (stop) - g_signal_stop_emission_by_name(G_OBJECT(widget), "key_pressed"); - - return ret; + return TRUE; } static void update_buddy_display(GaimBuddy *buddy, GGBlist *ggblist) { GaimContact *contact; + GntTextFormatFlags bflag = 0, cflag = 0; contact = gaim_buddy_get_contact(buddy); + gaim_debug_fatal("sadrul", "updating display for %s\n", gaim_buddy_get_name(buddy)); + g_printerr("sadrul: updating display for %s\n", gaim_buddy_get_name(buddy)); + gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, 0, get_display_name((GaimBlistNode*)buddy)); gnt_tree_change_text(GNT_TREE(ggblist->tree), contact, 0, get_display_name((GaimBlistNode*)contact)); + if (ggblist->tagged && g_list_find(ggblist->tagged, buddy)) + bflag |= GNT_TEXT_FLAG_BOLD; + if (ggblist->tagged && g_list_find(ggblist->tagged, contact)) + cflag |= GNT_TEXT_FLAG_BOLD; + if (ggblist->tnode == (GaimBlistNode*)buddy) draw_tooltip(ggblist); if (gaim_presence_is_idle(gaim_buddy_get_presence(buddy))) { - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, GNT_TEXT_FLAG_DIM); - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, GNT_TEXT_FLAG_DIM); + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, bflag | GNT_TEXT_FLAG_DIM); + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, cflag | GNT_TEXT_FLAG_DIM); } else { - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, 0); - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, 0); + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, bflag); + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, cflag); } } Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-11-15 20:39:32 UTC (rev 17755) +++ trunk/console/libgnt/gnttree.c 2006-11-16 00:27:30 UTC (rev 17756) @@ -1058,7 +1058,6 @@ return list; } -/* XXX: Should this also remove all the children of the row being removed? */ void gnt_tree_remove(GntTree *tree, gpointer key) { GntTreeRow *row = g_hash_table_lookup(tree->hash, key); @@ -1066,6 +1065,16 @@ { gboolean redraw = FALSE; + if (row->child) { + GntTreeRow *ch = row->child; + while (ch) { + GntTreeRow *n = ch->next; + tree->list = g_list_remove(tree->list, ch->key); + g_hash_table_remove(tree->hash, ch->key); + ch = n; + } + } + if (get_distance(tree->top, row) >= 0 && get_distance(row, tree->bottom) >= 0) redraw = TRUE; @@ -1146,7 +1155,7 @@ g_free(col->text); col->text = g_strdup(text); - if (get_distance(tree->top, row) >= 0 && get_distance(row, tree->bottom) > 0) + if (get_distance(tree->top, row) >= 0 && get_distance(row, tree->bottom) >= 0) redraw_tree(tree); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-11-28 07:06:38
|
Revision: 17835 http://svn.sourceforge.net/gaim/?rev=17835&view=rev Author: sadrul Date: 2006-11-27 23:06:37 -0800 (Mon, 27 Nov 2006) Log Message: ----------- Patch from wabz to: - Fix bug #1602136 - Better handle resizing of trees - Make the tooltip-info more closely resemble the tooltip-info in Gaim. Also remove some unnecessary debug statements. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntstatus.c trunk/console/libgnt/gnttree.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-11-28 06:59:48 UTC (rev 17834) +++ trunk/console/gntblist.c 2006-11-28 07:06:37 UTC (rev 17835) @@ -1016,7 +1016,6 @@ if (GAIM_BLIST_NODE_IS_CONTACT(node)) node = (GaimBlistNode*)gaim_contact_get_priority_buddy((GaimContact*)node); update_buddy_display((GaimBuddy*)node, ggblist); - gaim_debug_info("blist", "Tagged buddy\n"); } static void @@ -1059,7 +1058,6 @@ } } } - gaim_debug_info("blist", "Placed buddy\n"); } static void @@ -1150,9 +1148,12 @@ GaimPlugin *prpl; GaimPluginProtocolInfo *prpl_info; GaimAccount *account; + const char *alias = gaim_buddy_get_alias(buddy); account = gaim_buddy_get_account(buddy); - + + if (g_utf8_collate(gaim_buddy_get_name(buddy), alias)) + g_string_append_printf(str, _("Nickname: %s\n"), alias); g_string_append_printf(str, _("Account: %s (%s)"), gaim_account_get_username(account), gaim_account_get_protocol_name(account)); @@ -1230,12 +1231,9 @@ GaimBuddy *pr = gaim_contact_get_priority_buddy((GaimContact*)node); gboolean offline = !GAIM_BUDDY_IS_ONLINE(pr); gboolean showoffline = gaim_prefs_get_bool(PREF_ROOT "/showoffline"); - const char *alias = gaim_contact_get_alias((GaimContact*)node); const char *name = gaim_buddy_get_name(pr); - title = g_strdup(alias); - if (g_utf8_collate(alias, name)) - g_string_append_printf(str, _("Nickname: %s\n"), gaim_buddy_get_name(pr)); + title = g_strdup(name); tooltip_for_buddy(pr, str); for (node = node->child; node; node = node->next) { GaimBuddy *buddy = (GaimBuddy*)node; @@ -1251,7 +1249,6 @@ if (!showoffline && !GAIM_BUDDY_IS_ONLINE(buddy)) continue; str = g_string_append(str, "\n----------\n"); - g_string_append_printf(str, _("Nickname: %s\n"), gaim_buddy_get_name(buddy)); tooltip_for_buddy(buddy, str); } } else if (GAIM_BLIST_NODE_IS_BUDDY(node)) { @@ -1361,6 +1358,7 @@ !gaim_prefs_get_bool(PREF_ROOT "/showoffline")); } else if (strcmp(text, "t") == 0) { gg_blist_toggle_tag_buddy(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree))); + gnt_bindable_perform_action_named(GNT_BINDABLE(ggblist->tree), "move-down"); } else if (strcmp(text, "a") == 0) { gg_blist_place_tagged(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree))); } else @@ -1377,9 +1375,6 @@ contact = gaim_buddy_get_contact(buddy); - gaim_debug_fatal("sadrul", "updating display for %s\n", gaim_buddy_get_name(buddy)); - g_printerr("sadrul: updating display for %s\n", gaim_buddy_get_name(buddy)); - gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, 0, get_display_name((GaimBlistNode*)buddy)); gnt_tree_change_text(GNT_TREE(ggblist->tree), contact, 0, get_display_name((GaimBlistNode*)contact)); @@ -1428,7 +1423,6 @@ gnt_widget_get_size(w, &width, &height); gaim_prefs_set_int(PREF_ROOT "/size/width", width); gaim_prefs_set_int(PREF_ROOT "/size/height", height); - gnt_tree_set_col_width(GNT_TREE(ggblist->tree), 0, width - 1); } static void Modified: trunk/console/gntstatus.c =================================================================== --- trunk/console/gntstatus.c 2006-11-28 06:59:48 UTC (rev 17834) +++ trunk/console/gntstatus.c 2006-11-28 07:06:37 UTC (rev 17835) @@ -359,7 +359,8 @@ name = g_strdup_printf("%s (%s)", gaim_account_get_username(account), gaim_account_get_protocol_name(account)); gnt_tree_add_choice(GNT_TREE(edit->tree), key, - gnt_tree_create_row(GNT_TREE(edit->tree), name, type, message), NULL, NULL); + gnt_tree_create_row(GNT_TREE(edit->tree), + name, type ? type : "", message ? message : ""), NULL, NULL); if (sub) gnt_tree_set_choice(GNT_TREE(edit->tree), key, TRUE); Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-11-28 06:59:48 UTC (rev 17834) +++ trunk/console/libgnt/gnttree.c 2006-11-28 07:06:37 UTC (rev 17835) @@ -669,6 +669,22 @@ } static void +gnt_tree_size_changed(GntWidget *widget, int w, int h) +{ + GntTree *tree = GNT_TREE(widget); + int i; + int n = 0; + if (widget->priv.width <= 0) + return; + for (i = 0; i < tree->ncol; ++i) + n += tree->columns[i].width; + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) + tree->columns[tree->ncol - 1].width += widget->priv.width - n - 1 * tree->ncol; + else + tree->columns[tree->ncol - 1].width += widget->priv.width - n - 2 - 1 * tree->ncol; +} + +static void gnt_tree_class_init(GntTreeClass *klass) { GntBindableClass *bindable = GNT_BINDABLE_CLASS(klass); @@ -679,6 +695,7 @@ parent_class->size_request = gnt_tree_size_request; parent_class->key_pressed = gnt_tree_key_pressed; parent_class->clicked = gnt_tree_clicked; + parent_class->size_changed = gnt_tree_size_changed; signals[SIG_SELECTION_CHANGED] = g_signal_new("selection-changed", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ev...@us...> - 2006-12-10 02:54:26
|
Revision: 17931 http://svn.sourceforge.net/gaim/?rev=17931&view=rev Author: evands Date: 2006-12-09 18:54:26 -0800 (Sat, 09 Dec 2006) Log Message: ----------- gntgaim changes for GaimNotifyUserInfo introduced in [17929] Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntnotify.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-12-10 02:53:54 UTC (rev 17930) +++ trunk/console/gntblist.c 2006-12-10 02:54:26 UTC (rev 17931) @@ -1148,29 +1148,27 @@ GaimPlugin *prpl; GaimPluginProtocolInfo *prpl_info; GaimAccount *account; + GaimNotifyUserInfo *user_info; const char *alias = gaim_buddy_get_alias(buddy); + char *tmp, *strip; + user_info = gaim_notify_user_info_new(); + account = gaim_buddy_get_account(buddy); if (g_utf8_collate(gaim_buddy_get_name(buddy), alias)) - g_string_append_printf(str, _("Nickname: %s\n"), alias); - g_string_append_printf(str, _("Account: %s (%s)"), + gaim_notify_user_info_add_pair(user_info, _("Nickname"), alias); + + tmp = g_strdup_printf("%s (%s)", gaim_account_get_username(account), gaim_account_get_protocol_name(account)); + gaim_notify_user_info_add_pair(user_info, _("Account"), tmp); + g_free(tmp); prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); if (prpl_info && prpl_info->tooltip_text) { - GString *tip = g_string_new(""); - char *strip, *br; - prpl_info->tooltip_text(buddy, tip, TRUE); - - br = gaim_strreplace(tip->str, "\n", "<br>"); - strip = gaim_markup_strip_html(br); - g_string_append(str, strip); - g_string_free(tip, TRUE); - g_free(strip); - g_free(br); + prpl_info->tooltip_text(buddy, user_info, TRUE); } if (gaim_prefs_get_bool("/gaim/gnt/blist/idletime")) { @@ -1179,11 +1177,19 @@ time_t idle = gaim_presence_get_idle_time(pre); if (idle > 0) { char *st = gaim_str_seconds_to_string(time(NULL) - idle); - g_string_append_printf(str, _("\nIdle: %s"), st); + gaim_notify_user_info_add_pair(user_info, _("Idle"), st); g_free(st); } } } + + tmp = gaim_notify_user_info_get_text_with_newline(user_info, "\n"); + gaim_notify_user_info_destroy(user_info); + + strip = gaim_markup_strip_html(tmp); + g_string_append(str, strip); + g_free(strip); + g_free(tmp); } static GString* Modified: trunk/console/gntnotify.c =================================================================== --- trunk/console/gntnotify.c 2006-12-10 02:53:54 UTC (rev 17930) +++ trunk/console/gntnotify.c 2006-12-10 02:54:26 UTC (rev 17931) @@ -220,14 +220,17 @@ } static void * -gg_notify_userinfo(GaimConnection *gc, const char *who, const char *text) +gg_notify_userinfo(GaimConnection *gc, const char *who, GaimNotifyUserInfo *user_info) { /* Xeroxed from gtknotify.c */ char *primary; + char *info; void *ui_handle; - + primary = g_strdup_printf(_("Info for %s"), who); - ui_handle = gg_notify_formatted(_("Buddy Information"), primary, NULL, text); + info = gaim_notify_user_info_get_text_with_newline(user_info, "\n"); + ui_handle = gg_notify_formatted(_("Buddy Information"), primary, NULL, info); + g_free(info); g_free(primary); return ui_handle; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-12-10 11:26:23
|
Revision: 17946 http://svn.sourceforge.net/gaim/?rev=17946&view=rev Author: sadrul Date: 2006-12-10 03:26:17 -0800 (Sun, 10 Dec 2006) Log Message: ----------- Experimental search-as-you-type in GntTree. Press "/" to enter the search-mode, and when you're done, press escape to cancel. The search-mode remains active for 4 seconds before returning to normal. Someone should update the manual, and possibly enhance the behaviour. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-12-10 09:38:02 UTC (rev 17945) +++ trunk/console/gntblist.c 2006-12-10 11:26:17 UTC (rev 17946) @@ -1362,11 +1362,13 @@ } else if (strcmp(text, GNT_KEY_CTRL_O) == 0) { gaim_prefs_set_bool(PREF_ROOT "/showoffline", !gaim_prefs_get_bool(PREF_ROOT "/showoffline")); - } else if (strcmp(text, "t") == 0) { - gg_blist_toggle_tag_buddy(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree))); - gnt_bindable_perform_action_named(GNT_BINDABLE(ggblist->tree), "move-down"); - } else if (strcmp(text, "a") == 0) { - gg_blist_place_tagged(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree))); + } else if (GNT_TREE(ggblist->tree)->search == NULL) { + if (strcmp(text, "t") == 0) { + gg_blist_toggle_tag_buddy(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree))); + gnt_bindable_perform_action_named(GNT_BINDABLE(ggblist->tree), "move-down"); + } else if (strcmp(text, "a") == 0) { + gg_blist_place_tagged(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree))); + } } else return FALSE; Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-12-10 09:38:02 UTC (rev 17945) +++ trunk/console/libgnt/gnttree.c 2006-12-10 11:26:17 UTC (rev 17946) @@ -6,6 +6,8 @@ #include <string.h> #include <ctype.h> +#define SEARCH_TIMEOUT 4000 /* 4 secs */ + enum { SIG_SELECTION_CHANGED, @@ -35,6 +37,7 @@ GntTreeRow *prev; GList *columns; + GntTree *tree; }; struct _GnTreeCol @@ -70,12 +73,32 @@ return _get_next(row->parent, FALSE); } +static gboolean +row_matches_search(GntTreeRow *row) +{ + GntTree *t = row->tree; + if (t->search && t->search->len > 0) { + char *one = g_utf8_casefold(((GntTreeCol*)row->columns->data)->text, -1); + char *two = g_utf8_casefold(t->search->str, -1); + char *z = strstr(one, two); + g_free(one); + g_free(two); + if (z == NULL) + return FALSE; + } + return TRUE; +} + static GntTreeRow * get_next(GntTreeRow *row) { if (row == NULL) return NULL; - return _get_next(row, !row->collapsed); + while ((row = _get_next(row, !row->collapsed)) != NULL) { + if (row_matches_search(row)) + break; + } + return row; } /* Returns the n-th next row. If it doesn't exist, returns NULL */ @@ -135,9 +158,15 @@ { if (row == NULL) return NULL; - if (row->prev) - return get_last_child(row->prev); - return row->parent; + while (row) { + if (row->prev) + row = get_last_child(row->prev); + else + row = row->parent; + if (!row || row_matches_search(row)) + break; + } + return row; } static GntTreeRow * @@ -332,6 +361,8 @@ else if (up >= widget->priv.height - pos) tree->top = get_prev_n(tree->current, rows); + if (tree->top && !row_matches_search(tree->top)) + tree->top = get_next(tree->top); row = tree->top; scrcol = widget->priv.width - 1 - 2 * pos; /* exclude the borders and the scrollbar */ for (i = start + pos; row && i < widget->priv.height - pos; @@ -343,6 +374,8 @@ GntTextFormatFlags flags = row->flags; int attr = 0; + if (!row_matches_search(row)) + continue; str = update_row_text(tree, row); if ((wr = gnt_util_onscreen_width(str, NULL)) > scrcol) @@ -574,18 +607,46 @@ return TRUE; } +static void +end_search(GntTree *tree) +{ + if (tree->search) { + g_source_remove(tree->search_timeout); + g_string_free(tree->search, TRUE); + tree->search = NULL; + tree->search_timeout = 0; + } +} + static gboolean +search_timeout(gpointer data) +{ + GntTree *tree = data; + + end_search(tree); + redraw_tree(tree); + + return FALSE; +} + +static gboolean gnt_tree_key_pressed(GntWidget *widget, const char *text) { GntTree *tree = GNT_TREE(widget); GntTreeRow *old = tree->current; - if (text[0] == '\r') - { + if (text[0] == '\r') { + end_search(tree); gnt_widget_activate(widget); - } - else if (text[0] == ' ' && text[1] == 0) - { + } else if (tree->search) { + if (isalnum(*text)) { + tree->search = g_string_append_c(tree->search, *text); + redraw_tree(tree); + g_source_remove(tree->search_timeout); + tree->search_timeout = g_timeout_add(SEARCH_TIMEOUT, search_timeout, tree); + } + return TRUE; + } else if (text[0] == ' ' && text[1] == 0) { /* Space pressed */ GntTreeRow *row = tree->current; if (row && row->child) @@ -616,6 +677,7 @@ GntTree *tree = GNT_TREE(widget); int i; + end_search(tree); g_hash_table_destroy(tree->hash); g_list_free(tree->list); @@ -684,6 +746,28 @@ tree->columns[tree->ncol - 1].width += widget->priv.width - n - 2 - 1 * tree->ncol; } +static gboolean +start_search(GntBindable *bindable, GList *list) +{ + GntTree *tree = GNT_TREE(bindable); + if (tree->search) + return FALSE; + tree->search = g_string_new(NULL); + tree->search_timeout = g_timeout_add(SEARCH_TIMEOUT, search_timeout, tree); + return TRUE; +} + +static gboolean +end_search_action(GntBindable *bindable, GList *list) +{ + GntTree *tree = GNT_TREE(bindable); + if (tree->search == NULL) + return FALSE; + end_search(tree); + redraw_tree(tree); + return TRUE; +} + static void gnt_tree_class_init(GntTreeClass *klass) { @@ -732,6 +816,10 @@ GNT_KEY_PGUP, NULL); gnt_bindable_class_register_action(bindable, "page-down", action_page_down, GNT_KEY_PGDOWN, NULL); + gnt_bindable_class_register_action(bindable, "start-search", start_search, + "/", NULL); + gnt_bindable_class_register_action(bindable, "end-search", end_search_action, + "\033", NULL); gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), bindable); GNTDEBUG; @@ -956,6 +1044,7 @@ GntTreeRow *pr = NULL; g_hash_table_replace(tree->hash, key, row); + row->tree = tree; if (bigbro == NULL && tree->compare) { Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-12-10 09:38:02 UTC (rev 17945) +++ trunk/console/libgnt/gnttree.h 2006-12-10 11:26:17 UTC (rev 17946) @@ -52,6 +52,9 @@ gboolean show_title; gboolean show_separator; /* Whether to show column separators */ + GString *search; + int search_timeout; + GCompareFunc compare; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-12-11 06:02:16
|
Revision: 17957 http://svn.sourceforge.net/gaim/?rev=17957&view=rev Author: sadrul Date: 2006-12-10 22:02:15 -0800 (Sun, 10 Dec 2006) Log Message: ----------- Show 'ABC is typing...' in the conversation window for typing notification. seanegan suggested this, and it sounded like an interesting thing to do. The change in gnttextview.c will need some more work if it is to be used for some other task, but its current use should be OK. Modified Paths: -------------- trunk/console/gntconv.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttextview.h Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-12-11 05:35:19 UTC (rev 17956) +++ trunk/console/gntconv.c 2006-12-11 06:02:15 UTC (rev 17957) @@ -205,7 +205,7 @@ GaimConversation *conv; GGConv *ggc; GaimConvIm *im = NULL; - char *title, *old_title; + char *title, *str; conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, who, account); @@ -213,15 +213,26 @@ return; im = GAIM_CONV_IM(conv); + ggc = conv->ui_data; if (gaim_conv_im_get_typing_state(im) == GAIM_TYPING) { - old_title = get_conversation_title(conv, account); - title = g_strdup_printf(_("%s [%s]"), old_title, + int scroll; + str = get_conversation_title(conv, account); + title = g_strdup_printf(_("%s [%s]"), str, gnt_ascii_only() ? "T" : "\342\243\277"); - g_free(old_title); - } else + g_free(str); + + scroll = gnt_text_view_get_lines_below(GNT_TEXT_VIEW(ggc->tv)); + str = g_strdup_printf(_("\n%s is typing..."), gaim_conversation_get_name(conv)); + gnt_text_view_append_text_with_tag(GNT_TEXT_VIEW(ggc->tv), + str, GNT_TEXT_FLAG_DIM, "typing"); + g_free(str); + if (scroll <= 1) + gnt_text_view_scroll(GNT_TEXT_VIEW(ggc->tv), 0); + } else { title = get_conversation_title(conv, account); - ggc = conv->ui_data; + gnt_text_view_tag_change(GNT_TEXT_VIEW(ggc->tv), "typing", NULL, TRUE); + } gnt_screen_rename_widget(ggc->window, title); g_free(title); } @@ -324,6 +335,7 @@ char *strip, *newline; GntTextFormatFlags fl = 0; int pos; + gboolean notify; g_return_if_fail(ggconv != NULL); @@ -336,6 +348,7 @@ pos = gnt_text_view_get_lines_below(GNT_TEXT_VIEW(ggconv->tv)); + notify = !!gnt_text_view_tag_change(GNT_TEXT_VIEW(ggconv->tv), "typing", NULL, TRUE); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), "\n", GNT_TEXT_FLAG_NORMAL); /* Unnecessary to print the timestamp for delayed message */ @@ -374,12 +387,20 @@ strip = gaim_markup_strip_html(newline); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), strip, fl); - if (pos <= 1) - gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 0); g_free(newline); g_free(strip); + if (notify) { + strip = g_strdup_printf(_("\n%s is typing..."), gaim_conversation_get_name(conv)); + gnt_text_view_append_text_with_tag(GNT_TEXT_VIEW(ggconv->tv), + strip, GNT_TEXT_FLAG_DIM, "typing"); + g_free(strip); + } + + if (pos <= 1) + gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 0); + if (flags & (GAIM_MESSAGE_RECV | GAIM_MESSAGE_NICK | GAIM_MESSAGE_ERROR)) gnt_widget_set_urgent(ggconv->tv); } Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-12-11 05:35:19 UTC (rev 17956) +++ trunk/console/libgnt/gnttextview.c 2006-12-11 06:02:15 UTC (rev 17957) @@ -23,6 +23,13 @@ gboolean soft; /* TRUE if it's an overflow from prev. line */ } GntTextLine; +typedef struct +{ + char *name; + int start; + int end; +} GntTextTag; + static GntWidgetClass *parent_class = NULL; static void @@ -134,12 +141,22 @@ } static void +free_tag(gpointer data, gpointer null) +{ + GntTextTag *tag = data; + g_free(tag->name); + g_free(tag); +} + +static void gnt_text_view_destroy(GntWidget *widget) { GntTextView *view = GNT_TEXT_VIEW(widget); view->list = g_list_first(view->list); g_list_foreach(view->list, free_text_line, NULL); g_list_free(view->list); + g_list_foreach(view->tags, free_tag, NULL); + g_list_free(view->tags); g_string_free(view->string, TRUE); } @@ -297,6 +314,12 @@ void gnt_text_view_append_text_with_flags(GntTextView *view, const char *text, GntTextFormatFlags flags) { + gnt_text_view_append_text_with_tag(view, text, flags, NULL); +} + +void gnt_text_view_append_text_with_tag(GntTextView *view, const char *text, + GntTextFormatFlags flags, const char *tagname) +{ GntWidget *widget = GNT_WIDGET(view); int fl = 0; const char *start, *end; @@ -312,6 +335,14 @@ len = view->string->len; view->string = g_string_append(view->string, text); + if (tagname) { + GntTextTag *tag = g_new0(GntTextTag, 1); + tag->name = g_strdup(tagname); + tag->start = len; + tag->end = view->string->len; + view->tags = g_list_append(view->tags, tag); + } + view->list = g_list_first(view->list); start = end = view->string->str + len; @@ -471,3 +502,73 @@ return above; } +/** + * XXX: There are quite possibly more than a few bugs here. + */ +int gnt_text_view_tag_change(GntTextView *view, const char *name, const char *text, gboolean all) +{ + GList *list, *next, *iter, *inext; + int count = 0; + for (list = view->tags; list; list = next) { + GntTextTag *tag = list->data; + next = list->next; + if (strcmp(tag->name, name) == 0) { + int change; + char *before, *after; + + count++; + + before = g_strndup(view->string->str, tag->start); + after = g_strdup(view->string->str + tag->end); + change = (tag->end - tag->start) - (text ? strlen(text) : 0); + + g_string_printf(view->string, "%s%s%s", before, text ? text : "", after); + g_free(before); + g_free(after); + + /* Update the offsets of the next tags */ + for (iter = next; iter; iter = iter->next) { + GntTextTag *t = iter->data; + t->start -= change; + t->end -= change; + } + + /* Update the offsets of the segments */ + for (iter = view->list; iter; iter = inext) { + GList *segs, *snext; + GntTextLine *line = iter->data; + inext = iter->next; + for (segs = line->segments; segs; segs = snext) { + GntTextSegment *seg = segs->data; + snext = segs->next; + if (seg->start >= tag->end) { + seg->start -= change; + seg->end -= change; + continue; + } + if (seg->end < tag->start) + continue; + + if (seg->start >= tag->start && seg->end <= tag->end) { + free_text_segment(seg, NULL); + line->segments = g_list_delete_link(line->segments, segs); + if (line->segments == NULL) { + free_text_line(line, NULL); + view->list = g_list_delete_link(view->list, iter); + } + } + /* XXX: handle the rest of the conditions */ + } + } + if (text == NULL) { + /* Remove the tag */ + view->tags = g_list_delete_link(view->tags, list); + free_tag(tag, NULL); + } + if (!all) + break; + } + } + return count; +} + Modified: trunk/console/libgnt/gnttextview.h =================================================================== --- trunk/console/libgnt/gnttextview.h 2006-12-11 05:35:19 UTC (rev 17956) +++ trunk/console/libgnt/gnttextview.h 2006-12-11 06:02:15 UTC (rev 17957) @@ -27,6 +27,8 @@ GString *string; GList *list; /* List of GntTextLine */ + + GList *tags; /* A list of tags */ }; typedef enum @@ -62,6 +64,8 @@ void gnt_text_view_append_text_with_flags(GntTextView *view, const char *text, GntTextFormatFlags flags); +void gnt_text_view_append_text_with_tag(GntTextView *view, const char *text, GntTextFormatFlags flags, const char *tag); + /* Move the cursor to the beginning of the next line and resets text-attributes. * It first completes the current line with the current text-attributes. */ void gnt_text_view_next_line(GntTextView *view); @@ -74,6 +78,9 @@ int gnt_text_view_get_lines_above(GntTextView *view); +/* If text is NULL, then the tag is removed. */ +int gnt_text_view_tag_change(GntTextView *view, const char *name, const char *text, gboolean all); + G_END_DECLS #endif /* GNT_TEXT_VIEW_H */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |