From: <sa...@us...> - 2006-06-22 23:08:09
|
Revision: 16311 Author: sadrul Date: 2006-06-22 16:08:05 -0700 (Thu, 22 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16311&view=rev Log Message: ----------- We don't want threads. Modified Paths: -------------- trunk/console/Makefile trunk/console/gntgaim.c Modified: trunk/console/Makefile =================================================================== --- trunk/console/Makefile 2006-06-22 22:38:03 UTC (rev 16310) +++ trunk/console/Makefile 2006-06-22 23:08:05 UTC (rev 16311) @@ -1,5 +1,5 @@ CFLAGS=`pkg-config --cflags gaim gobject-2.0` -g -I./libgnt/ -LDFLAGS=`pkg-config --libs gaim gobject-2.0 gthread-2.0 libxml-2.0` -lncursesw -L./libgnt/ -lgnt +LDFLAGS=`pkg-config --libs gaim gobject-2.0 libxml-2.0` -lncursesw -L./libgnt/ -lgnt GG_SOURCES = \ gntblist.c \ Modified: trunk/console/gntgaim.c =================================================================== --- trunk/console/gntgaim.c 2006-06-22 22:38:03 UTC (rev 16310) +++ trunk/console/gntgaim.c 2006-06-22 23:08:05 UTC (rev 16311) @@ -168,8 +168,6 @@ int main(int argc, char **argv) { - GMainLoop *loop; - /* Initialize the libgaim stuff */ init_libgaim(); @@ -178,11 +176,6 @@ /* Enable the accounts and restore the status */ gaim_accounts_restore_current_statuses(); - /* Main loop */ - g_thread_init(NULL); - loop = g_main_loop_new(NULL, TRUE); - g_thread_create((GThreadFunc)g_main_loop_run, loop, FALSE, NULL); - /* Initialize the UI */ init_gnt_ui(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-23 00:45:52
|
Revision: 16312 Author: sadrul Date: 2006-06-22 17:45:45 -0700 (Thu, 22 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16312&view=rev Log Message: ----------- Improvement/fixing of GntTree. Do the scrolling and stuff without 'reliably'. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbox.h trunk/console/libgnt/gnttree.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-06-22 23:08:05 UTC (rev 16311) +++ trunk/console/gntblist.c 2006-06-23 00:45:45 UTC (rev 16312) @@ -8,39 +8,55 @@ #include "gntbox.h" #include "gnttree.h" +#include "gntblist.h" + #define TAB_SIZE 3 -/** - * NOTES: - * - * 1. signal-callbacks should check for module_in_focus() before redrawing anything. - * 2. call module_lost_focus() before opening a new window, and module_gained_focus() when - * the new window is closed. This is to make sure the signal callbacks don't screw up - * the display. - */ +typedef struct +{ + GntWidget *window; + GntWidget *tree; +} GGBlist; +GGBlist *ggblist; + +static void +new_node(GaimBlistNode *node) +{ +} + +static void +node_update(GaimBuddyList *list, GaimBlistNode *node) +{ +} + +static void +node_remove(GaimBuddyList *list, GaimBlistNode *node) +{ +} + +static void +new_list(GaimBuddyList *list) +{ + if (ggblist == NULL) + gg_blist_init(); + list->ui_data = ggblist; +} + static GaimBlistUiOps blist_ui_ops = { + new_list, + new_node, NULL, + node_update, /* This doesn't do crap */ + node_remove, NULL, NULL, - NULL, /* This doesn't do crap */ NULL, NULL, - NULL, - NULL, - NULL, NULL }; -typedef struct -{ - GntWidget *window; - GntWidget *tree; -} GGBlist; - -GGBlist *ggblist; - static gpointer gg_blist_get_handle() { @@ -61,11 +77,15 @@ } static void -buddy_signed_on(GaimBuddy *buddy, GGBlist *ggblist) +add_buddy(GaimBuddy *buddy, GGBlist *ggblist) { - GaimGroup *group = gaim_buddy_get_group(buddy); char *text; + GaimGroup *group; + GaimBlistNode *node = (GaimBlistNode *)buddy; + if (node->ui_data) + return; + group = gaim_buddy_get_group(buddy); add_group(group, ggblist); text = g_strdup_printf("%*s%s", TAB_SIZE, "", gaim_buddy_get_alias(buddy)); @@ -74,6 +94,12 @@ } static void +buddy_signed_on(GaimBuddy *buddy, GGBlist *ggblist) +{ + add_buddy(buddy, ggblist); +} + +static void buddy_signed_off(GaimBuddy *buddy, GGBlist *ggblist) { gnt_tree_remove(GNT_TREE(ggblist->tree), buddy); @@ -92,13 +118,17 @@ void gg_blist_init() { - ggblist = g_new0(GGBlist, 1); + if (ggblist == NULL) + ggblist = g_new0(GGBlist, 1); ggblist->window = gnt_box_new(FALSE, FALSE); + GNT_WIDGET_UNSET_FLAGS(ggblist->window, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); gnt_box_set_title(GNT_BOX(ggblist->window), _("Buddy List")); + gnt_box_set_pad(GNT_BOX(ggblist->window), 0); ggblist->tree = gnt_tree_new(); - gnt_widget_set_size(ggblist->tree, 25, getmaxy(stdscr)); + GNT_WIDGET_SET_FLAGS(ggblist->tree, GNT_WIDGET_NO_BORDER); + gnt_widget_set_size(ggblist->tree, 25, getmaxy(stdscr) - 2); gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->tree); gnt_widget_show(ggblist->window); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-06-22 23:08:05 UTC (rev 16311) +++ trunk/console/libgnt/gntbox.c 2006-06-23 00:45:45 UTC (rev 16312) @@ -31,8 +31,8 @@ } else { + /* XXX: Position of the title might be configurable */ pos = (widget->priv.width - pos - 2) / 2; - /*pos = 2;*/ } wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TITLE)); mvwprintw(widget->window, 0, pos, title); @@ -52,17 +52,15 @@ gboolean has_border = FALSE; int x, y; - x = widget->priv.x; - y = widget->priv.y; w = h = 0; max = -1; - curx = widget->priv.x; - cury = widget->priv.y; + curx = widget->priv.x + 1; + cury = widget->priv.y + 1; if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) { has_border = TRUE; - curx += 1; - cury += 1; + curx += box->pad; + cury += box->pad; if (!box->vertical) curx++; } @@ -73,13 +71,13 @@ gnt_widget_get_size(GNT_WIDGET(iter->data), &w, &h); if (box->vertical) { - cury += h + 1; + cury += h + box->pad; if (max < w) max = w; } else { - curx += w + 2; + curx += w + box->pad; if (max < h) max = h; } @@ -303,6 +301,7 @@ box->homogeneous = homo; box->vertical = vert; + box->pad = 1; gnt_widget_set_take_focus(widget, TRUE); GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); @@ -321,3 +320,9 @@ b->title = g_strdup(title); } +void gnt_box_set_pad(GntBox *box, int pad) +{ + box->pad = pad; + /* XXX: Perhaps redraw if already showing? */ +} + Modified: trunk/console/libgnt/gntbox.h =================================================================== --- trunk/console/libgnt/gntbox.h 2006-06-22 23:08:05 UTC (rev 16311) +++ trunk/console/libgnt/gntbox.h 2006-06-23 00:45:45 UTC (rev 16312) @@ -23,6 +23,7 @@ GList *list; /* List of widgets */ GList *active; + int pad; /* Number of spaces to use between widgets */ char *title; @@ -52,6 +53,8 @@ void gnt_box_set_title(GntBox *box, const char *title); +void gnt_box_set_pad(GntBox *box, int pad); + G_END_DECLS #endif /* GNT_BOX_H */ Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-22 23:08:05 UTC (rev 16311) +++ trunk/console/libgnt/gnttree.c 2006-06-23 00:45:45 UTC (rev 16312) @@ -21,11 +21,12 @@ static GntWidgetClass *parent_class = NULL; static guint signals[SIGS] = { 0 }; -/* XXX: This is ugly, but what can you do ... */ static void -gnt_tree_refresh(GntTree *tree) +redraw_tree(GntTree *tree) { + int start; GntWidget *widget = GNT_WIDGET(tree); + GList *iter; int pos; if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) @@ -33,50 +34,45 @@ else pos = 1; - copywin(tree->scroll, widget->window, tree->top, 0, - pos, pos, widget->priv.height - pos - 1, widget->priv.width - pos - 1, FALSE); - wrefresh(widget->window); -} - -static void -redraw_tree(GntTree *tree) -{ - int start; - GntWidget *widget = GNT_WIDGET(tree); - GList *iter; - wbkgd(tree->scroll, COLOR_PAIR(GNT_COLOR_NORMAL)); for (start = tree->top, iter = g_list_nth(tree->list, tree->top); iter && start < tree->bottom; start++, iter = iter->next) { char str[2096]; /* XXX: This should be safe for any terminal */ + int wr; GntTreeRow *row = g_hash_table_lookup(tree->hash, iter->data); - if (snprintf(str, widget->priv.width, "%s\n", row->text) >= widget->priv.width) + if ((wr = snprintf(str, widget->priv.width, "%s", row->text)) >= widget->priv.width) { /* XXX: ellipsize */ str[widget->priv.width - 1] = 0; } + else + { + while (wr < widget->priv.width - 1) + str[wr++] = ' '; + str[wr] = 0; + } if (start == tree->current) { wbkgdset(tree->scroll, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); - mvwprintw(tree->scroll, start, 0, str); + mvwprintw(tree->scroll, start - tree->top + pos, pos, str); wbkgdset(tree->scroll, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); } else - mvwprintw(tree->scroll, start, 0, str); + mvwprintw(tree->scroll, start - tree->top + pos, pos, str); } while (start < tree->bottom) { - wmove(tree->scroll, start, 0); + wmove(tree->scroll, start - tree->top + pos, pos); wclrtoeol(tree->scroll); start++; } - gnt_tree_refresh(tree); + wrefresh(widget->window); } static void @@ -90,9 +86,10 @@ if (tree->scroll == NULL) { - tree->scroll = newwin(SCROLL_HEIGHT, widget->priv.width, widget->priv.y, widget->priv.x); + tree->scroll = widget->window; /* newwin(SCROLL_HEIGHT, widget->priv.width, 0, 0); */ scrollok(tree->scroll, TRUE); - wsetscrreg(tree->scroll, 0, SCROLL_HEIGHT - 1); + /*wsetscrreg(tree->scroll, 0, SCROLL_HEIGHT - 1);*/ + wsetscrreg(tree->scroll, 0, widget->priv.height - 1); tree->top = 0; tree->bottom = widget->priv.height - @@ -132,14 +129,16 @@ tree->current++; if (tree->current >= tree->bottom) gnt_tree_scroll(tree, 1 + tree->current - tree->bottom); - redraw_tree(tree); + else + redraw_tree(tree); } else if (strcmp(text+1, GNT_KEY_UP) == 0 && tree->current > 0) { tree->current--; if (tree->current < tree->top) gnt_tree_scroll(tree, tree->current - tree->top); - redraw_tree(tree); + else + redraw_tree(tree); } } else if (text[0] == '\r') @@ -216,6 +215,7 @@ GntTree *tree = GNT_TREE(widget); tree->hash = g_hash_table_new(g_direct_hash, g_direct_equal); + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_SHADOW); return widget; } @@ -249,8 +249,7 @@ tree->top += count; tree->bottom += count; - /*wscrl(tree->scroll, count);*/ - gnt_tree_refresh(tree); + redraw_tree(tree); } void gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-23 09:38:57
|
Revision: 16316 Author: sadrul Date: 2006-06-23 02:38:48 -0700 (Fri, 23 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16316&view=rev Log Message: ----------- Minor tweaks to the buddy-list. The list now updates if some account gets disconnected due to a connection error. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntblist.h trunk/console/gntgaim.c trunk/console/gntui.c trunk/console/libgnt/gnttree.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-06-23 08:42:07 UTC (rev 16315) +++ trunk/console/gntblist.c 2006-06-23 09:38:48 UTC (rev 16316) @@ -16,31 +16,52 @@ { GntWidget *window; GntWidget *tree; + + GaimBuddyList *list; } GGBlist; GGBlist *ggblist; +static void add_buddy(GaimBuddy *buddy, GGBlist *ggblist); +static void add_group(GaimGroup *group, GGBlist *ggblist); + static void new_node(GaimBlistNode *node) { } static void -node_update(GaimBuddyList *list, GaimBlistNode *node) +node_remove(GaimBuddyList *list, GaimBlistNode *node) { + GGBlist *ggblist = list->ui_data; + + if (node->ui_data == NULL) + return; + + gnt_tree_remove(GNT_TREE(ggblist->tree), node); + node->ui_data = NULL; + + /* XXX: Depending on the node, we may want to remove the group/contact node if necessary */ + if (GAIM_BLIST_NODE_IS_BUDDY(node)) + { + GaimGroup *group = gaim_buddy_get_group((GaimBuddy*)node); + if (gaim_blist_get_group_online_count(group) == 0) + node_remove(list, (GaimBlistNode*)group); + } } static void -node_remove(GaimBuddyList *list, GaimBlistNode *node) +node_update(GaimBuddyList *list, GaimBlistNode *node) { + if (GAIM_BLIST_NODE_IS_BUDDY(node)) + { + GaimBuddy *buddy = (GaimBuddy*)node; + } } static void new_list(GaimBuddyList *list) { - if (ggblist == NULL) - gg_blist_init(); - list->ui_data = ggblist; } static GaimBlistUiOps blist_ui_ops = @@ -85,6 +106,7 @@ if (node->ui_data) return; + node->ui_data = GINT_TO_POINTER(TRUE); group = gaim_buddy_get_group(buddy); add_group(group, ggblist); @@ -102,10 +124,10 @@ static void buddy_signed_off(GaimBuddy *buddy, GGBlist *ggblist) { - gnt_tree_remove(GNT_TREE(ggblist->tree), buddy); + node_remove(ggblist->list, (GaimBlistNode*)buddy); } -GaimBlistUiOps *gg_get_blist_ui_ops() +GaimBlistUiOps *gg_blist_get_ui_ops() { return &blist_ui_ops; } @@ -118,9 +140,10 @@ void gg_blist_init() { - if (ggblist == NULL) - ggblist = g_new0(GGBlist, 1); + ggblist = g_new0(GGBlist, 1); + gaim_get_blist()->ui_data = ggblist; + ggblist->window = gnt_box_new(FALSE, FALSE); GNT_WIDGET_UNSET_FLAGS(ggblist->window, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); gnt_box_set_title(GNT_BOX(ggblist->window), _("Buddy List")); @@ -139,7 +162,7 @@ GAIM_CALLBACK(buddy_signed_off), ggblist); g_signal_connect(G_OBJECT(ggblist->tree), "activate", G_CALLBACK(selection_activate), ggblist); - + /*gaim_signal_connect(gaim_conversations_get_handle(), "received-im-msg", gg_blist_get_handle(),*/ /*GAIM_CALLBACK(received_im_msg), list);*/ /*gaim_signal_connect(gaim_conversations_get_handle(), "sent-im-msg", gg_blist_get_handle(),*/ Modified: trunk/console/gntblist.h =================================================================== --- trunk/console/gntblist.h 2006-06-23 08:42:07 UTC (rev 16315) +++ trunk/console/gntblist.h 2006-06-23 09:38:48 UTC (rev 16316) @@ -1,5 +1,5 @@ #include "blist.h" -GaimBlistUiOps * gg_get_blist_ui_ops(); +GaimBlistUiOps * gg_blist_get_ui_ops(); void gg_blist_init(); Modified: trunk/console/gntgaim.c =================================================================== --- trunk/console/gntgaim.c 2006-06-23 08:42:07 UTC (rev 16315) +++ trunk/console/gntgaim.c 2006-06-23 09:38:48 UTC (rev 16316) @@ -171,8 +171,6 @@ /* Initialize the libgaim stuff */ init_libgaim(); - /* Connect to the signals */ - /* Enable the accounts and restore the status */ gaim_accounts_restore_current_statuses(); Modified: trunk/console/gntui.c =================================================================== --- trunk/console/gntui.c 2006-06-23 08:42:07 UTC (rev 16315) +++ trunk/console/gntui.c 2006-06-23 09:38:48 UTC (rev 16316) @@ -6,12 +6,11 @@ wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); werase(stdscr); - /*box(stdscr, ACS_VLINE, ACS_HLINE);*/ wrefresh(stdscr); /* Initialize the buddy list */ gg_blist_init(); - gaim_blist_set_ui_ops(gg_get_blist_ui_ops()); + gaim_blist_set_ui_ops(gg_blist_get_ui_ops()); gnt_main(); } Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-23 08:42:07 UTC (rev 16315) +++ trunk/console/libgnt/gnttree.c 2006-06-23 09:38:48 UTC (rev 16316) @@ -13,9 +13,11 @@ char *text; void *data; /* XXX: unused */ + /* XXX: These are also unused */ GntTreeRow *parent; GntTreeRow *child; GntTreeRow *next; + GntTreeRow *prev; }; static GntWidgetClass *parent_class = NULL; @@ -268,7 +270,9 @@ pr = g_hash_table_lookup(tree->hash, bigbro); if (pr) { + if (pr->next) pr->next->prev = row; row->next = pr->next; + row->prev = pr; pr->next = row; row->parent = pr->parent; @@ -281,6 +285,7 @@ pr = g_hash_table_lookup(tree->hash, parent); if (pr) { + if (pr->child) pr->child->prev = row; row->next = pr->child; pr->child = row; row->parent = pr; @@ -291,6 +296,7 @@ if (pr == NULL) { + if (tree->root) tree->root->prev = row; row->next = tree->root; tree->root = row; @@ -316,6 +322,7 @@ return tree->current; } +/* 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); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-23 10:25:54
|
Revision: 16317 Author: sadrul Date: 2006-06-23 03:25:47 -0700 (Fri, 23 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16317&view=rev Log Message: ----------- Do the indentation in GntTree properly. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gntwidget.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-06-23 09:38:48 UTC (rev 16316) +++ trunk/console/gntblist.c 2006-06-23 10:25:47 UTC (rev 16317) @@ -10,8 +10,6 @@ #include "gntblist.h" -#define TAB_SIZE 3 - typedef struct { GntWidget *window; @@ -100,7 +98,6 @@ static void add_buddy(GaimBuddy *buddy, GGBlist *ggblist) { - char *text; GaimGroup *group; GaimBlistNode *node = (GaimBlistNode *)buddy; if (node->ui_data) @@ -110,9 +107,7 @@ group = gaim_buddy_get_group(buddy); add_group(group, ggblist); - text = g_strdup_printf("%*s%s", TAB_SIZE, "", gaim_buddy_get_alias(buddy)); - gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, text, group, NULL); - g_free(text); + gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, gaim_buddy_get_alias(buddy), group, NULL); } static void Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-23 09:38:48 UTC (rev 16316) +++ trunk/console/libgnt/gnttree.c 2006-06-23 10:25:47 UTC (rev 16317) @@ -5,6 +5,8 @@ SIGS = 1, }; +#define TAB_SIZE 3 + /* XXX: Make this one into a GObject? * ... Probably not */ struct _GnTreeRow @@ -202,12 +204,21 @@ return type; } +static void +free_tree_row(gpointer data) +{ + GntTreeRow *row = data; + + g_free(row->text); + g_free(row); +} + GntWidget *gnt_tree_new() { GntWidget *widget = g_object_new(GNT_TYPE_TREE, NULL); GntTree *tree = GNT_TREE(widget); - tree->hash = g_hash_table_new(g_direct_hash, g_direct_equal); + tree->hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_tree_row); GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_SHADOW); gnt_widget_set_take_focus(widget, TRUE); @@ -246,14 +257,24 @@ redraw_tree(tree); } +static int +find_depth(GntTreeRow *row) +{ + int dep = -1; + + while (row) + { + dep++; + row = row->parent; + } + + return dep; +} + void gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro) { GntTreeRow *row = g_new0(GntTreeRow, 1), *pr = NULL; - row->key = key; - row->text = g_strdup(text); - row->data = NULL; - g_hash_table_insert(tree->hash, key, row); if (tree->root == NULL) @@ -308,6 +329,10 @@ } } + row->key = key; + row->text = g_strdup_printf("%*s%s", TAB_SIZE * find_depth(row), "", text); + row->data = NULL; + if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_MAPPED)) redraw_tree(tree); } Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-06-23 09:38:48 UTC (rev 16316) +++ trunk/console/libgnt/gntwidget.c 2006-06-23 10:25:47 UTC (rev 16317) @@ -224,6 +224,7 @@ delwin(obj->window); if(!(GNT_WIDGET_FLAGS(obj) & GNT_WIDGET_DESTROYING)) g_object_run_dispose(G_OBJECT(obj)); + /* XXX: This may be the wrong place */ gnt_screen_remove_widget(obj); DEBUG; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-23 19:41:47
|
Revision: 16321 Author: sadrul Date: 2006-06-23 12:41:31 -0700 (Fri, 23 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16321&view=rev Log Message: ----------- Sean suggested displaying a tooltip in the buddylist (http://gaim.sourceforge.net/sean/gntmock.png). This (http://img157.imageshack.us/img157/1793/q4jb.png) is close. You can press Escape to hide the tooltip. I haven't yet managed to refresh widgets when other widgets covering it are destroyed. So some parts of the border around the buddylist gets erased. I am going to try to fix it. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gnt-skel.c trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbox.h trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntlabel.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h trunk/console/libgnt/gntwidget.c trunk/console/libgnt/test.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-06-23 16:59:12 UTC (rev 16320) +++ trunk/console/gntblist.c 2006-06-23 19:41:31 UTC (rev 16321) @@ -15,6 +15,9 @@ GntWidget *window; GntWidget *tree; + GntWidget *tooltip; + GaimBlistNode *tnode; /* Who is the tooltip being displayed for? */ + GaimBuddyList *list; } GGBlist; @@ -29,6 +32,14 @@ } static void +remove_tooltip(GGBlist *ggblist) +{ + gnt_widget_destroy(ggblist->tooltip); + ggblist->tooltip = NULL; + ggblist->tnode = NULL; +} + +static void node_remove(GaimBuddyList *list, GaimBlistNode *node) { GGBlist *ggblist = list->ui_data; @@ -46,6 +57,11 @@ if (gaim_blist_get_group_online_count(group) == 0) node_remove(list, (GaimBlistNode*)group); } + + if (ggblist->tnode == node) + { + remove_tooltip(ggblist); + } } static void @@ -90,9 +106,8 @@ GaimBlistNode *node = (GaimBlistNode *)group; if (node->ui_data) return; - gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group, + node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group, group->name, NULL, NULL); - node->ui_data = GINT_TO_POINTER(TRUE); } static void @@ -103,11 +118,11 @@ if (node->ui_data) return; - node->ui_data = GINT_TO_POINTER(TRUE); group = gaim_buddy_get_group(buddy); add_group(group, ggblist); - gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, gaim_buddy_get_alias(buddy), group, NULL); + node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, + gaim_buddy_get_alias(buddy), group, NULL); } static void @@ -133,14 +148,108 @@ gnt_widget_set_focus(widget, FALSE); } +static void +selection_changed(GntWidget *widget, int old, int current, GGBlist *ggblist) +{ + GaimBlistNode *node; + GntTree *tree = GNT_TREE(widget); + int x, y, top, width; + GString *str; + GaimPlugin *prpl; + GaimPluginProtocolInfo *prpl_info; + GaimAccount *account; + GntWidget *box, *label; + char *title; + + if (ggblist->tooltip) + { + remove_tooltip(ggblist); + } + + node = gnt_tree_get_selection_data(tree); + if (!node) + return; + + str = g_string_new(""); + + if (GAIM_BLIST_NODE_IS_BUDDY(node)) + { + GaimBuddy *buddy = (GaimBuddy *)node; + account = gaim_buddy_get_account(buddy); + + g_string_append_printf(str, _("Account: %s"), gaim_account_get_username(account)); + + 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); + } + + title = g_strdup(gaim_buddy_get_name(buddy)); + } + else + { + g_string_free(str, TRUE); + return; + } + + gnt_widget_get_position(widget, &x, &y); + gnt_widget_get_size(widget, &width, NULL); + top = gnt_tree_get_selection_visible_line(tree); + + x += width; + y += top - 1; + + box = gnt_box_new(FALSE, FALSE); + gnt_box_set_toplevel(GNT_BOX(box), TRUE); + GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_NO_SHADOW); + gnt_box_set_title(GNT_BOX(box), title); + + gnt_box_add_widget(GNT_BOX(box), GNT_WIDGET(gnt_label_new(str->str))); + + gnt_widget_set_position(box, x, y); + gnt_widget_draw(box); + + g_string_free(str, TRUE); + ggblist->tooltip = box; + ggblist->tnode = node; +} + +static gboolean +key_pressed(GntWidget *widget, const char *text, GGBlist *ggblist) +{ + if (text[0] == 27 && text[1] == 0) + { + /* Escape was pressed */ + if (ggblist->tooltip) + { + gnt_widget_destroy(ggblist->tooltip); + ggblist->tooltip = NULL; + return TRUE; + } + } + return FALSE; +} + void gg_blist_init() { ggblist = g_new0(GGBlist, 1); gaim_get_blist()->ui_data = ggblist; + ggblist->list = gaim_get_blist(); ggblist->window = gnt_box_new(FALSE, FALSE); - GNT_WIDGET_UNSET_FLAGS(ggblist->window, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); + gnt_box_set_toplevel(GNT_BOX(ggblist->window), TRUE); gnt_box_set_title(GNT_BOX(ggblist->window), _("Buddy List")); gnt_box_set_pad(GNT_BOX(ggblist->window), 0); @@ -156,14 +265,19 @@ gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-off", gg_blist_get_handle(), GAIM_CALLBACK(buddy_signed_off), ggblist); - g_signal_connect(G_OBJECT(ggblist->tree), "activate", G_CALLBACK(selection_activate), ggblist); +#if 0 + /* These I plan to use to indicate unread-messages etc. */ + gaim_signal_connect(gaim_conversations_get_handle(), "received-im-msg", gg_blist_get_handle(), + GAIM_CALLBACK(received_im_msg), list); + gaim_signal_connect(gaim_conversations_get_handle(), "sent-im-msg", gg_blist_get_handle(), + GAIM_CALLBACK(sent_im_msg), NULL); - /*gaim_signal_connect(gaim_conversations_get_handle(), "received-im-msg", gg_blist_get_handle(),*/ - /*GAIM_CALLBACK(received_im_msg), list);*/ - /*gaim_signal_connect(gaim_conversations_get_handle(), "sent-im-msg", gg_blist_get_handle(),*/ - /*GAIM_CALLBACK(sent_im_msg), NULL);*/ + gaim_signal_connect(gaim_conversations_get_handle(), "received-chat-msg", gg_blist_get_handle(), + GAIM_CALLBACK(received_chat_msg), list); +#endif - /*gaim_signal_connect(gaim_conversations_get_handle(), "received-chat-msg", gg_blist_get_handle(),*/ - /*GAIM_CALLBACK(received_chat_msg), list);*/ + 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), "activate", G_CALLBACK(selection_activate), ggblist); } Modified: trunk/console/libgnt/gnt-skel.c =================================================================== --- trunk/console/libgnt/gnt-skel.c 2006-06-23 16:59:12 UTC (rev 16320) +++ trunk/console/libgnt/gnt-skel.c 2006-06-23 19:41:31 UTC (rev 16321) @@ -39,7 +39,7 @@ } static void -gnt_skel_class_init(GntWidgetClass *klass) +gnt_skel_class_init(GntSkelClass *klass) { GObjectClass *obj_class = G_OBJECT_CLASS(klass); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-06-23 16:59:12 UTC (rev 16320) +++ trunk/console/libgnt/gntbox.c 2006-06-23 19:41:31 UTC (rev 16321) @@ -267,7 +267,7 @@ } static void -gnt_box_class_init(GntWidgetClass *klass) +gnt_box_class_init(GntBoxClass *klass) { GObjectClass *obj_class = G_OBJECT_CLASS(klass); @@ -351,3 +351,12 @@ /* XXX: Perhaps redraw if already showing? */ } +void gnt_box_set_toplevel(GntBox *box, gboolean set) +{ + GntWidget *widget = GNT_WIDGET(box); + if (set) + GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); + else + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); +} + Modified: trunk/console/libgnt/gntbox.h =================================================================== --- trunk/console/libgnt/gntbox.h 2006-06-23 16:59:12 UTC (rev 16320) +++ trunk/console/libgnt/gntbox.h 2006-06-23 19:41:31 UTC (rev 16321) @@ -55,6 +55,8 @@ void gnt_box_set_pad(GntBox *box, int pad); +void gnt_box_set_toplevel(GntBox *box, gboolean set); + G_END_DECLS #endif /* GNT_BOX_H */ Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-06-23 16:59:12 UTC (rev 16320) +++ trunk/console/libgnt/gntentry.c 2006-06-23 19:41:31 UTC (rev 16321) @@ -138,7 +138,7 @@ } static void -gnt_entry_class_init(GntWidgetClass *klass) +gnt_entry_class_init(GntEntryClass *klass) { GObjectClass *obj_class = G_OBJECT_CLASS(klass); Modified: trunk/console/libgnt/gntlabel.c =================================================================== --- trunk/console/libgnt/gntlabel.c 2006-06-23 16:59:12 UTC (rev 16320) +++ trunk/console/libgnt/gntlabel.c 2006-06-23 19:41:31 UTC (rev 16321) @@ -57,7 +57,7 @@ } static void -gnt_label_class_init(GntWidgetClass *klass) +gnt_label_class_init(GntLabelClass *klass) { GObjectClass *obj_class = G_OBJECT_CLASS(klass); Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-06-23 16:59:12 UTC (rev 16320) +++ trunk/console/libgnt/gntmain.c 2006-06-23 19:41:31 UTC (rev 16321) @@ -90,7 +90,6 @@ setlocale(LC_ALL, ""); initscr(); start_color(); - /*use_default_colors();*/ gnt_init_colors(); max_x = getmaxx(stdscr); Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-23 16:59:12 UTC (rev 16320) +++ trunk/console/libgnt/gnttree.c 2006-06-23 19:41:31 UTC (rev 16321) @@ -1,8 +1,10 @@ #include "gnttree.h" +#include "gntutils.h" enum { - SIGS = 1, + SIG_SELECTION_CHANGED, + SIGS, }; #define TAB_SIZE 3 @@ -113,10 +115,18 @@ DEBUG; } +static void +tree_selection_changed(GntTree *tree, int old, int current) +{ + g_signal_emit(tree, signals[SIG_SELECTION_CHANGED], 0, old, current); +} + static gboolean gnt_tree_key_pressed(GntWidget *widget, const char *text) { GntTree *tree = GNT_TREE(widget); + int old = tree->current; + if (text[0] == 27) { if (strcmp(text+1, GNT_KEY_DOWN) == 0 && tree->current < g_list_length(tree->list) - 1) @@ -141,6 +151,9 @@ gnt_widget_activate(widget); } + if (old != tree->current) + tree_selection_changed(tree, old, tree->current); + return FALSE; } @@ -154,7 +167,7 @@ } static void -gnt_tree_class_init(GntWidgetClass *klass) +gnt_tree_class_init(GntTreeClass *klass) { GObjectClass *obj_class = G_OBJECT_CLASS(klass); @@ -165,6 +178,15 @@ parent_class->size_request = gnt_tree_size_request; parent_class->key_pressed = gnt_tree_key_pressed; + signals[SIG_SELECTION_CHANGED] = + g_signal_new("selection-changed", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GntTreeClass, selection_changed), + NULL, NULL, + gnt_closure_marshal_VOID__INT_INT, + G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); + DEBUG; } @@ -271,7 +293,7 @@ return dep; } -void gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro) +GntTreeRow *gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro) { GntTreeRow *row = g_new0(GntTreeRow, 1), *pr = NULL; @@ -335,11 +357,13 @@ if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_MAPPED)) redraw_tree(tree); + + return row; } gpointer gnt_tree_get_selection_data(GntTree *tree) { - return g_list_nth(tree->list, tree->current); + return g_list_nth_data(tree->list, tree->current); } int gnt_tree_get_selection_index(GntTree *tree) @@ -355,9 +379,6 @@ { int len, pos; - g_free(row->text); - g_free(row); - pos = g_list_index(tree->list, key); g_hash_table_remove(tree->hash, key); @@ -367,6 +388,13 @@ { redraw_tree(tree); } + g_hash_table_replace(tree->hash, key, NULL); } } +int gnt_tree_get_selection_visible_line(GntTree *tree) +{ + return (tree->current - tree->top) + + !!(GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_NO_BORDER)); +} + Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-06-23 16:59:12 UTC (rev 16320) +++ trunk/console/libgnt/gnttree.h 2006-06-23 19:41:31 UTC (rev 16321) @@ -42,6 +42,8 @@ { GntWidgetClass parent; + void (*selection_changed)(int old, int current); + void (*gnt_reserved1)(void); void (*gnt_reserved2)(void); void (*gnt_reserved3)(void); @@ -60,7 +62,7 @@ void gnt_tree_scroll(GntTree *tree, int count); -void gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro); +GntTreeRow *gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro); gpointer gnt_tree_get_selection_data(GntTree *tree); @@ -68,6 +70,9 @@ void gnt_tree_remove(GntTree *tree, gpointer key); +/* Returns the visible line number of the selected row */ +int gnt_tree_get_selection_visible_line(GntTree *tree); + G_END_DECLS #endif /* GNT_TREE_H */ Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-06-23 16:59:12 UTC (rev 16320) +++ trunk/console/libgnt/gntwidget.c 2006-06-23 19:41:31 UTC (rev 16321) @@ -221,11 +221,12 @@ { g_return_if_fail(GNT_IS_WIDGET(obj)); + gnt_widget_hide(obj); delwin(obj->window); if(!(GNT_WIDGET_FLAGS(obj) & GNT_WIDGET_DESTROYING)) g_object_run_dispose(G_OBJECT(obj)); /* XXX: This may be the wrong place */ - gnt_screen_remove_widget(obj); + /*gnt_screen_remove_widget(obj);*/ DEBUG; } @@ -309,6 +310,7 @@ * those windows to redraw themselves by emitting the approrpiate * expose signal. */ + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); werase(widget->window); wrefresh(widget->window); } Modified: trunk/console/libgnt/test.c =================================================================== --- trunk/console/libgnt/test.c 2006-06-23 16:59:12 UTC (rev 16320) +++ trunk/console/libgnt/test.c 2006-06-23 19:41:31 UTC (rev 16321) @@ -112,7 +112,7 @@ gnt_widget_show(hbox); - /*g_signal_connect(hbox, "key_pressed", G_CALLBACK(key_pressed), widget);*/ + g_signal_connect(hbox, "key_pressed", G_CALLBACK(key_pressed), tree); g_signal_connect(widget, "activate", G_CALLBACK(button1), hbox); g_signal_connect(widget2, "activate", G_CALLBACK(button2), hbox); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-23 20:42:30
|
Revision: 16322 Author: sadrul Date: 2006-06-23 13:42:25 -0700 (Fri, 23 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16322&view=rev Log Message: ----------- Fix a crash. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gnttree.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-06-23 19:41:31 UTC (rev 16321) +++ trunk/console/gntblist.c 2006-06-23 20:42:25 UTC (rev 16322) @@ -17,8 +17,6 @@ GntWidget *tooltip; GaimBlistNode *tnode; /* Who is the tooltip being displayed for? */ - - GaimBuddyList *list; } GGBlist; GGBlist *ggblist; @@ -134,7 +132,7 @@ static void buddy_signed_off(GaimBuddy *buddy, GGBlist *ggblist) { - node_remove(ggblist->list, (GaimBlistNode*)buddy); + node_remove(gaim_get_blist(), (GaimBlistNode*)buddy); } GaimBlistUiOps *gg_blist_get_ui_ops() @@ -246,7 +244,6 @@ ggblist = g_new0(GGBlist, 1); gaim_get_blist()->ui_data = ggblist; - ggblist->list = gaim_get_blist(); ggblist->window = gnt_box_new(FALSE, FALSE); gnt_box_set_toplevel(GNT_BOX(ggblist->window), TRUE); Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-23 19:41:31 UTC (rev 16321) +++ trunk/console/libgnt/gnttree.c 2006-06-23 20:42:25 UTC (rev 16322) @@ -231,6 +231,9 @@ { GntTreeRow *row = data; + if (!row) + return; + g_free(row->text); g_free(row); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-24 10:11:01
|
Revision: 16328 Author: sadrul Date: 2006-06-24 03:10:53 -0700 (Sat, 24 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16328&view=rev Log Message: ----------- Change the internals of GntTree. The change was required to accommodate expand/collapsing of the groups. I have added tooltips for Groups as well, which shows the online/total count. Do we like it? I have also added emblems at the beginning of the names of the buddies to indicate their status. Currently I am using ASCII-emblems ('o' for available, '.' for away, 'x' for offline (but I am not showing any offline buddies yet)), but I plan on using some cool unicode-emblems Sean suggested to me. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntgaim.c trunk/console/libgnt/Makefile trunk/console/libgnt/gntbox.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h trunk/console/libgnt/gntutils.c trunk/console/libgnt/gntutils.h Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-06-24 08:56:57 UTC (rev 16327) +++ trunk/console/gntblist.c 2006-06-24 10:10:53 UTC (rev 16328) @@ -9,6 +9,7 @@ #include "gnttree.h" #include "gntblist.h" +#include <string.h> typedef struct { @@ -23,6 +24,7 @@ static void add_buddy(GaimBuddy *buddy, GGBlist *ggblist); static void add_group(GaimGroup *group, GGBlist *ggblist); +static void draw_tooltip(GGBlist *ggblist); static void new_node(GaimBlistNode *node) @@ -54,6 +56,8 @@ GaimGroup *group = gaim_buddy_get_group((GaimBuddy*)node); if (gaim_blist_get_group_online_count(group) == 0) node_remove(list, (GaimBlistNode*)group); + else if (ggblist->tnode == (GaimBlistNode *)group) /* Need to update the counts */ + draw_tooltip(ggblist); } if (ggblist->tnode == node) @@ -68,6 +72,10 @@ if (GAIM_BLIST_NODE_IS_BUDDY(node)) { GaimBuddy *buddy = (GaimBuddy*)node; + if (gaim_presence_is_online(gaim_buddy_get_presence(buddy))) + add_buddy(buddy, list->ui_data); + else + node_remove(gaim_get_blist(), node); } } @@ -108,6 +116,52 @@ group->name, NULL, NULL); } +static const char * +get_buddy_display_name(GaimBuddy *buddy) +{ + static char text[2096]; + char status[8]; + GaimStatusPrimitive prim; + GaimPresence *presence; + GaimStatus *now; + + presence = gaim_buddy_get_presence(buddy); + now = gaim_presence_get_active_status(presence); + + prim = gaim_status_type_get_primitive(gaim_status_get_type(now)); + + switch(prim) + { +#if 1 + case GAIM_STATUS_OFFLINE: + strncpy(status, "x", sizeof(status) - 1); + break; + case GAIM_STATUS_AVAILABLE: + strncpy(status, "o", sizeof(status) - 1); + break; + default: + strncpy(status, ".", sizeof(status) - 1); + break; +#else + /* XXX: Let's use these some time */ + case GAIM_STATUS_OFFLINE: + strncpy(status, "⊗", sizeof(status) - 1); + break; + case GAIM_STATUS_AVAILABLE: + /* XXX: Detect idleness */ + strncpy(status, "◯", sizeof(status) - 1); + break; + default: + strncpy(status, "⊖", sizeof(status) - 1); + break; +#endif + } + + snprintf(text, sizeof(text) - 1, "%s %s", status, gaim_buddy_get_alias(buddy)); + + return text; +} + static void add_buddy(GaimBuddy *buddy, GGBlist *ggblist) { @@ -120,7 +174,10 @@ add_group(group, ggblist); node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, - gaim_buddy_get_alias(buddy), group, NULL); + get_buddy_display_name(buddy), group, NULL); + + if (ggblist->tnode == (GaimBlistNode*)group) + draw_tooltip(ggblist); } static void @@ -147,18 +204,21 @@ } static void -selection_changed(GntWidget *widget, int old, int current, GGBlist *ggblist) +draw_tooltip(GGBlist *ggblist) { GaimBlistNode *node; - GntTree *tree = GNT_TREE(widget); int x, y, top, width; GString *str; GaimPlugin *prpl; GaimPluginProtocolInfo *prpl_info; GaimAccount *account; - GntWidget *box, *label; - char *title; + GntTree *tree; + GntWidget *widget, *box, *label; + char *title = NULL; + widget = ggblist->tree; + tree = GNT_TREE(widget); + if (ggblist->tooltip) { remove_tooltip(ggblist); @@ -195,6 +255,16 @@ title = g_strdup(gaim_buddy_get_name(buddy)); } + else if (GAIM_BLIST_NODE_IS_GROUP(node)) + { + GaimGroup *group = (GaimGroup *)node; + + g_string_append_printf(str, _("Online: %d\nTotal: %d"), + gaim_blist_get_group_online_count(group), + gaim_blist_get_group_size(group, FALSE)); + + title = g_strdup(group->name); + } else { g_string_free(str, TRUE); @@ -217,12 +287,20 @@ gnt_widget_set_position(box, x, y); gnt_widget_draw(box); - + + g_free(title); g_string_free(str, TRUE); ggblist->tooltip = box; ggblist->tnode = node; } +static void +selection_changed(GntWidget *widget, gpointer old, gpointer current, GGBlist *ggblist) +{ + draw_tooltip(ggblist); +} + + static gboolean key_pressed(GntWidget *widget, const char *text, GGBlist *ggblist) { @@ -239,6 +317,14 @@ return FALSE; } +static void +buddy_status_changed(GaimBuddy *buddy, GaimStatus *old, GaimStatus *now, GGBlist *ggblist) +{ + gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, get_buddy_display_name(buddy)); + if (ggblist->tnode == (GaimBlistNode*)buddy) + draw_tooltip(ggblist); +} + void gg_blist_init() { ggblist = g_new0(GGBlist, 1); @@ -256,13 +342,16 @@ gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->tree); gnt_widget_show(ggblist->window); + + gaim_signal_connect(gaim_blist_get_handle(), "buddy-status-changed", gg_blist_get_handle(), + GAIM_CALLBACK(buddy_status_changed), ggblist); +#if 0 gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-on", gg_blist_get_handle(), GAIM_CALLBACK(buddy_signed_on), ggblist); gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-off", gg_blist_get_handle(), GAIM_CALLBACK(buddy_signed_off), ggblist); -#if 0 /* These I plan to use to indicate unread-messages etc. */ gaim_signal_connect(gaim_conversations_get_handle(), "received-im-msg", gg_blist_get_handle(), GAIM_CALLBACK(received_im_msg), list); Modified: trunk/console/gntgaim.c =================================================================== --- trunk/console/gntgaim.c 2006-06-24 08:56:57 UTC (rev 16327) +++ trunk/console/gntgaim.c 2006-06-24 10:10:53 UTC (rev 16328) @@ -168,6 +168,9 @@ int main(int argc, char **argv) { + /* XXX: Don't puke */ + freopen("/dev/null", "w", stderr); + /* Initialize the libgaim stuff */ init_libgaim(); Modified: trunk/console/libgnt/Makefile =================================================================== --- trunk/console/libgnt/Makefile 2006-06-24 08:56:57 UTC (rev 16327) +++ trunk/console/libgnt/Makefile 2006-06-24 10:10:53 UTC (rev 16328) @@ -36,7 +36,7 @@ all: libgnt -test: $(OBJECTS) +test2: $(OBJECTS) key: $(OBJECTS) gntwidget.o: gntwidget.c $(HEADERS) Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-06-24 08:56:57 UTC (rev 16327) +++ trunk/console/libgnt/gntbox.c 2006-06-24 10:10:53 UTC (rev 16328) @@ -32,7 +32,7 @@ else { /* XXX: Position of the title might be configurable */ - pos = (widget->priv.width - pos - 2) / 2; + pos = (widget->priv.width - pos) / 2; } wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TITLE)); mvwprintw(widget->window, 0, pos, title); Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-24 08:56:57 UTC (rev 16327) +++ trunk/console/libgnt/gnttree.c 2006-06-24 10:10:53 UTC (rev 16328) @@ -1,6 +1,8 @@ #include "gnttree.h" #include "gntutils.h" +#include <string.h> + enum { SIG_SELECTION_CHANGED, @@ -17,7 +19,8 @@ char *text; void *data; /* XXX: unused */ - /* XXX: These are also unused */ + gboolean collapsed; + GntTreeRow *parent; GntTreeRow *child; GntTreeRow *next; @@ -27,30 +30,166 @@ static GntWidgetClass *parent_class = NULL; static guint signals[SIGS] = { 0 }; +static GntTreeRow * +_get_next(GntTreeRow *row, gboolean godeep) +{ + if (row == NULL) + return NULL; + if (godeep && row->child) + return row->child; + if (row->next) + return row->next; + return _get_next(row->parent, FALSE); +} + +static GntTreeRow * +get_next(GntTreeRow *row) +{ + if (row == NULL) + return; + return _get_next(row, !row->collapsed); +} + +/* Returns the n-th next row. If it doesn't exist, returns NULL */ +static GntTreeRow * +get_next_n(GntTreeRow *row, int n) +{ + while (row && n--) + row = get_next(row); + return row; +} + +/* Returns the n-th next row. If it doesn't exist, then the last non-NULL node */ +static GntTreeRow * +get_next_n_opt(GntTreeRow *row, int n, int *pos) +{ + GntTreeRow *next = row; + int r = 0; + + if (row == NULL) + return NULL; + + while (row && n--) + { + row = get_next(row); + if (row) + { + next = row; + r++; + } + } + + if (pos) + *pos = r; + + return next; +} + +static GntTreeRow * +get_last_child(GntTreeRow *row) +{ + if (row == NULL) + return NULL; + if (!row->collapsed && row->child) + row = row->child; + else + return row; + + while(row->next) + row = row->next; + if (row->child) + row = get_last_child(row->child); + return row; +} + +static GntTreeRow * +get_prev(GntTreeRow *row) +{ + if (row == NULL) + return NULL; + if (row->prev) + return get_last_child(row->prev); + return row->parent; +} + +static GntTreeRow * +get_prev_n(GntTreeRow *row, int n) +{ + while (row && n--) + row = get_prev(row); + return row; +} + +/* Distance of row from the root */ +/* XXX: This is uber-inefficient */ +static int +get_root_distance(GntTreeRow *row) +{ + if (row == NULL) + return -1; + return get_root_distance(get_prev(row)) + 1; +} + +/* Returns the distance between a and b. + * If a is 'above' b, then the distance is positive */ +static int +get_distance(GntTreeRow *a, GntTreeRow *b) +{ + /* First get the distance from a to the root. + * Then the distance from b to the root. + * Subtract. + * It's not that good, but it works. */ + int ha = get_root_distance(a); + int hb = get_root_distance(b); + + return (hb - ha); +} + static void redraw_tree(GntTree *tree) { int start; GntWidget *widget = GNT_WIDGET(tree); - GList *iter; + GntTreeRow *row; int pos; + gboolean deep; if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) pos = 0; else pos = 1; + if (tree->top == NULL) + tree->top = tree->root; + if (tree->current == NULL) + tree->current = tree->root; + wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); - for (start = tree->top, iter = g_list_nth(tree->list, tree->top); - iter && start < tree->bottom; start++, iter = iter->next) + deep = TRUE; + row = tree->top; + for (start = pos; row && start < widget->priv.height - pos; + start++, row = get_next(row)) { - char str[2096]; /* XXX: This should be safe for any terminal */ + char str[2048]; int wr; - GntTreeRow *row = g_hash_table_lookup(tree->hash, iter->data); + char format[16] = ""; - if ((wr = snprintf(str, widget->priv.width, "%s", row->text)) >= widget->priv.width) + deep = TRUE; + + if (row->parent == NULL && row->child) { + if (row->collapsed) + { + strcpy(format, "+ "); + deep = FALSE; + } + else + strcpy(format, "- "); + } + + if ((wr = g_snprintf(str, widget->priv.width, "%s%s", format, row->text)) >= widget->priv.width) + { /* XXX: ellipsize */ str[widget->priv.width - 1 - pos] = 0; } @@ -61,19 +200,20 @@ str[wr] = 0; } - if (start == tree->current) + if (row == tree->current) { wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); - mvwprintw(widget->window, start - tree->top + pos, pos, str); + mvwprintw(widget->window, start, pos, str); wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); } else - mvwprintw(widget->window, start - tree->top + pos, pos, str); + mvwprintw(widget->window, start, pos, str); + tree->bottom = row; } - while (start < tree->bottom) + while (start < widget->priv.height - pos) { - mvwhline(widget->window, start - tree->top + pos, pos, ' ', + mvwhline(widget->window, start, pos, ' ', widget->priv.width - pos * 2); start++; } @@ -85,13 +225,12 @@ gnt_tree_draw(GntWidget *widget) { GntTree *tree = GNT_TREE(widget); + int bottom; scrollok(widget->window, TRUE); wsetscrreg(widget->window, 0, widget->priv.height - 1); - tree->top = 0; - tree->bottom = widget->priv.height - - (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER) ? 0 : 2); + tree->top = tree->root; redraw_tree(tree); @@ -116,32 +255,42 @@ } static void -tree_selection_changed(GntTree *tree, int old, int current) +tree_selection_changed(GntTree *tree, GntTreeRow *old, GntTreeRow *current) { g_signal_emit(tree, signals[SIG_SELECTION_CHANGED], 0, old, current); } +static GntTreeRow * +get_nth_row(GntTree *tree, int n) +{ + gpointer key = g_list_nth_data(tree->list, n); + return g_hash_table_lookup(tree->hash, key); +} + static gboolean gnt_tree_key_pressed(GntWidget *widget, const char *text) { GntTree *tree = GNT_TREE(widget); - int old = tree->current; + GntTreeRow *old = tree->current; + GntTreeRow *row; if (text[0] == 27) { - if (strcmp(text+1, GNT_KEY_DOWN) == 0 && tree->current < g_list_length(tree->list) - 1) + int dist; + if (strcmp(text+1, GNT_KEY_DOWN) == 0 && (row = get_next(tree->current)) != NULL) { - tree->current++; - if (tree->current >= tree->bottom) - gnt_tree_scroll(tree, 1 + tree->current - tree->bottom); + tree->current = row; + if ((dist = get_distance(tree->current, tree->bottom)) < 0) + gnt_tree_scroll(tree, -dist); else redraw_tree(tree); } - else if (strcmp(text+1, GNT_KEY_UP) == 0 && tree->current > 0) + else if (strcmp(text+1, GNT_KEY_UP) == 0 && (row = get_prev(tree->current)) != NULL) { - tree->current--; - if (tree->current < tree->top) - gnt_tree_scroll(tree, tree->current - tree->top); + tree->current = row; + + if ((dist = get_distance(tree->current, tree->top)) > 0) + gnt_tree_scroll(tree, -dist); else redraw_tree(tree); } @@ -150,6 +299,16 @@ { gnt_widget_activate(widget); } + else if (text[0] == ' ' && text[1] == 0) + { + /* Space pressed */ + GntTreeRow *row = tree->current; + if (row && row->child) + { + row->collapsed = !row->collapsed; + redraw_tree(tree); + } + } if (old != tree->current) tree_selection_changed(tree, old, tree->current); @@ -184,8 +343,8 @@ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(GntTreeClass, selection_changed), NULL, NULL, - gnt_closure_marshal_VOID__INT_INT, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); + gnt_closure_marshal_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); DEBUG; } @@ -268,17 +427,23 @@ void gnt_tree_scroll(GntTree *tree, int count) { - if (tree->top == 0 && count < 0) - return; + GntTreeRow *row; - if (count > 0 && tree->bottom + count >= g_list_length(tree->list)) - count = g_list_length(tree->list) - tree->bottom; - else if (count < 0 && tree->top + count < 0) - count = -tree->top; + if (count < 0) + { + if (get_root_distance(tree->top) == 0) + return; + row = get_prev_n(tree->top, -count); + if (row == NULL) + row = tree->root; + tree->top = row; + } + else + { + get_next_n_opt(tree->bottom, count, &count); + tree->top = get_next_n(tree->top, count); + } - tree->top += count; - tree->bottom += count; - redraw_tree(tree); } @@ -300,7 +465,7 @@ { GntTreeRow *row = g_new0(GntTreeRow, 1), *pr = NULL; - g_hash_table_insert(tree->hash, key, row); + g_hash_table_replace(tree->hash, key, row); if (tree->root == NULL) { @@ -342,11 +507,13 @@ if (pr == NULL) { - if (tree->root) tree->root->prev = row; - row->next = tree->root; - tree->root = row; + GntTreeRow *r = tree->root; + while (r->next) + r = r->next; + r->next = row; + row->prev = r; - tree->list = g_list_prepend(tree->list, key); + tree->list = g_list_append(tree->list, key); } else { @@ -366,38 +533,81 @@ gpointer gnt_tree_get_selection_data(GntTree *tree) { - return g_list_nth_data(tree->list, tree->current); + if (tree->current) + return tree->current->key; /* XXX: perhaps we should just get rid of 'data' */ + return NULL; } -int gnt_tree_get_selection_index(GntTree *tree) -{ - return tree->current; -} - /* 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); if (row) { - int len, pos; + gboolean redraw = FALSE; - pos = g_list_index(tree->list, key); + if (get_distance(tree->top, row) >= 0 && get_distance(row, tree->bottom) >= 0) + redraw = TRUE; + /* Update root/top/current/bottom if necessary */ + if (tree->root == row) + tree->root = get_next(row); + if (tree->top == row) + { + if (tree->top != tree->root) + tree->top = get_prev(row); + else + tree->top = get_next(row); + if (tree->current == row) + tree->current = tree->top; + } + else if (tree->current == row) + { + if (tree->current != tree->root) + tree->current = get_prev(row); + else + tree->current = get_next(row); + } + else if (tree->bottom == row) + { + tree->bottom = get_prev(row); + } + + /* Fix the links */ + if (row->next) + row->next->prev = row->prev; + if (row->parent && row->parent->child == row) + row->parent->child = row->next; + if (row->prev) + row->prev->next = row->next; + g_hash_table_remove(tree->hash, key); tree->list = g_list_remove(tree->list, key); - if (pos >= tree->top && pos < tree->bottom) + if (redraw) { redraw_tree(tree); } - g_hash_table_replace(tree->hash, key, NULL); } } int gnt_tree_get_selection_visible_line(GntTree *tree) { - return (tree->current - tree->top) + + return get_distance(tree->top, tree->current) + !!(GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_NO_BORDER)); } +void gnt_tree_change_text(GntTree *tree, gpointer key, const char *text) +{ + GntTreeRow *row = g_hash_table_lookup(tree->hash, key); + if (row) + { + g_free(row->text); + row->text = g_strdup_printf("%*s%s", TAB_SIZE * find_depth(row), "", text); + + if (get_distance(tree->top, row) >= 0 && get_distance(row, tree->bottom) > 0) + redraw_tree(tree); + } +} + + Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-06-24 08:56:57 UTC (rev 16327) +++ trunk/console/libgnt/gnttree.h 2006-06-24 10:10:53 UTC (rev 16328) @@ -27,10 +27,10 @@ { GntWidget parent; - int current; /* current selection */ + GntTreeRow *current; /* current selection */ - int top; /* The index in 'list' of the topmost visible item */ - int bottom; /* The index in 'list' of the bottommost visible item */ + GntTreeRow *top; /* The topmost visible item */ + GntTreeRow *bottom; /* The bottommost visible item */ GntTreeRow *root; /* The root of all evil */ @@ -66,13 +66,13 @@ gpointer gnt_tree_get_selection_data(GntTree *tree); -int gnt_tree_get_selection_index(GntTree *tree); - void gnt_tree_remove(GntTree *tree, gpointer key); /* Returns the visible line number of the selected row */ int gnt_tree_get_selection_visible_line(GntTree *tree); +void gnt_tree_change_text(GntTree *tree, gpointer key, const char *text); + G_END_DECLS #endif /* GNT_TREE_H */ Modified: trunk/console/libgnt/gntutils.c =================================================================== --- trunk/console/libgnt/gntutils.c 2006-06-24 08:56:57 UTC (rev 16327) +++ trunk/console/libgnt/gntutils.c 2006-06-24 10:10:53 UTC (rev 16328) @@ -98,3 +98,35 @@ data2); } +void gnt_closure_marshal_VOID__POINTER_POINTER(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*func) (gpointer data1, gpointer, gpointer, gpointer data2); + register func callback; + register GCClosure *cc = (GCClosure*)closure; + register gpointer data1, data2; + + g_return_if_fail(n_param_values == 3); + + 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); + callback(data1, + g_value_get_pointer(param_values + 1) , + g_value_get_pointer(param_values + 2) , + data2); +} + Modified: trunk/console/libgnt/gntutils.h =================================================================== --- trunk/console/libgnt/gntutils.h 2006-06-24 08:56:57 UTC (rev 16327) +++ trunk/console/libgnt/gntutils.h 2006-06-24 10:10:53 UTC (rev 16328) @@ -21,3 +21,10 @@ gpointer invocation_hint, gpointer marshal_data); +void gnt_closure_marshal_VOID__POINTER_POINTER(GClosure *closure, + GValue *ret_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-24 20:06:45
|
Revision: 16331 Author: sadrul Date: 2006-06-24 13:06:37 -0700 (Sat, 24 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16331&view=rev Log Message: ----------- Make the tooltips move to the right place when the selected item goes up/down when someone signs on/off. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gnttree.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-06-24 18:11:59 UTC (rev 16330) +++ trunk/console/gntblist.c 2006-06-24 20:06:37 UTC (rev 16331) @@ -24,6 +24,7 @@ static void add_buddy(GaimBuddy *buddy, GGBlist *ggblist); static void add_group(GaimGroup *group, GGBlist *ggblist); +static void add_node(GaimBlistNode *node, GGBlist *ggblist); static void draw_tooltip(GGBlist *ggblist); static void @@ -31,6 +32,15 @@ { } +static void add_node(GaimBlistNode *node, GGBlist *ggblist) +{ + if (GAIM_BLIST_NODE_IS_BUDDY(node)) + add_buddy((GaimBuddy*)node, ggblist); + else if (GAIM_BLIST_NODE_IS_GROUP(node)) + add_group((GaimGroup*)node, ggblist); + draw_tooltip(ggblist); +} + static void remove_tooltip(GGBlist *ggblist) { @@ -56,14 +66,8 @@ GaimGroup *group = gaim_buddy_get_group((GaimBuddy*)node); if (gaim_blist_get_group_online_count(group) == 0) node_remove(list, (GaimBlistNode*)group); - else if (ggblist->tnode == (GaimBlistNode *)group) /* Need to update the counts */ - draw_tooltip(ggblist); } - - if (ggblist->tnode == node) - { - remove_tooltip(ggblist); - } + draw_tooltip(ggblist); } static void @@ -73,7 +77,7 @@ { GaimBuddy *buddy = (GaimBuddy*)node; if (gaim_presence_is_online(gaim_buddy_get_presence(buddy))) - add_buddy(buddy, list->ui_data); + add_node((GaimBlistNode*)buddy, list->ui_data); else node_remove(gaim_get_blist(), node); } @@ -171,19 +175,16 @@ return; group = gaim_buddy_get_group(buddy); - add_group(group, ggblist); + add_node((GaimBlistNode*)group, ggblist); node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, get_buddy_display_name(buddy), group, NULL); - - if (ggblist->tnode == (GaimBlistNode*)group) - draw_tooltip(ggblist); } static void buddy_signed_on(GaimBuddy *buddy, GGBlist *ggblist) { - add_buddy(buddy, ggblist); + add_node((GaimBlistNode*)buddy, ggblist); } static void Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-24 18:11:59 UTC (rev 16330) +++ trunk/console/libgnt/gnttree.c 2006-06-24 20:06:37 UTC (rev 16331) @@ -6,6 +6,7 @@ enum { SIG_SELECTION_CHANGED, + SIG_SCROLLED, SIGS, }; @@ -345,6 +346,14 @@ NULL, NULL, gnt_closure_marshal_VOID__POINTER_POINTER, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); + signals[SIG_SCROLLED] = + g_signal_new("scrolled", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, G_TYPE_INT); DEBUG; } @@ -445,6 +454,7 @@ } redraw_tree(tree); + g_signal_emit(tree, signals[SIG_SCROLLED], 0, count); } static int This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-25 03:15:48
|
Revision: 16335 Author: sadrul Date: 2006-06-24 20:15:41 -0700 (Sat, 24 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16335&view=rev Log Message: ----------- A bunch of stuff that doesn't really do much. I am trying to get the "expose" thingy going where a widget will redraw some of its parts when some other widget covering it is destroyed. Modified Paths: -------------- trunk/console/Makefile trunk/console/gntblist.c trunk/console/gntgaim.c trunk/console/libgnt/Makefile trunk/console/libgnt/gnt.h trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntwidget.c Modified: trunk/console/Makefile =================================================================== --- trunk/console/Makefile 2006-06-24 22:52:59 UTC (rev 16334) +++ trunk/console/Makefile 2006-06-25 03:15:41 UTC (rev 16335) @@ -1,5 +1,5 @@ CFLAGS=`pkg-config --cflags gaim gobject-2.0` -g -I./libgnt/ -LDFLAGS=`pkg-config --libs gaim gobject-2.0 libxml-2.0` -lncursesw -L./libgnt/ -lgnt +LDFLAGS=`pkg-config --libs gaim gobject-2.0 libxml-2.0` -lncursesw -L./libgnt/ -lgnt -pg GG_SOURCES = \ gntblist.c \ @@ -13,7 +13,9 @@ gntblist.o \ gntui.o -all: gntgaim +all: + cd libgnt && make + make gntgaim gntgaim: gntgaim.o $(GG_OBJECTS) $(CC) -o gntgaim gntgaim.o $(GG_OBJECTS) $(LDFLAGS) @@ -22,6 +24,7 @@ gntui.o: gntui.c $(GG_HEADERS) clean: + cd libgnt && make clean rm *.o rm gntgaim Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-06-24 22:52:59 UTC (rev 16334) +++ trunk/console/gntblist.c 2006-06-25 03:15:41 UTC (rev 16335) @@ -222,6 +222,8 @@ if (ggblist->tooltip) { + /* XXX: Once we can properly redraw on expose events, this can be removed at the end + * to avoid the blinking*/ remove_tooltip(ggblist); } @@ -293,6 +295,8 @@ g_string_free(str, TRUE); ggblist->tooltip = box; ggblist->tnode = node; + + gnt_widget_set_name(ggblist->tooltip, "tooltip"); } static void @@ -333,6 +337,7 @@ gaim_get_blist()->ui_data = ggblist; ggblist->window = gnt_box_new(FALSE, FALSE); + gnt_widget_set_name(ggblist->window, "buddylist"); gnt_box_set_toplevel(GNT_BOX(ggblist->window), TRUE); gnt_box_set_title(GNT_BOX(ggblist->window), _("Buddy List")); gnt_box_set_pad(GNT_BOX(ggblist->window), 0); Modified: trunk/console/gntgaim.c =================================================================== --- trunk/console/gntgaim.c 2006-06-24 22:52:59 UTC (rev 16334) +++ trunk/console/gntgaim.c 2006-06-25 03:15:41 UTC (rev 16335) @@ -169,7 +169,7 @@ int main(int argc, char **argv) { /* XXX: Don't puke */ - freopen("/dev/null", "w", stderr); + freopen(".error", "w", stderr); /* Initialize the libgaim stuff */ init_libgaim(); Modified: trunk/console/libgnt/Makefile =================================================================== --- trunk/console/libgnt/Makefile 2006-06-24 22:52:59 UTC (rev 16334) +++ trunk/console/libgnt/Makefile 2006-06-25 03:15:41 UTC (rev 16335) @@ -1,5 +1,5 @@ CFLAGS=`pkg-config --cflags gobject-2.0` -g -LDFLAGS=`pkg-config --libs gobject-2.0` -lncursesw +LDFLAGS=`pkg-config --libs gobject-2.0` -lncursesw -pg HEADERS = \ gntwidget.h \ Modified: trunk/console/libgnt/gnt.h =================================================================== --- trunk/console/libgnt/gnt.h 2006-06-24 22:52:59 UTC (rev 16334) +++ trunk/console/libgnt/gnt.h 2006-06-25 03:15:41 UTC (rev 16335) @@ -3,15 +3,11 @@ #include "gntcolors.h" #include "gntkeys.h" -/* XXX: Find a better place for this */ -#define SCROLL_HEIGHT 4096 -#define SCROLL_WIDTH 512 - void gnt_init(); void gnt_main(); -void gnt_screen_take_focus(GntWidget *widget); +void gnt_screen_occupy(GntWidget *widget); -void gnt_screen_remove_widget(GntWidget *widget); +void gnt_screen_release(GntWidget *widget); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-06-24 22:52:59 UTC (rev 16334) +++ trunk/console/libgnt/gntbox.c 2006-06-25 03:15:41 UTC (rev 16335) @@ -16,7 +16,9 @@ for (iter = box->list; iter; iter = iter->next) { - gnt_widget_draw(GNT_WIDGET(iter->data)); + GntWidget *w = GNT_WIDGET(iter->data); + gnt_widget_draw(w); + overwrite(w->window, widget->window); } if (box->title) @@ -39,6 +41,8 @@ g_free(title); } wrefresh(widget->window); + + gnt_screen_occupy(widget); DEBUG; } @@ -263,10 +267,21 @@ gnt_widget_destroy(iter->data); } + gnt_screen_release(w); + g_list_free(box->list); } static void +gnt_box_expose(GntWidget *widget, int x, int y, int width, int height) +{ + WINDOW *win = newwin(height, width, widget->priv.y + y, widget->priv.x + x); + copywin(widget->window, win, y, x, 0, 0, height - 1, width - 1, FALSE); + wrefresh(win); + delwin(win); +} + +static void gnt_box_class_init(GntBoxClass *klass) { GObjectClass *obj_class = G_OBJECT_CLASS(klass); @@ -274,6 +289,7 @@ parent_class = GNT_WIDGET_CLASS(klass); parent_class->destroy = gnt_box_destroy; parent_class->draw = gnt_box_draw; + parent_class->expose = gnt_box_expose; parent_class->map = gnt_box_map; parent_class->size_request = gnt_box_size_request; parent_class->set_position = gnt_box_set_position; Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-06-24 22:52:59 UTC (rev 16334) +++ trunk/console/libgnt/gntmain.c 2006-06-25 03:15:41 UTC (rev 16335) @@ -9,6 +9,10 @@ static int max_x; static int max_y; +static GHashTable *nodes; + +static void free_node(gpointer data); + void gnt_screen_take_focus(GntWidget *widget) { focus_list = g_list_prepend(focus_list, widget); @@ -95,6 +99,8 @@ max_x = getmaxx(stdscr); max_y = getmaxy(stdscr); + nodes = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_node); + wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); noecho(); refresh(); @@ -108,3 +114,83 @@ g_main_run(loop); } +/********************************* + * Stuff for 'window management' * + *********************************/ + +typedef struct +{ + GntWidget *me; + GList *below; /* List of widgets below me */ + GList *above; /* List of widgets above me */ +} GntNode; + +static void +free_node(gpointer data) +{ + GntNode *node = data; + g_list_free(node->below); + g_list_free(node->above); + g_free(node); +} + +static void +check_intersection(gpointer key, gpointer value, gpointer data) +{ + GntNode *n = value; + GntNode *nu = data; + + if (value == NULL) + return; + + if (n->me->priv.x + n->me->priv.width < nu->me->priv.x) + return; + if (nu->me->priv.x + nu->me->priv.width < n->me->priv.x) + return; + + if (n->me->priv.y + n->me->priv.height < nu->me->priv.y) + return; + if (nu->me->priv.y + nu->me->priv.height < n->me->priv.y) + return; + + n->above = g_list_prepend(n->above, nu->me); + nu->below = g_list_prepend(nu->below, n->me); +} + +void gnt_screen_occupy(GntWidget *widget) +{ + /* XXX: what happens if this is called more than once for the same widget? + * perhaps _release first? */ + GntNode *node = g_new0(GntNode, 1); + node->me = widget; + + g_hash_table_foreach(nodes, check_intersection, node); + g_hash_table_replace(nodes, widget, node); +} + +void gnt_screen_release(GntWidget *widget) +{ + GList *iter; + GntNode *node = g_hash_table_lookup(nodes, widget); + if (node == NULL || node->below == NULL) /* Yay! Nothing to do. */ + return; + + /* XXX: This is not going to work. + * It will be necessary to build a topology and go from there. */ + for (iter = node->below; iter; iter = iter->next) + { + GntWidget *w = iter->data; + int left, right, top, bottom; + + left = MAX(widget->priv.x, w->priv.x) - w->priv.x; + right = MIN(widget->priv.x + widget->priv.width, w->priv.x + w->priv.width) - w->priv.x; + + top = MAX(widget->priv.y, w->priv.y) - w->priv.y; + bottom = MIN(widget->priv.y + widget->priv.height, w->priv.y + w->priv.height) - w->priv.y; + + gnt_widget_expose(w, left, top, right - left, bottom - top); + } + + g_hash_table_remove(nodes, widget); +} + Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-06-24 22:52:59 UTC (rev 16334) +++ trunk/console/libgnt/gntwidget.c 2006-06-25 03:15:41 UTC (rev 16335) @@ -225,8 +225,6 @@ delwin(obj->window); if(!(GNT_WIDGET_FLAGS(obj) & GNT_WIDGET_DESTROYING)) g_object_run_dispose(G_OBJECT(obj)); - /* XXX: This may be the wrong place */ - /*gnt_screen_remove_widget(obj);*/ DEBUG; } @@ -264,11 +262,10 @@ else werase(widget->window); +#if 0 + /* XXX: No shadow for now :( */ if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_SHADOW)) { - /* XXX: Find out the actual windows beneath this window, and - * draw the shadow on them */ - /* XXX: Or perhaps do all these from a psedo-WM! */ widget->back = newwin(widget->priv.height, widget->priv.width, widget->priv.y + 1, widget->priv.x + 1); wbkgd(widget->back, COLOR_PAIR(GNT_COLOR_SHADOW)); @@ -279,6 +276,7 @@ touchline(widget->back, 0, widget->priv.height); wrefresh(widget->back); } +#endif wrefresh(widget->window); 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-06-28 01:46:49
|
Revision: 16364 Author: sadrul Date: 2006-06-27 18:46:41 -0700 (Tue, 27 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16364&view=rev Log Message: ----------- Let's have chats in the buddylist. Modified Paths: -------------- trunk/console/Makefile trunk/console/gntblist.c trunk/console/gntui.c trunk/console/libgnt/Makefile Modified: trunk/console/Makefile =================================================================== --- trunk/console/Makefile 2006-06-28 00:21:38 UTC (rev 16363) +++ trunk/console/Makefile 2006-06-28 01:46:41 UTC (rev 16364) @@ -25,6 +25,6 @@ clean: cd libgnt && make clean - rm *.o - rm gntgaim + rm -f *.o + rm -f gntgaim Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-06-28 00:21:38 UTC (rev 16363) +++ trunk/console/gntblist.c 2006-06-28 01:46:41 UTC (rev 16364) @@ -24,6 +24,7 @@ static void add_buddy(GaimBuddy *buddy, GGBlist *ggblist); static void add_group(GaimGroup *group, GGBlist *ggblist); +static void add_chat(GaimChat *chat, GGBlist *ggblist); static void add_node(GaimBlistNode *node, GGBlist *ggblist); static void draw_tooltip(GGBlist *ggblist); @@ -38,6 +39,8 @@ add_buddy((GaimBuddy*)node, ggblist); else if (GAIM_BLIST_NODE_IS_GROUP(node)) add_group((GaimGroup*)node, ggblist); + else if (GAIM_BLIST_NODE_IS_CHAT(node)) + add_chat((GaimChat *)node, ggblist); draw_tooltip(ggblist); } @@ -81,6 +84,10 @@ else node_remove(gaim_get_blist(), node); } + else if (GAIM_BLIST_NODE_IS_CHAT(node)) + { + add_chat((GaimChat *)node, list->ui_data); + } } static void @@ -121,52 +128,80 @@ } static const char * -get_buddy_display_name(GaimBuddy *buddy) +get_display_name(GaimBlistNode *node) { static char text[2096]; - char status[8]; - GaimStatusPrimitive prim; - GaimPresence *presence; - GaimStatus *now; + char status[8] = " "; + const char *name = NULL; - presence = gaim_buddy_get_presence(buddy); - now = gaim_presence_get_active_status(presence); + if (GAIM_BLIST_NODE_IS_BUDDY(node)) + { + GaimBuddy *buddy = (GaimBuddy *)node; + GaimStatusPrimitive prim; + GaimPresence *presence; + GaimStatus *now; - prim = gaim_status_type_get_primitive(gaim_status_get_type(now)); + + presence = gaim_buddy_get_presence(buddy); + now = gaim_presence_get_active_status(presence); - switch(prim) - { + prim = gaim_status_type_get_primitive(gaim_status_get_type(now)); + + switch(prim) + { #if 1 - case GAIM_STATUS_OFFLINE: - strncpy(status, "x", sizeof(status) - 1); - break; - case GAIM_STATUS_AVAILABLE: - strncpy(status, "o", sizeof(status) - 1); - break; - default: - strncpy(status, ".", sizeof(status) - 1); - break; + case GAIM_STATUS_OFFLINE: + strncpy(status, "x", sizeof(status) - 1); + break; + case GAIM_STATUS_AVAILABLE: + strncpy(status, "o", sizeof(status) - 1); + break; + default: + strncpy(status, ".", sizeof(status) - 1); + break; #else - /* XXX: Let's use these some time */ - case GAIM_STATUS_OFFLINE: - strncpy(status, "⊗", sizeof(status) - 1); - break; - case GAIM_STATUS_AVAILABLE: - /* XXX: Detect idleness */ - strncpy(status, "◯", sizeof(status) - 1); - break; - default: - strncpy(status, "⊖", sizeof(status) - 1); - break; + /* XXX: Let's use these some time */ + case GAIM_STATUS_OFFLINE: + strncpy(status, "⊗", sizeof(status) - 1); + break; + case GAIM_STATUS_AVAILABLE: + /* XXX: Detect idleness */ + strncpy(status, "◯", sizeof(status) - 1); + break; + default: + strncpy(status, "⊖", sizeof(status) - 1); + break; #endif + } + name = gaim_buddy_get_alias(buddy); } + else if (GAIM_BLIST_NODE_IS_CHAT(node)) + { + GaimChat *chat = (GaimChat*)node; + name = gaim_chat_get_name(chat); + } - snprintf(text, sizeof(text) - 1, "%s %s", status, gaim_buddy_get_alias(buddy)); + snprintf(text, sizeof(text) - 1, "%s %s", status, name); return text; } static void +add_chat(GaimChat *chat, GGBlist *ggblist) +{ + GaimGroup *group; + GaimBlistNode *node = (GaimBlistNode *)chat; + if (node->ui_data) + return; + + group = gaim_chat_get_group(chat); + add_node((GaimBlistNode*)group, ggblist); + + node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), chat, + get_display_name(node), group, NULL); +} + +static void add_buddy(GaimBuddy *buddy, GGBlist *ggblist) { GaimGroup *group; @@ -178,7 +213,7 @@ add_node((GaimBlistNode*)group, ggblist); node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, - get_buddy_display_name(buddy), group, NULL); + get_display_name(node), group, NULL); } static void @@ -268,6 +303,15 @@ title = g_strdup(group->name); } + else if (GAIM_BLIST_NODE_IS_CHAT(node)) + { + GaimChat *chat = (GaimChat *)node; + GaimAccount *account = chat->account; + + g_string_append_printf(str, _("Account: %s"), gaim_account_get_username(account)); + + title = g_strdup(gaim_chat_get_name(chat)); + } else { g_string_free(str, TRUE); @@ -325,7 +369,7 @@ static void buddy_status_changed(GaimBuddy *buddy, GaimStatus *old, GaimStatus *now, GGBlist *ggblist) { - gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, get_buddy_display_name(buddy)); + gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, get_display_name((GaimBlistNode*)buddy)); if (ggblist->tnode == (GaimBlistNode*)buddy) draw_tooltip(ggblist); } Modified: trunk/console/gntui.c =================================================================== --- trunk/console/gntui.c 2006-06-28 00:21:38 UTC (rev 16363) +++ trunk/console/gntui.c 2006-06-28 01:46:41 UTC (rev 16364) @@ -12,6 +12,8 @@ gg_blist_init(); gaim_blist_set_ui_ops(gg_blist_get_ui_ops()); + /* Now the conversations */ + gnt_main(); } Modified: trunk/console/libgnt/Makefile =================================================================== --- trunk/console/libgnt/Makefile 2006-06-28 00:21:38 UTC (rev 16363) +++ trunk/console/libgnt/Makefile 2006-06-28 01:46:41 UTC (rev 16364) @@ -57,6 +57,6 @@ $(CC) --shared -o libgnt.so $(OBJECTS) clean: - rm *.o - rm libgnt.so + rm -f *.o + rm -f libgnt.so This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-28 05:52:32
|
Revision: 16365 Author: sadrul Date: 2006-06-27 22:52:23 -0700 (Tue, 27 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16365&view=rev Log Message: ----------- Add ui for conversation. It 'works', but it's broken. So don't use it just yet. I probably will not be able to touch it in the next couple of days. So feel free to fix the brokenness :) Modified Paths: -------------- trunk/console/Makefile trunk/console/gntblist.c trunk/console/gntui.c trunk/console/libgnt/gntcolors.h trunk/console/libgnt/gntmain.c Added Paths: ----------- trunk/console/gntconv.c trunk/console/gntconv.h Modified: trunk/console/Makefile =================================================================== --- trunk/console/Makefile 2006-06-28 01:46:41 UTC (rev 16364) +++ trunk/console/Makefile 2006-06-28 05:52:23 UTC (rev 16365) @@ -3,14 +3,17 @@ GG_SOURCES = \ gntblist.c \ + gntconv.c \ gntui.c GG_HEADERS = \ gntblist.h \ + gntconv.h \ gntui.h GG_OBJECTS = \ gntblist.o \ + gntconv.o \ gntui.o all: @@ -20,6 +23,7 @@ gntgaim: gntgaim.o $(GG_OBJECTS) $(CC) -o gntgaim gntgaim.o $(GG_OBJECTS) $(LDFLAGS) gntblist.o: gntblist.c $(GG_HEADERS) +gntconv.o: gntconv.c $(GG_HEADERS) gntgaim.o: gntgaim.c gntgaim.h $(GG_HEADERS) gntui.o: gntui.c $(GG_HEADERS) Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-06-28 01:46:41 UTC (rev 16364) +++ trunk/console/gntblist.c 2006-06-28 05:52:23 UTC (rev 16365) @@ -179,6 +179,8 @@ { GaimChat *chat = (GaimChat*)node; name = gaim_chat_get_name(chat); + + strncpy(status, "~", sizeof(status) - 1); } snprintf(text, sizeof(text) - 1, "%s %s", status, name); @@ -363,6 +365,25 @@ return TRUE; } } + else if (text[0] == '\r' && text[1] == '\0') + { + GntTree *tree = GNT_TREE(ggblist->tree); + GaimBlistNode *node = gnt_tree_get_selection_data(tree); + + if (GAIM_BLIST_NODE_IS_BUDDY(node)) + { + GaimBuddy *buddy = (GaimBuddy *)node; + gaim_conversation_new(GAIM_CONV_TYPE_IM, + gaim_buddy_get_account(buddy), + gaim_buddy_get_name(buddy)); + } + else if (GAIM_BLIST_NODE_IS_CHAT(node)) + { + GaimChat *chat = (GaimChat*)node; + serv_join_chat(chat->account->gc, chat->components); + } + } + return FALSE; } Added: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c (rev 0) +++ trunk/console/gntconv.c 2006-06-28 05:52:23 UTC (rev 16365) @@ -0,0 +1,248 @@ +#include <util.h> + +#include "gntgaim.h" +#include "gntconv.h" + +#include "gnt.h" +#include "gntbox.h" +#include "gntentry.h" +#include "gnttextview.h" + +GHashTable *ggconvs; + +typedef struct _GGConv GGConv; +typedef struct _GGConvChat GGConvChat; +typedef struct _GGConvIm GGConvIm; + +struct _GGConv +{ + GaimConversation *conv; + + GntWidget *window; /* the container */ + GntWidget *entry; /* entry */ + GntWidget *tv; /* text-view */ + + union + { + GGConvChat *chat; + GGConvIm *im; + } u; +}; + +struct _GGConvChat +{ + GntWidget *userlist; /* the userlist */ +}; + +struct _GGConvIm +{ + void *nothing_for_now; +}; + +static gboolean +entry_key_pressed(GntWidget *w, const char *key, GGConv *ggconv) +{ + if (key[0] == '\r' && key[1] == 0) + { + const char *text = gnt_entry_get_text(GNT_ENTRY(ggconv->entry)); + switch (gaim_conversation_get_type(ggconv->conv)) + { + case GAIM_CONV_TYPE_IM: + gaim_conv_im_send_with_flags(GAIM_CONV_IM(ggconv->conv), text, GAIM_MESSAGE_SEND); + break; + case GAIM_CONV_TYPE_CHAT: + gaim_conv_chat_send(GAIM_CONV_CHAT(ggconv->conv), text); + break; + default: + g_return_val_if_reached(FALSE); + } + gnt_entry_clear(GNT_ENTRY(ggconv->entry)); + return TRUE; + } + + return FALSE; +} + +static void +closing_window(GntWidget *window, GGConv *ggconv) +{ + ggconv->window = NULL; + gaim_conversation_destroy(ggconv->conv); +} + +static void +gg_create_conversation(GaimConversation *conv) +{ + GGConv *ggc = g_hash_table_lookup(ggconvs, conv); + char *title; + GaimConversationType type; + + if (ggc) + return; + + ggc = g_new0(GGConv, 1); + g_hash_table_insert(ggconvs, conv, ggc); + + ggc->conv = conv; + + type = gaim_conversation_get_type(conv); + title = g_strdup_printf(_("Conversation: %s"), gaim_conversation_get_name(conv)); + ggc->window = gnt_box_new(FALSE, TRUE); + gnt_box_set_title(GNT_BOX(ggc->window), title); + gnt_box_set_toplevel(GNT_BOX(ggc->window), TRUE); + gnt_widget_set_name(ggc->window, "conversation-window"); + + ggc->tv = gnt_text_view_new(); + gnt_box_add_widget(GNT_BOX(ggc->window), ggc->tv); + gnt_widget_set_name(ggc->tv, "conversation-window-textview"); + gnt_widget_set_size(ggc->tv, getmaxx(stdscr) - 40, getmaxy(stdscr) - 15); + + ggc->entry = gnt_entry_new(NULL); + gnt_box_add_widget(GNT_BOX(ggc->window), ggc->entry); + gnt_widget_set_name(ggc->entry, "conversation-window-entry"); + gnt_widget_set_size(ggc->entry, getmaxx(stdscr) - 40, 1); + + g_signal_connect(G_OBJECT(ggc->entry), "key_pressed", G_CALLBACK(entry_key_pressed), ggc); + g_signal_connect(G_OBJECT(ggc->window), "destroy", G_CALLBACK(closing_window), ggc); + + gnt_widget_set_position(ggc->window, 32, 0); + gnt_widget_show(ggc->window); + + g_free(title); +} + +static void +gg_destroy_conversation(GaimConversation *conv) +{ + g_hash_table_remove(ggconvs, conv); +} + +static void +gg_write_chat(GaimConversation *conv, const char *who, const char *message, + GaimMessageFlags flags, time_t mtime) +{ + GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); + char *name, *strip; + + g_return_if_fail(ggconv != NULL); + + name = g_strdup_printf("%s: ", who); + strip = gaim_markup_strip_html(message); + + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), + name, GNT_TEXT_FLAG_BOLD); + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), + strip, (flags & GAIM_MESSAGE_NICK) ? GNT_TEXT_FLAG_UNDERLINE : 0); + gnt_text_view_next_line(GNT_TEXT_VIEW(ggconv->tv)); + + g_free(name); + g_free(strip); +} + +static void +gg_write_im(GaimConversation *conv, const char *who, const char *message, + GaimMessageFlags flags, time_t mtime) +{ + GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); + char *strip; + char *name; + + g_return_if_fail(ggconv != NULL); + + if (flags & GAIM_MESSAGE_SEND) + { + who = gaim_connection_get_display_name(conv->account->gc); + if (!who) + who = gaim_account_get_alias(conv->account); + if (!who) + who = gaim_account_get_username(conv->account); + } + else if (flags & GAIM_MESSAGE_RECV) + who = gaim_conversation_get_name(conv); + + name = g_strdup_printf("%s: ", who); + + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), + name, GNT_TEXT_FLAG_BOLD); + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), + (strip = gaim_markup_strip_html(message)), 0); + gnt_text_view_next_line(GNT_TEXT_VIEW(ggconv->tv)); + g_free(strip); + g_free(name); +} + +static void +gg_write_conv(GaimConversation *conv, const char *who, const char *message, + GaimMessageFlags flags, time_t mtime) +{ + GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); + char *strip; + char *name; + + g_return_if_fail(ggconv != NULL); + + strip = gaim_markup_strip_html(message); + name = g_strdup_printf("%s: ", who); + + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), + name, GNT_TEXT_FLAG_BOLD); + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), + strip, 0); + gnt_text_view_next_line(GNT_TEXT_VIEW(ggconv->tv)); + + g_free(strip); +} + +static void +gg_chat_add_users(GaimConversation *conv, GList *users, GList *flags, GList *aliases, gboolean new_arrivals) +{} + +static void +gg_chat_rename_user(GaimConversation *conv, const char *old, const char *new_n, const char *new_a) +{} + +static void +gg_chat_remove_user(GaimConversation *conv, GList *list) +{} + +static void +gg_chat_update_user(GaimConversation *conv, const char *user) +{} + +static GaimConversationUiOps conv_ui_ops = +{ + .create_conversation = gg_create_conversation, + .destroy_conversation = gg_destroy_conversation, + .write_chat = gg_write_chat, + .write_im = gg_write_im, + .write_chat = gg_write_conv, + .chat_add_users = gg_chat_add_users, + .chat_rename_user = gg_chat_rename_user, + .chat_remove_users = gg_chat_remove_user, + .chat_update_user = gg_chat_update_user, + .present = NULL, + .has_focus = NULL, + .custom_smiley_add = NULL, + .custom_smiley_write = NULL, + .custom_smiley_close = NULL +}; + +static void +destroy_ggconv(gpointer data) +{ + GGConv *conv = data; + gnt_widget_destroy(conv->window); + g_free(conv); +} + +GaimConversationUiOps *gg_conv_get_ui_ops() +{ + return &conv_ui_ops; +} + + +void gg_conversation_init() +{ + ggconvs = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, destroy_ggconv); +} + Property changes on: trunk/console/gntconv.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/gntconv.h =================================================================== --- trunk/console/gntconv.h (rev 0) +++ trunk/console/gntconv.h 2006-06-28 05:52:23 UTC (rev 16365) @@ -0,0 +1,5 @@ +#include "conversation.h" + +GaimConversationUiOps *gg_conv_get_ui_ops(); + +void gg_conversation_init(); Property changes on: trunk/console/gntconv.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/gntui.c =================================================================== --- trunk/console/gntui.c 2006-06-28 01:46:41 UTC (rev 16364) +++ trunk/console/gntui.c 2006-06-28 05:52:23 UTC (rev 16365) @@ -13,6 +13,8 @@ gaim_blist_set_ui_ops(gg_blist_get_ui_ops()); /* Now the conversations */ + gg_conversation_init(); + gaim_conversations_set_ui_ops(gg_conv_get_ui_ops()); gnt_main(); } Modified: trunk/console/libgnt/gntcolors.h =================================================================== --- trunk/console/libgnt/gntcolors.h 2006-06-28 01:46:41 UTC (rev 16364) +++ trunk/console/libgnt/gntcolors.h 2006-06-28 05:52:23 UTC (rev 16365) @@ -18,7 +18,7 @@ enum { - GNT_COLOR_BLACK = 1, + GNT_COLOR_BLACK = 0, GNT_COLOR_RED, GNT_COLOR_GREEN, GNT_COLOR_BLUE, Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-06-28 01:46:41 UTC (rev 16364) +++ trunk/console/libgnt/gntmain.c 2006-06-28 05:52:23 UTC (rev 16365) @@ -49,7 +49,6 @@ if (focus_list) { gboolean ret = FALSE; - /*g_signal_emit_by_name(focus_list->data, "key_pressed", buffer, &ret);*/ ret = gnt_widget_key_pressed(focus_list->data, buffer); } @@ -57,22 +56,35 @@ { /* Some special key has been pressed */ if (strcmp(buffer+1, GNT_KEY_POPUP) == 0) + {} + else if (strcmp(buffer + 1, "c") == 0) { - /*printf("popup\n");*/ + /* Alt + c was pressed. I am going to use it to close a window. */ + if (focus_list) + { + gnt_widget_destroy(focus_list->data); + gnt_screen_remove_widget(focus_list->data); + } } - else + else if (strcmp(buffer + 1, "q") == 0) { - /*printf("Unknown: %s\n", buffer+1);*/ - } - } - else - { - if (buffer[0] == 'q') - { + /* I am going to use Alt + q to quit. */ endwin(); exit(1); } - /*printf("%s\n", buffer);*/ + else if (strcmp(buffer + 1, "n") == 0) + { + /* Alt + n to go to the next window */ + if (focus_list && focus_list->next) + focus_list = focus_list->next; + else + focus_list = g_list_first(focus_list); + if (focus_list) + { + /* XXX: Need a way to bring it on top */ + gnt_widget_draw(focus_list->data); + } + } } refresh(); @@ -184,7 +196,7 @@ WINDOW *win; GList *iter; GntNode *node = g_hash_table_lookup(nodes, widget); - if (node == NULL || node->below == NULL) /* Yay! Nothing to do. */ + if (node == NULL) /* Yay! Nothing to do. */ return; win = dupwin(widget->window); @@ -212,6 +224,12 @@ n->above = g_list_remove(n->above, node); } + for (iter = node->above; iter; iter = iter->next) + { + GntNode *n = iter->data; + n->below = g_list_remove(n->below, node); + } + wrefresh(win); delwin(win); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-28 19:25:40
|
Revision: 16368 Author: sadrul Date: 2006-06-28 11:50:33 -0700 (Wed, 28 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16368&view=rev Log Message: ----------- Minor tweaks to Makefile and some other things. Modified Paths: -------------- trunk/console/Makefile trunk/console/gntconv.c trunk/console/gntui.c trunk/console/libgnt/Makefile trunk/console/libgnt/test/Makefile Modified: trunk/console/Makefile =================================================================== --- trunk/console/Makefile 2006-06-28 17:28:06 UTC (rev 16367) +++ trunk/console/Makefile 2006-06-28 18:50:33 UTC (rev 16368) @@ -1,4 +1,5 @@ -CFLAGS=`pkg-config --cflags gaim gobject-2.0` -g -I./libgnt/ +CC=gcc +CFLAGS=`pkg-config --cflags gaim gobject-2.0` -g -I./libgnt/ -Wall LDFLAGS=`pkg-config --libs gaim gobject-2.0 libxml-2.0` -lncursesw -L./libgnt/ -lgnt -pg GG_SOURCES = \ Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-06-28 17:28:06 UTC (rev 16367) +++ trunk/console/gntconv.c 2006-06-28 18:50:33 UTC (rev 16368) @@ -180,27 +180,31 @@ { GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); char *strip; - char *name; g_return_if_fail(ggconv != NULL); strip = gaim_markup_strip_html(message); - if (alias && *alias) - name = g_strdup_printf("%s: ", alias); - else if (who && *who) - name = g_strdup_printf("%s: ", who); - else - name = g_strdup(""); + if (flags & (GAIM_MESSAGE_SEND | GAIM_MESSAGE_RECV)) + { + char *name; + if (alias && *alias) + name = g_strdup_printf("%s: ", alias); + else if (who && *who) + name = g_strdup_printf("%s: ", who); + else + name = g_strdup(""); + + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), + name, GNT_TEXT_FLAG_BOLD); + g_free(name); + } gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), - name, GNT_TEXT_FLAG_BOLD); - gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), strip, 0); gnt_text_view_next_line(GNT_TEXT_VIEW(ggconv->tv)); gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 0); g_free(strip); - g_free(name); } static void Modified: trunk/console/gntui.c =================================================================== --- trunk/console/gntui.c 2006-06-28 17:28:06 UTC (rev 16367) +++ trunk/console/gntui.c 2006-06-28 18:50:33 UTC (rev 16368) @@ -1,4 +1,6 @@ #include "gntui.h" +#include "gntblist.h" +#include "gntconv.h" void init_gnt_ui() { Modified: trunk/console/libgnt/Makefile =================================================================== --- trunk/console/libgnt/Makefile 2006-06-28 17:28:06 UTC (rev 16367) +++ trunk/console/libgnt/Makefile 2006-06-28 18:50:33 UTC (rev 16368) @@ -1,4 +1,5 @@ -CFLAGS=`pkg-config --cflags gobject-2.0` -g +CC=gcc +CFLAGS=`pkg-config --cflags gobject-2.0` -g -Wall LDFLAGS=`pkg-config --libs gobject-2.0` -lncursesw -pg HEADERS = \ Modified: trunk/console/libgnt/test/Makefile =================================================================== --- trunk/console/libgnt/test/Makefile 2006-06-28 17:28:06 UTC (rev 16367) +++ trunk/console/libgnt/test/Makefile 2006-06-28 18:50:33 UTC (rev 16368) @@ -1,3 +1,4 @@ +CC=gcc CFLAGS=`pkg-config --cflags gobject-2.0` -g -I../ LDFLAGS=`pkg-config --libs gobject-2.0` -lncursesw -pg -lgnt -L../ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-01 00:56:24
|
Revision: 16381 Author: sadrul Date: 2006-06-30 17:56:05 -0700 (Fri, 30 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16381&view=rev Log Message: ----------- Changes in GntTextView. Things go somewhat 'smooth' when run inside valgrind. Otherwise, it's kind of flaky. I don't mind a single bit if someone gave me a hint :) Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntconv.c trunk/console/gntgaim.c trunk/console/libgnt/gnt.h trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbox.h trunk/console/libgnt/gntcolors.c trunk/console/libgnt/gntcolors.h trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntkeys.h trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttextview.h trunk/console/libgnt/gnttree.c trunk/console/libgnt/gntwidget.c trunk/console/libgnt/test/multiwin.c trunk/console/libgnt/test/tv.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/gntblist.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -6,6 +6,7 @@ #include "gntgaim.h" #include "gntbox.h" +#include "gntlabel.h" #include "gnttree.h" #include "gntblist.h" @@ -238,12 +239,27 @@ static void selection_activate(GntWidget *widget, GGBlist *ggblist) { - gnt_widget_set_focus(widget, FALSE); + GntTree *tree = GNT_TREE(ggblist->tree); + GaimBlistNode *node = gnt_tree_get_selection_data(tree); + + if (GAIM_BLIST_NODE_IS_BUDDY(node)) + { + GaimBuddy *buddy = (GaimBuddy *)node; + gaim_conversation_new(GAIM_CONV_TYPE_IM, + gaim_buddy_get_account(buddy), + gaim_buddy_get_name(buddy)); + } + else if (GAIM_BLIST_NODE_IS_CHAT(node)) + { + GaimChat *chat = (GaimChat*)node; + serv_join_chat(chat->account->gc, chat->components); + } } static void draw_tooltip(GGBlist *ggblist) { + return; GaimBlistNode *node; int x, y, top, width; GString *str; @@ -251,12 +267,15 @@ GaimPluginProtocolInfo *prpl_info; GaimAccount *account; GntTree *tree; - GntWidget *widget, *box, *label; + GntWidget *widget, *box; char *title = NULL; widget = ggblist->tree; tree = GNT_TREE(widget); + if (!gnt_widget_has_focus(ggblist->tree)) + return; + if (ggblist->tooltip) { /* XXX: Once we can properly redraw on expose events, this can be removed at the end @@ -332,7 +351,7 @@ GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_NO_SHADOW); gnt_box_set_title(GNT_BOX(box), title); - gnt_box_add_widget(GNT_BOX(box), GNT_WIDGET(gnt_label_new(str->str))); + gnt_box_add_widget(GNT_BOX(box), gnt_label_new(str->str)); gnt_widget_set_position(box, x, y); gnt_widget_draw(box); @@ -365,25 +384,7 @@ return TRUE; } } - else if (text[0] == '\r' && text[1] == '\0') - { - GntTree *tree = GNT_TREE(ggblist->tree); - GaimBlistNode *node = gnt_tree_get_selection_data(tree); - if (GAIM_BLIST_NODE_IS_BUDDY(node)) - { - GaimBuddy *buddy = (GaimBuddy *)node; - gaim_conversation_new(GAIM_CONV_TYPE_IM, - gaim_buddy_get_account(buddy), - gaim_buddy_get_name(buddy)); - } - else if (GAIM_BLIST_NODE_IS_CHAT(node)) - { - GaimChat *chat = (GaimChat*)node; - serv_join_chat(chat->account->gc, chat->components); - } - } - return FALSE; } Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/gntconv.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -1,3 +1,4 @@ +#include <string.h> #include <util.h> #include "gntgaim.h" @@ -59,6 +60,20 @@ gnt_entry_clear(GNT_ENTRY(ggconv->entry)); return TRUE; } + else if (key[0] == 27) + { + if (strcmp(key+1, GNT_KEY_DOWN) == 0) + gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 1); + else if (strcmp(key+1, GNT_KEY_UP) == 0) + gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), -1); + else if (strcmp(key+1, 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) + gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), -(ggconv->tv->priv.height - 2)); + else + return FALSE; + return TRUE; + } return FALSE; } @@ -90,7 +105,7 @@ ggc->window = gnt_box_new(FALSE, TRUE); gnt_box_set_title(GNT_BOX(ggc->window), title); gnt_box_set_toplevel(GNT_BOX(ggc->window), TRUE); - gnt_widget_set_name(ggc->window, "conversation-window"); + gnt_widget_set_name(ggc->window, title); ggc->tv = gnt_text_view_new(); gnt_box_add_widget(GNT_BOX(ggc->window), ggc->tv); @@ -180,6 +195,7 @@ { GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); char *strip; + GntTextViewFlags fl = 0; g_return_if_fail(ggconv != NULL); @@ -199,8 +215,14 @@ name, GNT_TEXT_FLAG_BOLD); g_free(name); } + else + fl = GNT_TEXT_FLAG_DIM; + + if (flags & GAIM_MESSAGE_ERROR) + fl |= GNT_TEXT_FLAG_BOLD; + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), - strip, 0); + strip, fl); gnt_text_view_next_line(GNT_TEXT_VIEW(ggconv->tv)); gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 0); Modified: trunk/console/gntgaim.c =================================================================== --- trunk/console/gntgaim.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/gntgaim.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -16,6 +16,7 @@ #include "whiteboard.h" #include "gntgaim.h" +#include "gntui.h" /* Anything IO-related is directly copied from gtkgaim's source tree */ Modified: trunk/console/libgnt/gnt.h =================================================================== --- trunk/console/libgnt/gnt.h 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gnt.h 2006-07-01 00:56:05 UTC (rev 16381) @@ -14,3 +14,5 @@ void gnt_screen_update(GntWidget *widget); void gnt_screen_take_focus(GntWidget *widget); + +gboolean gnt_widget_has_focus(GntWidget *widget); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gntbox.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -10,6 +10,8 @@ static GntWidgetClass *parent_class = NULL; static guint signals[SIGS] = { 0 }; +static GntWidget * find_focusable_widget(GntBox *box); + static void gnt_box_draw(GntWidget *widget) { @@ -34,7 +36,11 @@ /* XXX: Position of the title might be configurable */ pos = (widget->priv.width - pos) / 2; } - wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TITLE)); + + if (gnt_widget_has_focus(widget)) + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TITLE)); + else + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TITLE_D)); mvwprintw(widget->window, 0, pos, title); g_free(title); } @@ -139,23 +145,88 @@ gnt_box_map(GntWidget *widget) { if (widget->priv.width == 0 || widget->priv.height == 0) + { gnt_widget_size_request(widget); + find_focusable_widget(GNT_BOX(widget)); + } DEBUG; } +static GntWidget * +find_next_focus(GntBox *box) +{ + GntWidget *w = box->active; + GList *iter; + + while (w && !(iter = g_list_find(box->list, w))) + w = w->parent; + + if (!w) + box->active = NULL; + else if (iter) + { + GntWidget *next = NULL; + + do + { + next = find_next_focus(iter->data); + box->active = next; + iter = iter->next; + } while (!next && iter); + } + + if (box->active == NULL && GNT_WIDGET(box)->parent == NULL) + { + box->active = find_focusable_widget(box); + } + + if (box->active) + GNT_WIDGET_SET_FLAGS(box->active, GNT_WIDGET_HAS_FOCUS); + + return box->active; +} + /* Ensures that the current widget can take focus */ -static void -ensure_active(GntBox *box) +static GntWidget * +find_focusable_widget(GntBox *box) { int investigated = 0; int total; + GntWidget *w = NULL; + GList *iter; - if (box->active == NULL) - box->active = box->list; + for (iter = box->list; iter; iter = iter->next) + { + w = iter->data; + if (GNT_IS_BOX(w)) + { + w = find_focusable_widget(GNT_BOX(w)); + if (w) + break; + } + else if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS)) + break; + } + if (iter) + box->active = w; + else + box->active = NULL; + + if (box->active) + GNT_WIDGET_SET_FLAGS(box->active, GNT_WIDGET_HAS_FOCUS); + + return box->active; + +#if 0 + if (box->active == NULL && box->list) + box->active = box->list->data; + else + w = box->active; + total = g_list_length(box->list); - while (box->active && !GNT_WIDGET_IS_FLAG_SET(box->active->data, GNT_WIDGET_CAN_TAKE_FOCUS)) + while (box->active && !GNT_WIDGET_IS_FLAG_SET(box->active, GNT_WIDGET_CAN_TAKE_FOCUS)) { box->active = box->active->next; investigated++; @@ -171,6 +242,12 @@ investigated++; } } + + if (box->active) + gnt_widget_set_focus(box->active->data, TRUE); + if (w && w != box->active->data) + gnt_widget_set_focus(w, FALSE); +#endif } static gboolean @@ -178,15 +255,15 @@ { GntBox *box = GNT_BOX(widget); - ensure_active(box); - if (box->active == NULL) + if (box->active == NULL && !find_focusable_widget(box)) return FALSE; - if (gnt_widget_key_pressed(box->active->data, text)) + if (gnt_widget_key_pressed(box->active, text)) return TRUE; if (text[0] == 27) { +#if 0 GList *now = NULL; if (strcmp(text+1, GNT_KEY_LEFT) == 0) { @@ -209,6 +286,7 @@ return TRUE; } +#endif } return FALSE; @@ -237,8 +315,9 @@ return NULL; } +#if 0 static void -gnt_box_lost_focus(GntWidget *widget) +gnt_box_set_focus(GntWidget *widget, gboolean set) { GntWidget *p = widget; @@ -247,10 +326,32 @@ p = find_focused_widget(GNT_BOX(p)); if (p) - gnt_widget_set_focus(p, FALSE); + gnt_widget_set_focus(p, set); + gnt_widget_draw(widget); } static void +gnt_box_lost_focus(GntWidget *widget) +{ + gnt_box_set_focus(widget, FALSE); +} + +static void +gnt_box_gained_focus(GntWidget *widget) +{ + GntWidget *p; + + while (widget->parent) + widget = widget->parent; + + p = find_focused_widget(GNT_BOX(widget)); + GNT_BOX(widget)->active = g_list_find(GNT_BOX(widget)->list, p); + if (p) + gnt_widget_draw(p); +} +#endif + +static void gnt_box_destroy(GntWidget *w) { GntBox *box = GNT_BOX(w); @@ -286,7 +387,11 @@ parent_class->size_request = gnt_box_size_request; parent_class->set_position = gnt_box_set_position; parent_class->key_pressed = gnt_box_key_pressed; +#if 0 + /* We are going to need this when there are multiple focusble widgets in a box */ parent_class->lost_focus = gnt_box_lost_focus; + parent_class->gained_focus = gnt_box_gained_focus; +#endif DEBUG; } Modified: trunk/console/libgnt/gntbox.h =================================================================== --- trunk/console/libgnt/gntbox.h 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gntbox.h 2006-07-01 00:56:05 UTC (rev 16381) @@ -22,7 +22,7 @@ gboolean homogeneous; GList *list; /* List of widgets */ - GList *active; + GntWidget *active; int pad; /* Number of spaces to use between widgets */ char *title; Modified: trunk/console/libgnt/gntcolors.c =================================================================== --- trunk/console/libgnt/gntcolors.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gntcolors.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -11,16 +11,18 @@ init_color(GNT_COLOR_GREEN, 0, 1000, 0); init_color(GNT_COLOR_BLUE, 0, 0, 1000); init_color(GNT_COLOR_WHITE, 1000, 1000, 1000); - init_color(GNT_COLOR_GRAY, 799, 799, 799); + init_color(GNT_COLOR_GRAY, 699, 699, 699); init_color(GNT_COLOR_DARK_GRAY, 256, 256, 256); /* Now some init_pair()s */ init_pair(GNT_COLOR_NORMAL, GNT_COLOR_BLACK, GNT_COLOR_WHITE); - init_pair(GNT_COLOR_HIGHLIGHT, GNT_COLOR_BLUE, GNT_COLOR_GRAY); + init_pair(GNT_COLOR_HIGHLIGHT, GNT_COLOR_WHITE, GNT_COLOR_BLUE); init_pair(GNT_COLOR_SHADOW, GNT_COLOR_BLACK, GNT_COLOR_DARK_GRAY); init_pair(GNT_COLOR_TITLE, GNT_COLOR_WHITE, GNT_COLOR_DARK_GRAY); - init_pair(GNT_COLOR_TEXT_NORMAL, GNT_COLOR_BLACK, GNT_COLOR_GRAY); + init_pair(GNT_COLOR_TITLE_D, GNT_COLOR_BLACK, GNT_COLOR_GRAY); + init_pair(GNT_COLOR_TEXT_NORMAL, GNT_COLOR_WHITE, GNT_COLOR_BLUE); init_pair(GNT_COLOR_HIGHLIGHT_D, GNT_COLOR_BLACK, GNT_COLOR_GRAY); + init_pair(GNT_COLOR_DISABLED, GNT_COLOR_GRAY, GNT_COLOR_WHITE); } else { @@ -30,6 +32,7 @@ init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLACK); init_pair(GNT_COLOR_TEXT_NORMAL, COLOR_BLACK, COLOR_WHITE); init_pair(GNT_COLOR_HIGHLIGHT_D, COLOR_CYAN, COLOR_BLACK); + init_pair(GNT_COLOR_DISABLED, COLOR_YELLOW, COLOR_WHITE); } } Modified: trunk/console/libgnt/gntcolors.h =================================================================== --- trunk/console/libgnt/gntcolors.h 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gntcolors.h 2006-07-01 00:56:05 UTC (rev 16381) @@ -13,6 +13,7 @@ GNT_COLOR_MNEMONIC_D, GNT_COLOR_SHADOW, GNT_COLOR_TITLE, + GNT_COLOR_TITLE_D, GNT_COLORS } GntColorType; Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gntentry.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -17,7 +17,10 @@ GntEntry *entry = GNT_ENTRY(widget); int stop; - wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TEXT_NORMAL)); + if (gnt_widget_has_focus(widget)) + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TEXT_NORMAL)); + else + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); mvwprintw(widget->window, 0, 0, entry->scroll); stop = entry->end - entry->scroll; Modified: trunk/console/libgnt/gntkeys.h =================================================================== --- trunk/console/libgnt/gntkeys.h 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gntkeys.h 2006-07-01 00:56:05 UTC (rev 16381) @@ -9,6 +9,9 @@ #define GNT_KEY_UP "[A" #define GNT_KEY_DOWN "[B" +#define GNT_KEY_PGUP "[5~" +#define GNT_KEY_PGDOWN "[6~" + #define GNT_KEY_ENTER "\r" #define GNT_KEY_BACKSPACE "\177" Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gntmain.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -13,22 +13,59 @@ static int max_x; static int max_y; +typedef struct +{ + GntWidget *me; + GList *below; /* List of widgets below me */ + GList *above; /* List of widgets above me */ +} GntNode; + static GHashTable *nodes; static void free_node(gpointer data); void gnt_screen_take_focus(GntWidget *widget) { + GntWidget *w = NULL; + if (focus_list) + w = focus_list->data; focus_list = g_list_prepend(focus_list, widget); + gnt_widget_set_focus(widget, TRUE); + if (w) + gnt_widget_set_focus(w, FALSE); } void gnt_screen_remove_widget(GntWidget *widget) { focus_list = g_list_remove(focus_list, widget); if (focus_list) + { + gnt_widget_set_focus(focus_list->data, TRUE); gnt_widget_draw(focus_list->data); + } } +static void +bring_on_top(GntWidget *widget) +{ + GntNode *node = g_hash_table_lookup(nodes, widget); + GList *iter; + + if (!node) + return; + + for (iter = node->above; iter;) + { + GntNode *n = iter->data; + iter = iter->next; + n->below = g_list_remove(n->below, node); + n->above = g_list_prepend(n->above, node); + + node->above = g_list_remove(node->above, n); + node->below = g_list_prepend(node->below, n); + } +} + static gboolean io_invoke(GIOChannel *source, GIOCondition cond, gpointer null) { @@ -79,15 +116,23 @@ else if (strcmp(buffer + 1, "n") == 0) { /* Alt + n to go to the next window */ + GntWidget *w = NULL; + if (focus_list) + w = focus_list->data; + if (focus_list && focus_list->next) focus_list = focus_list->next; else focus_list = g_list_first(focus_list); if (focus_list) { - /* XXX: Need a way to bring it on top */ + gnt_widget_set_focus(focus_list->data, TRUE); + bring_on_top(focus_list->data); gnt_widget_draw(focus_list->data); } + + if (w && w != focus_list->data) + gnt_widget_set_focus(w, FALSE); } } refresh(); @@ -134,13 +179,6 @@ * Stuff for 'window management' * *********************************/ -typedef struct -{ - GntWidget *me; - GList *below; /* List of widgets below me */ - GList *above; /* List of widgets above me */ -} GntNode; - static void free_node(gpointer data) { @@ -284,3 +322,26 @@ delwin(win); } +gboolean gnt_widget_has_focus(GntWidget *widget) +{ + GntWidget *w; + if (!widget) + return FALSE; + + w = widget; + + while (widget->parent) + { + fprintf(stderr, "%p %p\n", widget, widget->parent); + widget = widget->parent; + } + fprintf(stderr, "%p %p\n", widget, widget->parent); + + if (focus_list && focus_list->data == widget && + (!GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS) || + GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_HAS_FOCUS))) + return TRUE; + + return FALSE; +} + Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gnttextview.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -5,6 +5,18 @@ SIGS = 1, }; +typedef struct +{ + GntTextViewFlags flags; + char *text; +} GntTextSegment; + +typedef struct +{ + GList *segments; /* A list of GntTextSegments */ + int length; /* The current length of the line so far */ +} GntTextLine; + static GntWidgetClass *parent_class = NULL; static guint signals[SIGS] = { 0 }; @@ -12,9 +24,27 @@ gnt_text_view_draw(GntWidget *widget) { GntTextView *view = GNT_TEXT_VIEW(widget); + int i = 0; + GList *lines; - copywin(view->scroll, widget->window, view->pos, 0, 0, 0, - widget->priv.height - 1, widget->priv.width - 1, FALSE); + werase(widget->window); + + for (i = 0, lines = view->list; i < widget->priv.height && lines; i++, lines = lines->next) + { + GList *iter; + GntTextLine *line = lines->data; + + wmove(widget->window, widget->priv.height - 1 - i, 0); + + for (iter = line->segments; iter; iter = iter->next) + { + GntTextSegment *seg = iter->data; + wattrset(widget->window, seg->flags); + wprintw(widget->window, "%s", seg->text); + if (!iter->next) + whline(widget->window, ' ' | seg->flags, widget->priv.width - line->length - 1); + } + } DEBUG; } @@ -43,8 +73,28 @@ } static void +free_text_segment(gpointer data, gpointer null) +{ + GntTextSegment *seg = data; + g_free(seg->text); + g_free(seg); +} + +static void +free_text_line(gpointer data, gpointer null) +{ + GntTextLine *line = data; + g_list_foreach(line->segments, free_text_segment, NULL); + g_list_free(line->segments); + g_free(line); +} + +static void gnt_text_view_destroy(GntWidget *widget) { + GntTextView *view = GNT_TEXT_VIEW(widget); + g_list_foreach(view->list, free_text_line, NULL); + g_list_free(view->list); } static void @@ -100,14 +150,12 @@ { GntWidget *widget = g_object_new(GNT_TYPE_TEXTVIEW, NULL); GntTextView *view = GNT_TEXT_VIEW(widget); + GntTextLine *line = g_new0(GntTextLine, 1); - view->scroll = newwin(255, widget->priv.width, widget->priv.y, widget->priv.x); - scrollok(view->scroll, TRUE); - wsetscrreg(view->scroll, 0, 254); - wbkgd(view->scroll, COLOR_PAIR(GNT_COLOR_NORMAL)); - werase(view->scroll); GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER); + view->list = g_list_append(view->list, line); + return widget; } @@ -117,6 +165,7 @@ int fl = 0; char **split; int i; + GList *list = view->list; if (text == NULL || *text == '\0') return; @@ -128,48 +177,80 @@ if (flags & GNT_TEXT_FLAG_BLINK) fl |= A_BLINK; - wattrset(view->scroll, fl | COLOR_PAIR(GNT_COLOR_NORMAL)); + if (flags & GNT_TEXT_FLAG_DIM) + fl |= (A_DIM | COLOR_PAIR(GNT_COLOR_DISABLED)); + else if (flags & GNT_TEXT_FLAG_HIGHLIGHT) + fl |= (A_DIM | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); + else + fl |= COLOR_PAIR(GNT_COLOR_NORMAL); + view->list = g_list_first(view->list); + split = g_strsplit(text, "\n", 0); - for (i = 0; split[i + 1]; i++) + for (i = 0; split[i]; i++) { - /* XXX: Do something if the strlen of split[i] is big - * enough to cause the text to wrap. */ - wprintw(view->scroll, "%s\n", split[i]); - view->lines++; + GntTextLine *line = view->list->data; + int len = g_utf8_strlen(split[i], -1); + char *iter = split[i]; + int prev = 0; + + while (iter && *iter) + { + GntTextSegment *seg = g_new0(GntTextSegment, 1); + seg->flags = fl; + seg->text = g_new0(char, len); /* XXX: MUST be improved */ + g_utf8_strncpy(seg->text, iter, widget->priv.width - line->length - 1); + line->segments = g_list_append(line->segments, seg); + + prev = g_utf8_strlen(seg->text, -1); + line->length += prev; + iter = g_utf8_offset_to_pointer(iter, prev); + if (line->length >= widget->priv.width - 1 && *iter) + { + line = g_new0(GntTextLine, 1); + view->list = g_list_prepend(g_list_first(view->list), line); + } + /*len -= prev;*/ + } } - wprintw(view->scroll, "%s", split[i]); + g_strfreev(split); + view->list = list; gnt_widget_draw(widget); } void gnt_text_view_scroll(GntTextView *view, int scroll) { - GntWidget *widget = GNT_WIDGET(view); - int height; - if (scroll == 0) { - view->pos = view->lines - widget->priv.height + 1; + view->list = g_list_first(view->list); } - else + else if (scroll > 0) { - view->pos += scroll; + GList *list = g_list_nth_prev(view->list, scroll); + if (list == NULL) + list = g_list_first(view->list); + view->list = list; } - - if (view->pos + (height = widget->priv.height) > view->lines) - view->pos = view->lines - height + 1; - - if (view->pos < 0) - view->pos = 0; - + else if (scroll < 0) + { + GList *list = g_list_nth(view->list, -scroll); + if (list == NULL) + list = g_list_last(view->list); + view->list = list; + } + gnt_widget_draw(GNT_WIDGET(view)); } void gnt_text_view_next_line(GntTextView *view) { - wclrtoeol(view->scroll); - gnt_text_view_append_text_with_flags(view, "\n", 0); + GntTextLine *line = g_new0(GntTextLine, 1); + GList *list = view->list; + + view->list = g_list_prepend(g_list_first(view->list), line); + view->list = list; + gnt_widget_draw(GNT_WIDGET(view)); } Modified: trunk/console/libgnt/gnttextview.h =================================================================== --- trunk/console/libgnt/gnttextview.h 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gnttextview.h 2006-07-01 00:56:05 UTC (rev 16381) @@ -25,9 +25,7 @@ { GntWidget parent; - WINDOW *scroll; /* XXX: For now, let's do with this. */ - int pos; /* Scroll position. */ - int lines; /* No. of lines of text. */ + GList *list; /* List of GntTextLine */ }; typedef enum @@ -35,6 +33,8 @@ GNT_TEXT_FLAG_BOLD = 1 << 0, GNT_TEXT_FLAG_UNDERLINE = 1 << 1, GNT_TEXT_FLAG_BLINK = 1 << 2, + GNT_TEXT_FLAG_DIM = 1 << 3, + GNT_TEXT_FLAG_HIGHLIGHT = 1 << 4, } GntTextViewFlags; struct _GnTextViewClass Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gnttree.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -203,7 +203,7 @@ if (row == tree->current) { - if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_HAS_FOCUS)) + if (gnt_widget_has_focus(widget)) wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); else wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); /* XXX: This, somehow, doesn't work */ @@ -230,9 +230,6 @@ { GntTree *tree = GNT_TREE(widget); - scrollok(widget->window, TRUE); - wsetscrreg(widget->window, 0, widget->priv.height - 1); - redraw_tree(tree); DEBUG; Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/gntwidget.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -369,7 +369,6 @@ if (set && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_HAS_FOCUS)) { - g_signal_emit(widget->parent, signals[SIG_LOST_FOCUS], 0); GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_HAS_FOCUS); g_signal_emit(widget, signals[SIG_GIVE_FOCUS], 0); } Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/test/multiwin.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -37,6 +37,7 @@ gnt_box_set_title(GNT_BOX(box2), "On top"); gnt_box_add_widget(GNT_BOX(box2), GNT_WIDGET(gnt_label_new("asdasd"))); + gnt_box_add_widget(GNT_BOX(box2), gnt_entry_new(NULL)); gnt_widget_show(hbox); gnt_widget_set_position(box2, 5, 5); Modified: trunk/console/libgnt/test/tv.c =================================================================== --- trunk/console/libgnt/test/tv.c 2006-06-30 16:23:56 UTC (rev 16380) +++ trunk/console/libgnt/test/tv.c 2006-07-01 00:56:05 UTC (rev 16381) @@ -11,10 +11,10 @@ { if (key[0] == '\r' && key[1] == 0) { - gnt_text_view_next_line(GNT_TEXT_VIEW(view)); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(view), gnt_entry_get_text(GNT_ENTRY(w)), - GNT_TEXT_FLAG_BOLD); + GNT_TEXT_FLAG_HIGHLIGHT); + gnt_text_view_next_line(GNT_TEXT_VIEW(view)); gnt_entry_clear(GNT_ENTRY(w)); gnt_text_view_scroll(GNT_TEXT_VIEW(view), 0); @@ -54,8 +54,8 @@ view = gnt_text_view_new(); gnt_widget_set_name(view, "view"); - gnt_widget_set_size(view, getmaxx(stdscr) - 3, 15); - gnt_widget_set_size(entry, getmaxx(stdscr) - 3, 1); + gnt_widget_set_size(view, 20, 15); + gnt_widget_set_size(entry, 20, 1); gnt_box_add_widget(GNT_BOX(hbox), view); gnt_box_add_widget(GNT_BOX(hbox), entry); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-01 04:24:42
|
Revision: 16382 Author: sadrul Date: 2006-06-30 21:24:31 -0700 (Fri, 30 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16382&view=rev Log Message: ----------- I have added a sort of a taskbar, useful in showing the active windows. I have also readjusted the blue color a little bit, since this is the one I am using in a few places right now. And also getting rid of some code-duplication. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntconv.c trunk/console/libgnt/gnt.h trunk/console/libgnt/gntcolors.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntwidget.h Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-07-01 00:56:05 UTC (rev 16381) +++ trunk/console/gntblist.c 2006-07-01 04:24:31 UTC (rev 16382) @@ -219,6 +219,7 @@ get_display_name(node), group, NULL); } +#if 0 static void buddy_signed_on(GaimBuddy *buddy, GGBlist *ggblist) { @@ -230,6 +231,7 @@ { node_remove(gaim_get_blist(), (GaimBlistNode*)buddy); } +#endif GaimBlistUiOps *gg_blist_get_ui_ops() { @@ -259,7 +261,6 @@ static void draw_tooltip(GGBlist *ggblist) { - return; GaimBlistNode *node; int x, y, top, width; GString *str; @@ -410,7 +411,7 @@ ggblist->tree = gnt_tree_new(); GNT_WIDGET_SET_FLAGS(ggblist->tree, GNT_WIDGET_NO_BORDER); - gnt_widget_set_size(ggblist->tree, 25, getmaxy(stdscr) - 2); + gnt_widget_set_size(ggblist->tree, 25, getmaxy(stdscr) - 3); gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->tree); gnt_widget_show(ggblist->window); Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-01 00:56:05 UTC (rev 16381) +++ trunk/console/gntconv.c 2006-07-01 04:24:31 UTC (rev 16382) @@ -101,7 +101,7 @@ ggc->conv = conv; type = gaim_conversation_get_type(conv); - title = g_strdup_printf(_("Conversation: %s"), gaim_conversation_get_name(conv)); + title = g_strdup_printf(_("%s"), gaim_conversation_get_name(conv)); ggc->window = gnt_box_new(FALSE, TRUE); gnt_box_set_title(GNT_BOX(ggc->window), title); gnt_box_set_toplevel(GNT_BOX(ggc->window), TRUE); @@ -133,38 +133,52 @@ } static void -gg_write_chat(GaimConversation *conv, const char *who, const char *message, +gg_write_common(GaimConversation *conv, const char *who, const char *message, GaimMessageFlags flags, time_t mtime) { GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); - char *name, *strip; + char *strip; + GntTextViewFlags fl = 0; g_return_if_fail(ggconv != NULL); - name = g_strdup_printf("%s: ", who); - strip = gaim_markup_strip_html(message); + if (who && *who && (flags & (GAIM_MESSAGE_SEND | GAIM_MESSAGE_RECV))) + { + char * name = g_strdup_printf("%s: ", who); + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), + name, GNT_TEXT_FLAG_BOLD); + g_free(name); + } + else + fl = GNT_TEXT_FLAG_DIM; + if (flags & GAIM_MESSAGE_ERROR) + fl |= GNT_TEXT_FLAG_BOLD; + if (flags & GAIM_MESSAGE_NICK) + fl |= GNT_TEXT_FLAG_UNDERLINE; + + strip = gaim_markup_strip_html(message); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), - name, GNT_TEXT_FLAG_BOLD); - gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), - strip, (flags & GAIM_MESSAGE_NICK) ? GNT_TEXT_FLAG_UNDERLINE : 0); + strip, fl); gnt_text_view_next_line(GNT_TEXT_VIEW(ggconv->tv)); gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 0); - g_free(name); g_free(strip); + + gnt_widget_set_urgent(ggconv->tv); } static void -gg_write_im(GaimConversation *conv, const char *who, const char *message, +gg_write_chat(GaimConversation *conv, const char *who, const char *message, GaimMessageFlags flags, time_t mtime) { - GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); - char *strip; - char *name; + gg_write_common(conv, who, message, flags, mtime); +} - g_return_if_fail(ggconv != NULL); - +static void +gg_write_im(GaimConversation *conv, const char *who, const char *message, + GaimMessageFlags flags, time_t mtime) +{ if (flags & GAIM_MESSAGE_SEND) { who = gaim_connection_get_display_name(conv->account->gc); @@ -176,57 +190,22 @@ else if (flags & GAIM_MESSAGE_RECV) who = gaim_conversation_get_name(conv); - name = g_strdup_printf("%s: ", who); - - gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), - name, GNT_TEXT_FLAG_BOLD); - gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), - (strip = gaim_markup_strip_html(message)), 0); - gnt_text_view_next_line(GNT_TEXT_VIEW(ggconv->tv)); - gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 0); - - g_free(strip); - g_free(name); + gg_write_common(conv, who, message, flags, mtime); } static void gg_write_conv(GaimConversation *conv, const char *who, const char *alias, const char *message, GaimMessageFlags flags, time_t mtime) { - GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); - char *strip; - GntTextViewFlags fl = 0; - - g_return_if_fail(ggconv != NULL); - - strip = gaim_markup_strip_html(message); - - if (flags & (GAIM_MESSAGE_SEND | GAIM_MESSAGE_RECV)) - { - char *name; - if (alias && *alias) - name = g_strdup_printf("%s: ", alias); - else if (who && *who) - name = g_strdup_printf("%s: ", who); - else - name = g_strdup(""); - - gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), - name, GNT_TEXT_FLAG_BOLD); - g_free(name); - } + const char *name; + if (alias && *alias) + name = alias; + else if (who && *who) + name = who; else - fl = GNT_TEXT_FLAG_DIM; + name = NULL; - if (flags & GAIM_MESSAGE_ERROR) - fl |= GNT_TEXT_FLAG_BOLD; - - gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), - strip, fl); - gnt_text_view_next_line(GNT_TEXT_VIEW(ggconv->tv)); - gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 0); - - g_free(strip); + gg_write_common(conv, name, message, flags, mtime); } static void Modified: trunk/console/libgnt/gnt.h =================================================================== --- trunk/console/libgnt/gnt.h 2006-07-01 00:56:05 UTC (rev 16381) +++ trunk/console/libgnt/gnt.h 2006-07-01 04:24:31 UTC (rev 16382) @@ -16,3 +16,5 @@ void gnt_screen_take_focus(GntWidget *widget); gboolean gnt_widget_has_focus(GntWidget *widget); + +void gnt_widget_set_urgent(GntWidget *widget); Modified: trunk/console/libgnt/gntcolors.c =================================================================== --- trunk/console/libgnt/gntcolors.c 2006-07-01 00:56:05 UTC (rev 16381) +++ trunk/console/libgnt/gntcolors.c 2006-07-01 04:24:31 UTC (rev 16382) @@ -9,7 +9,7 @@ init_color(GNT_COLOR_BLACK, 0, 0, 0); init_color(GNT_COLOR_RED, 1000, 0, 0); init_color(GNT_COLOR_GREEN, 0, 1000, 0); - init_color(GNT_COLOR_BLUE, 0, 0, 1000); + init_color(GNT_COLOR_BLUE, 250, 250, 700); init_color(GNT_COLOR_WHITE, 1000, 1000, 1000); init_color(GNT_COLOR_GRAY, 699, 699, 699); init_color(GNT_COLOR_DARK_GRAY, 256, 256, 256); @@ -18,8 +18,10 @@ init_pair(GNT_COLOR_NORMAL, GNT_COLOR_BLACK, GNT_COLOR_WHITE); init_pair(GNT_COLOR_HIGHLIGHT, GNT_COLOR_WHITE, GNT_COLOR_BLUE); init_pair(GNT_COLOR_SHADOW, GNT_COLOR_BLACK, GNT_COLOR_DARK_GRAY); - init_pair(GNT_COLOR_TITLE, GNT_COLOR_WHITE, GNT_COLOR_DARK_GRAY); - init_pair(GNT_COLOR_TITLE_D, GNT_COLOR_BLACK, GNT_COLOR_GRAY); + + init_pair(GNT_COLOR_TITLE, GNT_COLOR_WHITE, GNT_COLOR_BLUE); + init_pair(GNT_COLOR_TITLE_D, GNT_COLOR_WHITE, GNT_COLOR_GRAY); + init_pair(GNT_COLOR_TEXT_NORMAL, GNT_COLOR_WHITE, GNT_COLOR_BLUE); init_pair(GNT_COLOR_HIGHLIGHT_D, GNT_COLOR_BLACK, GNT_COLOR_GRAY); init_pair(GNT_COLOR_DISABLED, GNT_COLOR_GRAY, GNT_COLOR_WHITE); Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-01 00:56:05 UTC (rev 16381) +++ trunk/console/libgnt/gntmain.c 2006-07-01 04:24:31 UTC (rev 16382) @@ -23,6 +23,7 @@ static GHashTable *nodes; static void free_node(gpointer data); +static void draw_taskbar(); void gnt_screen_take_focus(GntWidget *widget) { @@ -33,6 +34,7 @@ gnt_widget_set_focus(widget, TRUE); if (w) gnt_widget_set_focus(w, FALSE); + draw_taskbar(); } void gnt_screen_remove_widget(GntWidget *widget) @@ -43,6 +45,7 @@ gnt_widget_set_focus(focus_list->data, TRUE); gnt_widget_draw(focus_list->data); } + draw_taskbar(); } static void @@ -66,6 +69,53 @@ } } +static void +draw_taskbar() +{ + static WINDOW *taskbar = NULL; + GList *iter; + int n, width; + int i; + + if (taskbar == NULL) + { + taskbar = newwin(1, getmaxx(stdscr), getmaxy(stdscr) - 1, 0); + } + + werase(taskbar); + + n = g_list_length(g_list_first(focus_list)); + if (n) + width = getmaxx(stdscr) / n; + + for (i = 0, iter = g_list_first(focus_list); iter; iter = iter->next, i++) + { + GntWidget *w = iter->data; + int color; + + if (w == focus_list->data) + { + /* This is the current window in focus */ + color = GNT_COLOR_TITLE; + GNT_WIDGET_UNSET_FLAGS(w, GNT_WIDGET_URGENT); + } + else if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_URGENT)) + { + /* This is a window with the URGENT hint set */ + color = GNT_COLOR_TITLE_D; + } + else + { + color = GNT_COLOR_NORMAL; + } + wbkgdset(taskbar, '\0' | COLOR_PAIR(color)); + mvwhline(taskbar, 0, width * i, ' ' | COLOR_PAIR(color), width); + mvwprintw(taskbar, 0, width * i, "%s", GNT_BOX(w)->title); + } + + wrefresh(taskbar); +} + static gboolean io_invoke(GIOChannel *source, GIOCondition cond, gpointer null) { @@ -135,6 +185,8 @@ gnt_widget_set_focus(w, FALSE); } } + + draw_taskbar(); refresh(); return TRUE; @@ -345,3 +397,15 @@ return FALSE; } +void gnt_widget_set_urgent(GntWidget *widget) +{ + while (widget->parent) + widget = widget->parent; + + if (focus_list && focus_list->data == widget) + return; + + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_URGENT); + draw_taskbar(); +} + Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-07-01 00:56:05 UTC (rev 16381) +++ trunk/console/libgnt/gntwidget.h 2006-07-01 04:24:31 UTC (rev 16382) @@ -35,7 +35,8 @@ GNT_WIDGET_NO_BORDER = 1 << 3, GNT_WIDGET_NO_SHADOW = 1 << 4, GNT_WIDGET_HAS_FOCUS = 1 << 5, - GNT_WIDGET_DRAWING = 1 << 6 + GNT_WIDGET_DRAWING = 1 << 6, + GNT_WIDGET_URGENT = 1 << 7 } GntWidgetFlags; /* XXX: I'll have to ask grim what he's using this for in guifications. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-02 22:13:22
|
Revision: 16402 Author: sadrul Date: 2006-07-02 15:13:06 -0700 (Sun, 02 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16402&view=rev Log Message: ----------- This commit has 1234 lines of diff :) Windows can now be moved (alt+m, then the arrow keys, then escape/enter). Add a window to enable/disable accounts. But the 'add' etc. buttons don't have any callbacks yet. I am going to need to do some more widgets (checkbox, combobox) before I do anything else. I have also updated the test programs to work with the changes in libgnt. Modified Paths: -------------- trunk/console/Makefile trunk/console/gntblist.c trunk/console/gntblist.h trunk/console/gntconv.c trunk/console/gntconv.h trunk/console/gntgaim.c trunk/console/gntui.c trunk/console/libgnt/gnt.h trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbox.h trunk/console/libgnt/gntbutton.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h trunk/console/libgnt/gntwidget.c trunk/console/libgnt/test/focus.c trunk/console/libgnt/test/multiwin.c trunk/console/libgnt/test/tv.c Added Paths: ----------- trunk/console/gntaccount.c trunk/console/gntaccount.h Modified: trunk/console/Makefile =================================================================== --- trunk/console/Makefile 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/Makefile 2006-07-02 22:13:06 UTC (rev 16402) @@ -3,16 +3,19 @@ LDFLAGS=`pkg-config --libs gaim gobject-2.0 libxml-2.0 gnt` -pg GG_SOURCES = \ + gntaccount.c \ gntblist.c \ gntconv.c \ gntui.c GG_HEADERS = \ + gntaccount.h \ gntblist.h \ gntconv.h \ gntui.h GG_OBJECTS = \ + gntaccount.o \ gntblist.o \ gntconv.o \ gntui.o @@ -21,6 +24,7 @@ gntgaim: gntgaim.o $(GG_OBJECTS) $(CC) -o gntgaim gntgaim.o $(GG_OBJECTS) $(LDFLAGS) +gntaccount.o: gntaccount.c $(GG_HEADERS) gntblist.o: gntblist.c $(GG_HEADERS) gntconv.o: gntconv.c $(GG_HEADERS) gntgaim.o: gntgaim.c gntgaim.h $(GG_HEADERS) Added: trunk/console/gntaccount.c =================================================================== --- trunk/console/gntaccount.c (rev 0) +++ trunk/console/gntaccount.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -0,0 +1,180 @@ +#include <gnt.h> +#include <gntbox.h> +#include <gntbutton.h> +#include <gntlabel.h> +#include <gnttree.h> + +#include <connection.h> +#include <notify.h> +#include <request.h> + +#include "gntaccount.h" +#include "gntgaim.h" + +typedef struct +{ + GntWidget *window; + GntWidget *tree; +} GGAccountList; + +static GGAccountList accounts; + +static void +account_toggled(GntWidget *widget, void *key, gpointer null) +{ + GaimAccount *account = key; + + gaim_account_set_enabled(account, GAIM_GNT_UI, gnt_tree_get_choice(GNT_TREE(widget), key)); +} + +void gg_accounts_init() +{ + GList *iter; + GntWidget *box, *button; + + accounts.window = gnt_box_new(TRUE, TRUE); + gnt_box_set_toplevel(GNT_BOX(accounts.window), TRUE); + gnt_box_set_title(GNT_BOX(accounts.window), _("Accounts")); + gnt_widget_set_name(accounts.window, "accounts"); + + gnt_box_add_widget(GNT_BOX(accounts.window), + gnt_label_new(_("You can enable/disable accounts from the follwing list."))); + + accounts.tree = gnt_tree_new(); + GNT_WIDGET_SET_FLAGS(accounts.tree, GNT_WIDGET_NO_BORDER); + + for (iter = gaim_accounts_get_all(); iter; iter = iter->next) + { + GaimAccount *account = iter->data; + char *str = g_strdup_printf("%s (%s)", + gaim_account_get_username(account), gaim_account_get_protocol_id(account)); + + gnt_tree_add_choice(GNT_TREE(accounts.tree), account, + str, NULL, NULL); + gnt_tree_set_choice(GNT_TREE(accounts.tree), account, + gaim_account_get_enabled(account, GAIM_GNT_UI)); + g_free(str); + } + + g_signal_connect(G_OBJECT(accounts.tree), "toggled", G_CALLBACK(account_toggled), NULL); + + gnt_widget_set_size(accounts.tree, 40, 15); + gnt_box_add_widget(GNT_BOX(accounts.window), accounts.tree); + + box = gnt_box_new(FALSE, FALSE); + + button = gnt_button_new(_("Add")); + gnt_box_add_widget(GNT_BOX(box), button); + + button = gnt_button_new(_("Modify")); + gnt_box_add_widget(GNT_BOX(box), button); + + button = gnt_button_new(_("Delete")); + gnt_box_add_widget(GNT_BOX(box), button); + + gnt_box_add_widget(GNT_BOX(accounts.window), box); + + gnt_widget_show(accounts.window); +} + +void gg_accounts_uninit() +{ + gnt_widget_destroy(accounts.window); +} + +#if 0 +/* The following uiops stuff are copied from gtkaccount.c */ +/* Need to do some work on notify- and request-ui before this works */ +typedef struct +{ + GaimAccount *account; + char *username; + char *alias; +} AddUserData; + +static char * +make_info(GaimAccount *account, GaimConnection *gc, const char *remote_user, + const char *id, const char *alias, const char *msg) +{ + if (msg != NULL && *msg == '\0') + msg = NULL; + + return g_strdup_printf(_("%s%s%s%s has made %s his or her buddy%s%s"), + remote_user, + (alias != NULL ? " (" : ""), + (alias != NULL ? alias : ""), + (alias != NULL ? ")" : ""), + (id != NULL + ? id + : (gaim_connection_get_display_name(gc) != NULL + ? gaim_connection_get_display_name(gc) + : gaim_account_get_username(account))), + (msg != NULL ? ": " : "."), + (msg != NULL ? msg : "")); +} + +static void +notify_added(GaimAccount *account, const char *remote_user, + const char *id, const char *alias, + const char *msg) +{ + char *buffer; + GaimConnection *gc; + + gc = gaim_account_get_connection(account); + + buffer = make_info(account, gc, remote_user, id, alias, msg); + + gaim_notify_info(NULL, NULL, buffer, NULL); + + g_free(buffer); +} + +static void +request_add(GaimAccount *account, const char *remote_user, + const char *id, const char *alias, + const char *msg) +{ + char *buffer; + GaimConnection *gc; + AddUserData *data; + + gc = gaim_account_get_connection(account); + + data = g_new0(AddUserData, 1); + data->account = account; + data->username = g_strdup(remote_user); + data->alias = (alias != NULL ? g_strdup(alias) : NULL); + + buffer = make_info(account, gc, remote_user, id, alias, msg); +#if 0 + gaim_request_action(NULL, NULL, _("Add buddy to your list?"), + buffer, GAIM_DEFAULT_ACTION_NONE, data, 2, + _("Add"), G_CALLBACK(add_user_cb), + _("Cancel"), G_CALLBACK(free_add_user_data)); +#endif + g_free(buffer); +} + +static GaimAccountUiOps ui_ops = +{ + .notify_added = notify_added, + .status_changed = NULL, + .request_add = request_add +}; +#else + +static GaimAccountUiOps ui_ops = +{ + .notify_added = NULL, + .status_changed = NULL, + .request_add = NULL +}; + +#endif + +GaimAccountUiOps *gg_accounts_get_ui_ops() +{ + return &ui_ops; +} + Property changes on: trunk/console/gntaccount.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/gntaccount.h =================================================================== --- trunk/console/gntaccount.h (rev 0) +++ trunk/console/gntaccount.h 2006-07-02 22:13:06 UTC (rev 16402) @@ -0,0 +1,7 @@ +#include "account.h" + +GaimAccountUiOps *gg_accounts_get_ui_ops(); + +void gg_accounts_init(); + +void gg_accounts_uninit(); Property changes on: trunk/console/gntaccount.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/gntblist.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -440,3 +440,11 @@ g_signal_connect(G_OBJECT(ggblist->tree), "activate", G_CALLBACK(selection_activate), ggblist); } +void gg_blist_uninit() +{ + gnt_widget_destroy(ggblist->window); + g_free(ggblist); + ggblist = NULL; +} + + Modified: trunk/console/gntblist.h =================================================================== --- trunk/console/gntblist.h 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/gntblist.h 2006-07-02 22:13:06 UTC (rev 16402) @@ -3,3 +3,5 @@ GaimBlistUiOps * gg_blist_get_ui_ops(); void gg_blist_init(); + +void gg_blist_uninit(); Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/gntconv.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -165,7 +165,8 @@ g_free(strip); - gnt_widget_set_urgent(ggconv->tv); + if (flags & (GAIM_MESSAGE_RECV | GAIM_MESSAGE_NICK | GAIM_MESSAGE_ERROR)) + gnt_widget_set_urgent(ggconv->tv); } static void @@ -261,3 +262,9 @@ ggconvs = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, destroy_ggconv); } +void gg_conversation_uninit() +{ + g_hash_table_destroy(ggconvs); + ggconvs = NULL; +} + Modified: trunk/console/gntconv.h =================================================================== --- trunk/console/gntconv.h 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/gntconv.h 2006-07-02 22:13:06 UTC (rev 16402) @@ -3,3 +3,5 @@ GaimConversationUiOps *gg_conv_get_ui_ops(); void gg_conversation_init(); + +void gg_conversation_uninit(); Modified: trunk/console/gntgaim.c =================================================================== --- trunk/console/gntgaim.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/gntgaim.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -178,7 +178,7 @@ /* Enable the accounts and restore the status */ gaim_accounts_restore_current_statuses(); - /* Initialize the UI */ + /* Initialize and run the UI */ init_gnt_ui(); gaim_core_quit(); Modified: trunk/console/gntui.c =================================================================== --- trunk/console/gntui.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/gntui.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -1,4 +1,6 @@ #include "gntui.h" + +#include "gntaccount.h" #include "gntblist.h" #include "gntconv.h" @@ -6,9 +8,9 @@ { gnt_init(); - wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); - werase(stdscr); - wrefresh(stdscr); + /* Accounts */ + gg_accounts_init(); + gaim_accounts_set_ui_ops(gg_accounts_get_ui_ops()); /* Initialize the buddy list */ gg_blist_init(); @@ -19,5 +21,16 @@ gaim_conversations_set_ui_ops(gg_conv_get_ui_ops()); gnt_main(); + + gaim_accounts_set_ui_ops(NULL); + gg_accounts_uninit(); + + gaim_blist_set_ui_ops(NULL); + gg_blist_uninit(); + + gaim_conversations_set_ui_ops(NULL); + gg_conversation_uninit(); + + gnt_quit(); } Modified: trunk/console/libgnt/gnt.h =================================================================== --- trunk/console/libgnt/gnt.h 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/libgnt/gnt.h 2006-07-02 22:13:06 UTC (rev 16402) @@ -18,3 +18,6 @@ gboolean gnt_widget_has_focus(GntWidget *widget); void gnt_widget_set_urgent(GntWidget *widget); + +void gnt_quit(); + Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/libgnt/gntbox.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -13,10 +13,25 @@ static GntWidget * find_focusable_widget(GntBox *box); static void +add_to_focus(gpointer value, gpointer data) +{ + GntBox *box = GNT_BOX(data); + GntWidget *w = GNT_WIDGET(value); + + if (GNT_IS_BOX(w)) + g_list_foreach(GNT_BOX(w)->list, add_to_focus, box); + else if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS)) + box->focus = g_list_append(box->focus, w); +} + +static void gnt_box_draw(GntWidget *widget) { GntBox *box = GNT_BOX(widget); + if (box->focus == NULL && widget->parent == NULL) + g_list_foreach(box->list, add_to_focus, box); + g_list_foreach(box->list, (GFunc)gnt_widget_draw, NULL); gnt_box_sync_children(box); @@ -152,12 +167,18 @@ DEBUG; } +#if 0 static GntWidget * find_next_focus(GntBox *box) { GntWidget *w = box->active; GList *iter; + if (w == NULL) + { + return find_focusable_widget(box); + } + while (w && !(iter = g_list_find(box->list, w))) w = w->parent; @@ -167,12 +188,20 @@ { GntWidget *next = NULL; - do + while (!next && (iter = iter->next)) { - next = find_next_focus(iter->data); - box->active = next; - iter = iter->next; - } while (!next && iter); + if (GNT_IS_BOX(iter->data)) + next = find_next_focus(iter->data); + else + { + if (GNT_WIDGET_IS_FLAG_SET(iter->data, GNT_WIDGET_CAN_TAKE_FOCUS) && + GNT_WIDGET_IS_FLAG_SET(iter->data, GNT_WIDGET_HAS_FOCUS)) + next = iter->data; + else + next = NULL; + } + } + box->active = next; } if (box->active == NULL && GNT_WIDGET(box)->parent == NULL) @@ -185,16 +214,21 @@ return box->active; } +#endif /* Ensures that the current widget can take focus */ static GntWidget * find_focusable_widget(GntBox *box) { - int investigated = 0; - int total; - GntWidget *w = NULL; - GList *iter; + if (box->focus == NULL && GNT_WIDGET(box)->parent == NULL) + g_list_foreach(box->list, add_to_focus, box); + if (box->active == NULL && box->focus) + box->active = box->focus->data; + + return box->active; + +#if 0 for (iter = box->list; iter; iter = iter->next) { w = iter->data; @@ -248,6 +282,7 @@ if (w && w != box->active->data) gnt_widget_set_focus(w, FALSE); #endif +#endif } static gboolean @@ -263,35 +298,44 @@ if (text[0] == 27) { -#if 0 - GList *now = NULL; + GntWidget *now = box->active; if (strcmp(text+1, GNT_KEY_LEFT) == 0) { - now = box->active->prev; - if (now == NULL) - now = g_list_last(box->list); + GList *iter = g_list_find(box->focus, box->active); + if ((!iter || !iter->prev) && box->focus) + { + box->active = box->focus->data; + } + else + { + box->active = iter->prev->data; + } } else if (strcmp(text+1, GNT_KEY_RIGHT) == 0) { - now = box->active->next; - if (now == NULL) - now = box->list; + GList *iter = g_list_find(box->focus, box->active); + if (iter && iter->next) + { + box->active = iter->next->data; + } + else if (box->focus) + { + box->active = box->focus->data; + } } if (now && now != box->active) { - gnt_widget_set_focus(box->active->data, FALSE); - box->active = now; - gnt_widget_set_focus(box->active->data, TRUE); - + gnt_widget_set_focus(now, FALSE); + gnt_widget_set_focus(box->active, TRUE); return TRUE; } -#endif } return FALSE; } +#if 0 static GntWidget *find_focused_widget(GntBox *box) { GList *iter; @@ -314,6 +358,7 @@ } return NULL; } +#endif #if 0 static void @@ -483,6 +528,10 @@ for (iter = box->list; iter; iter = iter->next) { GntWidget *w = GNT_WIDGET(iter->data); + + if (GNT_IS_BOX(w)) + gnt_box_sync_children(GNT_BOX(w)); + copywin(w->window, widget->window, 0, 0, w->priv.y - widget->priv.y, w->priv.x - widget->priv.x, Modified: trunk/console/libgnt/gntbox.h =================================================================== --- trunk/console/libgnt/gntbox.h 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/libgnt/gntbox.h 2006-07-02 22:13:06 UTC (rev 16402) @@ -26,6 +26,7 @@ int pad; /* Number of spaces to use between widgets */ char *title; + GList *focus; /* List of widgets to cycle focus (only valid for parent boxes) */ void (*gnt_reserved1)(void); void (*gnt_reserved2)(void); Modified: trunk/console/libgnt/gntbutton.c =================================================================== --- trunk/console/libgnt/gntbutton.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/libgnt/gntbutton.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -16,10 +16,11 @@ GntButton *button = GNT_BUTTON(widget); GntColorType type; - if (GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_HAS_FOCUS) + if (gnt_widget_has_focus(widget)) type = GNT_COLOR_HIGHLIGHT; else type = GNT_COLOR_NORMAL; + wbkgdset(widget->window, '\0' | COLOR_PAIR(type)); mvwprintw(widget->window, 1, 1, button->priv->text); Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/libgnt/gntmain.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -10,9 +10,13 @@ #include <string.h> static GList *focus_list; -static int max_x; -static int max_y; +static int X_MIN; +static int X_MAX; +static int Y_MIN; +static int Y_MAX; +static GMainLoop *loop; + typedef struct { GntWidget *me; @@ -20,6 +24,14 @@ GList *above; /* List of widgets above me */ } GntNode; +typedef enum +{ + GNT_KP_MODE_NORMAL, + GNT_KP_MODE_RESIZE, + GNT_KP_MODE_MOVE, + GNT_KP_MODE_MENU, +} GntKeyPressMode; + static GHashTable *nodes; static void free_node(gpointer data); @@ -28,9 +40,15 @@ void gnt_screen_take_focus(GntWidget *widget) { GntWidget *w = NULL; + if (focus_list) w = focus_list->data; - focus_list = g_list_prepend(focus_list, widget); + + /* XXX: ew */ + focus_list = g_list_first(focus_list); + focus_list = g_list_append(focus_list, widget); + focus_list = g_list_find(focus_list, widget); + gnt_widget_set_focus(widget, TRUE); if (w) gnt_widget_set_focus(w, FALSE); @@ -39,7 +57,18 @@ void gnt_screen_remove_widget(GntWidget *widget) { + int pos = g_list_index(g_list_first(focus_list), widget); + GList *next; + + if (pos == -1) + return; + + focus_list = g_list_first(focus_list); focus_list = g_list_remove(focus_list, widget); + next = g_list_nth(focus_list, pos - 1); + if (next) + focus_list = next; + if (focus_list) { gnt_widget_set_focus(focus_list->data, TRUE); @@ -82,6 +111,7 @@ taskbar = newwin(1, getmaxx(stdscr), getmaxy(stdscr) - 1, 0); } + wbkgdset(taskbar, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); werase(taskbar); n = g_list_length(g_list_first(focus_list)); @@ -116,10 +146,45 @@ wrefresh(taskbar); } +static void +switch_window(int direction) +{ + GntWidget *w = NULL; + if (focus_list) + w = focus_list->data; + + if (direction == 1) + { + if (focus_list && focus_list->next) + focus_list = focus_list->next; + else + focus_list = g_list_first(focus_list); + } + else if (direction == -1) + { + if (focus_list && focus_list->prev) + focus_list = focus_list->prev; + else + focus_list = g_list_last(focus_list); + } + + if (focus_list) + { + gnt_widget_set_focus(focus_list->data, TRUE); + bring_on_top(focus_list->data); + gnt_widget_draw(focus_list->data); + } + + if (w && (!focus_list || w != focus_list->data)) + gnt_widget_set_focus(w, FALSE); +} + static gboolean io_invoke(GIOChannel *source, GIOCondition cond, gpointer null) { char buffer[256]; + static GntKeyPressMode mode = GNT_KP_MODE_NORMAL; + gboolean ret = FALSE; int rd = read(0, buffer, sizeof(buffer) - 1); if (rd < 0) @@ -137,53 +202,110 @@ buffer[rd] = 0; - if (focus_list) + if (mode == GNT_KP_MODE_NORMAL) { - gboolean ret = FALSE; - ret = gnt_widget_key_pressed(focus_list->data, buffer); - } + if (focus_list) + { + ret = gnt_widget_key_pressed(focus_list->data, buffer); + } - if (buffer[0] == 27) - { - /* Some special key has been pressed */ - if (strcmp(buffer+1, GNT_KEY_POPUP) == 0) - {} - else if (strcmp(buffer + 1, "c") == 0) + if (!ret) { - /* Alt + c was pressed. I am going to use it to close a window. */ - if (focus_list) + if (buffer[0] == 27) { - gnt_widget_destroy(focus_list->data); - gnt_screen_remove_widget(focus_list->data); + /* Some special key has been pressed */ + if (strcmp(buffer+1, GNT_KEY_POPUP) == 0) + {} + else if (strcmp(buffer + 1, "c") == 0) + { + /* Alt + c was pressed. I am going to use it to close a window. */ + if (focus_list) + { + gnt_widget_destroy(focus_list->data); + } + } + else if (strcmp(buffer + 1, "q") == 0) + { + /* I am going to use Alt + q to quit. */ + g_main_loop_quit(loop); + } + else if (strcmp(buffer + 1, "n") == 0) + { + /* Alt + n to go to the next window */ + switch_window(1); + } + else if (strcmp(buffer + 1, "p") == 0) + { + /* Alt + p to go to the previous window */ + switch_window(-1); + } + else if (strcmp(buffer + 1, "m") == 0 && focus_list) + { + mode = GNT_KP_MODE_MOVE; + } } } - else if (strcmp(buffer + 1, "q") == 0) + } + else if (mode == GNT_KP_MODE_MOVE && focus_list) + { + if (buffer[0] == 27) { - /* I am going to use Alt + q to quit. */ - endwin(); - exit(1); - } - else if (strcmp(buffer + 1, "n") == 0) - { - /* Alt + n to go to the next window */ - GntWidget *w = NULL; - if (focus_list) - w = focus_list->data; + gboolean changed = FALSE; + int x, y, w, h; + GntWidget *widget = GNT_WIDGET(focus_list->data); - if (focus_list && focus_list->next) - focus_list = focus_list->next; - else - focus_list = g_list_first(focus_list); - if (focus_list) + gnt_widget_get_position(widget, &x, &y); + gnt_widget_get_size(widget, &w, &h); + + if (strcmp(buffer + 1, GNT_KEY_LEFT) == 0) { - gnt_widget_set_focus(focus_list->data, TRUE); - bring_on_top(focus_list->data); - gnt_widget_draw(focus_list->data); + if (x > X_MIN) + { + x--; + changed = TRUE; + } } + else if (strcmp(buffer + 1, GNT_KEY_RIGHT) == 0) + { + if (x + w < X_MAX) + { + x++; + changed = TRUE; + } + } + else if (strcmp(buffer + 1, GNT_KEY_UP) == 0) + { + if (y > Y_MIN) + { + y--; + changed = TRUE; + } + } + else if (strcmp(buffer + 1, GNT_KEY_DOWN) == 0) + { + if (y + h < Y_MAX) + { + y++; + changed = TRUE; + } + } + else if (buffer[1] == 0) + { + mode = GNT_KP_MODE_NORMAL; + changed = TRUE; + } - if (w && w != focus_list->data) - gnt_widget_set_focus(w, FALSE); + if (changed) + { + gnt_widget_hide(widget); + gnt_widget_set_position(widget, x, y); + gnt_widget_show(widget); + } } + else if (*buffer == '\r') + { + mode = GNT_KP_MODE_NORMAL; + } } draw_taskbar(); @@ -209,8 +331,10 @@ start_color(); gnt_init_colors(); - max_x = getmaxx(stdscr); - max_y = getmaxy(stdscr); + X_MIN = 0; + Y_MIN = 0; + X_MAX = getmaxx(stdscr); + Y_MAX = getmaxy(stdscr) - 1; nodes = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_node); @@ -218,13 +342,17 @@ noecho(); refresh(); mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL); + wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); + werase(stdscr); + wrefresh(stdscr); + g_type_init(); } void gnt_main() { - GMainLoop *loop = g_main_new(FALSE); - g_main_run(loop); + loop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(loop); } /********************************* @@ -290,6 +418,9 @@ WINDOW *win; GList *iter; GntNode *node = g_hash_table_lookup(nodes, widget); + + gnt_screen_remove_widget(widget); + if (node == NULL) /* Yay! Nothing to do. */ return; @@ -384,15 +515,15 @@ while (widget->parent) { - fprintf(stderr, "%p %p\n", widget, widget->parent); widget = widget->parent; } - fprintf(stderr, "%p %p\n", widget, widget->parent); - if (focus_list && focus_list->data == widget && - (!GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS) || - GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_HAS_FOCUS))) - return TRUE; + if (focus_list && focus_list->data == widget) + { + if (GNT_IS_BOX(widget) && + (GNT_BOX(widget)->active == w || widget == w)) + return TRUE; + } return FALSE; } @@ -409,3 +540,8 @@ draw_taskbar(); } +void gnt_quit() +{ + endwin(); +} + Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/libgnt/gnttree.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -7,6 +7,7 @@ { SIG_SELECTION_CHANGED, SIG_SCROLLED, + SIG_TOGGLED, SIGS, }; @@ -21,6 +22,9 @@ void *data; /* XXX: unused */ gboolean collapsed; + gboolean choice; /* Is this a choice-box? + If choice is true, then child will be NULL */ + gboolean isselected; GntTreeRow *parent; GntTreeRow *child; @@ -188,6 +192,10 @@ else strcpy(format, "- "); } + else if (row->choice) + { + g_snprintf(format, sizeof(format) - 1, "[%c] ", row->isselected ? 'X' : ' '); + } if ((wr = g_snprintf(str, widget->priv.width, "%s%s", format, row->text)) >= widget->priv.width) { @@ -206,7 +214,7 @@ if (gnt_widget_has_focus(widget)) wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); else - wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); /* XXX: This, somehow, doesn't work */ + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); mvwprintw(widget->window, start, pos, str); wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); } @@ -306,10 +314,19 @@ row->collapsed = !row->collapsed; redraw_tree(tree); } + else if (row && row->choice) + { + row->isselected = !row->isselected; + g_signal_emit(tree, signals[SIG_TOGGLED], 0, row->key); + redraw_tree(tree); + } } if (old != tree->current) + { tree_selection_changed(tree, old, tree->current); + return TRUE; + } return FALSE; } @@ -349,6 +366,14 @@ NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); + signals[SIG_TOGGLED] = + g_signal_new("toggled", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); DEBUG; } @@ -616,4 +641,39 @@ } } +GntTreeRow *gnt_tree_add_choice(GntTree *tree, void *key, const char *text, void *parent, void *bigbro) +{ + GntTreeRow *row; + row = g_hash_table_lookup(tree->hash, key); + g_return_val_if_fail(!row || !row->choice, NULL); + + row = gnt_tree_add_row_after(tree, key, text, parent, bigbro); + row->choice = TRUE; + + return row; +} + +void gnt_tree_set_choice(GntTree *tree, void *key, gboolean set) +{ + GntTreeRow *row = g_hash_table_lookup(tree->hash, key); + + if (!row) + return; + g_return_if_fail(row->choice); + + row->isselected = set; + redraw_tree(tree); +} + +gboolean gnt_tree_get_choice(GntTree *tree, void *key) +{ + GntTreeRow *row = g_hash_table_lookup(tree->hash, key); + + if (!row) + return; + g_return_val_if_fail(row->choice, FALSE); + + return row->isselected; +} + Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/libgnt/gnttree.h 2006-07-02 22:13:06 UTC (rev 16402) @@ -73,6 +73,12 @@ void gnt_tree_change_text(GntTree *tree, gpointer key, const char *text); +GntTreeRow *gnt_tree_add_choice(GntTree *tree, void *key, const char *text, void *parent, void *bigbro); + +void gnt_tree_set_choice(GntTree *tree, void *key, gboolean set); + +gboolean gnt_tree_get_choice(GntTree *tree, void *key); + G_END_DECLS #endif /* GNT_TREE_H */ Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/libgnt/gntwidget.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -239,11 +239,11 @@ gnt_widget_show(GntWidget *widget) { /* Draw the widget and take focus */ - gnt_widget_draw(widget); if (GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_CAN_TAKE_FOCUS) { gnt_widget_take_focus(widget); } + gnt_widget_draw(widget); } void @@ -267,7 +267,7 @@ widget->window = newwin(widget->priv.height, widget->priv.width, widget->priv.y, widget->priv.x); wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); - + if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) box(widget->window, 0, 0); else @@ -316,8 +316,8 @@ gnt_widget_hide(GntWidget *widget) { wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); - werase(widget->window); gnt_screen_release(widget); + GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_MAPPED); } void @@ -326,6 +326,8 @@ /* XXX: Need to install properties for these and g_object_notify */ wid->priv.x = x; wid->priv.y = y; + if (wid->window) + mvwin(wid->window, y, x); g_signal_emit(wid, signals[SIG_POSITION], 0, x, y); } Modified: trunk/console/libgnt/test/focus.c =================================================================== --- trunk/console/libgnt/test/focus.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/libgnt/test/focus.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -6,44 +6,79 @@ #include "gntentry.h" #include "gntlabel.h" +static void +toggled(GntWidget *tree, gpointer key, gpointer null) +{ + GntWidget *w = gnt_box_new(FALSE, FALSE); + + gnt_box_set_toplevel(GNT_BOX(w), TRUE); + + gnt_box_add_widget(GNT_BOX(w), + gnt_label_new(gnt_tree_get_choice(GNT_TREE(tree), key) ? "Selected" : "NOT")); + gnt_widget_show(w); +} + int main() { gnt_init(); GntWidget *label = gnt_label_new("So wassup dudes and dudettes!!\nSo this is, like,\nthe third line!! \\o/"); - GntWidget *vbox, *hbox, *tree; + GntWidget *vbox, *hbox, *tree, *box, *button; WINDOW *test; box(stdscr, 0, 0); wrefresh(stdscr); vbox = gnt_box_new(FALSE, FALSE); - hbox = gnt_box_new(FALSE, TRUE); + hbox = gnt_box_new(TRUE, TRUE); gnt_widget_set_name(vbox, "vbox"); gnt_widget_set_name(hbox, "hbox"); gnt_box_add_widget(GNT_BOX(hbox), label); - gnt_box_add_widget(GNT_BOX(hbox), vbox); - gnt_box_add_widget(GNT_BOX(hbox), gnt_entry_new("a")); + GntWidget *entry = gnt_entry_new("a"); + gnt_widget_set_name(entry, "entry"); + gnt_box_add_widget(GNT_BOX(hbox), entry); + box = gnt_box_new(FALSE, FALSE); tree = gnt_tree_new(); - gnt_box_add_widget(GNT_BOX(hbox), tree); + gnt_widget_set_name(tree, "tree"); + gnt_box_add_widget(GNT_BOX(box), tree); + gnt_box_add_widget(GNT_BOX(hbox), box); gnt_tree_add_row_after(GNT_TREE(tree), "a", "a", NULL, NULL); gnt_tree_add_row_after(GNT_TREE(tree), "c", "c", NULL, NULL); gnt_tree_add_row_after(GNT_TREE(tree), "d", "d", NULL, NULL); gnt_tree_add_row_after(GNT_TREE(tree), "e", "e", "a", NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "b", "b", "d", NULL); + gnt_tree_add_choice(GNT_TREE(tree), "b", "b", "d", NULL); GNT_WIDGET_UNSET_FLAGS(hbox, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); gnt_box_set_title(GNT_BOX(hbox), "This is the title …"); + + g_signal_connect(G_OBJECT(tree), "toggled", G_CALLBACK(toggled), NULL); + + button = gnt_button_new("one"); + gnt_widget_set_name(button, "one"); + gnt_box_add_widget(GNT_BOX(vbox), button); + + button = gnt_button_new("two"); + gnt_widget_set_name(button, "two"); + gnt_box_add_widget(GNT_BOX(vbox), button); + + button = gnt_button_new("three"); + gnt_widget_set_name(button, "three"); + gnt_box_add_widget(GNT_BOX(vbox), button); + + gnt_box_add_widget(GNT_BOX(hbox), vbox); + gnt_widget_show(hbox); gnt_main(); + gnt_quit(); + return 0; } Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/libgnt/test/multiwin.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -49,7 +49,7 @@ gnt_tree_add_row_after(GNT_TREE(tree), "e", "e", "a", NULL); gnt_tree_add_row_after(GNT_TREE(tree), "b", "b", "d", NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "1", "1", NULL, NULL); + gnt_tree_add_choice(GNT_TREE(tree), "1", "1", NULL, NULL); gnt_tree_add_row_after(GNT_TREE(tree), "2", "2", NULL, NULL); gnt_tree_add_row_after(GNT_TREE(tree), "3", "3", NULL, NULL); gnt_tree_add_row_after(GNT_TREE(tree), "4", "4", "a", NULL); @@ -60,6 +60,8 @@ gnt_main(); + gnt_quit(); + return 0; } Modified: trunk/console/libgnt/test/tv.c =================================================================== --- trunk/console/libgnt/test/tv.c 2006-07-02 21:52:38 UTC (rev 16401) +++ trunk/console/libgnt/test/tv.c 2006-07-02 22:13:06 UTC (rev 16402) @@ -66,6 +66,8 @@ gnt_main(); + gnt_quit(); + return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-03 02:27:47
|
Revision: 16410 Author: sadrul Date: 2006-07-02 19:27:41 -0700 (Sun, 02 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16410&view=rev Log Message: ----------- Change some colors for terminals that don't support customizing colors. Make taskbar behave properly when moving a window. Read startup options from command-line (copy-paste from gtkgaim [sic]). I am doing #define _GNU_SOURCE and #include <getopt.h> ... I don't know if that's alright. So now you can specify a location to read config files from. Modified Paths: -------------- trunk/console/Makefile trunk/console/gntgaim.c trunk/console/libgnt/gntcolors.c trunk/console/libgnt/gntmain.c Modified: trunk/console/Makefile =================================================================== --- trunk/console/Makefile 2006-07-03 01:40:12 UTC (rev 16409) +++ trunk/console/Makefile 2006-07-03 02:27:41 UTC (rev 16410) @@ -1,5 +1,6 @@ +VERSION=gntgaim-0.0.0dev CC=gcc -CFLAGS=`pkg-config --cflags gaim gobject-2.0 gnt` -g -Wall +CFLAGS=`pkg-config --cflags gaim gobject-2.0 gnt` -g -Wall -DVERSION=\"$(VERSION)\" LDFLAGS=`pkg-config --libs gaim gobject-2.0 libxml-2.0 gnt` -pg GG_SOURCES = \ Modified: trunk/console/gntgaim.c =================================================================== --- trunk/console/gntgaim.c 2006-07-03 01:40:12 UTC (rev 16409) +++ trunk/console/gntgaim.c 2006-07-03 02:27:41 UTC (rev 16410) @@ -18,6 +18,9 @@ #include "gntgaim.h" #include "gntui.h" +#define _GNU_SOURCE +#include <getopt.h> + /* Anything IO-related is directly copied from gtkgaim's source tree */ static GaimCoreUiOps core_ops = @@ -103,12 +106,6 @@ closure->result = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, cond, gaim_gtk_io_invoke, closure, gaim_gtk_io_destroy); -#if 0 - gaim_debug(GAIM_DEBUG_MISC, "gtk_eventloop", - "CLOSURE: adding input watcher %d for fd %d\n", - closure->result, fd); -#endif - g_io_channel_unref(channel); return closure->result; } @@ -129,25 +126,124 @@ /* This is mostly copied from gtkgaim's source tree */ static void -init_libgaim() +show_usage(const char *name, gboolean terse) { + char *text; + + if (terse) { + text = g_strdup_printf(_("Gaim %s. Try `%s -h' for more information.\n"), VERSION, name); + } else { + text = g_strdup_printf(_("Gaim %s\n" + "Usage: %s [OPTION]...\n\n" + " -c, --config=DIR use DIR for config files\n" + " -d, --debug print debugging messages to stdout\n" + " -h, --help display this help and exit\n" + " -n, --nologin don't automatically login\n" + " -v, --version display the current version and exit\n"), VERSION, name); + } + + gaim_print_utf8_to_console(stdout, text); + g_free(text); +} + +static int +init_libgaim(int argc, char **argv) +{ char *path; + int opt; + gboolean opt_help = FALSE; + gboolean opt_nologin = FALSE; + gboolean opt_version = FALSE; + char *opt_config_dir_arg = NULL; + char *opt_session_arg = NULL; + gboolean debug_enabled; + struct option long_options[] = { + {"config", required_argument, NULL, 'c'}, + {"debug", no_argument, NULL, 'd'}, + {"help", no_argument, NULL, 'h'}, + {"nologin", no_argument, NULL, 'n'}, + {"session", required_argument, NULL, 's'}, + {"version", no_argument, NULL, 'v'}, + {0, 0, 0, 0} + }; + + /* scan command-line options */ + opterr = 1; + while ((opt = getopt_long(argc, argv, +#ifndef _WIN32 + "c:dhn::s:v", +#else + "c:dhn::v", +#endif + long_options, NULL)) != -1) { + switch (opt) { + case 'c': /* config dir */ + g_free(opt_config_dir_arg); + opt_config_dir_arg = g_strdup(optarg); + break; + case 'd': /* debug */ + debug_enabled = TRUE; + break; + case 'h': /* help */ + opt_help = TRUE; + break; + case 'n': /* no autologin */ + opt_nologin = TRUE; + break; + case 's': /* use existing session ID */ + g_free(opt_session_arg); + opt_session_arg = g_strdup(optarg); + break; + case 'v': /* version */ + opt_version = TRUE; + break; + case '?': /* show terse help */ + default: + show_usage(argv[0], TRUE); + return 0; + break; + } + } + + /* show help message */ + if (opt_help) { + show_usage(argv[0], FALSE); + return 0; + } + /* show version message */ + if (opt_version) { + printf("Gaim %s\n", VERSION); + return 0; + } + + /* set a user-specified config directory */ + if (opt_config_dir_arg != NULL) { + gaim_util_set_user_dir(opt_config_dir_arg); + } + + /* + * We're done piddling around with command line arguments. + * Fire up this baby. + */ + + /* Because we don't want debug-messages to show up and corrup the display */ gaim_debug_set_enabled(FALSE); gaim_core_set_ui_ops(gnt_core_get_ui_ops()); gaim_eventloop_set_ui_ops(gnt_eventloop_get_ui_ops()); - gaim_util_set_user_dir("/tmp/tmp/"); /* XXX: */ - path = g_build_filename(gaim_user_dir(), "plugins", NULL); gaim_plugins_add_search_path(path); g_free(path); + gaim_plugins_add_search_path("/usr/local/lib/gaim"); /* XXX: */ if (!gaim_core_init(GAIM_GNT_UI)) { - fprintf(stderr, "OOPSSS!!\n"); + fprintf(stderr, + "Initialization of the Gaim core failed. Dumping core.\n" + "Please report this!\n"); abort(); } @@ -160,11 +256,36 @@ gaim_prefs_update_old(); /* load plugins we had when we quit */ - gaim_plugins_load_saved("/gaim/gtk/plugins/loaded"); + gaim_plugins_load_saved("/gaim/gnt/plugins/loaded"); /* TODO: Move pounces loading into gaim_pounces_init() */ gaim_pounces_load(); + if (opt_nologin) + { + /* Set all accounts to "offline" */ + GaimSavedStatus *saved_status; + + /* If we've used this type+message before, lookup the transient status */ + saved_status = gaim_savedstatus_find_transient_by_type_and_message( + GAIM_STATUS_OFFLINE, NULL); + + /* If this type+message is unique then create a new transient saved status */ + if (saved_status == NULL) + saved_status = gaim_savedstatus_new(NULL, GAIM_STATUS_OFFLINE); + + /* Set the status for each account */ + gaim_savedstatus_activate(saved_status); + } + else + { + /* Everything is good to go--sign on already */ + if (!gaim_prefs_get_bool("/core/savedstatus/startup_current_status")) + gaim_savedstatus_activate(gaim_savedstatus_get_startup()); + gaim_accounts_restore_current_statuses(); + } + + return 1; } int main(int argc, char **argv) @@ -173,11 +294,9 @@ freopen(".error", "w", stderr); /* Initialize the libgaim stuff */ - init_libgaim(); + if (!init_libgaim(argc, argv)) + return 0; - /* Enable the accounts and restore the status */ - gaim_accounts_restore_current_statuses(); - /* Initialize and run the UI */ init_gnt_ui(); Modified: trunk/console/libgnt/gntcolors.c =================================================================== --- trunk/console/libgnt/gntcolors.c 2006-07-03 01:40:12 UTC (rev 16409) +++ trunk/console/libgnt/gntcolors.c 2006-07-03 02:27:41 UTC (rev 16410) @@ -29,10 +29,11 @@ else { init_pair(GNT_COLOR_NORMAL, COLOR_BLACK, COLOR_WHITE); - init_pair(GNT_COLOR_HIGHLIGHT, COLOR_YELLOW, COLOR_BLACK); + init_pair(GNT_COLOR_HIGHLIGHT, COLOR_WHITE, COLOR_BLUE); init_pair(GNT_COLOR_SHADOW, COLOR_BLACK, COLOR_BLACK); - init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLACK); - init_pair(GNT_COLOR_TEXT_NORMAL, COLOR_BLACK, COLOR_WHITE); + init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLUE); + init_pair(GNT_COLOR_TITLE_D, COLOR_WHITE, COLOR_BLACK); + init_pair(GNT_COLOR_TEXT_NORMAL, COLOR_WHITE, COLOR_BLUE); init_pair(GNT_COLOR_HIGHLIGHT_D, COLOR_CYAN, COLOR_BLACK); init_pair(GNT_COLOR_DISABLED, COLOR_YELLOW, COLOR_WHITE); } Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-03 01:40:12 UTC (rev 16409) +++ trunk/console/libgnt/gntmain.c 2006-07-03 02:27:41 UTC (rev 16410) @@ -9,7 +9,9 @@ #include <unistd.h> #include <string.h> +static int lock_focus_list; static GList *focus_list; + static int X_MIN; static int X_MAX; static int Y_MIN; @@ -41,6 +43,9 @@ { GntWidget *w = NULL; + if (lock_focus_list) + return; + if (focus_list) w = focus_list->data; @@ -60,6 +65,9 @@ int pos = g_list_index(g_list_first(focus_list), widget); GList *next; + if (lock_focus_list) + return; + if (pos == -1) return; @@ -297,9 +305,11 @@ if (changed) { + lock_focus_list = 1; gnt_widget_hide(widget); gnt_widget_set_position(widget, x, y); gnt_widget_show(widget); + lock_focus_list = 0; } } else if (*buffer == '\r') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-04 01:32:49
|
Revision: 16418 Author: sadrul Date: 2006-07-03 18:32:39 -0700 (Mon, 03 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16418&view=rev Log Message: ----------- Make the conversation windows bigger ... which is better *wink*. Use Panel library to manage the windows. Add a window-list that you can use to quickly switch to a window (press Alt+w to bring it up). Get rid of some unused codes. Modified Paths: -------------- trunk/console/gntaccount.c trunk/console/gntblist.c trunk/console/gntblist.h trunk/console/gntconv.c trunk/console/libgnt/Makefile.am trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntwidget.c trunk/console/libgnt/test/Makefile trunk/console/libgnt/test/multiwin.c Modified: trunk/console/gntaccount.c =================================================================== --- trunk/console/gntaccount.c 2006-07-03 21:20:16 UTC (rev 16417) +++ trunk/console/gntaccount.c 2006-07-04 01:32:39 UTC (rev 16418) @@ -38,7 +38,7 @@ gnt_widget_set_name(accounts.window, "accounts"); gnt_box_add_widget(GNT_BOX(accounts.window), - gnt_label_new(_("You can enable/disable accounts from the follwing list."))); + gnt_label_new(_("You can enable/disable accounts from the following list."))); accounts.tree = gnt_tree_new(); GNT_WIDGET_SET_FLAGS(accounts.tree, GNT_WIDGET_NO_BORDER); Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-07-03 21:20:16 UTC (rev 16417) +++ trunk/console/gntblist.c 2006-07-04 01:32:39 UTC (rev 16418) @@ -355,6 +355,7 @@ gnt_box_add_widget(GNT_BOX(box), gnt_label_new(str->str)); gnt_widget_set_position(box, x, y); + GNT_WIDGET_UNSET_FLAGS(box, GNT_WIDGET_CAN_TAKE_FOCUS); gnt_widget_draw(box); g_free(title); @@ -438,6 +439,10 @@ 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), "activate", G_CALLBACK(selection_activate), ggblist); + g_signal_connect_data(G_OBJECT(ggblist->tree), "gained-focus", G_CALLBACK(draw_tooltip), + ggblist, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); + g_signal_connect_data(G_OBJECT(ggblist->tree), "lost-focus", G_CALLBACK(remove_tooltip), + ggblist, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); } void gg_blist_uninit() @@ -447,4 +452,23 @@ ggblist = NULL; } +void gg_blist_get_position(int *x, int *y) +{ + gnt_widget_get_position(ggblist->window, x, y); +} +void gg_blist_set_position(int x, int y) +{ + gnt_widget_set_position(ggblist->window, x, y); +} + +void gg_blist_get_size(int *width, int *height) +{ + gnt_widget_get_size(ggblist->window, width, height); +} + +void gg_blist_set_size(int width, int height) +{ + gnt_widget_set_size(ggblist->window, width, height); +} + Modified: trunk/console/gntblist.h =================================================================== --- trunk/console/gntblist.h 2006-07-03 21:20:16 UTC (rev 16417) +++ trunk/console/gntblist.h 2006-07-04 01:32:39 UTC (rev 16418) @@ -5,3 +5,12 @@ void gg_blist_init(); void gg_blist_uninit(); + +void gg_blist_get_position(int *x, int *y); + +void gg_blist_set_position(int x, int y); + +void gg_blist_get_size(int *width, int *height); + +void gg_blist_set_size(int width, int height); + Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-03 21:20:16 UTC (rev 16417) +++ trunk/console/gntconv.c 2006-07-04 01:32:39 UTC (rev 16418) @@ -2,6 +2,7 @@ #include <util.h> #include "gntgaim.h" +#include "gntblist.h" #include "gntconv.h" #include "gnt.h" @@ -91,10 +92,14 @@ GGConv *ggc = g_hash_table_lookup(ggconvs, conv); char *title; GaimConversationType type; + int x, width; if (ggc) return; + gg_blist_get_position(&x, NULL); + gg_blist_get_size(&width, NULL); + ggc = g_new0(GGConv, 1); g_hash_table_insert(ggconvs, conv, ggc); @@ -102,25 +107,28 @@ type = gaim_conversation_get_type(conv); title = g_strdup_printf(_("%s"), gaim_conversation_get_name(conv)); - ggc->window = gnt_box_new(FALSE, TRUE); + ggc->window = gnt_box_new(TRUE, TRUE); gnt_box_set_title(GNT_BOX(ggc->window), title); gnt_box_set_toplevel(GNT_BOX(ggc->window), TRUE); + gnt_box_set_pad(GNT_BOX(ggc->window), 0); gnt_widget_set_name(ggc->window, title); ggc->tv = gnt_text_view_new(); gnt_box_add_widget(GNT_BOX(ggc->window), ggc->tv); gnt_widget_set_name(ggc->tv, "conversation-window-textview"); - gnt_widget_set_size(ggc->tv, getmaxx(stdscr) - 40, getmaxy(stdscr) - 15); + gnt_widget_set_size(ggc->tv, getmaxx(stdscr) - 2 - x - width, getmaxy(stdscr) - 4); ggc->entry = gnt_entry_new(NULL); gnt_box_add_widget(GNT_BOX(ggc->window), ggc->entry); gnt_widget_set_name(ggc->entry, "conversation-window-entry"); - gnt_widget_set_size(ggc->entry, getmaxx(stdscr) - 40, 1); g_signal_connect(G_OBJECT(ggc->entry), "key_pressed", G_CALLBACK(entry_key_pressed), ggc); g_signal_connect(G_OBJECT(ggc->window), "destroy", G_CALLBACK(closing_window), ggc); - gnt_widget_set_position(ggc->window, 32, 0); + /* XXX: I am assuming the buddylist is on the leftmost corner. + * That may not always be correct, since the windows can be moved. + * It might be an option to remember the position of conv. windows. */ + gnt_widget_set_position(ggc->window, x + width, 0); gnt_widget_show(ggc->window); g_free(title); Modified: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am 2006-07-03 21:20:16 UTC (rev 16417) +++ trunk/console/libgnt/Makefile.am 2006-07-04 01:32:39 UTC (rev 16418) @@ -37,7 +37,7 @@ libgnt_la_LIBADD = \ $(GLIB_LIBS) \ $(STATIC_LINK_LIBS) \ - -lncursesw + -lncursesw -lpanelw AM_CPPFLAGS = \ $(GLIB_CFLAGS) Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-07-03 21:20:16 UTC (rev 16417) +++ trunk/console/libgnt/gntbox.c 2006-07-04 01:32:39 UTC (rev 16418) @@ -167,55 +167,6 @@ DEBUG; } -#if 0 -static GntWidget * -find_next_focus(GntBox *box) -{ - GntWidget *w = box->active; - GList *iter; - - if (w == NULL) - { - return find_focusable_widget(box); - } - - while (w && !(iter = g_list_find(box->list, w))) - w = w->parent; - - if (!w) - box->active = NULL; - else if (iter) - { - GntWidget *next = NULL; - - while (!next && (iter = iter->next)) - { - if (GNT_IS_BOX(iter->data)) - next = find_next_focus(iter->data); - else - { - if (GNT_WIDGET_IS_FLAG_SET(iter->data, GNT_WIDGET_CAN_TAKE_FOCUS) && - GNT_WIDGET_IS_FLAG_SET(iter->data, GNT_WIDGET_HAS_FOCUS)) - next = iter->data; - else - next = NULL; - } - } - box->active = next; - } - - if (box->active == NULL && GNT_WIDGET(box)->parent == NULL) - { - box->active = find_focusable_widget(box); - } - - if (box->active) - GNT_WIDGET_SET_FLAGS(box->active, GNT_WIDGET_HAS_FOCUS); - - return box->active; -} -#endif - /* Ensures that the current widget can take focus */ static GntWidget * find_focusable_widget(GntBox *box) @@ -227,62 +178,6 @@ box->active = box->focus->data; return box->active; - -#if 0 - for (iter = box->list; iter; iter = iter->next) - { - w = iter->data; - if (GNT_IS_BOX(w)) - { - w = find_focusable_widget(GNT_BOX(w)); - if (w) - break; - } - else if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS)) - break; - } - - if (iter) - box->active = w; - else - box->active = NULL; - - if (box->active) - GNT_WIDGET_SET_FLAGS(box->active, GNT_WIDGET_HAS_FOCUS); - - return box->active; - -#if 0 - if (box->active == NULL && box->list) - box->active = box->list->data; - else - w = box->active; - - total = g_list_length(box->list); - - while (box->active && !GNT_WIDGET_IS_FLAG_SET(box->active, GNT_WIDGET_CAN_TAKE_FOCUS)) - { - box->active = box->active->next; - investigated++; - } - - /* Rotate if necessary */ - if (!box->active && investigated < total) - { - box->active = box->list; - while (investigated < total && !GNT_WIDGET_IS_FLAG_SET(box->active->data, GNT_WIDGET_CAN_TAKE_FOCUS)) - { - box->active = box->active->next; - investigated++; - } - } - - if (box->active) - gnt_widget_set_focus(box->active->data, TRUE); - if (w && w != box->active->data) - gnt_widget_set_focus(w, FALSE); -#endif -#endif } static gboolean @@ -335,66 +230,23 @@ return FALSE; } -#if 0 -static GntWidget *find_focused_widget(GntBox *box) -{ - GList *iter; - - for (iter = box->list; iter; iter = iter->next) - { - GntWidget *w = iter->data; - - if (GNT_IS_BOX(w)) - { - if ((w = find_focused_widget(GNT_BOX(w))) != NULL) - return w; - } - else - { - if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS) && - GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_HAS_FOCUS)) - return w; - } - } - return NULL; -} -#endif - -#if 0 static void -gnt_box_set_focus(GntWidget *widget, gboolean set) +gnt_box_lost_focus(GntWidget *widget) { - GntWidget *p = widget; - - while (p->parent) - p = p->parent; - - p = find_focused_widget(GNT_BOX(p)); - if (p) - gnt_widget_set_focus(p, set); + GntWidget *w = GNT_BOX(widget)->active; + if (w) + gnt_widget_set_focus(w, FALSE); gnt_widget_draw(widget); } static void -gnt_box_lost_focus(GntWidget *widget) -{ - gnt_box_set_focus(widget, FALSE); -} - -static void gnt_box_gained_focus(GntWidget *widget) { - GntWidget *p; - - while (widget->parent) - widget = widget->parent; - - p = find_focused_widget(GNT_BOX(widget)); - GNT_BOX(widget)->active = g_list_find(GNT_BOX(widget)->list, p); - if (p) - gnt_widget_draw(p); + GntWidget *w = GNT_BOX(widget)->active; + if (w) + gnt_widget_set_focus(w, TRUE); + gnt_widget_draw(widget); } -#endif static void gnt_box_destroy(GntWidget *w) @@ -432,11 +284,8 @@ parent_class->size_request = gnt_box_size_request; parent_class->set_position = gnt_box_set_position; parent_class->key_pressed = gnt_box_key_pressed; -#if 0 - /* We are going to need this when there are multiple focusble widgets in a box */ parent_class->lost_focus = gnt_box_lost_focus; parent_class->gained_focus = gnt_box_gained_focus; -#endif DEBUG; } @@ -513,9 +362,15 @@ { GntWidget *widget = GNT_WIDGET(box); if (set) + { GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS); + } else + { GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); + GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS); + } } void gnt_box_sync_children(GntBox *box) Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-03 21:20:16 UTC (rev 16417) +++ trunk/console/libgnt/gntmain.c 2006-07-04 01:32:39 UTC (rev 16418) @@ -1,3 +1,5 @@ +#include <panel.h> + #include "gnt.h" #include "gntbox.h" #include "gntkeys.h" @@ -2,2 +4,3 @@ #include "gntcolors.h" +#include "gnttree.h" @@ -18,12 +21,17 @@ static int Y_MAX; static GMainLoop *loop; +static struct +{ + GntWidget *window; + GntWidget *tree; +} window_list; typedef struct { GntWidget *me; - GList *below; /* List of widgets below me */ - GList *above; /* List of widgets above me */ + + PANEL *panel; } GntNode; typedef enum @@ -32,6 +40,7 @@ GNT_KP_MODE_RESIZE, GNT_KP_MODE_MOVE, GNT_KP_MODE_MENU, + GNT_KP_MODE_WINDOW_LIST } GntKeyPressMode; static GHashTable *nodes; @@ -91,19 +100,23 @@ GntNode *node = g_hash_table_lookup(nodes, widget); GList *iter; + g_return_if_fail(focus_list->data == widget); + if (!node) return; - for (iter = node->above; iter;) + gnt_widget_set_focus(focus_list->data, TRUE); + gnt_widget_draw(focus_list->data); + + top_panel(node->panel); + + if (window_list.window) { - GntNode *n = iter->data; - iter = iter->next; - n->below = g_list_remove(n->below, node); - n->above = g_list_prepend(n->above, node); - - node->above = g_list_remove(node->above, n); - node->below = g_list_prepend(node->below, n); + GntNode *nd = g_hash_table_lookup(nodes, window_list.window); + top_panel(nd->panel); } + update_panels(); + doupdate(); } static void @@ -178,21 +191,75 @@ if (focus_list) { - gnt_widget_set_focus(focus_list->data, TRUE); bring_on_top(focus_list->data); - gnt_widget_draw(focus_list->data); } if (w && (!focus_list || w != focus_list->data)) + { gnt_widget_set_focus(w, FALSE); -} + } +} +static void +window_list_activate(GntTree *tree, gpointer null) +{ + GntWidget *widget = gnt_tree_get_selection_data(GNT_TREE(tree)); + GntWidget *old; + + if (focus_list) + old = focus_list->data; + + focus_list = g_list_find(g_list_first(focus_list), widget); + bring_on_top(widget); + + if (old && (!focus_list || old != focus_list->data)) + { + gnt_widget_set_focus(old, FALSE); + } +} + +static GntWidget * +show_window_list() +{ + GntWidget *tree, *win; + GList *iter; + int id; + + if (window_list.window) + return window_list.window; + + win = window_list.window = gnt_box_new(FALSE, FALSE); + gnt_box_set_toplevel(GNT_BOX(win), TRUE); + gnt_box_set_title(GNT_BOX(win), "Window List"); + gnt_box_set_pad(GNT_BOX(win), 0); + + tree = window_list.tree = gnt_tree_new(); + + for (iter = g_list_first(focus_list); iter; iter = iter->next) + { + GntBox *box = GNT_BOX(iter->data); + + gnt_tree_add_row_after(GNT_TREE(tree), box, box->title, NULL, NULL); + } + + gnt_box_add_widget(GNT_BOX(win), tree); + + gnt_widget_set_size(tree, getmaxx(stdscr) / 3, getmaxy(stdscr) / 2); + gnt_widget_set_position(win, getmaxx(stdscr) / 3, getmaxy(stdscr) / 4); + + lock_focus_list = 1; + gnt_widget_show(win); + lock_focus_list = 0; + + g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(window_list_activate), NULL); +} + static gboolean io_invoke(GIOChannel *source, GIOCondition cond, gpointer null) { char buffer[256]; + gboolean ret = FALSE; static GntKeyPressMode mode = GNT_KP_MODE_NORMAL; - gboolean ret = FALSE; int rd = read(0, buffer, sizeof(buffer) - 1); if (rd < 0) @@ -251,6 +318,11 @@ { mode = GNT_KP_MODE_MOVE; } + else if (strcmp(buffer + 1, "w") == 0 && focus_list) + { + mode = GNT_KP_MODE_WINDOW_LIST; + show_window_list(); + } } } } @@ -317,7 +389,21 @@ mode = GNT_KP_MODE_NORMAL; } } + else if (mode == GNT_KP_MODE_WINDOW_LIST && window_list.window) + { + gnt_widget_key_pressed(window_list.window, buffer); + if (buffer[0] == '\r' || (buffer[0] == 27 && buffer[1] == 0)) + { + mode = GNT_KP_MODE_NORMAL; + lock_focus_list = 1; + gnt_widget_destroy(window_list.window); + window_list.window = NULL; + window_list.tree = NULL; + lock_focus_list = 0; + } + } + draw_taskbar(); refresh(); @@ -373,36 +459,10 @@ free_node(gpointer data) { GntNode *node = data; - g_list_free(node->below); - g_list_free(node->above); + del_panel(node->panel); g_free(node); } -static void -check_intersection(gpointer key, gpointer value, gpointer data) -{ - GntNode *n = value; - GntNode *nu = data; - - if (value == NULL) - return; - if (n->me == nu->me) - return; - - if (n->me->priv.x + n->me->priv.width < nu->me->priv.x) - return; - if (nu->me->priv.x + nu->me->priv.width < n->me->priv.x) - return; - - if (n->me->priv.y + n->me->priv.height < nu->me->priv.y) - return; - if (nu->me->priv.y + nu->me->priv.height < n->me->priv.y) - return; - - n->above = g_list_prepend(n->above, nu); - nu->below = g_list_prepend(nu->below, n); -} - void gnt_screen_occupy(GntWidget *widget) { GntNode *node; @@ -419,56 +479,41 @@ node = g_new0(GntNode, 1); node->me = widget; - g_hash_table_foreach(nodes, check_intersection, node); g_hash_table_replace(nodes, widget, node); + + if (window_list.window) + { + if ((GNT_IS_BOX(widget) && GNT_BOX(widget)->title) && window_list.window != widget + && GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_CAN_TAKE_FOCUS)) + gnt_tree_add_row_after(GNT_TREE(window_list.tree), widget, + GNT_BOX(widget)->title, NULL, NULL); + } + + update_panels(); + doupdate(); } void gnt_screen_release(GntWidget *widget) { WINDOW *win; GList *iter; - GntNode *node = g_hash_table_lookup(nodes, widget); + GntNode *node; gnt_screen_remove_widget(widget); + node = g_hash_table_lookup(nodes, widget); if (node == NULL) /* Yay! Nothing to do. */ return; - win = dupwin(widget->window); - werase(win); + g_hash_table_remove(nodes, widget); - /* XXX: This is not going to work. - * It will be necessary to build a topology and go from there. */ - for (iter = node->below; iter; iter = iter->next) + if (window_list.window) { - GntNode *n = iter->data; - GntWidget *w = n->me; - int left, right, top, bottom; - - left = MAX(widget->priv.x, w->priv.x) - w->priv.x; - right = MIN(widget->priv.x + widget->priv.width, w->priv.x + w->priv.width) - w->priv.x; - - top = MAX(widget->priv.y, w->priv.y) - w->priv.y; - bottom = MIN(widget->priv.y + widget->priv.height, w->priv.y + w->priv.height) - w->priv.y; - - copywin(w->window, win, top, left, - w->priv.y - widget->priv.y + top, - w->priv.x - widget->priv.x + left, - w->priv.y - widget->priv.y + bottom - 1, - w->priv.x - widget->priv.x + right - 1, FALSE); - n->above = g_list_remove(n->above, node); + gnt_tree_remove(GNT_TREE(window_list.tree), widget); } - for (iter = node->above; iter; iter = iter->next) - { - GntNode *n = iter->data; - n->below = g_list_remove(n->below, node); - } - - wrefresh(win); - delwin(win); - - g_hash_table_remove(nodes, widget); + update_panels(); + doupdate(); } void gnt_screen_update(GntWidget *widget) @@ -485,34 +530,17 @@ gnt_box_sync_children(GNT_BOX(widget)); node = g_hash_table_lookup(nodes, widget); + if (node && !node->panel) + node->panel = new_panel(node->me->window); - win = dupwin(widget->window); - - if (node && node->above) + if (window_list.window) { - /* XXX: Same here: need to build a topology first. */ - for (iter = node->above; iter; iter = iter->next) - { - GntNode *n = iter->data; - GntWidget *w = n->me; - int left, right, top, bottom; - - left = MAX(widget->priv.x, w->priv.x) - w->priv.x; - right = MIN(widget->priv.x + widget->priv.width, w->priv.x + w->priv.width) - w->priv.x; - - top = MAX(widget->priv.y, w->priv.y) - w->priv.y; - bottom = MIN(widget->priv.y + widget->priv.height, w->priv.y + w->priv.height) - w->priv.y; - - copywin(w->window, win, top, left, - w->priv.y - widget->priv.y + top, - w->priv.x - widget->priv.x + left, - w->priv.y - widget->priv.y + bottom - 1, - w->priv.x - widget->priv.x + right - 1, FALSE); - } + GntNode *nd = g_hash_table_lookup(nodes, window_list.window); + top_panel(nd->panel); } - wrefresh(win); - delwin(win); + update_panels(); + doupdate(); } gboolean gnt_widget_has_focus(GntWidget *widget) @@ -521,6 +549,9 @@ if (!widget) return FALSE; + if (widget == window_list.window) + return TRUE; + w = widget; while (widget->parent) Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-07-03 21:20:16 UTC (rev 16417) +++ trunk/console/libgnt/gntwidget.c 2006-07-04 01:32:39 UTC (rev 16418) @@ -326,8 +326,11 @@ /* XXX: Need to install properties for these and g_object_notify */ wid->priv.x = x; wid->priv.y = y; + + /* XXX: I am supposed to move_panel ... but that seems to crash */ if (wid->window) mvwin(wid->window, y, x); + g_signal_emit(wid, signals[SIG_POSITION], 0, x, y); } Modified: trunk/console/libgnt/test/Makefile =================================================================== --- trunk/console/libgnt/test/Makefile 2006-07-03 21:20:16 UTC (rev 16417) +++ trunk/console/libgnt/test/Makefile 2006-07-04 01:32:39 UTC (rev 16418) @@ -1,11 +1,10 @@ CC=gcc CFLAGS=`pkg-config --cflags gobject-2.0` -g -I../ -LDFLAGS=`pkg-config --libs gobject-2.0` -lncursesw -pg -lgnt -L../ +LDFLAGS=`pkg-config --libs gobject-2.0` -pg -lgnt -L../ EXAMPLES=focus tv multiwin all: - cd .. && make make examples clean: Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-07-03 21:20:16 UTC (rev 16417) +++ trunk/console/libgnt/test/multiwin.c 2006-07-04 01:32:39 UTC (rev 16418) @@ -1,18 +1,20 @@ +#include "gnt.h" #include "gntbutton.h" -#include "gnt.h" +#include "gntentry.h" #include "gntkeys.h" +#include "gntlabel.h" #include "gnttree.h" #include "gntbox.h" gboolean show(GntWidget *w) { - gnt_widget_draw(w); - - return TRUE; + gnt_widget_destroy(w); + return FALSE; } int main() { + freopen(".error", "w", stderr); gnt_init(); GntWidget *hbox, *tree, *box2; @@ -36,11 +38,11 @@ gnt_box_set_toplevel(GNT_BOX(box2), TRUE); gnt_box_set_title(GNT_BOX(box2), "On top"); - gnt_box_add_widget(GNT_BOX(box2), GNT_WIDGET(gnt_label_new("asdasd"))); + gnt_box_add_widget(GNT_BOX(box2), gnt_label_new("asdasd")); gnt_box_add_widget(GNT_BOX(box2), gnt_entry_new(NULL)); gnt_widget_show(hbox); - gnt_widget_set_position(box2, 5, 5); + gnt_widget_set_position(box2, 35, 15); gnt_widget_show(box2); gnt_tree_add_row_after(GNT_TREE(tree), "a", "a", NULL, NULL); @@ -56,8 +58,9 @@ gnt_tree_add_row_after(GNT_TREE(tree), "5", "5", "d", NULL); gnt_tree_add_row_after(GNT_TREE(tree), "6", "6", "4", NULL); - g_timeout_add(1000, (GSourceFunc)show, hbox); + g_timeout_add(5000, show, box2); + gnt_main(); gnt_quit(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-06 17:55:00
|
Revision: 16447 Author: sadrul Date: 2006-07-06 10:54:46 -0700 (Thu, 06 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16447&view=rev Log Message: ----------- Pseudo-shadow effect for the windows and buttons. Uses non-ASCII emblems for buddies in the buddy-list if locale is set to UTF. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntconv.c trunk/console/gntgaim.c trunk/console/libgnt/Makefile.am trunk/console/libgnt/gnt.h trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gntwidget.c trunk/console/libgnt/gntwidget.h trunk/console/libgnt/test/multiwin.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/gntblist.c 2006-07-06 17:54:46 UTC (rev 16447) @@ -141,7 +141,7 @@ GaimStatusPrimitive prim; GaimPresence *presence; GaimStatus *now; - + gboolean ascii = gnt_ascii_only(); presence = gaim_buddy_get_presence(buddy); now = gaim_presence_get_active_status(presence); @@ -150,29 +150,15 @@ switch(prim) { -#if 1 case GAIM_STATUS_OFFLINE: - strncpy(status, "x", sizeof(status) - 1); + strncpy(status, ascii ? "x" : "⊗", sizeof(status) - 1); break; case GAIM_STATUS_AVAILABLE: - strncpy(status, "o", sizeof(status) - 1); + strncpy(status, ascii ? "o" : "◯", sizeof(status) - 1); break; default: - strncpy(status, ".", sizeof(status) - 1); + strncpy(status, ascii ? "." : "⊖", sizeof(status) - 1); break; -#else - /* XXX: Let's use these some time */ - case GAIM_STATUS_OFFLINE: - strncpy(status, "⊗", sizeof(status) - 1); - break; - case GAIM_STATUS_AVAILABLE: - /* XXX: Detect idleness */ - strncpy(status, "◯", sizeof(status) - 1); - break; - default: - strncpy(status, "⊖", sizeof(status) - 1); - break; -#endif } name = gaim_buddy_get_alias(buddy); } @@ -412,7 +398,7 @@ ggblist->tree = gnt_tree_new(); GNT_WIDGET_SET_FLAGS(ggblist->tree, GNT_WIDGET_NO_BORDER); - gnt_widget_set_size(ggblist->tree, 25, getmaxy(stdscr) - 3); + gnt_widget_set_size(ggblist->tree, 25, getmaxy(stdscr) - 4); gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->tree); gnt_widget_show(ggblist->window); Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/gntconv.c 2006-07-06 17:54:46 UTC (rev 16447) @@ -116,7 +116,7 @@ ggc->tv = gnt_text_view_new(); gnt_box_add_widget(GNT_BOX(ggc->window), ggc->tv); gnt_widget_set_name(ggc->tv, "conversation-window-textview"); - gnt_widget_set_size(ggc->tv, getmaxx(stdscr) - 2 - x - width, getmaxy(stdscr) - 4); + gnt_widget_set_size(ggc->tv, getmaxx(stdscr) - 3 - x - width, getmaxy(stdscr) - 5); ggc->entry = gnt_entry_new(NULL); gnt_box_add_widget(GNT_BOX(ggc->window), ggc->entry); Modified: trunk/console/gntgaim.c =================================================================== --- trunk/console/gntgaim.c 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/gntgaim.c 2006-07-06 17:54:46 UTC (rev 16447) @@ -228,7 +228,7 @@ */ /* Because we don't want debug-messages to show up and corrup the display */ - gaim_debug_set_enabled(FALSE); + gaim_debug_set_enabled(debug_enabled); gaim_core_set_ui_ops(gnt_core_get_ui_ops()); gaim_eventloop_set_ui_ops(gnt_eventloop_get_ui_ops()); Modified: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/libgnt/Makefile.am 2006-07-06 17:54:46 UTC (rev 16447) @@ -40,4 +40,5 @@ -lncursesw -lpanelw AM_CPPFLAGS = \ - $(GLIB_CFLAGS) + $(GLIB_CFLAGS) \ + -Wall Modified: trunk/console/libgnt/gnt.h =================================================================== --- trunk/console/libgnt/gnt.h 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/libgnt/gnt.h 2006-07-06 17:54:46 UTC (rev 16447) @@ -7,6 +7,8 @@ void gnt_main(); +gboolean gnt_ascii_only(); + void gnt_screen_occupy(GntWidget *widget); void gnt_screen_release(GntWidget *widget); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/libgnt/gntbox.c 2006-07-06 17:54:46 UTC (rev 16447) @@ -383,15 +383,18 @@ for (iter = box->list; iter; iter = iter->next) { GntWidget *w = GNT_WIDGET(iter->data); + int height, width; if (GNT_IS_BOX(w)) gnt_box_sync_children(GNT_BOX(w)); + gnt_widget_get_size(w, &width, &height); + copywin(w->window, widget->window, 0, 0, w->priv.y - widget->priv.y, w->priv.x - widget->priv.x, - w->priv.y - widget->priv.y + w->priv.height - 1, - w->priv.x - widget->priv.x + w->priv.width - 1, + w->priv.y - widget->priv.y + height - 1, + w->priv.x - widget->priv.x + width - 1, FALSE); } } Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/libgnt/gntmain.c 2006-07-06 17:54:46 UTC (rev 16447) @@ -20,6 +20,8 @@ static int Y_MIN; static int Y_MAX; +static gboolean ascii_only; + static GMainLoop *loop; static struct { @@ -314,10 +316,12 @@ } else if (strcmp(buffer + 1, "m") == 0 && focus_list) { + /* Move a window */ mode = GNT_KP_MODE_MOVE; } else if (strcmp(buffer + 1, "w") == 0 && focus_list) { + /* Window list */ mode = GNT_KP_MODE_WINDOW_LIST; show_window_list(); } @@ -375,11 +379,11 @@ if (changed) { - lock_focus_list = 1; - gnt_widget_hide(widget); + GntNode *node = g_hash_table_lookup(nodes, widget); gnt_widget_set_position(widget, x, y); - gnt_widget_show(widget); - lock_focus_list = 0; + move_panel(node->panel, y, x); + update_panels(); + doupdate(); } } else if (*buffer == '\r') @@ -419,8 +423,13 @@ int result = g_io_add_watch(channel, (G_IO_IN | G_IO_HUP | G_IO_ERR), io_invoke, NULL); + const char *locale = setlocale(LC_ALL, ""); - setlocale(LC_ALL, ""); + if (locale && (strstr(locale, "UTF") || strstr(locale, "utf"))) + ascii_only = FALSE; + else + ascii_only = TRUE; + initscr(); start_color(); gnt_init_colors(); @@ -459,6 +468,7 @@ free_node(gpointer data) { GntNode *node = data; + hide_panel(node->panel); del_panel(node->panel); g_free(node); } @@ -582,3 +592,8 @@ endwin(); } +gboolean gnt_ascii_only() +{ + return ascii_only; +} + Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/libgnt/gnttextview.c 2006-07-06 17:54:46 UTC (rev 16447) @@ -152,7 +152,7 @@ GntTextView *view = GNT_TEXT_VIEW(widget); GntTextLine *line = g_new0(GntTextLine, 1); - GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER); + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); view->list = g_list_append(view->list, line); @@ -198,7 +198,7 @@ { GntTextSegment *seg = g_new0(GntTextSegment, 1); seg->flags = fl; - seg->text = g_new0(char, len); /* XXX: MUST be improved */ + seg->text = g_new0(char, len + 1); /* XXX: MUST be improved */ g_utf8_strncpy(seg->text, iter, widget->priv.width - line->length - 1); line->segments = g_list_append(line->segments, seg); Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/libgnt/gnttree.c 2006-07-06 17:54:46 UTC (rev 16447) @@ -216,10 +216,14 @@ else wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); mvwprintw(widget->window, start, pos, str); + whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1)); wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); } else + { mvwprintw(widget->window, start, pos, str); + whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1)); + } tree->bottom = row; } @@ -505,7 +509,7 @@ } else { - int position; + int position = 0; if (bigbro) { @@ -671,7 +675,7 @@ GntTreeRow *row = g_hash_table_lookup(tree->hash, key); if (!row) - return; + return FALSE; g_return_val_if_fail(row->choice, FALSE); return row->isselected; Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/libgnt/gntwidget.c 2006-07-06 17:54:46 UTC (rev 16447) @@ -263,34 +263,32 @@ if (widget->window == NULL) { - /* XXX: It may be necessary to make sure the size hasn't changed */ - widget->window = newwin(widget->priv.height, widget->priv.width, + gboolean shadow = TRUE; + + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + shadow = FALSE; + + widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, widget->priv.y, widget->priv.x); wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) - box(widget->window, 0, 0); + { + WINDOW *tmp = derwin(widget->window, widget->priv.height, widget->priv.width, 0, 0); + box(tmp, 0, 0); + delwin(tmp); + } else werase(widget->window); - } -#if 0 - /* XXX: No shadow for now :( */ - if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_SHADOW)) - { - widget->back = newwin(widget->priv.height, widget->priv.width, - widget->priv.y + 1, widget->priv.x + 1); - wbkgd(widget->back, COLOR_PAIR(GNT_COLOR_SHADOW)); - werase(widget->back); - - mvwchgat(widget->back, 0, 0, widget->priv.height, - A_REVERSE | A_BLINK, 0, 0); - touchline(widget->back, 0, widget->priv.height); - wrefresh(widget->back); + if (shadow) + { + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_SHADOW)); + mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height); + mvwhline(widget->window, widget->priv.height, 1, ' ', widget->priv.width); + } } - wrefresh(widget->window); -#endif g_signal_emit(widget, signals[SIG_DRAW], 0); gnt_widget_queue_update(widget); GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_DRAWING); @@ -316,6 +314,11 @@ gnt_widget_hide(GntWidget *widget) { wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); +#if 1 + /* XXX: I have no clue why, but this seems to be necessary. */ + if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height); +#endif gnt_screen_release(widget); GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_MAPPED); } @@ -327,10 +330,6 @@ wid->priv.x = x; wid->priv.y = y; - /* XXX: I am supposed to move_panel ... but that seems to crash */ - if (wid->window) - mvwin(wid->window, y, x); - g_signal_emit(wid, signals[SIG_POSITION], 0, x, y); } @@ -352,10 +351,15 @@ void gnt_widget_get_size(GntWidget *wid, int *width, int *height) { + gboolean shadow = TRUE; + if (GNT_WIDGET_IS_FLAG_SET(wid, GNT_WIDGET_NO_SHADOW)) + shadow = FALSE; + if (width) - *width = wid->priv.width; + *width = wid->priv.width + shadow; if (height) - *height = wid->priv.height; + *height = wid->priv.height + shadow; + } void Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/libgnt/gntwidget.h 2006-07-06 17:54:46 UTC (rev 16447) @@ -61,7 +61,6 @@ GntWidgetPriv priv; WINDOW *window; - WINDOW *back; void (*gnt_reserved1)(void); void (*gnt_reserved2)(void); Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-07-06 09:22:18 UTC (rev 16446) +++ trunk/console/libgnt/test/multiwin.c 2006-07-06 17:54:46 UTC (rev 16447) @@ -8,7 +8,6 @@ gboolean show(GntWidget *w) { - gnt_widget_destroy(w); return FALSE; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-08 07:13:37
|
Revision: 16458 Author: sadrul Date: 2006-07-08 00:13:29 -0700 (Sat, 08 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16458&view=rev Log Message: ----------- Add text-attributes for rows in a GntTree. Use this feature to dim idle buddies in the buddylist. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntconv.c trunk/console/libgnt/gntbox.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttextview.h trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h trunk/console/libgnt/test/multiwin.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-07-08 02:11:11 UTC (rev 16457) +++ trunk/console/gntblist.c 2006-07-08 07:13:29 UTC (rev 16458) @@ -203,6 +203,10 @@ node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, get_display_name(node), group, NULL); + if (gaim_presence_is_idle(gaim_buddy_get_presence(buddy))) + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, GNT_TEXT_FLAG_DIM); + else + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, 0); } #if 0 @@ -358,7 +362,6 @@ draw_tooltip(ggblist); } - static gboolean key_pressed(GntWidget *widget, const char *text, GGBlist *ggblist) { @@ -377,13 +380,30 @@ } static void -buddy_status_changed(GaimBuddy *buddy, GaimStatus *old, GaimStatus *now, GGBlist *ggblist) +update_buddy_display(GaimBuddy *buddy, GGBlist *ggblist) { gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, get_display_name((GaimBlistNode*)buddy)); 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); + else + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, 0); } +static void +buddy_status_changed(GaimBuddy *buddy, GaimStatus *old, GaimStatus *now, GGBlist *ggblist) +{ + update_buddy_display(buddy, ggblist); +} + +static void +buddy_idle_changed(GaimBuddy *buddy, int old, int new, GGBlist *ggblist) +{ + update_buddy_display(buddy, ggblist); +} + void gg_blist_init() { ggblist = g_new0(GGBlist, 1); @@ -405,6 +425,8 @@ 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); #if 0 gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-on", gg_blist_get_handle(), Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-08 02:11:11 UTC (rev 16457) +++ trunk/console/gntconv.c 2006-07-08 07:13:29 UTC (rev 16458) @@ -146,7 +146,7 @@ { GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); char *strip; - GntTextViewFlags fl = 0; + GntTextFormatFlags fl = 0; g_return_if_fail(ggconv != NULL); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-07-08 02:11:11 UTC (rev 16457) +++ trunk/console/libgnt/gntbox.c 2006-07-08 07:13:29 UTC (rev 16458) @@ -284,7 +284,6 @@ GList *iter; GntBox *box = GNT_BOX(widget); int wchange, hchange; - int wc = 0, hc = 0; wchange = widget->priv.width - width; hchange = widget->priv.height - height; Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-07-08 02:11:11 UTC (rev 16457) +++ trunk/console/libgnt/gnttextview.c 2006-07-08 07:13:29 UTC (rev 16458) @@ -7,7 +7,7 @@ typedef struct { - GntTextViewFlags flags; + GntTextFormatFlags flags; char *text; } GntTextSegment; @@ -162,7 +162,7 @@ return widget; } -void gnt_text_view_append_text_with_flags(GntTextView *view, const char *text, GntTextViewFlags flags) +void gnt_text_view_append_text_with_flags(GntTextView *view, const char *text, GntTextFormatFlags flags) { GntWidget *widget = GNT_WIDGET(view); int fl = 0; Modified: trunk/console/libgnt/gnttextview.h =================================================================== --- trunk/console/libgnt/gnttextview.h 2006-07-08 02:11:11 UTC (rev 16457) +++ trunk/console/libgnt/gnttextview.h 2006-07-08 07:13:29 UTC (rev 16458) @@ -35,7 +35,7 @@ GNT_TEXT_FLAG_BLINK = 1 << 2, GNT_TEXT_FLAG_DIM = 1 << 3, GNT_TEXT_FLAG_HIGHLIGHT = 1 << 4, -} GntTextViewFlags; +} GntTextFormatFlags; struct _GnTextViewClass { @@ -58,7 +58,7 @@ /* scroll > 0 means scroll up, < 0 means scroll down, == 0 means scroll to the end */ void gnt_text_view_scroll(GntTextView *view, int scroll); -void gnt_text_view_append_text_with_flags(GntTextView *view, const char *text, GntTextViewFlags flags); +void gnt_text_view_append_text_with_flags(GntTextView *view, const char *text, GntTextFormatFlags flags); /* 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. */ Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-08 02:11:11 UTC (rev 16457) +++ trunk/console/libgnt/gnttree.c 2006-07-08 07:13:29 UTC (rev 16458) @@ -25,6 +25,7 @@ gboolean choice; /* Is this a choice-box? If choice is true, then child will be NULL */ gboolean isselected; + GntTextFormatFlags flags; GntTreeRow *parent; GntTreeRow *child; @@ -180,6 +181,9 @@ int wr; char format[16] = ""; + GntTextFormatFlags flags = row->flags; + int attr = 0; + deep = TRUE; if (row->parent == NULL && row->child) @@ -208,25 +212,38 @@ str[wr++] = ' '; str[wr] = 0; } - + + if (flags & GNT_TEXT_FLAG_BOLD) + attr |= A_BOLD; + if (flags & GNT_TEXT_FLAG_UNDERLINE) + attr |= A_UNDERLINE; + if (flags & GNT_TEXT_FLAG_BLINK) + attr |= A_BLINK; + if (row == tree->current) { if (gnt_widget_has_focus(widget)) - wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); + attr |= COLOR_PAIR(GNT_COLOR_HIGHLIGHT); else - wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); - mvwprintw(widget->window, start, pos, str); - whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1)); - wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); + attr |= COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D); } else { - mvwprintw(widget->window, start, pos, str); - whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1)); + if (flags & GNT_TEXT_FLAG_DIM) + attr |= (A_DIM | COLOR_PAIR(GNT_COLOR_DISABLED)); + else if (flags & GNT_TEXT_FLAG_HIGHLIGHT) + attr |= (A_DIM | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); + else + attr |= COLOR_PAIR(GNT_COLOR_NORMAL); } + + wbkgdset(widget->window, '\0' | attr); + mvwprintw(widget->window, start, pos, str); + whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1)); tree->bottom = row; } + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); while (start < widget->priv.height - pos) { mvwhline(widget->window, start, pos, ' ', @@ -682,3 +699,13 @@ return row->isselected; } +void gnt_tree_set_row_flags(GntTree *tree, void *key, GntTextFormatFlags flags) +{ + GntTreeRow *row = g_hash_table_lookup(tree->hash, key); + if (!row) + return; + + row->flags = flags; + redraw_tree(tree); +} + Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-07-08 02:11:11 UTC (rev 16457) +++ trunk/console/libgnt/gnttree.h 2006-07-08 07:13:29 UTC (rev 16458) @@ -5,6 +5,7 @@ #include "gnt.h" #include "gntcolors.h" #include "gntkeys.h" +#include "gnttextview.h" #define GNT_TYPE_TREE (gnt_tree_get_gtype()) #define GNT_TREE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_TREE, GntTree)) @@ -79,6 +80,8 @@ gboolean gnt_tree_get_choice(GntTree *tree, void *key); +void gnt_tree_set_row_flags(GntTree *tree, void *key, GntTextFormatFlags flags); + G_END_DECLS #endif /* GNT_TREE_H */ Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-07-08 02:11:11 UTC (rev 16457) +++ trunk/console/libgnt/test/multiwin.c 2006-07-08 07:13:29 UTC (rev 16458) @@ -58,6 +58,8 @@ gnt_tree_add_row_after(GNT_TREE(tree), "6", "6", "4", NULL); + gnt_tree_set_row_flags(GNT_TREE(tree), "e", GNT_TEXT_FLAG_DIM); + g_timeout_add(5000, show, box2); gnt_main(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-08 19:07:09
|
Revision: 16462 Author: sadrul Date: 2006-07-08 12:06:59 -0700 (Sat, 08 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16462&view=rev Log Message: ----------- Mark urgent-hinted windows in the window-list. Make the default size of some of the windows smaller. Modified Paths: -------------- trunk/console/gntaccount.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttree.c Modified: trunk/console/gntaccount.c =================================================================== --- trunk/console/gntaccount.c 2006-07-08 15:38:45 UTC (rev 16461) +++ trunk/console/gntaccount.c 2006-07-08 19:06:59 UTC (rev 16462) @@ -35,6 +35,7 @@ accounts.window = gnt_box_new(TRUE, TRUE); gnt_box_set_toplevel(GNT_BOX(accounts.window), TRUE); gnt_box_set_title(GNT_BOX(accounts.window), _("Accounts")); + gnt_box_set_pad(GNT_BOX(accounts.window), 0); gnt_widget_set_name(accounts.window, "accounts"); gnt_box_add_widget(GNT_BOX(accounts.window), @@ -58,7 +59,7 @@ g_signal_connect(G_OBJECT(accounts.tree), "toggled", G_CALLBACK(account_toggled), NULL); - gnt_widget_set_size(accounts.tree, 40, 15); + gnt_widget_set_size(accounts.tree, 40, 10); gnt_box_add_widget(GNT_BOX(accounts.window), accounts.tree); box = gnt_box_new(FALSE, FALSE); Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-08 15:38:45 UTC (rev 16461) +++ trunk/console/libgnt/gntmain.c 2006-07-08 19:06:59 UTC (rev 16462) @@ -118,9 +118,26 @@ } update_panels(); doupdate(); + draw_taskbar(); } static void +update_window_in_list(GntWidget *wid) +{ + GntTextFormatFlags flag = 0; + + if (window_list.window == NULL) + return; + + if (wid == focus_list->data) + flag |= GNT_TEXT_FLAG_DIM; + else if (GNT_WIDGET_IS_FLAG_SET(wid, GNT_WIDGET_URGENT)) + flag |= GNT_TEXT_FLAG_BOLD; + + gnt_tree_set_row_flags(GNT_TREE(window_list.tree), wid, flag); +} + +static void draw_taskbar() { static WINDOW *taskbar = NULL; @@ -163,6 +180,8 @@ wbkgdset(taskbar, '\0' | COLOR_PAIR(color)); mvwhline(taskbar, 0, width * i, ' ' | COLOR_PAIR(color), width); mvwprintw(taskbar, 0, width * i, "%s", GNT_BOX(w)->title); + + update_window_in_list(w); } wrefresh(taskbar); @@ -240,6 +259,7 @@ GntBox *box = GNT_BOX(iter->data); gnt_tree_add_row_after(GNT_TREE(tree), box, box->title, NULL, NULL); + update_window_in_list(GNT_WIDGET(box)); } gnt_box_add_widget(GNT_BOX(win), tree); @@ -468,7 +488,6 @@ } } - draw_taskbar(); refresh(); return TRUE; @@ -554,8 +573,11 @@ { if ((GNT_IS_BOX(widget) && GNT_BOX(widget)->title) && window_list.window != widget && GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_CAN_TAKE_FOCUS)) + { gnt_tree_add_row_after(GNT_TREE(window_list.tree), widget, GNT_BOX(widget)->title, NULL, NULL); + update_window_in_list(widget); + } } update_panels(); Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-08 15:38:45 UTC (rev 16461) +++ trunk/console/libgnt/gnttree.c 2006-07-08 19:06:59 UTC (rev 16462) @@ -201,6 +201,7 @@ g_snprintf(format, sizeof(format) - 1, "[%c] ", row->isselected ? 'X' : ' '); } + /* XXX: Need a utf8 version of snprintf */ if ((wr = g_snprintf(str, widget->priv.width, "%s%s", format, row->text)) >= widget->priv.width) { /* XXX: ellipsize */ @@ -702,10 +703,10 @@ void gnt_tree_set_row_flags(GntTree *tree, void *key, GntTextFormatFlags flags) { GntTreeRow *row = g_hash_table_lookup(tree->hash, key); - if (!row) + if (!row || row->flags == flags) return; row->flags = flags; - redraw_tree(tree); + redraw_tree(tree); /* XXX: Is shouldn't be necessary to redraw the whole darned tree */ } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-10 23:55:49
|
Revision: 16480 Author: sadrul Date: 2006-07-10 16:55:24 -0700 (Mon, 10 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16480&view=rev Log Message: ----------- New widget GntLine to use as a separator. A partial dialog for add-account callback. Updating the dialog as a result of selection-change in the prpl dropdown is way ickier than I had expected it to be. It 'works' now, but quite a bit quirky. I will try to smooth things up later, perhaps next week. Modified Paths: -------------- trunk/console/gntaccount.c trunk/console/gntblist.c trunk/console/gntconv.c trunk/console/libgnt/Makefile.am trunk/console/libgnt/gnt.h trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbox.h trunk/console/libgnt/gntbutton.c trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntlabel.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gntwidget.c trunk/console/libgnt/gntwidget.h trunk/console/libgnt/test/combo.c trunk/console/libgnt/test/focus.c trunk/console/libgnt/test/multiwin.c Added Paths: ----------- trunk/console/libgnt/gntline.c trunk/console/libgnt/gntline.h Modified: trunk/console/gntaccount.c =================================================================== --- trunk/console/gntaccount.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/gntaccount.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -1,11 +1,17 @@ #include <gnt.h> #include <gntbox.h> #include <gntbutton.h> +#include <gntcombobox.h> +#include <gntentry.h> #include <gntlabel.h> +#include <gntline.h> #include <gnttree.h> +#include <account.h> +#include <accountopt.h> #include <connection.h> #include <notify.h> +#include <plugin.h> #include <request.h> #include "gntaccount.h" @@ -19,7 +25,167 @@ static GGAccountList accounts; +typedef struct +{ + GaimAccount *account; /* NULL for a new account */ + + GntWidget *window; + + GntWidget *protocol; + GntWidget *screenname; + GntWidget *password; + GntWidget *alias; + + GntWidget *splits; + GList *split_entries; +} AccountEditDialog; + static void +edit_dialog_destroy(AccountEditDialog *dialog) +{ + g_free(dialog); +} + +static void +save_account_cb(AccountEditDialog *dialog) +{ +} + +static void +update_user_splits(AccountEditDialog *dialog) +{ + GntWidget *hbox; + GaimPlugin *plugin; + GaimPluginProtocolInfo *prplinfo; + GList *iter; + char *username = NULL; + + if (dialog->splits) + { + gnt_box_remove_all(GNT_BOX(dialog->splits)); + g_list_free(dialog->split_entries); + } + else + { + dialog->splits = gnt_box_new(FALSE, TRUE); + gnt_box_set_pad(GNT_BOX(dialog->splits), 0); + } + + dialog->split_entries = NULL; + + plugin = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(dialog->protocol)); + if (!plugin) + return; + prplinfo = GAIM_PLUGIN_PROTOCOL_INFO(plugin); + + username = g_strdup(gaim_account_get_username(dialog->account)); + + for (iter = prplinfo->user_splits; iter; iter = iter->next) + { + GaimAccountUserSplit *split = iter->data; + GntWidget *entry; + char *buf; + + hbox = gnt_box_new(TRUE, FALSE); + gnt_box_add_widget(GNT_BOX(dialog->splits), hbox); + + buf = g_strdup_printf("%s:", gaim_account_user_split_get_text(split)); + gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(buf)); + + entry = gnt_entry_new(NULL); + gnt_box_add_widget(GNT_BOX(hbox), entry); + + dialog->split_entries = g_list_append(dialog->split_entries, entry); + g_free(buf); + } + + /* XXX: Add default/custom values to the splits */ + g_free(username); +} + +static void +prpl_changed_cb(GntWidget *combo, GaimPlugin *old, GaimPlugin *new, AccountEditDialog *dialog) +{ + update_user_splits(dialog); + gnt_box_readjust(GNT_BOX(dialog->window)); + gnt_widget_draw(dialog->window); +} + +static void +add_account(GntWidget *b, gpointer null) +{ + GntWidget *window, *hbox; + GntWidget *combo, *button, *entry; + GList *list, *iter; + AccountEditDialog *dialog; + + dialog = g_new0(AccountEditDialog, 1); + + dialog->window = window = gnt_box_new(FALSE, TRUE); + gnt_box_set_toplevel(GNT_BOX(window), TRUE); + gnt_box_set_title(GNT_BOX(window), _("New Account")); + gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); + gnt_box_set_pad(GNT_BOX(window), 0); + + hbox = gnt_box_new(TRUE, FALSE); + gnt_box_add_widget(GNT_BOX(window), hbox); + gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); + + dialog->protocol = combo = gnt_combo_box_new(); + list = gaim_plugins_get_protocols(); + for (iter = list; iter; iter = iter->next) + { + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), iter->data, + ((GaimPlugin*)iter->data)->info->name); + } + g_signal_connect(G_OBJECT(combo), "selection-changed", G_CALLBACK(prpl_changed_cb), dialog); + gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(_("Protocol:"))); + gnt_box_add_widget(GNT_BOX(hbox), combo); + + hbox = gnt_box_new(TRUE, FALSE); + gnt_box_add_widget(GNT_BOX(window), hbox); + + dialog->screenname = entry = gnt_entry_new(NULL); + gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(_("Screen name:"))); + gnt_box_add_widget(GNT_BOX(hbox), entry); + + /* User splits */ + update_user_splits(dialog); + gnt_box_add_widget(GNT_BOX(window), dialog->splits); + + hbox = gnt_box_new(TRUE, FALSE); + gnt_box_add_widget(GNT_BOX(window), hbox); + + dialog->password = entry = gnt_entry_new(NULL); + gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(_("Password:"))); + gnt_box_add_widget(GNT_BOX(hbox), entry); + + hbox = gnt_box_new(TRUE, FALSE); + gnt_box_add_widget(GNT_BOX(window), hbox); + + dialog->alias = entry = gnt_entry_new(NULL); + gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(_("Alias:"))); + gnt_box_add_widget(GNT_BOX(hbox), entry); + + gnt_box_add_widget(GNT_BOX(window), gnt_line_new(FALSE)); + + hbox = gnt_box_new(FALSE, FALSE); + gnt_box_add_widget(GNT_BOX(window), hbox); + + button = gnt_button_new(_("Cancel")); + gnt_box_add_widget(GNT_BOX(hbox), button); + g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gnt_widget_destroy), window); + + button = gnt_button_new(_("Save")); + gnt_box_add_widget(GNT_BOX(hbox), button); + g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(save_account_cb), dialog); + + g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(edit_dialog_destroy), dialog); + + gnt_widget_show(window); +} + +static void account_toggled(GntWidget *widget, void *key, gpointer null) { GaimAccount *account = key; @@ -32,15 +198,18 @@ GList *iter; GntWidget *box, *button; - accounts.window = gnt_box_new(TRUE, TRUE); + accounts.window = gnt_box_new(FALSE, TRUE); gnt_box_set_toplevel(GNT_BOX(accounts.window), TRUE); gnt_box_set_title(GNT_BOX(accounts.window), _("Accounts")); gnt_box_set_pad(GNT_BOX(accounts.window), 0); + gnt_box_set_alignment(GNT_BOX(accounts.window), GNT_ALIGN_MID); gnt_widget_set_name(accounts.window, "accounts"); gnt_box_add_widget(GNT_BOX(accounts.window), gnt_label_new(_("You can enable/disable accounts from the following list."))); + gnt_box_add_widget(GNT_BOX(accounts.window), gnt_line_new(FALSE)); + accounts.tree = gnt_tree_new(); GNT_WIDGET_SET_FLAGS(accounts.tree, GNT_WIDGET_NO_BORDER); @@ -62,10 +231,13 @@ gnt_widget_set_size(accounts.tree, 40, 10); gnt_box_add_widget(GNT_BOX(accounts.window), accounts.tree); + gnt_box_add_widget(GNT_BOX(accounts.window), gnt_line_new(FALSE)); + box = gnt_box_new(FALSE, FALSE); button = gnt_button_new(_("Add")); gnt_box_add_widget(GNT_BOX(box), button); + g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(add_account), NULL); button = gnt_button_new(_("Modify")); gnt_box_add_widget(GNT_BOX(box), button); Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/gntblist.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -234,6 +234,9 @@ GntTree *tree = GNT_TREE(ggblist->tree); GaimBlistNode *node = gnt_tree_get_selection_data(tree); + if (!node) + return; + if (GAIM_BLIST_NODE_IS_BUDDY(node)) { GaimBuddy *buddy = (GaimBuddy *)node; Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/gntconv.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -119,7 +119,7 @@ type = gaim_conversation_get_type(conv); title = g_strdup_printf(_("%s"), gaim_conversation_get_name(conv)); - ggc->window = gnt_box_new(TRUE, TRUE); + ggc->window = gnt_box_new(FALSE, TRUE); gnt_box_set_title(GNT_BOX(ggc->window), title); gnt_box_set_toplevel(GNT_BOX(ggc->window), TRUE); gnt_box_set_pad(GNT_BOX(ggc->window), 0); Modified: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/Makefile.am 2006-07-10 23:55:24 UTC (rev 16480) @@ -11,6 +11,7 @@ gntcombobox.c \ gntentry.c \ gntlabel.c \ + gntline.c \ gntmarshal.c \ gnttextview.c \ gnttree.c \ @@ -25,6 +26,7 @@ gntentry.h \ gntkeys.h \ gntlabel.h \ + gntline.h \ gntmarshal.h \ gnttextview.h \ gnttree.h \ Modified: trunk/console/libgnt/gnt.h =================================================================== --- trunk/console/libgnt/gnt.h 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gnt.h 2006-07-10 23:55:24 UTC (rev 16480) @@ -17,6 +17,8 @@ void gnt_screen_take_focus(GntWidget *widget); +void gnt_screen_resize_widget(GntWidget *widget, int width, int height); + gboolean gnt_widget_has_focus(GntWidget *widget); void gnt_widget_set_urgent(GntWidget *widget); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gntbox.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -77,7 +77,7 @@ gboolean has_border = FALSE; w = h = 0; - max = -1; + max = 0; curx = widget->priv.x; cury = widget->priv.y; if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) @@ -93,15 +93,21 @@ gnt_widget_get_size(GNT_WIDGET(iter->data), &w, &h); if (box->vertical) { - cury += h + box->pad; - if (max < w) - max = w; + if (h) + { + cury += h + box->pad; + if (max < w) + max = w; + } } else { - curx += w + box->pad; - if (max < h) - max = h; + if (w) + { + curx += w + box->pad; + if (max < h) + max = h; + } } } @@ -112,6 +118,14 @@ max += 2; } + if (box->list) + { + if (box->vertical) + cury -= box->pad; + else + curx -= box->pad; + } + if (box->vertical) { widget->priv.width = max; @@ -127,8 +141,18 @@ static void gnt_box_set_position(GntWidget *widget, int x, int y) { - gnt_widget_size_request(widget); - reposition_children(widget); + GList *iter; + int changex, changey; + + changex = widget->priv.x - x; + changey = widget->priv.y - y; + + for (iter = GNT_BOX(widget)->list; iter; iter = iter->next) + { + GntWidget *w = GNT_WIDGET(iter->data); + gnt_widget_set_position(w, w->priv.x - changex, + w->priv.y - changey); + } } static void @@ -136,25 +160,43 @@ { GntBox *box = GNT_BOX(widget); GList *iter; + int maxw = 0, maxh = 0; g_list_foreach(box->list, (GFunc)gnt_widget_size_request, NULL); + for (iter = box->list; iter; iter = iter->next) + { + int w, h; + gnt_widget_get_size(GNT_WIDGET(iter->data), &w, &h); + if (maxh < h) + maxh = h; + if (maxw < w) + maxw = w; + } + if (box->homogeneous) { - int max = -1, w, h; - - /* XXX: should probably be changed based on vertical-ness */ for (iter = box->list; iter; iter = iter->next) { - gnt_widget_get_size(GNT_WIDGET(iter->data), &w, NULL); - if (max < w) - max = w; + gnt_widget_set_size(GNT_WIDGET(iter->data), maxw, maxh); } - + } + else + { for (iter = box->list; iter; iter = iter->next) { - gnt_widget_get_size(GNT_WIDGET(iter->data), NULL, &h); - gnt_widget_set_size(GNT_WIDGET(iter->data), max, h); + if (box->vertical) + { + int h; + gnt_widget_get_size(GNT_WIDGET(iter->data), NULL, &h); + gnt_widget_set_size(GNT_WIDGET(iter->data), maxw, h); + } + else + { + int w; + gnt_widget_get_size(GNT_WIDGET(iter->data), &w, NULL); + gnt_widget_set_size(GNT_WIDGET(iter->data), w, maxh); + } } } @@ -185,10 +227,21 @@ return box->active; } +static void +find_next_focus(GntBox *box) +{ + GList *iter = g_list_find(box->focus, box->active); + if (iter && iter->next) + box->active = iter->next->data; + else if (box->focus) + box->active = box->focus->data; +} + static gboolean gnt_box_key_pressed(GntWidget *widget, const char *text) { GntBox *box = GNT_BOX(widget); + GntWidget *now; if (box->active == NULL && !find_focusable_widget(box)) return FALSE; @@ -196,9 +249,10 @@ if (gnt_widget_key_pressed(box->active, text)) return TRUE; + now = box->active; + if (text[0] == 27) { - GntWidget *now = box->active; if (strcmp(text+1, GNT_KEY_LEFT) == 0) { GList *iter = g_list_find(box->focus, box->active); @@ -213,23 +267,19 @@ } else if (strcmp(text+1, GNT_KEY_RIGHT) == 0) { - GList *iter = g_list_find(box->focus, box->active); - if (iter && iter->next) - { - box->active = iter->next->data; - } - else if (box->focus) - { - box->active = box->focus->data; - } + find_next_focus(box); } + } + else if (text[0] == '\t') + { + find_next_focus(box); + } - if (now && now != box->active) - { - gnt_widget_set_focus(now, FALSE); - gnt_widget_set_focus(box->active, TRUE); - return TRUE; - } + if (now && now != box->active) + { + gnt_widget_set_focus(now, FALSE); + gnt_widget_set_focus(box->active, TRUE); + return TRUE; } return FALSE; @@ -257,16 +307,9 @@ gnt_box_destroy(GntWidget *w) { GntBox *box = GNT_BOX(w); - GList *iter; - for (iter = box->list; iter; iter = iter->next) - { - gnt_widget_destroy(iter->data); - } - + gnt_box_remove_all(box); gnt_screen_release(w); - - g_list_free(box->list); } static void @@ -285,9 +328,20 @@ GntBox *box = GNT_BOX(widget); int wchange, hchange; + if (widget->priv.width != width && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X)) + return FALSE; + if (widget->priv.height != height && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_Y)) + return FALSE; + + if (!box->list) + return TRUE; + wchange = widget->priv.width - width; hchange = widget->priv.height - height; + if (wchange == 0 && hchange == 0) + return TRUE; /* Quit playing games */ + /* XXX: Right now, I am trying to just apply all the changes to * just one widget. It should be possible to distribute the * changes to all the widgets in the box. */ @@ -298,14 +352,84 @@ gnt_widget_get_size(wid, &w, &h); - if (gnt_widget_set_size(wid, w - wchange, h - hchange)) + if (gnt_widget_confirm_size(wid, w - wchange, h - hchange)) + { + GList *i; + + for (i = box->list; i; i = i->next) + { + int tw, th; + if (i == iter) continue; + gnt_widget_get_size(GNT_WIDGET(i->data), &tw, &th); + if (box->vertical) + { + if (!gnt_widget_confirm_size(i->data, tw - wchange, th)) + return FALSE; + } + else + { + if (!gnt_widget_confirm_size(i->data, tw, th - hchange)) + return FALSE; + } + } +#if 0 + gnt_widget_set_size(wid, w - wchange, h - hchange); + if (box->vertical) + hchange = 0; + else + wchange = 0; + + for (i = box->list; i; i = i->next) + { + int tw, th; + if (i == iter) continue; + gnt_widget_get_size(GNT_WIDGET(i->data), &tw, &th); + gnt_widget_set_size(i->data, tw - wchange, th - hchange); + } +#endif + g_object_set_data(G_OBJECT(box), "size-queued", wid); return TRUE; + } } return FALSE; } static void +gnt_box_size_changed(GntWidget *widget, int oldw, int oldh) +{ + int wchange, hchange; + GList *i; + GntBox *box = GNT_BOX(widget); + GntWidget *wid; + int tw, th; + + wchange = widget->priv.width - oldw; + hchange = widget->priv.height - oldh; + + wid = g_object_get_data(G_OBJECT(box), "size-queued"); + if (wid) + { + gnt_widget_get_size(wid, &tw, &th); + gnt_widget_set_size(wid, tw + wchange, th + hchange); + g_object_set_data(G_OBJECT(box), "size-queued", NULL); + } + + if (box->vertical) + hchange = 0; + else + wchange = 0; + + for (i = box->list; i; i = i->next) + { + gnt_widget_get_size(GNT_WIDGET(i->data), &tw, &th); + gnt_widget_set_size(i->data, tw + wchange, th + hchange); + } + + reposition_children(widget); +} + +static void gnt_box_class_init(GntBoxClass *klass) { parent_class = GNT_WIDGET_CLASS(klass); @@ -319,6 +443,7 @@ parent_class->lost_focus = gnt_box_lost_focus; parent_class->gained_focus = gnt_box_gained_focus; parent_class->confirm_size = gnt_box_confirm_size; + parent_class->size_changed = gnt_box_size_changed; DEBUG; } @@ -428,8 +553,10 @@ { GList *iter; GntWidget *widget = GNT_WIDGET(box); + int pos = 1; - /* XXX: werase first? */ + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) + pos = 0; for (iter = box->list; iter; iter = iter->next) { @@ -451,8 +578,8 @@ x += widget->priv.width - width; else if (box->alignment == GNT_ALIGN_MID) x += (widget->priv.width - width)/2; - if (x + width > widget->priv.width - 1) - x -= x + width - (widget->priv.width - 1); + if (x + width > widget->priv.width - pos) + x -= x + width - (widget->priv.width - pos); } else { @@ -460,8 +587,8 @@ y += widget->priv.height - height; else if (box->alignment == GNT_ALIGN_MID) y += (widget->priv.height - height)/2; - if (y + height > widget->priv.height - 1) - y -= y + height - (widget->priv.height - 1); + if (y + height >= widget->priv.height - pos) + y = widget->priv.height - height - pos; } copywin(w->window, widget->window, 0, 0, @@ -474,3 +601,71 @@ box->alignment = alignment; } +void gnt_box_remove(GntBox *box, GntWidget *widget) +{ + box->list = g_list_remove(box->list, widget); + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_CAN_TAKE_FOCUS) + && GNT_WIDGET(box)->parent == NULL && box->focus) + { + if (widget == box->active) + { + find_next_focus(box); + if (box->active == widget) /* There's only one widget */ + box->active = NULL; + } + box->focus = g_list_remove(box->focus, widget); + } + + if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(box), GNT_WIDGET_MAPPED)) + gnt_widget_draw(GNT_WIDGET(box)); +} + +void gnt_box_remove_all(GntBox *box) +{ + g_list_foreach(box->list, (GFunc)gnt_widget_destroy, NULL); + g_list_free(box->list); + g_list_free(box->focus); + box->list = NULL; + box->focus = NULL; + GNT_WIDGET(box)->priv.width = 0; + GNT_WIDGET(box)->priv.height = 0; +} + +void gnt_box_readjust(GntBox *box) +{ + GList *iter; + GntWidget *wid; + int width, height; + + g_return_if_fail(GNT_WIDGET(box)->parent == NULL); + + for (iter = box->list; iter; iter = iter->next) + { + GntWidget *w = iter->data; + if (GNT_IS_BOX(w)) + gnt_box_readjust(GNT_BOX(w)); + else + { + GNT_WIDGET_UNSET_FLAGS(w, GNT_WIDGET_MAPPED); + w->priv.width = 0; + w->priv.height = 0; + } + } + + wid = GNT_WIDGET(box); + GNT_WIDGET_UNSET_FLAGS(wid, GNT_WIDGET_MAPPED); + wid->priv.width = 0; + wid->priv.height = 0; + + if (wid->parent == NULL) + { + g_list_free(box->focus); + box->focus = NULL; + box->active = NULL; + gnt_widget_size_request(wid); + gnt_widget_get_size(wid, &width, &height); + gnt_screen_resize_widget(wid, width, height); + find_focusable_widget(box); + } +} + Modified: trunk/console/libgnt/gntbox.h =================================================================== --- trunk/console/libgnt/gntbox.h 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gntbox.h 2006-07-10 23:55:24 UTC (rev 16480) @@ -62,6 +62,9 @@ GType gnt_box_get_gtype(void); +#define gnt_vbox_new(homo) gnt_box_new(homo, TRUE) +#define gnt_hbox_new(homo) gnt_box_new(homo, FALSE) + GntWidget *gnt_box_new(gboolean homo, gboolean vert); void gnt_box_add_widget(GntBox *box, GntWidget *widget); @@ -76,6 +79,12 @@ void gnt_box_set_alignment(GntBox *box, GntAlignment alignment); +void gnt_box_remove(GntBox *box, GntWidget *widget); /* XXX: does NOT destroy widget */ + +void gnt_box_remove_all(GntBox *box); /* Removes AND destroys all the widgets in it */ + +void gnt_box_readjust(GntBox *box); + G_END_DECLS #endif /* GNT_BOX_H */ Modified: trunk/console/libgnt/gntbutton.c =================================================================== --- trunk/console/libgnt/gntbutton.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gntbutton.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -69,10 +69,14 @@ static void gnt_button_init(GTypeInstance *instance, gpointer class) { + GntWidget *widget = GNT_WIDGET(instance); GntButton *button = GNT_BUTTON(instance); button->priv = g_new0(GntButtonPriv, 1); - GNT_WIDGET_SET_FLAGS(GNT_WIDGET(button), GNT_WIDGET_GROW_X); /* Can be resized sideways */ + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_GROW_X); + + widget->priv.minw = 4; + widget->priv.minh = 3; DEBUG; } Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gntcombobox.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -31,13 +31,13 @@ gnt_combo_box_draw(GntWidget *widget) { GntComboBox *box = GNT_COMBO_BOX(widget); - const char *text = NULL; + char *text = NULL; GntColorType type; int len; if (box->dropdown) { - text = gnt_tree_get_selection_text(GNT_TREE(box->dropdown)); + text = (char *)gnt_tree_get_selection_text(GNT_TREE(box->dropdown)); box->selected = gnt_tree_get_selection_data(GNT_TREE(box->dropdown)); } @@ -96,7 +96,6 @@ { case '\r': case '\t': - /* XXX: Get the selction */ set_selection(box, gnt_tree_get_selection_data(GNT_TREE(box->dropdown))); case 27: gnt_widget_hide(box->dropdown->parent); @@ -114,10 +113,19 @@ if (strcmp(text + 1, GNT_KEY_UP) == 0 || strcmp(text + 1, GNT_KEY_DOWN) == 0) { + GntWidget *parent = box->dropdown->parent; gnt_widget_set_size(box->dropdown, widget->priv.width, 9); - gnt_widget_set_position(box->dropdown->parent, + gnt_widget_set_position(parent, widget->priv.x, widget->priv.y + widget->priv.height - 1); - gnt_widget_draw(box->dropdown->parent); + if (parent->window) + { + if (mvwin(parent->window, widget->priv.y + widget->priv.height - 1, + widget->priv.x) == ERR) + mvwin(parent->window, + widget->priv.y - 9 + 1, widget->priv.x); + } + + gnt_widget_draw(parent); return TRUE; } } @@ -171,6 +179,7 @@ gnt_combo_box_init(GTypeInstance *instance, gpointer class) { GntWidget *box; + GntWidget *widget = GNT_WIDGET(instance); GntComboBox *combo = GNT_COMBO_BOX(instance); GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), @@ -182,6 +191,8 @@ gnt_box_set_pad(GNT_BOX(box), 0); gnt_box_add_widget(GNT_BOX(box), combo->dropdown); + widget->priv.minw = 4; + widget->priv.minh = 3; DEBUG; } Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gntentry.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -83,6 +83,10 @@ entry_redraw(widget); } /* XXX: handle other keys, like home/end, and ctrl+ goodness */ + else + return FALSE; + + return TRUE; } else { @@ -136,6 +140,7 @@ entry->scroll--; entry_redraw(widget); + return TRUE; } } } @@ -166,6 +171,7 @@ static void gnt_entry_init(GTypeInstance *instance, gpointer class) { + GntWidget *widget = GNT_WIDGET(instance); GntEntry *entry = GNT_ENTRY(instance); entry->flag = GNT_ENTRY_FLAG_ALL; @@ -174,6 +180,9 @@ GNT_WIDGET_SET_FLAGS(GNT_WIDGET(entry), GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW | GNT_WIDGET_CAN_TAKE_FOCUS); GNT_WIDGET_SET_FLAGS(GNT_WIDGET(entry), GNT_WIDGET_GROW_X); + + widget->priv.minw = 3; + widget->priv.minh = 1; DEBUG; } Modified: trunk/console/libgnt/gntlabel.c =================================================================== --- trunk/console/libgnt/gntlabel.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gntlabel.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -70,7 +70,10 @@ static void gnt_label_init(GTypeInstance *instance, gpointer class) { - GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_X | GNT_WIDGET_GROW_Y); + GntWidget *widget = GNT_WIDGET(instance); + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_GROW_X); + widget->priv.minw = 3; + widget->priv.minh = 1; DEBUG; } Added: trunk/console/libgnt/gntline.c =================================================================== --- trunk/console/libgnt/gntline.c (rev 0) +++ trunk/console/libgnt/gntline.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -0,0 +1,115 @@ +#include "gntline.h" + +enum +{ + SIGS = 1, +}; + +static GntWidgetClass *parent_class = NULL; +static guint signals[SIGS] = { 0 }; + +static void +gnt_line_draw(GntWidget *widget) +{ + GntLine *line = GNT_LINE(widget); + if (line->vertical) + mvwvline(widget->window, 1, 0, ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL), + widget->priv.height - 3); + else + mvwhline(widget->window, 0, 1, ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL), + widget->priv.width - 3); +} + +static void +gnt_line_size_request(GntWidget *widget) +{ + if (GNT_LINE(widget)->vertical) + { + widget->priv.width = 1; + widget->priv.height = 5; + } + else + { + widget->priv.width = 5; + widget->priv.height = 1; + } +} + +static void +gnt_line_map(GntWidget *widget) +{ + if (widget->priv.width == 0 || widget->priv.height == 0) + gnt_widget_size_request(widget); + DEBUG; +} + +static void +gnt_line_class_init(GntLineClass *klass) +{ + parent_class = GNT_WIDGET_CLASS(klass); + parent_class->draw = gnt_line_draw; + parent_class->map = gnt_line_map; + parent_class->size_request = gnt_line_size_request; + + DEBUG; +} + +static void +gnt_line_init(GTypeInstance *instance, gpointer class) +{ + GntWidget *widget = GNT_WIDGET(instance); + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_SHADOW | GNT_WIDGET_NO_BORDER); + widget->priv.minw = 1; + widget->priv.minh = 1; + DEBUG; +} + +/****************************************************************************** + * GntLine API + *****************************************************************************/ +GType +gnt_line_get_gtype(void) +{ + static GType type = 0; + + if(type == 0) + { + static const GTypeInfo info = { + sizeof(GntLineClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc)gnt_line_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof(GntLine), + 0, /* n_preallocs */ + gnt_line_init, /* instance_init */ + }; + + type = g_type_register_static(GNT_TYPE_WIDGET, + "GntLine", + &info, 0); + } + + return type; +} + +GntWidget *gnt_line_new(gboolean vertical) +{ + GntWidget *widget = g_object_new(GNT_TYPE_LINE, NULL); + GntLine *line = GNT_LINE(widget); + + line->vertical = vertical; + + if (vertical) + { + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_GROW_Y); + } + else + { + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_GROW_X); + } + + return widget; +} + Property changes on: trunk/console/libgnt/gntline.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/gntline.h =================================================================== --- trunk/console/libgnt/gntline.h (rev 0) +++ trunk/console/libgnt/gntline.h 2006-07-10 23:55:24 UTC (rev 16480) @@ -0,0 +1,49 @@ +#ifndef GNT_LINE_H +#define GNT_LINE_H + +#include "gntwidget.h" +#include "gnt.h" +#include "gntcolors.h" +#include "gntkeys.h" + +#define GNT_TYPE_LINE (gnt_line_get_gtype()) +#define GNT_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_LINE, GntLine)) +#define GNT_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_LINE, GntLineClass)) +#define GNT_IS_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNT_TYPE_LINE)) +#define GNT_IS_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_LINE)) +#define GNT_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_LINE, GntLineClass)) + +#define GNT_LINE_FLAGS(obj) (GNT_LINE(obj)->priv.flags) +#define GNT_LINE_SET_FLAGS(obj, flags) (GNT_LINE_FLAGS(obj) |= flags) +#define GNT_LINE_UNSET_FLAGS(obj, flags) (GNT_LINE_FLAGS(obj) &= ~(flags)) + +typedef struct _GnLine GntLine; +typedef struct _GnLinePriv GntLinePriv; +typedef struct _GnLineClass GntLineClass; + +struct _GnLine +{ + GntWidget parent; + + gboolean vertical; +}; + +struct _GnLineClass +{ + GntWidgetClass parent; + + void (*gnt_reserved1)(void); + void (*gnt_reserved2)(void); + void (*gnt_reserved3)(void); + void (*gnt_reserved4)(void); +}; + +G_BEGIN_DECLS + +GType gnt_line_get_gtype(void); + +GntWidget *gnt_line_new(gboolean vertical); + +G_END_DECLS + +#endif /* GNT_LINE_H */ Property changes on: trunk/console/libgnt/gntline.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gntmain.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -400,6 +400,7 @@ { mode = GNT_KP_MODE_NORMAL; changed = TRUE; + gnt_widget_draw(widget); } if (changed) @@ -471,19 +472,7 @@ if (changed) { - GntNode *node = g_hash_table_lookup(nodes, widget); - int x, y; - - gnt_widget_get_position(widget, &x, &y); - - hide_panel(node->panel); - gnt_widget_set_size(widget, width, height); - gnt_widget_set_position(widget, x, y); - gnt_widget_draw(widget); - replace_panel(node->panel, widget->window); - show_panel(node->panel); - update_panels(); - doupdate(); + gnt_screen_resize_widget(widget, width, height); } } } @@ -673,3 +662,21 @@ return ascii_only; } +void gnt_screen_resize_widget(GntWidget *widget, int width, int height) +{ + if (widget->parent == NULL) + { + GntNode *node = g_hash_table_lookup(nodes, widget); + if (!node) + return; + + hide_panel(node->panel); + gnt_widget_set_size(widget, width, height); + gnt_widget_draw(widget); + replace_panel(node->panel, widget->window); + show_panel(node->panel); + update_panels(); + doupdate(); + } +} + Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gnttextview.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -113,9 +113,14 @@ static void gnt_text_view_init(GTypeInstance *instance, gpointer class) { + GntWidget *widget = GNT_WIDGET(instance); + /* XXX: For now, resizing the width is not permitted. This is because * of the way I am handling wrapped lines. */ GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_Y); + + widget->priv.minw = 5; + widget->priv.minh = 1; DEBUG; } Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gnttree.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -399,7 +399,10 @@ static void gnt_tree_init(GTypeInstance *instance, gpointer class) { - GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_X | GNT_WIDGET_GROW_Y); + GntWidget *widget = GNT_WIDGET(instance); + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_GROW_X | GNT_WIDGET_GROW_Y); + widget->priv.minw = 4; + widget->priv.minh = 3; DEBUG; } Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gntwidget.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -4,8 +4,6 @@ #include "gntmarshal.h" #include "gnt.h" -#define MIN_SIZE 5 - enum { SIG_DESTROY, @@ -18,6 +16,7 @@ SIG_EXPOSE, SIG_SIZE_REQUEST, SIG_CONFIRM_SIZE, + SIG_SIZE_CHANGED, SIG_POSITION, SIGS }; @@ -71,7 +70,7 @@ static gboolean gnt_widget_dummy_confirm_size(GntWidget *widget, int width, int height) { - if (width < MIN_SIZE || height < MIN_SIZE) + if (width < widget->priv.minw || height < widget->priv.minh) return FALSE; if (widget->priv.width != width && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X)) return FALSE; @@ -173,6 +172,14 @@ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + signals[SIG_SIZE_CHANGED] = + g_signal_new("size_changed", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GntWidgetClass, size_changed), + NULL, NULL, + gnt_closure_marshal_VOID__INT_INT, + G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); signals[SIG_CONFIRM_SIZE] = g_signal_new("confirm_size", G_TYPE_FROM_CLASS(klass), @@ -245,15 +252,8 @@ void gnt_widget_destroy(GntWidget *obj) { - int id; g_return_if_fail(GNT_IS_WIDGET(obj)); - if ((id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(obj), "gnt:queue_update")))) - { - g_source_remove(id); - g_object_set_data(G_OBJECT(obj), "gnt:queue_update", NULL); - } - gnt_widget_hide(obj); delwin(obj->window); if(!(GNT_WIDGET_FLAGS(obj) & GNT_WIDGET_DESTROYING)) @@ -276,7 +276,6 @@ gnt_widget_draw(GntWidget *widget) { /* Draw the widget */ - DEBUG; if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_DRAWING)) return; @@ -293,10 +292,9 @@ if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) shadow = FALSE; - + widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, widget->priv.y, widget->priv.x); - init_widget(widget); } @@ -337,11 +335,10 @@ void gnt_widget_set_position(GntWidget *wid, int x, int y) { + g_signal_emit(wid, signals[SIG_POSITION], 0, x, y); /* XXX: Need to install properties for these and g_object_notify */ wid->priv.x = x; wid->priv.y = y; - - g_signal_emit(wid, signals[SIG_POSITION], 0, x, y); } void @@ -404,27 +401,38 @@ { gboolean ret = TRUE; + if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + { + width--; + height--; + } + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) { - if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) - { - width--; - height--; - } - g_signal_emit(widget, signals[SIG_CONFIRM_SIZE], 0, width, height, &ret); + ret = gnt_widget_confirm_size(widget, width, height); } if (ret) { gboolean shadow = TRUE; + int oldw, oldh; if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) shadow = FALSE; + oldw = widget->priv.width; + oldh = widget->priv.height; + widget->priv.width = width; widget->priv.height = height; + + g_signal_emit(widget, signals[SIG_SIZE_CHANGED], 0, oldw, oldh); + if (widget->window) + { wresize(widget->window, height + shadow, width + shadow); + init_widget(widget); + } if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) init_widget(widget); else @@ -475,7 +483,7 @@ if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update")) return FALSE; gnt_screen_update(widget); - g_object_set_data(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(FALSE)); + g_object_set_data(G_OBJECT(widget), "gnt:queue_update", NULL); return FALSE; } @@ -487,7 +495,15 @@ if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update")) { int id = g_timeout_add(0, update_queue_callback, widget); - g_object_set_data(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(id)); + g_object_set_data_full(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(id), + (GDestroyNotify)g_source_remove); } } +gboolean gnt_widget_confirm_size(GntWidget *widget, int width, int height) +{ + gboolean ret = FALSE; + g_signal_emit(widget, signals[SIG_CONFIRM_SIZE], 0, width, height, &ret); + return ret; +} + Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/gntwidget.h 2006-07-10 23:55:24 UTC (rev 16480) @@ -53,6 +53,8 @@ int width, height; GntWidgetFlags flags; char *name; + + int minw, minh; /* Minimum size for the widget */ }; struct _GnWidget @@ -84,6 +86,7 @@ void (*size_request)(GntWidget *widget); gboolean (*confirm_size)(GntWidget *widget, int x, int y); + void (*size_changed)(GntWidget *widget, int w, int h); void (*set_position)(GntWidget *widget, int x, int y); gboolean (*key_pressed)(GntWidget *widget, const char *key); void (*activate)(GntWidget *widget); @@ -108,6 +111,7 @@ void gnt_widget_size_request(GntWidget *widget); void gnt_widget_get_size(GntWidget *widget, int *width, int *height); gboolean gnt_widget_set_size(GntWidget *widget, int width, int height); +gboolean gnt_widget_confirm_size(GntWidget *widget, int width, int height); gboolean gnt_widget_key_pressed(GntWidget *widget, const char *keys); Modified: trunk/console/libgnt/test/combo.c =================================================================== --- trunk/console/libgnt/test/combo.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/test/combo.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -4,11 +4,23 @@ #include <gntcombobox.h> #include <gntlabel.h> +static void +button_activated(GntWidget *b, GntComboBox *combo) +{ + GntWidget *w = b->parent; + + gnt_box_add_widget(GNT_BOX(w), + gnt_label_new(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)))); + fprintf(stderr, "%s\n", gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo))); + gnt_box_readjust(GNT_BOX(w->parent)); +} + int main() { GntWidget *box, *combo, *button; GntWidget *hbox; + freopen(".error", "w", stderr); gnt_init(); box = gnt_box_new(FALSE, TRUE); @@ -43,6 +55,7 @@ button = gnt_button_new("OK"); gnt_box_add_widget(GNT_BOX(hbox), button); + g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(button_activated), combo); gnt_box_add_widget(GNT_BOX(box), hbox); Modified: trunk/console/libgnt/test/focus.c =================================================================== --- trunk/console/libgnt/test/focus.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/test/focus.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -20,6 +20,7 @@ int main() { + freopen(".error", "w", stderr); gnt_init(); GntWidget *label = gnt_label_new("So wassup dudes and dudettes!!\nSo this is, like,\nthe third line!! \\o/"); @@ -30,7 +31,7 @@ wrefresh(stdscr); vbox = gnt_box_new(FALSE, FALSE); - hbox = gnt_box_new(TRUE, TRUE); + hbox = gnt_box_new(FALSE, TRUE); gnt_widget_set_name(vbox, "vbox"); gnt_widget_set_name(hbox, "hbox"); Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-07-10 18:12:11 UTC (rev 16479) +++ trunk/console/libgnt/test/multiwin.c 2006-07-10 23:55:24 UTC (rev 16480) @@ -60,7 +60,7 @@ gnt_tree_set_row_flags(GNT_TREE(tree), "e", GNT_TEXT_FLAG_DIM); - g_timeout_add(5000, show, box2); + g_timeout_add(5000, (GSourceFunc)show, box2); gnt_main(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-17 03:45:41
|
Revision: 16500 Author: sadrul Date: 2006-07-16 20:45:24 -0700 (Sun, 16 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16500&view=rev Log Message: ----------- uiops for GaimConnections. This only shows an error message for a disconnect. uiops for GaimNotify. I have not done the notifications for searchresults yet. That will require multi-column GntTree's, which will also allow for improved email-notifications. I hope to complete it by next week. Modified Paths: -------------- trunk/console/Makefile trunk/console/gntblist.c trunk/console/gntgaim.h trunk/console/gntui.c trunk/console/libgnt/gntlabel.c trunk/console/libgnt/gntlabel.h trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttextview.h trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h trunk/console/libgnt/test/multiwin.c trunk/console/libgnt/test/tv.c Added Paths: ----------- trunk/console/gntconn.c trunk/console/gntconn.h trunk/console/gntnotify.c trunk/console/gntnotify.h Modified: trunk/console/Makefile =================================================================== --- trunk/console/Makefile 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/Makefile 2006-07-17 03:45:24 UTC (rev 16500) @@ -6,19 +6,25 @@ GG_SOURCES = \ gntaccount.c \ gntblist.c \ + gntconn.c \ gntconv.c \ + gntnotify.c \ gntui.c GG_HEADERS = \ gntaccount.h \ gntblist.h \ + gntconn.h \ gntconv.h \ + gntnotify.h \ gntui.h GG_OBJECTS = \ gntaccount.o \ gntblist.o \ + gntconn.o \ gntconv.o \ + gntnotify.o \ gntui.o all: gntgaim @@ -29,6 +35,7 @@ gntblist.o: gntblist.c $(GG_HEADERS) gntconv.o: gntconv.c $(GG_HEADERS) gntgaim.o: gntgaim.c gntgaim.h $(GG_HEADERS) +gntnotify.o: gntnotify.c $(GG_HEADERS) gntui.o: gntui.c $(GG_HEADERS) clean: Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/gntblist.c 2006-07-17 03:45:24 UTC (rev 16500) @@ -288,7 +288,9 @@ GaimBuddy *buddy = (GaimBuddy *)node; account = gaim_buddy_get_account(buddy); - g_string_append_printf(str, _("Account: %s"), gaim_account_get_username(account)); + g_string_append_printf(str, _("Account: %s (%s)"), + gaim_account_get_username(account), + gaim_account_get_protocol_name(account)); prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); @@ -323,7 +325,9 @@ GaimChat *chat = (GaimChat *)node; GaimAccount *account = chat->account; - g_string_append_printf(str, _("Account: %s"), gaim_account_get_username(account)); + g_string_append_printf(str, _("Account: %s (%s)"), + gaim_account_get_username(account), + gaim_account_get_protocol_name(account)); title = g_strdup(gaim_chat_get_name(chat)); } Added: trunk/console/gntconn.c =================================================================== --- trunk/console/gntconn.c (rev 0) +++ trunk/console/gntconn.c 2006-07-17 03:45:24 UTC (rev 16500) @@ -0,0 +1,45 @@ +#include "notify.h" + +#include "gntconn.h" +#include "gntgaim.h" + +static void +gg_connection_report_disconnect(GaimConnection *gc, const char *text) +{ + char *act, *primary, *secondary; + GaimAccount *account = gaim_connection_get_account(gc); + + act = g_strdup_printf(_("%s (%s)"), gaim_account_get_username(account), + gaim_account_get_protocol_name(account)); + + primary = g_strdup_printf(_("%s disconnected."), act); + secondary = g_strdup_printf(_("%s was disconnected due to the following error:\n%s"), + act, text); + + gaim_notify_error(account, _("Connection Error"), primary, secondary); + + g_free(act); + g_free(primary); + g_free(secondary); +} + +static GaimConnectionUiOps ops = +{ + .connect_progress = NULL, + .connected = NULL, + .disconnected = NULL, + .notice = NULL, + .report_disconnect = gg_connection_report_disconnect +}; + +GaimConnectionUiOps *gg_connections_get_ui_ops() +{ + return &ops; +} + +void gg_connections_init() +{} + +void gg_connections_uninit() +{} + Property changes on: trunk/console/gntconn.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/gntconn.h =================================================================== --- trunk/console/gntconn.h (rev 0) +++ trunk/console/gntconn.h 2006-07-17 03:45:24 UTC (rev 16500) @@ -0,0 +1,8 @@ +#include "connection.h" + +GaimConnectionUiOps *gg_connections_get_ui_ops(); + +void gg_connections_init(); + +void gg_connections_uninit(); + Property changes on: trunk/console/gntconn.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/gntgaim.h =================================================================== --- trunk/console/gntgaim.h 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/gntgaim.h 2006-07-17 03:45:24 UTC (rev 16500) @@ -1,4 +1,5 @@ #include <glib.h> +#include <libintl.h> #define GAIM_GNT_UI "gnt-gaim" Added: trunk/console/gntnotify.c =================================================================== --- trunk/console/gntnotify.c (rev 0) +++ trunk/console/gntnotify.c 2006-07-17 03:45:24 UTC (rev 16500) @@ -0,0 +1,160 @@ +#include <gnt.h> +#include <gntbox.h> +#include <gntbutton.h> +#include <gntlabel.h> + +#include <util.h> + +#include "gntnotify.h" +#include "gntgaim.h" + +static void * +gg_notify_message(GaimNotifyMsgType type, const char *title, + const char *primary, const char *secondary) +{ + GntWidget *window, *button; + GntTextFormatFlags pf = 0, sf = 0; + + switch (type) + { + case GAIM_NOTIFY_MSG_ERROR: + sf |= GNT_TEXT_FLAG_BOLD; + case GAIM_NOTIFY_MSG_WARNING: + pf |= GNT_TEXT_FLAG_UNDERLINE; + case GAIM_NOTIFY_MSG_INFO: + pf |= GNT_TEXT_FLAG_BOLD; + break; + } + + window = gnt_box_new(FALSE, TRUE); + gnt_box_set_toplevel(GNT_BOX(window), TRUE); + gnt_box_set_title(GNT_BOX(window), title); + + if (primary) + gnt_box_add_widget(GNT_BOX(window), + gnt_label_new_with_format(primary, pf)); + if (secondary) + gnt_box_add_widget(GNT_BOX(window), + gnt_label_new_with_format(secondary, sf)); + + button = gnt_button_new(_("OK")); + gnt_box_add_widget(GNT_BOX(window), button); + g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gnt_widget_destroy), window); + + gnt_widget_show(window); + return window; +} + +/* handle is, in all/most occasions, a GntWidget * */ +static void gg_close_notify(GaimNotifyType type, void *handle) +{ + gnt_widget_destroy(GNT_WIDGET(handle)); +} + +static void *gg_notify_formatted(const char *title, const char *primary, + const char *secondary, const char *text) +{ + /* XXX: For now, simply strip the html and use _notify_message. For future use, + * there should be some way of parsing the makrups from GntTextView */ + char *unformat = gaim_markup_strip_html(text); + char *t = g_strdup_printf("%s%s%s", + secondary ? secondary : "", + secondary ? "\n" : "", + unformat ? unformat : ""); + + void *ret = gg_notify_message(GAIM_NOTIFY_MSG_INFO, title, primary, t); + + g_free(t); + g_free(unformat); + + return ret; +} + +static void * +gg_notify_emails(GaimConnection *gc, size_t count, gboolean detailed, + const char **subjects, const char **froms, const char **tos, + const char **urls) +{ + GaimAccount *account = gaim_connection_get_account(gc); + GString *message = g_string_new(NULL); + void *ret; + + if (!detailed) + { + g_string_append_printf(message, + ngettext("%s (%s) has %d new message.", + "%s (%s) has %d new messages.", + (int)count), + tos ? *tos : gaim_account_get_username(account), + gaim_account_get_protocol_name(account), (int)count); + } + else + { + /* XXX: Yes, yes. I know, the combined dialog thing. Maybe later. */ + g_string_append_printf(message, + _("You have received a mail \"%s\""), *subjects); + if (froms && *froms && **froms) + g_string_append_printf(message, _("\nfrom %s"), *froms); + g_string_append_printf(message, _(" to %s (%s)"), + tos ? *tos : gaim_account_get_username(account), + gaim_account_get_protocol_name(account)); + } + + ret = gg_notify_message(GAIM_NOTIFY_MSG_INFO, _("New Mail"), _("You have mail!"), message->str); + g_string_free(message, TRUE); + return ret; +} + +static void * +gg_notify_email(GaimConnection *gc, const char *subject, const char *from, + const char *to, const char *url) +{ + return gg_notify_emails(gc, 1, subject != NULL, + subject ? &subject : NULL, + from ? &from : NULL, + to ? &to : NULL, + url ? &url : NULL); +} + +static void * +gg_notify_userinfo(GaimConnection *gc, const char *who, const char *text) +{ + /* Xeroxed from gtknotify.c */ + char *primary; + void *ui_handle; + + primary = g_strdup_printf(_("Info for %s"), who); + ui_handle = gg_notify_formatted(_("Buddy Information"), primary, NULL, text); + g_free(primary); + return ui_handle; +} + +static GaimNotifyUiOps ops = +{ + .notify_message = gg_notify_message, + .close_notify = gg_close_notify, /* The rest of the notify-uiops return a GntWidget. + These widgets should be destroyed from here. */ + .notify_formatted = gg_notify_formatted, + .notify_email = gg_notify_email, + .notify_emails = gg_notify_emails, + .notify_userinfo = gg_notify_userinfo, + + .notify_searchresults = NULL, /* We are going to need multi-column GntTree's for this */ + .notify_searchresults_new_rows = NULL, + .notify_uri = NULL /* This is of low-priority to me */ +}; + +GaimNotifyUiOps *gg_notify_get_ui_ops() +{ + return &ops; +} + +void gg_notify_init() +{ +} + +void gg_notify_uninit() +{ +} + + Property changes on: trunk/console/gntnotify.c ___________________________________________________________________ Name: svn:mime-type + text/plan Name: svn:eol-style + native Added: trunk/console/gntnotify.h =================================================================== --- trunk/console/gntnotify.h (rev 0) +++ trunk/console/gntnotify.h 2006-07-17 03:45:24 UTC (rev 16500) @@ -0,0 +1,8 @@ +#include "notify.h" + +GaimNotifyUiOps *gg_notify_get_ui_ops(); + +void gg_notify_init(); + +void gg_notify_uninit(); + Property changes on: trunk/console/gntnotify.h ___________________________________________________________________ Name: svn:mime-type + text/plan Name: svn:eol-style + native Modified: trunk/console/gntui.c =================================================================== --- trunk/console/gntui.c 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/gntui.c 2006-07-17 03:45:24 UTC (rev 16500) @@ -2,7 +2,9 @@ #include "gntaccount.h" #include "gntblist.h" +#include "gntconn.h" #include "gntconv.h" +#include "gntnotify.h" void init_gnt_ui() { @@ -12,6 +14,10 @@ gg_accounts_init(); gaim_accounts_set_ui_ops(gg_accounts_get_ui_ops()); + /* Connections */ + gg_connections_init(); + gaim_connections_set_ui_ops(gg_connections_get_ui_ops()); + /* Initialize the buddy list */ gg_blist_init(); gaim_blist_set_ui_ops(gg_blist_get_ui_ops()); @@ -20,17 +26,27 @@ gg_conversation_init(); gaim_conversations_set_ui_ops(gg_conv_get_ui_ops()); + /* Notify */ + gg_notify_init(); + gaim_notify_set_ui_ops(gg_notify_get_ui_ops()); + gnt_main(); gaim_accounts_set_ui_ops(NULL); gg_accounts_uninit(); + gaim_connections_set_ui_ops(NULL); + gg_connections_uninit(); + gaim_blist_set_ui_ops(NULL); gg_blist_uninit(); gaim_conversations_set_ui_ops(NULL); gg_conversation_uninit(); + gaim_notify_set_ui_ops(NULL); + gg_notify_uninit(); + gnt_quit(); } Modified: trunk/console/libgnt/gntlabel.c =================================================================== --- trunk/console/libgnt/gntlabel.c 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/libgnt/gntlabel.c 2006-07-17 03:45:24 UTC (rev 16500) @@ -21,8 +21,9 @@ gnt_label_draw(GntWidget *widget) { GntLabel *label = GNT_LABEL(widget); + chtype flag = gnt_text_format_flag_to_chtype(label->flags); - wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); + wbkgdset(widget->window, '\0' | flag); mvwprintw(widget->window, 0, 0, label->text); DEBUG; @@ -109,10 +110,16 @@ GntWidget *gnt_label_new(const char *text) { + return gnt_label_new_with_format(text, 0); +} + +GntWidget *gnt_label_new_with_format(const char *text, GntTextFormatFlags flags) +{ GntWidget *widget = g_object_new(GNT_TYPE_LABEL, NULL); GntLabel *label = GNT_LABEL(widget); label->text = g_strdup(text); + label->flags = flags; gnt_widget_set_take_focus(widget, FALSE); GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); Modified: trunk/console/libgnt/gntlabel.h =================================================================== --- trunk/console/libgnt/gntlabel.h 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/libgnt/gntlabel.h 2006-07-17 03:45:24 UTC (rev 16500) @@ -3,6 +3,7 @@ #include "gnt.h" #include "gntwidget.h" +#include "gnttextview.h" #define GNT_TYPE_LABEL (gnt_label_get_gtype()) #define GNT_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_LABEL, GntLabel)) @@ -19,6 +20,7 @@ GntWidget parent; char *text; + GntTextFormatFlags flags; void (*gnt_reserved1)(void); void (*gnt_reserved2)(void); @@ -42,6 +44,8 @@ GntWidget *gnt_label_new(const char *text); +GntWidget *gnt_label_new_with_format(const char *text, GntTextFormatFlags flags); + G_END_DECLS #endif /* GNT_LABEL_H */ Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/libgnt/gntmain.c 2006-07-17 03:45:24 UTC (rev 16500) @@ -262,6 +262,7 @@ update_window_in_list(GNT_WIDGET(box)); } + gnt_tree_set_selected(GNT_TREE(tree), focus_list->data); gnt_box_add_widget(GNT_BOX(win), tree); gnt_widget_set_size(tree, getmaxx(stdscr) / 3, getmaxy(stdscr) / 2); Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/libgnt/gnttextview.c 2006-07-17 03:45:24 UTC (rev 16500) @@ -178,20 +178,8 @@ if (text == NULL || *text == '\0') return; - if (flags & GNT_TEXT_FLAG_BOLD) - fl |= A_BOLD; - if (flags & GNT_TEXT_FLAG_UNDERLINE) - fl |= A_UNDERLINE; - if (flags & GNT_TEXT_FLAG_BLINK) - fl |= A_BLINK; + fl = gnt_text_format_flag_to_chtype(flags); - if (flags & GNT_TEXT_FLAG_DIM) - fl |= (A_DIM | COLOR_PAIR(GNT_COLOR_DISABLED)); - else if (flags & GNT_TEXT_FLAG_HIGHLIGHT) - fl |= (A_DIM | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); - else - fl |= COLOR_PAIR(GNT_COLOR_NORMAL); - view->list = g_list_first(view->list); split = g_strsplit(text, "\n", 0); @@ -262,3 +250,24 @@ gnt_widget_draw(GNT_WIDGET(view)); } +chtype gnt_text_format_flag_to_chtype(GntTextFormatFlags flags) +{ + chtype fl = 0; + + if (flags & GNT_TEXT_FLAG_BOLD) + fl |= A_BOLD; + if (flags & GNT_TEXT_FLAG_UNDERLINE) + fl |= A_UNDERLINE; + if (flags & GNT_TEXT_FLAG_BLINK) + fl |= A_BLINK; + + if (flags & GNT_TEXT_FLAG_DIM) + fl |= (A_DIM | COLOR_PAIR(GNT_COLOR_DISABLED)); + else if (flags & GNT_TEXT_FLAG_HIGHLIGHT) + fl |= (A_DIM | COLOR_PAIR(GNT_COLOR_HIGHLIGHT)); + else + fl |= COLOR_PAIR(GNT_COLOR_NORMAL); + + return fl; +} + Modified: trunk/console/libgnt/gnttextview.h =================================================================== --- trunk/console/libgnt/gnttextview.h 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/libgnt/gnttextview.h 2006-07-17 03:45:24 UTC (rev 16500) @@ -64,6 +64,8 @@ * It first completes the current line with the current text-attributes. */ void gnt_text_view_next_line(GntTextView *view); +chtype gnt_text_format_flag_to_chtype(GntTextFormatFlags flags); + G_END_DECLS #endif /* GNT_TEXT_VIEW_H */ Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/libgnt/gnttree.c 2006-07-17 03:45:24 UTC (rev 16500) @@ -716,3 +716,24 @@ redraw_tree(tree); /* XXX: It shouldn't be necessary to redraw the whole darned tree */ } +void gnt_tree_set_selected(GntTree *tree , void *key) +{ + int dist; + GntTreeRow *row = g_hash_table_lookup(tree->hash, key); + if (!row) + return; + + if (tree->top == NULL) + tree->top = row; + if (tree->bottom == NULL) + tree->bottom = row; + + tree->current = row; + if ((dist = get_distance(tree->current, tree->bottom)) < 0) + gnt_tree_scroll(tree, -dist); + else if ((dist = get_distance(tree->current, tree->top)) > 0) + gnt_tree_scroll(tree, -dist); + else + redraw_tree(tree); +} + Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/libgnt/gnttree.h 2006-07-17 03:45:24 UTC (rev 16500) @@ -84,6 +84,8 @@ void gnt_tree_set_row_flags(GntTree *tree, void *key, GntTextFormatFlags flags); +void gnt_tree_set_selected(GntTree *tree , void *key); + G_END_DECLS #endif /* GNT_TREE_H */ Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/libgnt/test/multiwin.c 2006-07-17 03:45:24 UTC (rev 16500) @@ -60,6 +60,8 @@ gnt_tree_set_row_flags(GNT_TREE(tree), "e", GNT_TEXT_FLAG_DIM); + gnt_tree_set_selected(GNT_TREE(tree), "2"); + g_timeout_add(5000, (GSourceFunc)show, box2); gnt_main(); Modified: trunk/console/libgnt/test/tv.c =================================================================== --- trunk/console/libgnt/test/tv.c 2006-07-17 03:12:41 UTC (rev 16499) +++ trunk/console/libgnt/test/tv.c 2006-07-17 03:45:24 UTC (rev 16500) @@ -59,6 +59,7 @@ gnt_box_add_widget(GNT_BOX(hbox), view); gnt_box_add_widget(GNT_BOX(hbox), entry); + gnt_box_add_widget(GNT_BOX(hbox), gnt_button_new("OK")); gnt_widget_show(hbox); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-17 04:30:58
|
Revision: 16501 Author: sadrul Date: 2006-07-16 21:30:50 -0700 (Sun, 16 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16501&view=rev Log Message: ----------- Minor adjustments to the packing of child widgets in a box. Modified Paths: -------------- trunk/console/gntnotify.c trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbox.h trunk/console/libgnt/test/focus.c trunk/console/libgnt/test/tv.c Modified: trunk/console/gntnotify.c =================================================================== --- trunk/console/gntnotify.c 2006-07-17 03:45:24 UTC (rev 16500) +++ trunk/console/gntnotify.c 2006-07-17 04:30:50 UTC (rev 16501) @@ -29,6 +29,8 @@ window = gnt_box_new(FALSE, TRUE); gnt_box_set_toplevel(GNT_BOX(window), TRUE); gnt_box_set_title(GNT_BOX(window), title); + gnt_box_set_fill(GNT_BOX(window), FALSE); + gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); if (primary) gnt_box_add_widget(GNT_BOX(window), Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-07-17 03:45:24 UTC (rev 16500) +++ trunk/console/libgnt/gntbox.c 2006-07-17 04:30:50 UTC (rev 16501) @@ -173,31 +173,30 @@ if (maxw < w) maxw = w; } - - if (box->homogeneous) + + for (iter = box->list; iter; iter = iter->next) { - for (iter = box->list; iter; iter = iter->next) + int w, h; + GntWidget *wid = GNT_WIDGET(iter->data); + + gnt_widget_get_size(wid, &w, &h); + + if (box->homogeneous) { - gnt_widget_set_size(GNT_WIDGET(iter->data), maxw, maxh); + if (box->vertical) + h = maxh; + else + w = maxw; } - } - else - { - for (iter = box->list; iter; iter = iter->next) + if (box->fill) { if (box->vertical) - { - int h; - gnt_widget_get_size(GNT_WIDGET(iter->data), NULL, &h); - gnt_widget_set_size(GNT_WIDGET(iter->data), maxw, h); - } + w = maxw; else - { - int w; - gnt_widget_get_size(GNT_WIDGET(iter->data), &w, NULL); - gnt_widget_set_size(GNT_WIDGET(iter->data), w, maxh); - } + h = maxh; } + + gnt_widget_set_size(wid, w, h); } reposition_children(widget); @@ -495,6 +494,7 @@ box->homogeneous = homo; box->vertical = vert; box->pad = 1; + box->fill = TRUE; gnt_widget_set_take_focus(widget, TRUE); GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); if (vert) @@ -669,3 +669,8 @@ } } +void gnt_box_set_fill(GntBox *box, gboolean fill) +{ + box->fill = fill; +} + Modified: trunk/console/libgnt/gntbox.h =================================================================== --- trunk/console/libgnt/gntbox.h 2006-07-17 03:45:24 UTC (rev 16500) +++ trunk/console/libgnt/gntbox.h 2006-07-17 04:30:50 UTC (rev 16501) @@ -33,6 +33,7 @@ gboolean vertical; gboolean homogeneous; + gboolean fill; GList *list; /* List of widgets */ GntWidget *active; @@ -85,6 +86,8 @@ void gnt_box_readjust(GntBox *box); +void gnt_box_set_fill(GntBox *box, gboolean fill); + G_END_DECLS #endif /* GNT_BOX_H */ Modified: trunk/console/libgnt/test/focus.c =================================================================== --- trunk/console/libgnt/test/focus.c 2006-07-17 03:45:24 UTC (rev 16500) +++ trunk/console/libgnt/test/focus.c 2006-07-17 04:30:50 UTC (rev 16501) @@ -32,6 +32,7 @@ vbox = gnt_box_new(FALSE, FALSE); hbox = gnt_box_new(FALSE, TRUE); + gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); gnt_widget_set_name(vbox, "vbox"); gnt_widget_set_name(hbox, "hbox"); Modified: trunk/console/libgnt/test/tv.c =================================================================== --- trunk/console/libgnt/test/tv.c 2006-07-17 03:45:24 UTC (rev 16500) +++ trunk/console/libgnt/test/tv.c 2006-07-17 04:30:50 UTC (rev 16501) @@ -45,7 +45,9 @@ hbox = gnt_box_new(FALSE, TRUE); gnt_widget_set_name(hbox, "hbox"); gnt_box_set_toplevel(GNT_BOX(hbox), TRUE); + gnt_box_set_fill(GNT_BOX(hbox), FALSE); gnt_box_set_title(GNT_BOX(hbox), "Textview test"); + gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); entry = gnt_entry_new(NULL); gnt_widget_set_name(entry, "entry"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-19 07:13:14
|
Revision: 16520 Author: sadrul Date: 2006-07-19 00:12:59 -0700 (Wed, 19 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16520&view=rev Log Message: ----------- Add multi-column support for GntTree. Use it for email-notifications. Restore colors before exiting. Modified Paths: -------------- trunk/console/gntaccount.c trunk/console/gntblist.c trunk/console/gntnotify.c trunk/console/libgnt/gntcolors.c trunk/console/libgnt/gntcolors.h trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gntlabel.c trunk/console/libgnt/gntlabel.h trunk/console/libgnt/gntline.h trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttextview.h trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h trunk/console/libgnt/test/focus.c trunk/console/libgnt/test/multiwin.c trunk/console/libgnt/test/wm.c Modified: trunk/console/gntaccount.c =================================================================== --- trunk/console/gntaccount.c 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/gntaccount.c 2006-07-19 07:12:59 UTC (rev 16520) @@ -210,25 +210,26 @@ gnt_box_add_widget(GNT_BOX(accounts.window), gnt_line_new(FALSE)); - accounts.tree = gnt_tree_new(); + accounts.tree = gnt_tree_new_with_columns(2); GNT_WIDGET_SET_FLAGS(accounts.tree, GNT_WIDGET_NO_BORDER); for (iter = gaim_accounts_get_all(); iter; iter = iter->next) { GaimAccount *account = iter->data; - char *str = g_strdup_printf("%s (%s)", - gaim_account_get_username(account), gaim_account_get_protocol_id(account)); gnt_tree_add_choice(GNT_TREE(accounts.tree), account, - str, NULL, NULL); + gnt_tree_create_row(GNT_TREE(accounts.tree), + gaim_account_get_username(account), + gaim_account_get_protocol_name(account)), + NULL, NULL); gnt_tree_set_choice(GNT_TREE(accounts.tree), account, gaim_account_get_enabled(account, GAIM_GNT_UI)); - g_free(str); } g_signal_connect(G_OBJECT(accounts.tree), "toggled", G_CALLBACK(account_toggled), NULL); - gnt_widget_set_size(accounts.tree, 40, 10); + gnt_tree_set_col_width(GNT_TREE(accounts.tree), 0, 40); + gnt_tree_set_col_width(GNT_TREE(accounts.tree), 1, 10); gnt_box_add_widget(GNT_BOX(accounts.window), accounts.tree); gnt_box_add_widget(GNT_BOX(accounts.window), gnt_line_new(FALSE)); Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/gntblist.c 2006-07-19 07:12:59 UTC (rev 16520) @@ -129,8 +129,9 @@ GaimBlistNode *node = (GaimBlistNode *)group; if (node->ui_data) return; + gnt_tree_remove(GNT_TREE(ggblist->tree), group); node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group, - group->name, NULL, NULL); + gnt_tree_create_row(GNT_TREE(ggblist->tree), group->name), NULL, NULL); } static const char * @@ -191,8 +192,10 @@ group = gaim_chat_get_group(chat); add_node((GaimBlistNode*)group, ggblist); + gnt_tree_remove(GNT_TREE(ggblist->tree), chat); node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), chat, - get_display_name(node), group, NULL); + gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), + group, NULL); } static void @@ -206,8 +209,10 @@ group = gaim_buddy_get_group(buddy); add_node((GaimBlistNode*)group, ggblist); + gnt_tree_remove(GNT_TREE(ggblist->tree), buddy); node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, - get_display_name(node), group, NULL); + gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), + group, NULL); if (gaim_presence_is_idle(gaim_buddy_get_presence(buddy))) gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, GNT_TEXT_FLAG_DIM); else @@ -270,7 +275,8 @@ { GList *list; - gnt_tree_add_row_after(tree, action, action->label, parent, NULL); + gnt_tree_add_row_after(tree, action, + gnt_tree_create_row(tree, action->label), parent, NULL); for (list = action->children; list; list = list->next) gnt_append_menu_action(tree, list->data, action); } @@ -640,7 +646,7 @@ static void update_buddy_display(GaimBuddy *buddy, GGBlist *ggblist) { - gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, get_display_name((GaimBlistNode*)buddy)); + gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, 0, get_display_name((GaimBlistNode*)buddy)); if (ggblist->tnode == (GaimBlistNode*)buddy) draw_tooltip(ggblist); @@ -685,7 +691,8 @@ ggblist->tree = gnt_tree_new(); GNT_WIDGET_SET_FLAGS(ggblist->tree, GNT_WIDGET_NO_BORDER); - gnt_widget_set_size(ggblist->tree, 25, getmaxy(stdscr) - 4); + gnt_tree_set_col_width(GNT_TREE(ggblist->tree), 0, 25); + gnt_widget_set_size(ggblist->tree, 0, getmaxy(stdscr) - 4); gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->tree); gnt_widget_show(ggblist->window); Modified: trunk/console/gntnotify.c =================================================================== --- trunk/console/gntnotify.c 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/gntnotify.c 2006-07-19 07:12:59 UTC (rev 16520) @@ -2,12 +2,19 @@ #include <gntbox.h> #include <gntbutton.h> #include <gntlabel.h> +#include <gnttree.h> #include <util.h> #include "gntnotify.h" #include "gntgaim.h" +static struct +{ + GntWidget *window; + GntWidget *tree; +} emaildialog; + static void * gg_notify_message(GaimNotifyMsgType type, const char *title, const char *primary, const char *secondary) @@ -72,6 +79,44 @@ return ret; } +static void +reset_email_dialog() +{ + emaildialog.window = NULL; + emaildialog.tree = NULL; +} + +static void +setup_email_dialog() +{ + GntWidget *box, *tree, *button; + if (emaildialog.window) + return; + + emaildialog.window = box = gnt_vbox_new(FALSE); + gnt_box_set_toplevel(GNT_BOX(box), TRUE); + gnt_box_set_title(GNT_BOX(box), _("Emails")); + gnt_box_set_fill(GNT_BOX(box), FALSE); + gnt_box_set_alignment(GNT_BOX(box), GNT_ALIGN_MID); + gnt_box_set_pad(GNT_BOX(box), 0); + + gnt_box_add_widget(GNT_BOX(box), + gnt_label_new_with_format(_("You have mail!"), GNT_TEXT_FLAG_BOLD)); + + emaildialog.tree = tree = gnt_tree_new_with_columns(3); + gnt_tree_set_col_width(GNT_TREE(tree), 0, 15); + gnt_tree_set_col_width(GNT_TREE(tree), 1, 25); + gnt_tree_set_col_width(GNT_TREE(tree), 2, 25); + + gnt_box_add_widget(GNT_BOX(box), tree); + + button = gnt_button_new(_("Close")); + gnt_box_add_widget(GNT_BOX(box), button); + + g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gnt_widget_destroy), box); + g_signal_connect(G_OBJECT(box), "destroy", G_CALLBACK(reset_email_dialog), NULL); +} + static void * gg_notify_emails(GaimConnection *gc, size_t count, gboolean detailed, const char **subjects, const char **froms, const char **tos, @@ -92,14 +137,16 @@ } else { - /* XXX: Yes, yes. I know, the combined dialog thing. Maybe later. */ - g_string_append_printf(message, - _("You have received a mail \"%s\""), *subjects); - if (froms && *froms && **froms) - g_string_append_printf(message, _("\nfrom %s"), *froms); - g_string_append_printf(message, _(" to %s (%s)"), - tos ? *tos : gaim_account_get_username(account), - gaim_account_get_protocol_name(account)); + setup_email_dialog(); + + gnt_tree_add_row_after(GNT_TREE(emaildialog.tree), GINT_TO_POINTER(time(NULL)), + gnt_tree_create_row(GNT_TREE(emaildialog.tree), + tos ? *tos : gaim_account_get_username(account), + froms ? *froms : "[Unknown sender]", + *subjects), + NULL, NULL); + gnt_widget_show(emaildialog.window); + return NULL; } ret = gg_notify_message(GAIM_NOTIFY_MSG_INFO, _("New Mail"), _("You have mail!"), message->str); Modified: trunk/console/libgnt/gntcolors.c =================================================================== --- trunk/console/libgnt/gntcolors.c 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/gntcolors.c 2006-07-19 07:12:59 UTC (rev 16520) @@ -1,10 +1,40 @@ #include <ncursesw/ncurses.h> #include "gntcolors.h" +static struct +{ + short r, g, b; +} colors[GNT_TOTAL_COLORS]; + +static void +backup_colors() +{ + short i; + for (i = 0; i < GNT_TOTAL_COLORS; i++) + { + color_content(i, &colors[i].r, + &colors[i].g, &colors[i].b); + } +} + +static void +restore_colors() +{ + short i; + for (i = 0; i < GNT_TOTAL_COLORS; i++) + { + init_color(i, colors[i].r, + colors[i].g, colors[i].b); + } +} + void gnt_init_colors() { + start_color(); if (can_change_color()) { + backup_colors(); + /* XXX: Do some init_color()s */ init_color(GNT_COLOR_BLACK, 0, 0, 0); init_color(GNT_COLOR_RED, 1000, 0, 0); @@ -39,3 +69,9 @@ } } +void +gnt_uninit_colors() +{ + restore_colors(); +} + Modified: trunk/console/libgnt/gntcolors.h =================================================================== --- trunk/console/libgnt/gntcolors.h 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/gntcolors.h 2006-07-19 07:12:59 UTC (rev 16520) @@ -32,4 +32,6 @@ /* populate some default colors */ void gnt_init_colors(); +void gnt_uninit_colors(); + #endif Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/gntcombobox.c 2006-07-19 07:12:59 UTC (rev 16520) @@ -235,7 +235,8 @@ void gnt_combo_box_add_data(GntComboBox *box, gpointer key, const char *text) { - gnt_tree_add_row_after(GNT_TREE(box->dropdown), key, text, NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(box->dropdown), key, + gnt_tree_create_row(GNT_TREE(box->dropdown), text), NULL, NULL); if (box->selected == NULL) set_selection(box, key); } Modified: trunk/console/libgnt/gntlabel.c =================================================================== --- trunk/console/libgnt/gntlabel.c 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/gntlabel.c 2006-07-19 07:12:59 UTC (rev 16520) @@ -126,3 +126,16 @@ return widget; } +void gnt_label_set_text(GntLabel *label, const char *text) +{ + g_free(label->text); + label->text = g_strdup(text); + + if (GNT_WIDGET(label)->window) + { + gnt_widget_hide(GNT_WIDGET(label)); + gnt_label_size_request(GNT_WIDGET(label)); + gnt_widget_draw(GNT_WIDGET(label)); + } +} + Modified: trunk/console/libgnt/gntlabel.h =================================================================== --- trunk/console/libgnt/gntlabel.h 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/gntlabel.h 2006-07-19 07:12:59 UTC (rev 16520) @@ -46,6 +46,8 @@ GntWidget *gnt_label_new_with_format(const char *text, GntTextFormatFlags flags); +void gnt_label_set_text(GntLabel *label, const char *text); + G_END_DECLS #endif /* GNT_LABEL_H */ Modified: trunk/console/libgnt/gntline.h =================================================================== --- trunk/console/libgnt/gntline.h 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/gntline.h 2006-07-19 07:12:59 UTC (rev 16520) @@ -42,6 +42,9 @@ GType gnt_line_get_gtype(void); +#define gnt_hline_new() gnt_line_new(FALSE) +#define gnt_vline_new() gnt_line_new(TRUE) + GntWidget *gnt_line_new(gboolean vertical); G_END_DECLS Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/gntmain.c 2006-07-19 07:12:59 UTC (rev 16520) @@ -258,14 +258,16 @@ { GntBox *box = GNT_BOX(iter->data); - gnt_tree_add_row_after(GNT_TREE(tree), box, box->title, NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), box, + gnt_tree_create_row(GNT_TREE(tree), box->title), NULL, NULL); update_window_in_list(GNT_WIDGET(box)); } gnt_tree_set_selected(GNT_TREE(tree), focus_list->data); gnt_box_add_widget(GNT_BOX(win), tree); - gnt_widget_set_size(tree, getmaxx(stdscr) / 3, getmaxy(stdscr) / 2); + gnt_tree_set_col_width(GNT_TREE(tree), 0, getmaxx(stdscr) / 3); + gnt_widget_set_size(tree, 0, getmaxy(stdscr) / 2); gnt_widget_set_position(win, getmaxx(stdscr) / 3, getmaxy(stdscr) / 4); lock_focus_list = 1; @@ -539,7 +541,6 @@ ascii_only = TRUE; initscr(); - start_color(); gnt_init_colors(); X_MIN = 0; @@ -602,7 +603,8 @@ && GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_CAN_TAKE_FOCUS)) { gnt_tree_add_row_after(GNT_TREE(window_list.tree), widget, - GNT_BOX(widget)->title, NULL, NULL); + gnt_tree_create_row(GNT_TREE(window_list.tree), GNT_BOX(widget)->title), + NULL, NULL); update_window_in_list(widget); } } @@ -692,6 +694,7 @@ void gnt_quit() { + gnt_uninit_colors(); endwin(); } Modified: trunk/console/libgnt/gnttextview.h =================================================================== --- trunk/console/libgnt/gnttextview.h 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/gnttextview.h 2006-07-19 07:12:59 UTC (rev 16520) @@ -30,6 +30,7 @@ typedef enum { + GNT_TEXT_FLAG_NORMAL = 0, GNT_TEXT_FLAG_BOLD = 1 << 0, GNT_TEXT_FLAG_UNDERLINE = 1 << 1, GNT_TEXT_FLAG_BLINK = 1 << 2, Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/gnttree.c 2006-07-19 07:12:59 UTC (rev 16520) @@ -18,7 +18,6 @@ struct _GnTreeRow { void *key; - char *text; void *data; /* XXX: unused */ gboolean collapsed; @@ -31,8 +30,16 @@ GntTreeRow *child; GntTreeRow *next; GntTreeRow *prev; + + GList *columns; }; +struct _GnTreeCol +{ + char *text; + int span; /* How many columns does it span? */ +}; + static GntWidgetClass *parent_class = NULL; static guint signals[SIGS] = { 0 }; @@ -151,6 +158,83 @@ return (hb - ha); } +static int +find_depth(GntTreeRow *row) +{ + int dep = -1; + + while (row) + { + dep++; + row = row->parent; + } + + return dep; +} + +static char * +update_row_text(GntTree *tree, GntTreeRow *row) +{ + GString *string = g_string_new(NULL); + GList *iter; + int i; + + for (i = 0, iter = row->columns; i < tree->ncol && iter; i++, iter = iter->next) + { + GntTreeCol *col = iter->data; + char *text; + int len = g_utf8_strlen(col->text, -1); + int fl = 0; + gboolean ell = FALSE; + + if (i == 0) + { + if (row->choice) + { + g_string_append_printf(string, "[%c] ", + row->isselected ? 'X' : ' '); + fl = 4; + } + else if (row->parent == NULL && row->child) + { + if (row->collapsed) + { + string = g_string_append(string, "+ "); + } + else + { + string = g_string_append(string, "- "); + } + fl = 2; + } + else + { + fl = TAB_SIZE * find_depth(row); + g_string_append_printf(string, "%*s", fl, ""); + } + len += fl; + } + else + g_string_append_c(string, '|'); + + if (len > tree->columns[i].width) + { + len = tree->columns[i].width; + ell = TRUE; + } + + text = g_utf8_offset_to_pointer(col->text, len - fl - ell); + string = g_string_append_len(string, col->text, text - col->text); + if (len < tree->columns[i].width) + g_string_append_printf(string, "%*s", tree->columns[i].width - len, ""); + else if (ell) + { + g_string_append_unichar(string, (gunichar)2026); + } + } + return g_string_free(string, FALSE); +} + static void redraw_tree(GntTree *tree) { @@ -158,7 +242,6 @@ GntWidget *widget = GNT_WIDGET(tree); GntTreeRow *row; int pos; - gboolean deep; if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) pos = 0; @@ -172,37 +255,18 @@ wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); - deep = TRUE; row = tree->top; for (start = pos; row && start < widget->priv.height - pos; start++, row = get_next(row)) { - char str[2048]; + char *str; int wr; - char format[16] = ""; GntTextFormatFlags flags = row->flags; int attr = 0; - deep = TRUE; + str = update_row_text(tree, row); - if (row->parent == NULL && row->child) - { - if (row->collapsed) - { - strcpy(format, "+ "); - deep = FALSE; - } - else - strcpy(format, "- "); - } - else if (row->choice) - { - g_snprintf(format, sizeof(format) - 1, "[%c] ", row->isselected ? 'X' : ' '); - } - - g_snprintf(str, sizeof(str) - 1, "%s%s", format, row->text); - if ((wr = g_utf8_strlen(str, -1)) >= widget->priv.width - 1 - pos) { /* XXX: ellipsize */ @@ -238,6 +302,7 @@ mvwprintw(widget->window, start, pos, str); whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1)); tree->bottom = row; + g_free(str); } wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); @@ -267,7 +332,13 @@ if (widget->priv.height == 0) widget->priv.height = 10; /* XXX: Why?! */ if (widget->priv.width == 0) - widget->priv.width = 20; /* YYY: 'cuz ... */ + { + GntTree *tree = GNT_TREE(widget); + int i, width = 0; + for (i = 0; i < tree->ncol; i++) + width += tree->columns[i].width; + widget->priv.width = width + i; + } } static void @@ -437,6 +508,15 @@ } static void +free_tree_col(gpointer data) +{ + GntTreeCol *col = data; + + g_free(col->text); + g_free(col); +} + +static void free_tree_row(gpointer data) { GntTreeRow *row = data; @@ -444,20 +524,14 @@ if (!row) return; - g_free(row->text); + g_list_foreach(row->columns, (GFunc)free_tree_col, NULL); + g_list_free(row->columns); g_free(row); } GntWidget *gnt_tree_new() { - GntWidget *widget = g_object_new(GNT_TYPE_TREE, NULL); - GntTree *tree = GNT_TREE(widget); - - tree->hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_tree_row); - GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_SHADOW); - gnt_widget_set_take_focus(widget, TRUE); - - return widget; + return gnt_tree_new_with_columns(1); } void gnt_tree_set_visible_rows(GntTree *tree, int rows) @@ -500,24 +574,10 @@ g_signal_emit(tree, signals[SIG_SCROLLED], 0, count); } -static int -find_depth(GntTreeRow *row) +GntTreeRow *gnt_tree_add_row_after(GntTree *tree, void *key, GntTreeRow *row, void *parent, void *bigbro) { - int dep = -1; + GntTreeRow *pr = NULL; - while (row) - { - dep++; - row = row->parent; - } - - return dep; -} - -GntTreeRow *gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro) -{ - GntTreeRow *row = g_new0(GntTreeRow, 1), *pr = NULL; - g_hash_table_replace(tree->hash, key, row); if (tree->root == NULL) @@ -575,7 +635,6 @@ } row->key = key; - row->text = g_strdup_printf("%*s%s", TAB_SIZE * find_depth(row), "", text); row->data = NULL; if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_MAPPED)) @@ -591,10 +650,10 @@ return NULL; } -const char *gnt_tree_get_selection_text(GntTree *tree) +char *gnt_tree_get_selection_text(GntTree *tree) { if (tree->current) - return tree->current->text; + update_row_text(tree, tree->current); return NULL; } @@ -657,27 +716,32 @@ !!(GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_NO_BORDER)); } -void gnt_tree_change_text(GntTree *tree, gpointer key, const char *text) +void gnt_tree_change_text(GntTree *tree, gpointer key, int colno, const char *text) { - GntTreeRow *row = g_hash_table_lookup(tree->hash, key); + GntTreeRow *row; + GntTreeCol *col; + + g_return_if_fail(colno < tree->ncol); + + row = g_hash_table_lookup(tree->hash, key); if (row) { - g_free(row->text); - row->text = g_strdup_printf("%*s%s", TAB_SIZE * find_depth(row), "", text); + col = g_list_nth_data(row->columns, colno); + g_free(col->text); + col->text = g_strdup(text); if (get_distance(tree->top, row) >= 0 && get_distance(row, tree->bottom) > 0) redraw_tree(tree); } } -GntTreeRow *gnt_tree_add_choice(GntTree *tree, void *key, const char *text, void *parent, void *bigbro) +GntTreeRow *gnt_tree_add_choice(GntTree *tree, void *key, GntTreeRow *row, void *parent, void *bigbro) { - GntTreeRow *row; - - row = g_hash_table_lookup(tree->hash, key); - g_return_val_if_fail(!row || !row->choice, NULL); + GntTreeRow *r; + r = g_hash_table_lookup(tree->hash, key); + g_return_val_if_fail(!r || !r->choice, NULL); - row = gnt_tree_add_row_after(tree, key, text, parent, bigbro); + row = gnt_tree_add_row_after(tree, key, row, parent, bigbro); row->choice = TRUE; return row; @@ -737,3 +801,49 @@ redraw_tree(tree); } +GntWidget *gnt_tree_new_with_columns(int col) +{ + GntWidget *widget = g_object_new(GNT_TYPE_TREE, NULL); + GntTree *tree = GNT_TREE(widget); + + tree->hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_tree_row); + tree->ncol = col; + tree->columns = g_new0(struct _GntTreeColInfo, col); + while (col--) + { + tree->columns[col].width = 15; + } + + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_SHADOW); + gnt_widget_set_take_focus(widget, TRUE); + + return widget; +} + +GntTreeRow *gnt_tree_create_row(GntTree *tree, ...) +{ + GntTreeRow *row = g_new0(GntTreeRow, 1); + int i; + va_list args; + + va_start(args, tree); + + for (i = 0; i < tree->ncol; i++) + { + GntTreeCol *col = g_new0(GntTreeCol, 1); + col->span = 1; + col->text = g_strdup(va_arg(args, const char *)); + + row->columns = g_list_append(row->columns, col); + } + + return row; +} + +void gnt_tree_set_col_width(GntTree *tree, int col, int width) +{ + g_return_if_fail(col < tree->ncol); + + tree->columns[col].width = width; +} + Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/gnttree.h 2006-07-19 07:12:59 UTC (rev 16520) @@ -23,20 +23,28 @@ typedef struct _GnTreeClass GntTreeClass; typedef struct _GnTreeRow GntTreeRow; +typedef struct _GnTreeCol GntTreeCol; struct _GnTree { GntWidget parent; - GntTreeRow *current; /* current selection */ + GntTreeRow *current; /* current selection */ - GntTreeRow *top; /* The topmost visible item */ - GntTreeRow *bottom; /* The bottommost visible item */ + GntTreeRow *top; /* The topmost visible item */ + GntTreeRow *bottom; /* The bottommost visible item */ - GntTreeRow *root; /* The root of all evil */ + GntTreeRow *root; /* The root of all evil */ - GList *list; /* List of GntTreeRow s */ - GHashTable *hash; /* XXX: We may need this for quickly referencing the rows */ + GList *list; /* List of GntTreeRow s */ + GHashTable *hash; /* XXX: We may need this for quickly referencing the rows */ + + int ncol; /* No. of columns */ + struct _GntTreeColInfo + { + int width; + int *name; + } *columns; /* Would a GList be better? */ }; struct _GnTreeClass @@ -55,28 +63,30 @@ GType gnt_tree_get_gtype(void); -GntWidget *gnt_tree_new(); +GntWidget *gnt_tree_new(); /* A tree with just one column */ +GntWidget *gnt_tree_new_with_columns(int columns); + void gnt_tree_set_visible_rows(GntTree *tree, int rows); int gnt_tree_get_visible_rows(GntTree *tree); void gnt_tree_scroll(GntTree *tree, int count); -GntTreeRow *gnt_tree_add_row_after(GntTree *tree, void *key, const char *text, void *parent, void *bigbro); +GntTreeRow *gnt_tree_add_row_after(GntTree *tree, void *key, GntTreeRow *row, void *parent, void *bigbro); gpointer gnt_tree_get_selection_data(GntTree *tree); -const char *gnt_tree_get_selection_text(GntTree *tree); +char *gnt_tree_get_selection_text(GntTree *tree); void gnt_tree_remove(GntTree *tree, gpointer key); /* Returns the visible line number of the selected row */ int gnt_tree_get_selection_visible_line(GntTree *tree); -void gnt_tree_change_text(GntTree *tree, gpointer key, const char *text); +void gnt_tree_change_text(GntTree *tree, gpointer key, int colno, const char *text); -GntTreeRow *gnt_tree_add_choice(GntTree *tree, void *key, const char *text, void *parent, void *bigbro); +GntTreeRow *gnt_tree_add_choice(GntTree *tree, void *key, GntTreeRow *row, void *parent, void *bigbro); void gnt_tree_set_choice(GntTree *tree, void *key, gboolean set); @@ -86,6 +96,10 @@ void gnt_tree_set_selected(GntTree *tree , void *key); +GntTreeRow *gnt_tree_create_row(GntTree *tree, ...); + +void gnt_tree_set_col_width(GntTree *tree, int col, int width); + G_END_DECLS #endif /* GNT_TREE_H */ Modified: trunk/console/libgnt/test/focus.c =================================================================== --- trunk/console/libgnt/test/focus.c 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/test/focus.c 2006-07-19 07:12:59 UTC (rev 16520) @@ -48,11 +48,11 @@ gnt_box_add_widget(GNT_BOX(box), tree); gnt_box_add_widget(GNT_BOX(hbox), box); - gnt_tree_add_row_after(GNT_TREE(tree), "a", "a", NULL, NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "c", "c", NULL, NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "d", "d", NULL, NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "e", "e", "a", NULL); - gnt_tree_add_choice(GNT_TREE(tree), "b", "b", "d", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "a", gnt_tree_create_row(GNT_TREE(tree), "a"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "c", gnt_tree_create_row(GNT_TREE(tree), "c"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "d", gnt_tree_create_row(GNT_TREE(tree), "d"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "e", gnt_tree_create_row(GNT_TREE(tree), "e"), "a", NULL); + gnt_tree_add_choice(GNT_TREE(tree), "b", gnt_tree_create_row(GNT_TREE(tree), "b"), "d", NULL); GNT_WIDGET_UNSET_FLAGS(hbox, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); gnt_box_set_title(GNT_BOX(hbox), "This is the title …"); Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/test/multiwin.c 2006-07-19 07:12:59 UTC (rev 16520) @@ -43,19 +43,19 @@ gnt_widget_set_position(box2, 35, 15); gnt_widget_show(box2); - gnt_tree_add_row_after(GNT_TREE(tree), "a", "a", NULL, NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "c", "c", NULL, NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "d", "d", NULL, NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "e", "e", "a", NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "b", "b", "d", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "a", gnt_tree_create_row(GNT_TREE(tree), "a"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "c", gnt_tree_create_row(GNT_TREE(tree), "c"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "d", gnt_tree_create_row(GNT_TREE(tree), "d"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "e", gnt_tree_create_row(GNT_TREE(tree), "e"), "a", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "b", gnt_tree_create_row(GNT_TREE(tree), "b"), "d", NULL); - gnt_tree_add_choice(GNT_TREE(tree), "1", "1", NULL, NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "2", "2", NULL, NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "3", "3", NULL, NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "4", "4", "a", NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "5", "5", "d", NULL); + gnt_tree_add_choice(GNT_TREE(tree), "1", gnt_tree_create_row(GNT_TREE(tree), "1"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "2", gnt_tree_create_row(GNT_TREE(tree), "2"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "3", gnt_tree_create_row(GNT_TREE(tree), "3"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "4", gnt_tree_create_row(GNT_TREE(tree), "4"), "a", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "5", gnt_tree_create_row(GNT_TREE(tree), "5"), "d", NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "6", "6", "4", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "6", gnt_tree_create_row(GNT_TREE(tree), "6"), "4", NULL); gnt_tree_set_row_flags(GNT_TREE(tree), "e", GNT_TEXT_FLAG_DIM); Modified: trunk/console/libgnt/test/wm.c =================================================================== --- trunk/console/libgnt/test/wm.c 2006-07-19 06:47:26 UTC (rev 16519) +++ trunk/console/libgnt/test/wm.c 2006-07-19 07:12:59 UTC (rev 16520) @@ -20,8 +20,9 @@ handle = g_module_open(cmd, G_MODULE_BIND_LOCAL); if (handle && g_module_symbol(handle, "main", (gpointer)&func)) { + char *argv[] = {cmd, NULL}; gnt_entry_clear(entry); - func(); + func(1, argv); } else { @@ -29,6 +30,7 @@ gnt_box_set_toplevel(GNT_BOX(widget), TRUE); gnt_box_set_title(GNT_BOX(widget), "Error"); gnt_box_add_widget(GNT_BOX(widget), gnt_label_new("Could not execute.")); + gnt_box_add_widget(GNT_BOX(widget), gnt_label_new(g_module_error())); gnt_widget_show(widget); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-19 23:52:07
|
Revision: 16522 Author: sadrul Date: 2006-07-19 16:52:01 -0700 (Wed, 19 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16522&view=rev Log Message: ----------- Enable the commands (prefixed with /) in conversations. Modified Paths: -------------- trunk/console/Makefile trunk/console/gntconv.c trunk/console/gntgaim.c trunk/console/gntui.c Modified: trunk/console/Makefile =================================================================== --- trunk/console/Makefile 2006-07-19 20:14:58 UTC (rev 16521) +++ trunk/console/Makefile 2006-07-19 23:52:01 UTC (rev 16522) @@ -1,6 +1,6 @@ VERSION=gntgaim-0.0.0dev CC=gcc -CFLAGS=`pkg-config --cflags gaim gobject-2.0 gnt` -g -Wall -DVERSION=\"$(VERSION)\" +CFLAGS=`pkg-config --cflags gaim gobject-2.0 gnt` -g -Wall -DVERSION=\"$(VERSION)\" -DSTANDALONE LDFLAGS=`pkg-config --libs gaim gobject-2.0 libxml-2.0 gnt` -pg GG_SOURCES = \ Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-19 20:14:58 UTC (rev 16521) +++ trunk/console/gntconv.c 2006-07-19 23:52:01 UTC (rev 16522) @@ -1,4 +1,6 @@ #include <string.h> + +#include <cmds.h> #include <util.h> #include "gntgaim.h" @@ -49,12 +51,53 @@ const char *text = gnt_entry_get_text(GNT_ENTRY(ggconv->entry)); if (*text == '/') { - /* XXX: Need to check for /-commands here */ + GaimConversation *conv = ggconv->conv; + GaimCmdStatus status; + const char *cmdline = text + 1; + char *error = NULL, *escape; + + escape = g_markup_escape_text(cmdline, -1); + status = gaim_cmd_do_command(conv, cmdline, escape, &error); + g_free(escape); + + switch (status) + { + case GAIM_CMD_STATUS_OK: + break; + case GAIM_CMD_STATUS_NOT_FOUND: + gaim_conversation_write(conv, "", _("No such command."), + GAIM_MESSAGE_NO_LOG, time(NULL)); + break; + case GAIM_CMD_STATUS_WRONG_ARGS: + gaim_conversation_write(conv, "", _("Syntax Error: You typed the wrong number of arguments " + "to that command."), + GAIM_MESSAGE_NO_LOG, time(NULL)); + break; + case GAIM_CMD_STATUS_FAILED: + gaim_conversation_write(conv, "", error ? error : _("Your command failed for an unknown reason."), + GAIM_MESSAGE_NO_LOG, time(NULL)); + break; + case GAIM_CMD_STATUS_WRONG_TYPE: + if(gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) + gaim_conversation_write(conv, "", _("That command only works in chats, not IMs."), + GAIM_MESSAGE_NO_LOG, time(NULL)); + else + gaim_conversation_write(conv, "", _("That command only works in IMs, not chats."), + GAIM_MESSAGE_NO_LOG, time(NULL)); + break; + case GAIM_CMD_STATUS_WRONG_PRPL: + gaim_conversation_write(conv, "", _("That command doesn't work on this protocol."), + GAIM_MESSAGE_NO_LOG, time(NULL)); + break; + } + g_free(error); +#if 0 gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), _("Commands are not supported yet. Message was NOT sent."), GNT_TEXT_FLAG_DIM | GNT_TEXT_FLAG_UNDERLINE); gnt_text_view_next_line(GNT_TEXT_VIEW(ggconv->tv)); gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 0); +#endif } else { Modified: trunk/console/gntgaim.c =================================================================== --- trunk/console/gntgaim.c 2006-07-19 20:14:58 UTC (rev 16521) +++ trunk/console/gntgaim.c 2006-07-19 23:52:01 UTC (rev 16522) @@ -299,8 +299,9 @@ /* Initialize and run the UI */ init_gnt_ui(); - +#ifdef STANDALONE gaim_core_quit(); +#endif return 0; } Modified: trunk/console/gntui.c =================================================================== --- trunk/console/gntui.c 2006-07-19 20:14:58 UTC (rev 16521) +++ trunk/console/gntui.c 2006-07-19 23:52:01 UTC (rev 16522) @@ -8,8 +8,9 @@ void init_gnt_ui() { +#ifdef STANDALONE gnt_init(); - +#endif /* Accounts */ gg_accounts_init(); gaim_accounts_set_ui_ops(gg_accounts_get_ui_ops()); @@ -30,6 +31,7 @@ gg_notify_init(); gaim_notify_set_ui_ops(gg_notify_get_ui_ops()); +#ifdef STANDALONE gnt_main(); gaim_accounts_set_ui_ops(NULL); @@ -48,5 +50,6 @@ gg_notify_uninit(); gnt_quit(); +#endif } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |