From: <sa...@us...> - 2006-07-20 17:38:22
|
Revision: 16529 Author: sadrul Date: 2006-07-20 10:38:09 -0700 (Thu, 20 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16529&view=rev Log Message: ----------- Make multi-column trees look nice. Show the list of users in a chat-room after you join. Add some commands (eg. /me, /help etc., all Xeroxed from gtkconv.c) Modified Paths: -------------- trunk/console/gntconv.c trunk/console/gntnotify.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/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-20 13:04:35 UTC (rev 16528) +++ trunk/console/gntconv.c 2006-07-20 17:38:09 UTC (rev 16529) @@ -245,11 +245,12 @@ { if (flags & GAIM_MESSAGE_SEND) { - who = gaim_connection_get_display_name(conv->account->gc); + GaimAccount *account = gaim_conversation_get_account(conv); + who = gaim_connection_get_display_name(gaim_account_get_connection(account)); if (!who) - who = gaim_account_get_alias(conv->account); + who = gaim_account_get_alias(account); if (!who) - who = gaim_account_get_username(conv->account); + who = gaim_account_get_username(account); } else if (flags & GAIM_MESSAGE_RECV) who = gaim_conversation_get_name(conv); @@ -273,20 +274,48 @@ } static void -gg_chat_add_users(GaimConversation *conv, GList *users, GList *flags, GList *aliases, gboolean new_arrivals) -{} +gg_chat_add_users(GaimConversation *conv, GList *users, gboolean new_arrivals) +{ + if (!new_arrivals) + { + /* Print the list of users in the room */ + GString *string = g_string_new(_("List of users:\n")); + GList *iter; + for (iter = users; iter; iter = iter->next) + { + GaimConvChatBuddy *cbuddy = iter->data; + char *str; + + if ((str = cbuddy->alias) == NULL) + str = cbuddy->name; + g_string_append_printf(string, "[ %s ]", str); + } + + gaim_conversation_write(conv, NULL, string->str, + GAIM_MESSAGE_SYSTEM, time(NULL)); + g_string_free(string, TRUE); + } + /* XXX: Add the names for string completion */ +} + static void gg_chat_rename_user(GaimConversation *conv, const char *old, const char *new_n, const char *new_a) -{} +{ + /* XXX: Update the name for string completion */ +} static void gg_chat_remove_user(GaimConversation *conv, GList *list) -{} +{ + /* XXX: Remove the name from string completion */ +} static void gg_chat_update_user(GaimConversation *conv, const char *user) -{} +{ + /* XXX: This probably will not require updating the string completion */ +} static GaimConversationUiOps conv_ui_ops = { @@ -309,9 +338,9 @@ static void destroy_ggconv(gpointer data) { - GGConv *conv = data; - gnt_widget_destroy(conv->window); - g_free(conv); + GGConv *ggconv = data; + gnt_widget_destroy(ggconv->window); + g_free(ggconv); } GaimConversationUiOps *gg_conv_get_ui_ops() @@ -319,10 +348,132 @@ return &conv_ui_ops; } +/* Xerox */ +static GaimCmdRet +say_command_cb(GaimConversation *conv, + const char *cmd, char **args, char **error, void *data) +{ + if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) + gaim_conv_im_send(GAIM_CONV_IM(conv), args[0]); + else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) + gaim_conv_chat_send(GAIM_CONV_CHAT(conv), args[0]); + return GAIM_CMD_RET_OK; +} + +/* Xerox */ +static GaimCmdRet +me_command_cb(GaimConversation *conv, + const char *cmd, char **args, char **error, void *data) +{ + char *tmp; + + tmp = g_strdup_printf("/me %s", args[0]); + + if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) + gaim_conv_im_send(GAIM_CONV_IM(conv), tmp); + else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) + gaim_conv_chat_send(GAIM_CONV_CHAT(conv), tmp); + + g_free(tmp); + return GAIM_CMD_RET_OK; +} + +/* Xerox */ +static GaimCmdRet +debug_command_cb(GaimConversation *conv, + const char *cmd, char **args, char **error, void *data) +{ + char *tmp, *markup; + GaimCmdStatus status; + + if (!g_ascii_strcasecmp(args[0], "version")) { + tmp = g_strdup_printf("me is using %s.", VERSION); + markup = g_markup_escape_text(tmp, -1); + + status = gaim_cmd_do_command(conv, tmp, markup, error); + + g_free(tmp); + g_free(markup); + return status; + } else { + gaim_conversation_write(conv, NULL, _("Supported debug options are: version"), + GAIM_MESSAGE_NO_LOG|GAIM_MESSAGE_ERROR, time(NULL)); + return GAIM_CMD_STATUS_OK; + } +} + +/* Xerox */ +static GaimCmdRet +clear_command_cb(GaimConversation *conv, + const char *cmd, char **args, char **error, void *data) +{ + GGConv *ggconv = conv->ui_data; + gnt_text_view_clear(GNT_TEXT_VIEW(ggconv->tv)); + return GAIM_CMD_STATUS_OK; +} + +/* Xerox */ +static GaimCmdRet +help_command_cb(GaimConversation *conv, + const char *cmd, char **args, char **error, void *data) +{ + GList *l, *text; + GString *s; + + if (args[0] != NULL) { + s = g_string_new(""); + text = gaim_cmd_help(conv, args[0]); + + if (text) { + for (l = text; l; l = l->next) + if (l->next) + g_string_append_printf(s, "%s\n", (char *)l->data); + else + g_string_append_printf(s, "%s", (char *)l->data); + } else { + g_string_append(s, _("No such command (in this context).")); + } + } else { + s = g_string_new(_("Use \"/help <command>\" for help on a specific command.\n" + "The following commands are available in this context:\n")); + + text = gaim_cmd_list(conv); + for (l = text; l; l = l->next) + if (l->next) + g_string_append_printf(s, "%s, ", (char *)l->data); + else + g_string_append_printf(s, "%s.", (char *)l->data); + g_list_free(text); + } + + gaim_conversation_write(conv, NULL, s->str, GAIM_MESSAGE_NO_LOG, time(NULL)); + g_string_free(s, TRUE); + + return GAIM_CMD_STATUS_OK; +} + + void gg_conversation_init() { ggconvs = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, destroy_ggconv); + + /* Xerox */ + gaim_cmd_register("say", "S", GAIM_CMD_P_DEFAULT, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, + say_command_cb, _("say <message>: Send a message normally as if you weren't using a command."), NULL); + gaim_cmd_register("me", "S", GAIM_CMD_P_DEFAULT, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, + me_command_cb, _("me <action>: Send an IRC style action to a buddy or chat."), NULL); + gaim_cmd_register("debug", "w", GAIM_CMD_P_DEFAULT, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, + debug_command_cb, _("debug <option>: Send various debug information to the current conversation."), NULL); + gaim_cmd_register("clear", "", GAIM_CMD_P_DEFAULT, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, + clear_command_cb, _("clear: Clears the conversation scrollback."), NULL); + gaim_cmd_register("help", "w", GAIM_CMD_P_DEFAULT, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, NULL, + help_command_cb, _("help <command>: Help on a specific command."), NULL); } void gg_conversation_uninit() Modified: trunk/console/gntnotify.c =================================================================== --- trunk/console/gntnotify.c 2006-07-20 13:04:35 UTC (rev 16528) +++ trunk/console/gntnotify.c 2006-07-20 17:38:09 UTC (rev 16529) @@ -104,6 +104,8 @@ gnt_label_new_with_format(_("You have mail!"), GNT_TEXT_FLAG_BOLD)); emaildialog.tree = tree = gnt_tree_new_with_columns(3); + gnt_tree_set_column_titles(GNT_TREE(tree), _("Account"), _("From"), _("Subject")); + gnt_tree_set_show_title(GNT_TREE(tree), TRUE); 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); @@ -141,7 +143,7 @@ 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), + tos ? *tos : gaim_account_get_username(account), /* XXX: Perhaps add the prpl-name */ froms ? *froms : "[Unknown sender]", *subjects), NULL, NULL); Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-07-20 13:04:35 UTC (rev 16528) +++ trunk/console/libgnt/gnttextview.c 2006-07-20 17:38:09 UTC (rev 16529) @@ -271,3 +271,18 @@ return fl; } +void gnt_text_view_clear(GntTextView *view) +{ + GntTextLine *line; + + g_list_foreach(view->list, free_text_line, NULL); + g_list_free(view->list); + view->list = NULL; + + line = g_new0(GntTextLine, 1); + view->list = g_list_append(view->list, line); + + if (GNT_WIDGET(view)->window) + gnt_widget_draw(GNT_WIDGET(view)); +} + Modified: trunk/console/libgnt/gnttextview.h =================================================================== --- trunk/console/libgnt/gnttextview.h 2006-07-20 13:04:35 UTC (rev 16528) +++ trunk/console/libgnt/gnttextview.h 2006-07-20 17:38:09 UTC (rev 16529) @@ -67,6 +67,8 @@ chtype gnt_text_format_flag_to_chtype(GntTextFormatFlags flags); +void gnt_text_view_clear(GntTextView *view); + G_END_DECLS #endif /* GNT_TEXT_VIEW_H */ Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-20 13:04:35 UTC (rev 16528) +++ trunk/console/libgnt/gnttree.c 2006-07-20 17:38:09 UTC (rev 16529) @@ -185,7 +185,6 @@ char *text; int len = g_utf8_strlen(col->text, -1); int fl = 0; - gboolean ell = FALSE; if (i == 0) { @@ -220,22 +219,31 @@ if (len > tree->columns[i].width) { len = tree->columns[i].width; - ell = TRUE; } - text = g_utf8_offset_to_pointer(col->text, len - fl - ell); + text = g_utf8_offset_to_pointer(col->text, len - fl); 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 +tree_mark_columns(GntTree *tree, int pos, int y, chtype type) +{ + GntWidget *widget = GNT_WIDGET(tree); + int i; + int x = pos; + + for (i = 0; i < tree->ncol - 1; i++) + { + x += tree->columns[i].width; + mvwaddch(widget->window, y, x + i, type); + } +} + +static void redraw_tree(GntTree *tree) { int start; @@ -255,8 +263,29 @@ wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); + start = 0; + if (tree->show_title) + { + int i; + int x = pos; + + mvwhline(widget->window, pos + 1, pos, ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL), + widget->priv.width - pos - 1); + + for (i = 0; i < tree->ncol; i++) + { + mvwprintw(widget->window, pos, x + i, tree->columns[i].title); + x += tree->columns[i].width; + } + if (pos) + tree_mark_columns(tree, pos, 0, ACS_TTEE | COLOR_PAIR(GNT_COLOR_NORMAL)); + tree_mark_columns(tree, pos, pos + 1, ACS_PLUS | COLOR_PAIR(GNT_COLOR_NORMAL)); + tree_mark_columns(tree, pos, pos, ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL)); + start = 2; + } + row = tree->top; - for (start = pos; row && start < widget->priv.height - pos; + for (start = start + pos; row && start < widget->priv.height - pos; start++, row = get_next(row)) { char *str; @@ -303,6 +332,7 @@ whline(widget->window, ' ', widget->priv.width - pos * 2 - g_utf8_strlen(str, -1)); tree->bottom = row; g_free(str); + tree_mark_columns(tree, pos, start, ACS_VLINE | attr); } wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); @@ -310,6 +340,7 @@ { mvwhline(widget->window, start, pos, ' ', widget->priv.width - pos * 2); + tree_mark_columns(tree, pos, start, ACS_VLINE); start++; } @@ -424,9 +455,16 @@ gnt_tree_destroy(GntWidget *widget) { GntTree *tree = GNT_TREE(widget); + int i; g_hash_table_destroy(tree->hash); g_list_free(tree->list); + + for (i = 0; i < tree->ncol; i++) + { + g_free(tree->columns[i].title); + } + g_free(tree->columns); } static void @@ -813,6 +851,7 @@ { tree->columns[col].width = 15; } + tree->show_title = FALSE; GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_SHADOW); gnt_widget_set_take_focus(widget, TRUE); @@ -836,6 +875,7 @@ row->columns = g_list_append(row->columns, col); } + va_end(args); return row; } @@ -847,3 +887,22 @@ tree->columns[col].width = width; } +void gnt_tree_set_column_titles(GntTree *tree, ...) +{ + int i; + va_list args; + + va_start(args, tree); + for (i = 0; i < tree->ncol; i++) + { + const char *title = va_arg(args, const char *); + tree->columns[i].title = g_strdup(title); + } + va_end(args); +} + +void gnt_tree_set_show_title(GntTree *tree, gboolean set) +{ + tree->show_title = set; +} + Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-07-20 13:04:35 UTC (rev 16528) +++ trunk/console/libgnt/gnttree.h 2006-07-20 17:38:09 UTC (rev 16529) @@ -37,14 +37,15 @@ 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 */ + GHashTable *hash; /* We need this for quickly referencing the rows */ int ncol; /* No. of columns */ struct _GntTreeColInfo { int width; - int *name; + char *title; } *columns; /* Would a GList be better? */ + gboolean show_title; }; struct _GnTreeClass @@ -100,6 +101,10 @@ void gnt_tree_set_col_width(GntTree *tree, int col, int width); +void gnt_tree_set_column_titles(GntTree *tree, ...); + +void gnt_tree_set_show_title(GntTree *tree, gboolean set); + G_END_DECLS #endif /* GNT_TREE_H */ Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-07-20 13:04:35 UTC (rev 16528) +++ trunk/console/libgnt/test/multiwin.c 2006-07-20 17:38:09 UTC (rev 16529) @@ -26,7 +26,9 @@ gnt_widget_set_name(hbox, "hbox"); gnt_widget_set_name(box2, "box2"); - tree = gnt_tree_new(); + tree = gnt_tree_new_with_columns(3); + gnt_tree_set_column_titles(GNT_TREE(tree), "12345678901234567890", "column 2", "column3"); + gnt_tree_set_show_title(GNT_TREE(tree), TRUE); gnt_widget_set_name(tree, "tree"); gnt_box_add_widget(GNT_BOX(hbox), tree); @@ -43,19 +45,21 @@ gnt_widget_set_position(box2, 35, 15); gnt_widget_show(box2); - 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_row_after(GNT_TREE(tree), "a", + gnt_tree_create_row(GNT_TREE(tree), "alaskdjfkashfashfah kfalkdhflsiafhlasf", " long text", "a2"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "c", + gnt_tree_create_row(GNT_TREE(tree), "casdgertqhyeqgasfeytwfga fg arf agfwa ", " long text", "a2"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "d", gnt_tree_create_row(GNT_TREE(tree), "d", " long text", "a2"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "e", gnt_tree_create_row(GNT_TREE(tree), "e", " long text", "a2"), "a", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "b", gnt_tree_create_row(GNT_TREE(tree), "b", "this is", "a2"), "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_choice(GNT_TREE(tree), "1", gnt_tree_create_row(GNT_TREE(tree), "1", " long text", "a2"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "2", gnt_tree_create_row(GNT_TREE(tree), "2", " long text", "a2"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "3", gnt_tree_create_row(GNT_TREE(tree), "3", " long text", "a2"), NULL, NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "4", gnt_tree_create_row(GNT_TREE(tree), "4", " long text", "a2"), "a", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "5", gnt_tree_create_row(GNT_TREE(tree), "5", " long text", "a2"), "d", NULL); - gnt_tree_add_row_after(GNT_TREE(tree), "6", gnt_tree_create_row(GNT_TREE(tree), "6"), "4", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "6", gnt_tree_create_row(GNT_TREE(tree), "6", " long text", "a2"), "4", NULL); gnt_tree_set_row_flags(GNT_TREE(tree), "e", GNT_TEXT_FLAG_DIM); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-23 01:10:22
|
Revision: 16540 Author: sadrul Date: 2006-07-22 18:10:06 -0700 (Sat, 22 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16540&view=rev Log Message: ----------- Complete the notify-ui. I have been unable to test the searchresult-ui. But "looks like" it will work. The accounts-ui is also mostly . I am yet to add the proxy-options. And you cannot still delete an account. That will happen after the request-ui is complete. The account-edit dialog needs some work, but it's usable. Added GntCheckBox, and add some features to some other gnt-widgets. Modified Paths: -------------- trunk/console/gntaccount.c trunk/console/gntaccount.h trunk/console/gntnotify.c trunk/console/libgnt/Makefile.am trunk/console/libgnt/gntbutton.c trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gntcombobox.h trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntentry.h trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h trunk/console/libgnt/gntwidget.c trunk/console/libgnt/test/combo.c Added Paths: ----------- trunk/console/libgnt/gntcheckbox.c trunk/console/libgnt/gntcheckbox.h Modified: trunk/console/gntaccount.c =================================================================== --- trunk/console/gntaccount.c 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/gntaccount.c 2006-07-23 01:10:06 UTC (rev 16540) @@ -1,6 +1,7 @@ #include <gnt.h> #include <gntbox.h> #include <gntbutton.h> +#include <gntcheckbox.h> #include <gntcombobox.h> #include <gntentry.h> #include <gntlabel.h> @@ -17,6 +18,8 @@ #include "gntaccount.h" #include "gntgaim.h" +#include <string.h> + typedef struct { GntWidget *window; @@ -38,17 +41,157 @@ GntWidget *splits; GList *split_entries; + + GList *prpl_entries; + GntWidget *prpls; + + GntWidget *newmail; + GntWidget *remember; } AccountEditDialog; static void +account_add(GaimAccount *account) +{ + gnt_tree_add_choice(GNT_TREE(accounts.tree), account, + 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)); +} + +static void edit_dialog_destroy(AccountEditDialog *dialog) { + g_list_free(dialog->prpl_entries); + g_list_free(dialog->split_entries); g_free(dialog); } static void save_account_cb(AccountEditDialog *dialog) { + GaimAccount *account; + GaimPlugin *plugin; + GaimPluginProtocolInfo *prplinfo; + const char *value; + GString *username; + + /* XXX: Do some error checking first. */ + + plugin = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(dialog->protocol)); + prplinfo = GAIM_PLUGIN_PROTOCOL_INFO(plugin); + + /* Screenname && user-splits */ + value = gnt_entry_get_text(GNT_ENTRY(dialog->screenname)); + + if (value == NULL || *value == '\0') + { + gaim_notify_error(NULL, _("Error"), _("Account was not added"), + _("Screenname of an account must be non-empty.")); + return; + } + + username = g_string_new(value); + + if (prplinfo != NULL) + { + GList *iter, *entries; + for (iter = prplinfo->user_splits, entries = dialog->split_entries; + iter && entries; iter = iter->next, entries = entries->next) + { + GaimAccountUserSplit *split = iter->data; + GntWidget *entry = entries->data; + + value = gnt_entry_get_text(GNT_ENTRY(entry)); + if (value == NULL || *value == '\0') + value = gaim_account_user_split_get_default_value(split); + g_string_append_printf(username, "%c%s", + gaim_account_user_split_get_separator(split), + value); + } + } + + if (dialog->account == NULL) + { + account = gaim_account_new(username->str, gaim_plugin_get_id(plugin)); + gaim_accounts_add(account); + } + else + { + account = dialog->account; + + /* Protocol */ + gaim_account_set_protocol_id(account, gaim_plugin_get_id(plugin)); + gaim_account_set_username(account, username->str); + } + g_string_free(username, TRUE); + + /* Alias */ + value = gnt_entry_get_text(GNT_ENTRY(dialog->alias)); + if (value && *value) + gaim_account_set_alias(account, value); + + /* Remember password and password */ + gaim_account_set_remember_password(account, + gnt_check_box_get_checked(GNT_CHECK_BOX(dialog->remember))); + value = gnt_entry_get_text(GNT_ENTRY(dialog->password)); + if (value && *value && gaim_account_get_remember_password(account)) + gaim_account_set_password(account, value); + else + gaim_account_set_password(account, NULL); + + /* Mail notification */ + /* XXX: Only if the protocol has anything to do with emails */ + gaim_account_set_check_mail(account, + gnt_check_box_get_checked(GNT_CHECK_BOX(dialog->newmail))); + + /* Protocol options */ + if (prplinfo) + { + GList *iter, *entries; + + for (iter = prplinfo->protocol_options, entries = dialog->prpl_entries; + iter && entries; iter = iter->next, entries = entries->next) + { + GaimAccountOption *option = iter->data; + GntWidget *entry = entries->data; + GaimPrefType type = gaim_account_option_get_type(option); + const char *setting = gaim_account_option_get_setting(option); + + if (type == GAIM_PREF_STRING) + { + const char *value = gnt_entry_get_text(GNT_ENTRY(entry)); + gaim_account_set_string(account, setting, value); + } + else if (type == GAIM_PREF_INT) + { + const char *str = gnt_entry_get_text(GNT_ENTRY(entry)); + int value = 0; + if (str) + value = atoi(str); + gaim_account_set_int(account, setting, value); + } + else if (type == GAIM_PREF_BOOLEAN) + { + gboolean value = gnt_check_box_get_checked(GNT_CHECK_BOX(entry)); + gaim_account_set_bool(account, setting, value); + } + else if (type == GAIM_PREF_STRING_LIST) + { + /* TODO: */ + } + else + { + g_assert_not_reached(); + } + } + } + + /* XXX: Proxy options */ + + gnt_widget_destroy(dialog->window); } static void @@ -57,7 +200,7 @@ GntWidget *hbox; GaimPlugin *plugin; GaimPluginProtocolInfo *prplinfo; - GList *iter; + GList *iter, *entries; char *username = NULL; if (dialog->splits) @@ -99,20 +242,180 @@ g_free(buf); } - /* XXX: Add default/custom values to the splits */ + for (iter = g_list_last(prplinfo->user_splits), entries = g_list_last(dialog->split_entries); + iter && entries; iter = iter->prev, entries = entries->prev) + { + GntWidget *entry = entries->data; + GaimAccountUserSplit *split = iter->data; + const char *value = NULL; + char *s; + + if (dialog->account) + { + s = strrchr(username, gaim_account_user_split_get_separator(split)); + if (s != NULL) + { + *s = '\0'; + s++; + value = s; + } + } + if (value == NULL) + value = gaim_account_user_split_get_default_value(split); + + if (value != NULL) + gnt_entry_set_text(GNT_ENTRY(entry), value); + } + + if (username != NULL) + gnt_entry_set_text(GNT_ENTRY(dialog->screenname), username); + g_free(username); } static void +add_protocol_options(AccountEditDialog *dialog) +{ + GaimPlugin *plugin; + GaimPluginProtocolInfo *prplinfo; + GList *iter; + GntWidget *vbox, *box; + GaimAccount *account; + + if (dialog->prpls) + gnt_box_remove_all(GNT_BOX(dialog->prpls)); + else + { + dialog->prpls = vbox = gnt_vbox_new(FALSE); + gnt_box_set_pad(GNT_BOX(vbox), 0); + gnt_box_set_alignment(GNT_BOX(vbox), GNT_ALIGN_LEFT); + gnt_box_set_fill(GNT_BOX(vbox), TRUE); + } + + if (dialog->prpl_entries) + { + g_list_free(dialog->prpl_entries); + dialog->prpl_entries = NULL; + } + + vbox = dialog->prpls; + + plugin = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(dialog->protocol)); + if (!plugin) + return; + + prplinfo = GAIM_PLUGIN_PROTOCOL_INFO(plugin); + + account = dialog->account; + + for (iter = prplinfo->protocol_options; iter; iter = iter->next) + { + GaimAccountOption *option = iter->data; + GaimPrefType type = gaim_account_option_get_type(option); + + box = gnt_hbox_new(TRUE); + gnt_box_set_pad(GNT_BOX(box), 0); + gnt_box_add_widget(GNT_BOX(vbox), box); + + if (type == GAIM_PREF_BOOLEAN) + { + GntWidget *widget = gnt_check_box_new(gaim_account_option_get_text(option)); + gnt_box_add_widget(GNT_BOX(box), widget); + dialog->prpl_entries = g_list_append(dialog->prpl_entries, widget); + + if (account) + gnt_check_box_set_checked(GNT_CHECK_BOX(widget), + gaim_account_get_bool(account, + gaim_account_option_get_setting(option), + gaim_account_option_get_default_bool(option))); + else + gnt_check_box_set_checked(GNT_CHECK_BOX(widget), + gaim_account_option_get_default_bool(option)); + } + else + { + gnt_box_add_widget(GNT_BOX(box), + gnt_label_new(gaim_account_option_get_text(option))); + + if (type == GAIM_PREF_STRING_LIST) + { + /* TODO: Use a combobox */ + /* Don't forget to append the widget to prpl_entries */ + } + else + { + GntWidget *entry = gnt_entry_new(NULL); + gnt_box_add_widget(GNT_BOX(box), entry); + dialog->prpl_entries = g_list_append(dialog->prpl_entries, entry); + + if (type == GAIM_PREF_STRING) + { + const char *dv = gaim_account_option_get_default_string(option); + + if (account) + gnt_entry_set_text(GNT_ENTRY(entry), + gaim_account_get_string(account, + gaim_account_option_get_setting(option), dv)); + else + gnt_entry_set_text(GNT_ENTRY(entry), dv); + } + else if (type == GAIM_PREF_INT) + { + char str[32]; + int value = gaim_account_option_get_default_int(option); + if (account) + value = gaim_account_get_int(account, + gaim_account_option_get_setting(option), value); + snprintf(str, sizeof(str), "%d", value); + gnt_entry_set_flag(GNT_ENTRY(entry), GNT_ENTRY_FLAG_INT); + gnt_entry_set_text(GNT_ENTRY(entry), str); + } + else + { + g_assert_not_reached(); + } + } + } + } +} + +static void +update_user_options(AccountEditDialog *dialog) +{ + GaimPlugin *plugin; + GaimPluginProtocolInfo *prplinfo; + + plugin = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(dialog->protocol)); + if (!plugin) + return; + + prplinfo = GAIM_PLUGIN_PROTOCOL_INFO(plugin); + + if (dialog->newmail == NULL) + dialog->newmail = gnt_check_box_new(_("New mail notifications")); + if (dialog->account) + gnt_check_box_set_checked(GNT_CHECK_BOX(dialog->newmail), + gaim_account_get_check_mail(dialog->account)); + + if (dialog->remember == NULL) + dialog->remember = gnt_check_box_new(_("Remember password")); + if (dialog->account) + gnt_check_box_set_checked(GNT_CHECK_BOX(dialog->remember), + gaim_account_get_remember_password(dialog->account)); +} + +static void prpl_changed_cb(GntWidget *combo, GaimPlugin *old, GaimPlugin *new, AccountEditDialog *dialog) { update_user_splits(dialog); + add_protocol_options(dialog); + update_user_options(dialog); /* This may not be necessary here */ gnt_box_readjust(GNT_BOX(dialog->window)); gnt_widget_draw(dialog->window); } static void -add_account(GntWidget *b, gpointer null) +edit_account(GaimAccount *account) { GntWidget *window, *hbox; GntWidget *combo, *button, *entry; @@ -122,8 +425,9 @@ dialog = g_new0(AccountEditDialog, 1); dialog->window = window = gnt_box_new(FALSE, TRUE); + dialog->account = account; gnt_box_set_toplevel(GNT_BOX(window), TRUE); - gnt_box_set_title(GNT_BOX(window), _("New Account")); + gnt_box_set_title(GNT_BOX(window), account ? _("Modify Account") : _("New Account")); gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); gnt_box_set_pad(GNT_BOX(window), 0); @@ -138,6 +442,12 @@ gnt_combo_box_add_data(GNT_COMBO_BOX(combo), iter->data, ((GaimPlugin*)iter->data)->info->name); } + if (account) + gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), + gaim_plugins_find_with_id(gaim_account_get_protocol_id(account))); + else + gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), list->data); + 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); @@ -157,8 +467,11 @@ gnt_box_add_widget(GNT_BOX(window), hbox); dialog->password = entry = gnt_entry_new(NULL); + gnt_entry_set_masked(GNT_ENTRY(entry), TRUE); gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(_("Password:"))); gnt_box_add_widget(GNT_BOX(hbox), entry); + if (account) + gnt_entry_set_text(GNT_ENTRY(entry), gaim_account_get_password(account)); hbox = gnt_box_new(TRUE, FALSE); gnt_box_add_widget(GNT_BOX(window), hbox); @@ -166,9 +479,23 @@ 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); + if (account) + gnt_entry_set_text(GNT_ENTRY(entry), gaim_account_get_alias(account)); + /* User options */ + update_user_options(dialog); + gnt_box_add_widget(GNT_BOX(window), dialog->remember); + gnt_box_add_widget(GNT_BOX(window), dialog->newmail); + gnt_box_add_widget(GNT_BOX(window), gnt_line_new(FALSE)); - + + /* The advanced box */ + add_protocol_options(dialog); + gnt_box_add_widget(GNT_BOX(window), dialog->prpls); + + /* TODO: Add proxy options */ + + /* The button box */ hbox = gnt_box_new(FALSE, FALSE); gnt_box_add_widget(GNT_BOX(window), hbox); @@ -183,9 +510,33 @@ g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(edit_dialog_destroy), dialog); gnt_widget_show(window); + gnt_box_readjust(GNT_BOX(window)); + gnt_widget_draw(window); } static void +add_account_cb(GntWidget *widget, gpointer null) +{ + edit_account(NULL); +} + +static void +modify_account_cb(GntWidget *widget, GntTree *tree) +{ + GaimAccount *account = gnt_tree_get_selection_data(tree); + if (!account) + return; + edit_account(account); +} + +static void +delete_account_cb(GntWidget *widget, GntTree *tree) +{ + /* XXX: After the request-api is complete */ + /* Note: remove the modify-dialog for the account */ +} + +static void account_toggled(GntWidget *widget, void *key, gpointer null) { GaimAccount *account = key; @@ -193,7 +544,7 @@ gaim_account_set_enabled(account, GAIM_GNT_UI, gnt_tree_get_choice(GNT_TREE(widget), key)); } -void gg_accounts_init() +void gg_accounts_show_all() { GList *iter; GntWidget *box, *button; @@ -216,14 +567,7 @@ for (iter = gaim_accounts_get_all(); iter; iter = iter->next) { GaimAccount *account = iter->data; - - gnt_tree_add_choice(GNT_TREE(accounts.tree), account, - 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)); + account_add(account); } g_signal_connect(G_OBJECT(accounts.tree), "toggled", G_CALLBACK(account_toggled), NULL); @@ -238,19 +582,59 @@ 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); + g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(add_account_cb), NULL); button = gnt_button_new(_("Modify")); gnt_box_add_widget(GNT_BOX(box), button); + g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(modify_account_cb), accounts.tree); button = gnt_button_new(_("Delete")); gnt_box_add_widget(GNT_BOX(box), button); + g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(delete_account_cb), accounts.tree); gnt_box_add_widget(GNT_BOX(accounts.window), box); gnt_widget_show(accounts.window); } +static gpointer +gg_accounts_get_handle() +{ + static int handle; + + return &handle; +} + +static void +account_added_callback(GaimAccount *account) +{ + if (accounts.window == NULL) + return; + account_add(account); + gnt_widget_draw(accounts.tree); +} + +static void +account_removed_callback(GaimAccount *account) +{ + if (accounts.window == NULL) + return; + + gnt_tree_remove(GNT_TREE(accounts.tree), account); +} + +void gg_accounts_init() +{ + gaim_signal_connect(gaim_accounts_get_handle(), "account-added", + gg_accounts_get_handle(), GAIM_CALLBACK(account_added_callback), + NULL); + gaim_signal_connect(gaim_accounts_get_handle(), "account-removed", + gg_accounts_get_handle(), GAIM_CALLBACK(account_removed_callback), + NULL); + + gg_accounts_show_all(); +} + void gg_accounts_uninit() { gnt_widget_destroy(accounts.window); Modified: trunk/console/gntaccount.h =================================================================== --- trunk/console/gntaccount.h 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/gntaccount.h 2006-07-23 01:10:06 UTC (rev 16540) @@ -5,3 +5,6 @@ void gg_accounts_init(); void gg_accounts_uninit(); + +void gg_accounts_show_all(); + Modified: trunk/console/gntnotify.c =================================================================== --- trunk/console/gntnotify.c 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/gntnotify.c 2006-07-23 01:10:06 UTC (rev 16540) @@ -57,7 +57,13 @@ /* handle is, in all/most occasions, a GntWidget * */ static void gg_close_notify(GaimNotifyType type, void *handle) { - gnt_widget_destroy(GNT_WIDGET(handle)); + GntWidget *widget = handle; + while (widget->parent) + widget = widget->parent; + + if (type == GAIM_NOTIFY_SEARCHRESULTS) + gaim_notify_searchresults_free(g_object_get_data(handle, "notify-results")); + gnt_widget_destroy(widget); } static void *gg_notify_formatted(const char *title, const char *primary, @@ -180,6 +186,112 @@ return ui_handle; } +static void +notify_button_activated(GntWidget *widget, GaimNotifySearchButton *b) +{ + GList *list = NULL; + GaimAccount *account = g_object_get_data(G_OBJECT(widget), "notify-account"); + gpointer data = g_object_get_data(G_OBJECT(widget), "notify-data"); + + list = gnt_tree_get_selection_text_list(GNT_TREE(widget)); + + b->callback(gaim_account_get_connection(account), list, data); + g_list_foreach(list, (GFunc)g_free, NULL); + g_list_free(list); +} + +static void +gg_notify_sr_new_rows(GaimConnection *gc, + GaimNotifySearchResults *results, void *data) +{ + GntTree *tree = GNT_TREE(data); + GList *o; + + /* XXX: Do I need to empty the tree here? */ + + for (o = results->rows; o; o = o->next) + { + gnt_tree_add_row_after(GNT_TREE(tree), o->data, + gnt_tree_create_row_from_list(GNT_TREE(tree), o->data), + NULL, NULL); + } +} + +static void * +gg_notify_searchresults(GaimConnection *gc, const char *title, + const char *primary, const char *secondary, + GaimNotifySearchResults *results, gpointer data) +{ + GntWidget *window, *tree, *box, *button; + GList *iter; + + window = gnt_vbox_new(FALSE); + 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_pad(GNT_BOX(window), 0); + gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); + + gnt_box_add_widget(GNT_BOX(window), + gnt_label_new_with_format(primary, GNT_TEXT_FLAG_BOLD)); + gnt_box_add_widget(GNT_BOX(window), + gnt_label_new_with_format(secondary, GNT_TEXT_FLAG_NORMAL)); + + tree = gnt_tree_new_with_columns(g_list_length(results->columns)); + gnt_tree_set_show_title(GNT_TREE(tree), TRUE); + gnt_box_add_widget(GNT_BOX(window), tree); + + box = gnt_hbox_new(TRUE); + + for (iter = results->buttons; iter; iter = iter->next) + { + GaimNotifySearchButton *b = iter->data; + const char *text; + + switch (b->type) + { + case GAIM_NOTIFY_BUTTON_LABELED: + text = b->label; + break; + case GAIM_NOTIFY_BUTTON_CONTINUE: + text = _("Continue"); + break; + case GAIM_NOTIFY_BUTTON_ADD: + text = _("Add"); + break; + case GAIM_NOTIFY_BUTTON_INFO: + text = _("Info"); + break; + case GAIM_NOTIFY_BUTTON_IM: + text = _("IM"); + break; + case GAIM_NOTIFY_BUTTON_JOIN: + text = _("Join"); + break; + case GAIM_NOTIFY_BUTTON_INVITE: + text = _("Invite"); + break; + } + + button = gnt_button_new(text); + g_object_set_data(G_OBJECT(button), "notify-account", gaim_connection_get_account(gc)); + g_object_set_data(G_OBJECT(button), "notify-data", data); + g_signal_connect_swapped(G_OBJECT(button), "activate", + G_CALLBACK(notify_button_activated), b); + + gnt_box_add_widget(GNT_BOX(box), button); + } + + gnt_box_add_widget(GNT_BOX(window), box); + + gg_notify_sr_new_rows(gc, results, tree); + + gnt_widget_show(window); + g_object_set_data(G_OBJECT(window), "notify-results", results); + + return tree; +} + static GaimNotifyUiOps ops = { .notify_message = gg_notify_message, @@ -190,8 +302,8 @@ .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_searchresults = gg_notify_searchresults, + .notify_searchresults_new_rows = gg_notify_sr_new_rows, .notify_uri = NULL /* This is of low-priority to me */ }; Modified: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/libgnt/Makefile.am 2006-07-23 01:10:06 UTC (rev 16540) @@ -7,6 +7,7 @@ gntwidget.c \ gntbox.c \ gntbutton.c \ + gntcheckbox.c \ gntcolors.c \ gntcombobox.c \ gntentry.c \ @@ -21,6 +22,7 @@ gntwidget.h \ gntbox.h \ gntbutton.h \ + gntcheckbox.h \ gntcolors.h \ gntcombobox.h \ gntentry.h \ Modified: trunk/console/libgnt/gntbutton.c =================================================================== --- trunk/console/libgnt/gntbutton.c 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/libgnt/gntbutton.c 2006-07-23 01:10:06 UTC (rev 16540) @@ -22,7 +22,7 @@ type = GNT_COLOR_NORMAL; wbkgdset(widget->window, '\0' | COLOR_PAIR(type)); - mvwprintw(widget->window, 1, 1, button->priv->text); + mvwprintw(widget->window, 1, 2, button->priv->text); DEBUG; } @@ -31,8 +31,10 @@ gnt_button_size_request(GntWidget *widget) { GntButton *button = GNT_BUTTON(widget); - widget->priv.width = g_utf8_strlen(button->priv->text, -1) + 2; - widget->priv.height = 3; + widget->priv.width = g_utf8_strlen(button->priv->text, -1) + 4; + widget->priv.height = 1; + if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + widget->priv.height += 2; } static void Added: trunk/console/libgnt/gntcheckbox.c =================================================================== --- trunk/console/libgnt/gntcheckbox.c (rev 0) +++ trunk/console/libgnt/gntcheckbox.c 2006-07-23 01:10:06 UTC (rev 16540) @@ -0,0 +1,153 @@ +#include "gntcheckbox.h" + +enum +{ + SIG_TOGGLED = 1, + SIGS, +}; + +static GntButtonClass *parent_class = NULL; +static guint signals[SIGS] = { 0 }; + +static void +gnt_check_box_draw(GntWidget *widget) +{ + GntCheckBox *cb = GNT_CHECK_BOX(widget); + GntColorType type; + char *text; + + if (gnt_widget_has_focus(widget)) + type = GNT_COLOR_HIGHLIGHT; + else + type = GNT_COLOR_NORMAL; + + wbkgdset(widget->window, '\0' | COLOR_PAIR(type)); + + text = g_strdup_printf("[%c]", cb->checked ? 'X' : ' '); + mvwprintw(widget->window, 0, 0, text); + g_free(text); + + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); + mvwprintw(widget->window, 0, 4, GNT_BUTTON(cb)->priv->text); + + DEBUG; +} + +static void +gnt_check_box_size_request(GntWidget *widget) +{ +} + +static void +gnt_check_box_map(GntWidget *widget) +{ + if (widget->priv.width == 0 || widget->priv.height == 0) + gnt_widget_size_request(widget); + DEBUG; +} + +static gboolean +gnt_check_box_key_pressed(GntWidget *widget, const char *text) +{ + if (text[0] == ' ' && text[1] == '\0') + { + GNT_CHECK_BOX(widget)->checked = !GNT_CHECK_BOX(widget)->checked; + g_signal_emit(widget, signals[SIG_TOGGLED], 0); + gnt_widget_draw(widget); + return TRUE; + } + + return FALSE; +} + +static void +gnt_check_box_destroy(GntWidget *widget) +{ +} + +static void +gnt_check_box_class_init(GntCheckBoxClass *klass) +{ + GntWidgetClass *wclass = GNT_WIDGET_CLASS(klass); + + parent_class = GNT_BUTTON_CLASS(klass); + /*parent_class->destroy = gnt_check_box_destroy;*/ + wclass->draw = gnt_check_box_draw; + /*parent_class->map = gnt_check_box_map;*/ + /*parent_class->size_request = gnt_check_box_size_request;*/ + wclass->key_pressed = gnt_check_box_key_pressed; + + signals[SIG_TOGGLED] = + g_signal_new("toggled", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GntCheckBoxClass, toggled), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + DEBUG; +} + +static void +gnt_check_box_init(GTypeInstance *instance, gpointer class) +{ + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); + DEBUG; +} + +/****************************************************************************** + * GntCheckBox API + *****************************************************************************/ +GType +gnt_check_box_get_gtype(void) +{ + static GType type = 0; + + if(type == 0) + { + static const GTypeInfo info = { + sizeof(GntCheckBoxClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc)gnt_check_box_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof(GntCheckBox), + 0, /* n_preallocs */ + gnt_check_box_init, /* instance_init */ + }; + + type = g_type_register_static(GNT_TYPE_BUTTON, + "GntCheckBox", + &info, 0); + } + + return type; +} + +GntWidget *gnt_check_box_new(const char *text) +{ + GntWidget *widget = g_object_new(GNT_TYPE_CHECK_BOX, NULL); + + GNT_BUTTON(widget)->priv->text = g_strdup(text); + gnt_widget_set_take_focus(widget, TRUE); + + return widget; +} + +void gnt_check_box_set_checked(GntCheckBox *box, gboolean set) +{ + if (set != box->checked) + { + box->checked = set; + g_signal_emit(box, signals[SIG_TOGGLED], 0); + } +} + +gboolean gnt_check_box_get_checked(GntCheckBox *box) +{ + return box->checked; +} + + + Property changes on: trunk/console/libgnt/gntcheckbox.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/gntcheckbox.h =================================================================== --- trunk/console/libgnt/gntcheckbox.h (rev 0) +++ trunk/console/libgnt/gntcheckbox.h 2006-07-23 01:10:06 UTC (rev 16540) @@ -0,0 +1,54 @@ +#ifndef GNT_CHECK_BOX_H +#define GNT_CHECK_BOX_H + +#include "gntbutton.h" +#include "gnt.h" +#include "gntcolors.h" +#include "gntkeys.h" + +#define GNT_TYPE_CHECK_BOX (gnt_check_box_get_gtype()) +#define GNT_CHECK_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GNT_TYPE_CHECK_BOX, GntCheckBox)) +#define GNT_CHECK_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GNT_TYPE_CHECK_BOX, GntCheckBoxClass)) +#define GNT_IS_CHECK_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNT_TYPE_CHECK_BOX)) +#define GNT_IS_CHECK_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GNT_TYPE_CHECK_BOX)) +#define GNT_CHECK_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GNT_TYPE_CHECK_BOX, GntCheckBoxClass)) + +#define GNT_CHECK_BOX_FLAGS(obj) (GNT_CHECK_BOX(obj)->priv.flags) +#define GNT_CHECK_BOX_SET_FLAGS(obj, flags) (GNT_CHECK_BOX_FLAGS(obj) |= flags) +#define GNT_CHECK_BOX_UNSET_FLAGS(obj, flags) (GNT_CHECK_BOX_FLAGS(obj) &= ~(flags)) + +typedef struct _GnCheckBox GntCheckBox; +typedef struct _GnCheckBoxPriv GntCheckBoxPriv; +typedef struct _GnCheckBoxClass GntCheckBoxClass; + +struct _GnCheckBox +{ + GntButton parent; + gboolean checked; +}; + +struct _GnCheckBoxClass +{ + GntButtonClass parent; + + void (*toggled)(void); + + void (*gnt_reserved1)(void); + void (*gnt_reserved2)(void); + void (*gnt_reserved3)(void); + void (*gnt_reserved4)(void); +}; + +G_BEGIN_DECLS + +GType gnt_check_box_get_gtype(void); + +GntWidget *gnt_check_box_new(const char *text); + +void gnt_check_box_set_checked(GntCheckBox *box, gboolean set); + +gboolean gnt_check_box_get_checked(GntCheckBox *box); + +G_END_DECLS + +#endif /* GNT_CHECK_BOX_H */ Property changes on: trunk/console/libgnt/gntcheckbox.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/libgnt/gntcombobox.c 2006-07-23 01:10:06 UTC (rev 16540) @@ -20,10 +20,14 @@ { if (box->selected != key) { + /* XXX: make sure the key actually does exist */ gpointer old = box->selected; box->selected = key; g_signal_emit(box, signals[SIG_SELECTION_CHANGED], 0, old, key); - gnt_widget_draw(GNT_WIDGET(box)); + if (GNT_WIDGET(box)->window) + gnt_widget_draw(GNT_WIDGET(box)); + if (box->dropdown) + gnt_tree_set_selected(GNT_TREE(box->dropdown), key); } } @@ -246,3 +250,8 @@ return box->selected; } +void gnt_combo_box_set_selected(GntComboBox *box, gpointer key) +{ + set_selection(box, key); +} + Modified: trunk/console/libgnt/gntcombobox.h =================================================================== --- trunk/console/libgnt/gntcombobox.h 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/libgnt/gntcombobox.h 2006-07-23 01:10:06 UTC (rev 16540) @@ -50,6 +50,8 @@ gpointer gnt_combo_box_get_selected_data(GntComboBox *box); +void gnt_combo_box_set_selected(GntComboBox *box, gpointer key); + G_END_DECLS #endif /* GNT_COMBO_BOX_H */ Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/libgnt/gntentry.c 2006-07-23 01:10:06 UTC (rev 16540) @@ -21,8 +21,15 @@ 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); + if (entry->masked) + { + mvwhline(widget->window, 0, 0, gnt_ascii_only() ? '*' : ACS_BULLET, + entry->end - entry->scroll); + } + else + mvwprintw(widget->window, 0, 0, entry->scroll); + stop = entry->end - entry->scroll; if (stop < widget->priv.width) mvwhline(widget->window, 0, stop, ENTRY_CHAR, widget->priv.width - stop); @@ -283,4 +290,8 @@ entry_redraw(GNT_WIDGET(entry)); } +void gnt_entry_set_masked(GntEntry *entry, gboolean set) +{ + entry->masked = set; +} Modified: trunk/console/libgnt/gntentry.h =================================================================== --- trunk/console/libgnt/gntentry.h 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/libgnt/gntentry.h 2006-07-23 01:10:06 UTC (rev 16540) @@ -49,6 +49,7 @@ size_t buffer; /* Size of the buffer */ int max; /* 0 means infinite */ + gboolean masked; }; struct _GnEntryClass @@ -78,6 +79,8 @@ void gnt_entry_clear(GntEntry *entry); +void gnt_entry_set_masked(GntEntry *entry, gboolean set); + G_END_DECLS #endif /* GNT_ENTRY_H */ Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/libgnt/gnttree.c 2006-07-23 01:10:06 UTC (rev 16540) @@ -278,7 +278,11 @@ x += tree->columns[i].width; } if (pos) + { tree_mark_columns(tree, pos, 0, ACS_TTEE | COLOR_PAIR(GNT_COLOR_NORMAL)); + tree_mark_columns(tree, pos, widget->priv.height - pos, + ACS_BTEE | COLOR_PAIR(GNT_COLOR_NORMAL)); + } tree_mark_columns(tree, pos, pos + 1, ACS_PLUS | COLOR_PAIR(GNT_COLOR_NORMAL)); tree_mark_columns(tree, pos, pos, ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL)); start = 2; @@ -691,10 +695,28 @@ char *gnt_tree_get_selection_text(GntTree *tree) { if (tree->current) - update_row_text(tree, tree->current); + return update_row_text(tree, tree->current); return NULL; } +GList *gnt_tree_get_selection_text_list(GntTree *tree) +{ + GList *list = NULL, *iter; + int i; + + if (!tree->current) + return NULL; + + for (i = 0, iter = tree->current->columns; i < tree->ncol && iter; + i++, iter = iter->next) + { + GntTreeCol *col = iter->data; + list = g_list_append(list, g_strdup(col->text)); + } + + return list; +} + /* XXX: Should this also remove all the children of the row being removed? */ void gnt_tree_remove(GntTree *tree, gpointer key) { @@ -859,24 +881,41 @@ return widget; } -GntTreeRow *gnt_tree_create_row(GntTree *tree, ...) +GntTreeRow *gnt_tree_create_row_from_list(GntTree *tree, GList *list) { + GList *iter; + int i; GntTreeRow *row = g_new0(GntTreeRow, 1); - int i; - va_list args; - va_start(args, tree); - - for (i = 0; i < tree->ncol; i++) + for (i = 0, iter = list; i < tree->ncol && iter; iter = iter->next, i++) { GntTreeCol *col = g_new0(GntTreeCol, 1); col->span = 1; - col->text = g_strdup(va_arg(args, const char *)); + col->text = g_strdup(iter->data); row->columns = g_list_append(row->columns, col); } + + return row; +} + +GntTreeRow *gnt_tree_create_row(GntTree *tree, ...) +{ + int i; + va_list args; + GList *list = NULL; + GntTreeRow *row; + + va_start(args, tree); + for (i = 0; i < tree->ncol; i++) + { + list = g_list_append(list, va_arg(args, const char *)); + } va_end(args); + row = gnt_tree_create_row_from_list(tree, list); + g_list_free(list); + return row; } Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/libgnt/gnttree.h 2006-07-23 01:10:06 UTC (rev 16540) @@ -80,6 +80,8 @@ char *gnt_tree_get_selection_text(GntTree *tree); +GList *gnt_tree_get_selection_text_list(GntTree *tree); + void gnt_tree_remove(GntTree *tree, gpointer key); /* Returns the visible line number of the selected row */ @@ -99,6 +101,8 @@ GntTreeRow *gnt_tree_create_row(GntTree *tree, ...); +GntTreeRow *gnt_tree_create_row_from_list(GntTree *tree, GList *list); + void gnt_tree_set_col_width(GntTree *tree, int col, int width); void gnt_tree_set_column_titles(GntTree *tree, ...); Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/libgnt/gntwidget.c 2006-07-23 01:10:06 UTC (rev 16540) @@ -489,6 +489,8 @@ void gnt_widget_queue_update(GntWidget *widget) { + if (widget->window == NULL) + return; while (widget->parent) widget = widget->parent; Modified: trunk/console/libgnt/test/combo.c =================================================================== --- trunk/console/libgnt/test/combo.c 2006-07-22 21:16:10 UTC (rev 16539) +++ trunk/console/libgnt/test/combo.c 2006-07-23 01:10:06 UTC (rev 16540) @@ -1,6 +1,7 @@ #include <gnt.h> #include <gntbox.h> #include <gntbutton.h> +#include <gntcheckbox.h> #include <gntcombobox.h> #include <gntlabel.h> @@ -61,6 +62,8 @@ gnt_box_add_widget(GNT_BOX(box), hbox); + gnt_box_add_widget(GNT_BOX(box), gnt_check_box_new("check box")); + gnt_widget_show(box); #ifdef STANDALONE This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-23 02:03:26
|
Revision: 16542 Author: sadrul Date: 2006-07-22 19:03:19 -0700 (Sat, 22 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16542&view=rev Log Message: ----------- Show the mail-notification checkbox in the account-dialog only if the prpl has support for it. Modified Paths: -------------- trunk/console/gntaccount.c trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntwidget.c trunk/console/libgnt/gntwidget.h Modified: trunk/console/gntaccount.c =================================================================== --- trunk/console/gntaccount.c 2006-07-23 01:40:43 UTC (rev 16541) +++ trunk/console/gntaccount.c 2006-07-23 02:03:19 UTC (rev 16542) @@ -396,6 +396,10 @@ if (dialog->account) gnt_check_box_set_checked(GNT_CHECK_BOX(dialog->newmail), gaim_account_get_check_mail(dialog->account)); + if (!prplinfo || !(prplinfo->options & OPT_PROTO_MAIL_CHECK)) + gnt_widget_set_visible(dialog->newmail, FALSE); + else + gnt_widget_set_visible(dialog->newmail, TRUE); if (dialog->remember == NULL) dialog->remember = gnt_check_box_new(_("Remember password")); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-07-23 01:40:43 UTC (rev 16541) +++ trunk/console/libgnt/gntbox.c 2006-07-23 02:03:19 UTC (rev 16542) @@ -89,6 +89,8 @@ for (iter = box->list; iter; iter = iter->next) { + if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(iter->data), GNT_WIDGET_INVISIBLE)) + continue; gnt_widget_set_position(GNT_WIDGET(iter->data), curx, cury); gnt_widget_get_size(GNT_WIDGET(iter->data), &w, &h); if (box->vertical) @@ -217,6 +219,7 @@ static GntWidget * find_focusable_widget(GntBox *box) { + /* XXX: Make sure the widget is visible? */ if (box->focus == NULL && GNT_WIDGET(box)->parent == NULL) g_list_foreach(box->list, add_to_focus, box); @@ -229,11 +232,17 @@ 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; + gpointer last = box->active; + do + { + 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 (!GNT_WIDGET_IS_FLAG_SET(box->active, GNT_WIDGET_INVISIBLE)) + break; + } while (box->active != last); } static gboolean @@ -564,6 +573,9 @@ int height, width; int x, y; + if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_INVISIBLE)) + continue; + if (GNT_IS_BOX(w)) gnt_box_sync_children(GNT_BOX(w)); Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-07-23 01:40:43 UTC (rev 16541) +++ trunk/console/libgnt/gntwidget.c 2006-07-23 02:03:19 UTC (rev 16542) @@ -329,6 +329,7 @@ mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height); #endif gnt_screen_release(widget); + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_INVISIBLE); GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_MAPPED); } @@ -509,3 +510,11 @@ return ret; } +void gnt_widget_set_visible(GntWidget *widget, gboolean set) +{ + if (set) + GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_INVISIBLE); + else + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_INVISIBLE); +} + Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-07-23 01:40:43 UTC (rev 16541) +++ trunk/console/libgnt/gntwidget.h 2006-07-23 02:03:19 UTC (rev 16542) @@ -39,6 +39,7 @@ GNT_WIDGET_URGENT = 1 << 7, GNT_WIDGET_GROW_X = 1 << 8, GNT_WIDGET_GROW_Y = 1 << 9, + GNT_WIDGET_INVISIBLE = 1 << 10, } GntWidgetFlags; /* XXX: I'll have to ask grim what he's using this for in guifications. */ @@ -125,6 +126,9 @@ void gnt_widget_queue_update(GntWidget *widget); void gnt_widget_set_take_focus(GntWidget *widget, gboolean set); + +void gnt_widget_set_visible(GntWidget *widget, gboolean set); + G_END_DECLS #endif /* GNT_WIDGET_H */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-23 20:38:23
|
Revision: 16552 Author: sadrul Date: 2006-07-23 13:38:07 -0700 (Sun, 23 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16552&view=rev Log Message: ----------- Add a debug window. The scrolling doesn't seem to work properly. I will try to figure out what's wrong with it. Start the request-ui. The ui for request input, choice and action are mostly done. I am not handling multiline input requests yet. It's not too high in my todo-list either. Modified Paths: -------------- trunk/console/Makefile trunk/console/gntgaim.c trunk/console/gntui.c trunk/console/libgnt/gntmain.c Added Paths: ----------- trunk/console/gntdebug.c trunk/console/gntdebug.h trunk/console/gntprefs.c trunk/console/gntprefs.h trunk/console/gntrequest.c trunk/console/gntrequest.h Modified: trunk/console/Makefile =================================================================== --- trunk/console/Makefile 2006-07-23 18:59:17 UTC (rev 16551) +++ trunk/console/Makefile 2006-07-23 20:38:07 UTC (rev 16552) @@ -8,7 +8,10 @@ gntblist.c \ gntconn.c \ gntconv.c \ + gntdebug.c \ gntnotify.c \ + gntprefs.c \ + gntrequest.c \ gntui.c GG_HEADERS = \ @@ -16,7 +19,10 @@ gntblist.h \ gntconn.h \ gntconv.h \ + gntdebug.h \ gntnotify.h \ + gntprefs.h \ + gntrequest.h \ gntui.h GG_OBJECTS = \ @@ -24,7 +30,10 @@ gntblist.o \ gntconn.o \ gntconv.o \ + gntdebug.o \ gntnotify.o \ + gntprefs.o \ + gntrequest.o \ gntui.o all: gntgaim Added: trunk/console/gntdebug.c =================================================================== --- trunk/console/gntdebug.c (rev 0) +++ trunk/console/gntdebug.c 2006-07-23 20:38:07 UTC (rev 16552) @@ -0,0 +1,106 @@ +#include <gnt.h> +#include <gntbox.h> +#include <gnttextview.h> + +#include "gntdebug.h" +#include "gntgaim.h" + +#include <stdio.h> +#include <string.h> + +static struct +{ + GntWidget *window; + GntWidget *tview; +} debug; + +static gboolean +debug_window_kpress_cb(GntWidget *wid, const char *key, GntTextView *view) +{ + if (key[0] == 27) + { + /* XXX: This doesn't seem to always work */ + if (strcmp(key+1, GNT_KEY_DOWN) == 0) + gnt_text_view_scroll(view, 1); + else if (strcmp(key+1, GNT_KEY_UP) == 0) + gnt_text_view_scroll(view, -1); + else if (strcmp(key+1, GNT_KEY_PGDOWN) == 0) + gnt_text_view_scroll(view, wid->priv.height - 2); + else if (strcmp(key+1, GNT_KEY_PGUP) == 0) + gnt_text_view_scroll(view, -(wid->priv.height - 2)); + else + return FALSE; + return TRUE; + } + return FALSE; +} + +static void +gg_debug_print(GaimDebugLevel level, const char *category, + const char *args) +{ + if (debug.window == NULL) + fprintf(stderr, "%s: %s\n", category, args); + else + { + GntTextFormatFlags flag = GNT_TEXT_FLAG_NORMAL; + + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(debug.tview), + category, GNT_TEXT_FLAG_BOLD); + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(debug.tview), + ": ", GNT_TEXT_FLAG_BOLD); + + switch (level) + { + case GAIM_DEBUG_WARNING: + flag |= GNT_TEXT_FLAG_UNDERLINE; + case GAIM_DEBUG_ERROR: + case GAIM_DEBUG_FATAL: + flag |= GNT_TEXT_FLAG_BOLD; + break; + default: + break; + } + + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(debug.tview), args, flag); + gnt_text_view_next_line(GNT_TEXT_VIEW(debug.tview)); + gnt_text_view_scroll(GNT_TEXT_VIEW(debug.tview), 0); + + g_signal_connect(G_OBJECT(debug.window), "key_pressed", G_CALLBACK(debug_window_kpress_cb), debug.tview); + } +} + +static GaimDebugUiOps uiops = +{ + gg_debug_print, +}; + +GaimDebugUiOps *gg_debug_get_ui_ops() +{ + return &uiops; +} + +void gg_debug_window_show() +{ + if (debug.window == NULL) + { + debug.window = gnt_vbox_new(FALSE); + gnt_box_set_toplevel(GNT_BOX(debug.window), TRUE); + gnt_box_set_title(GNT_BOX(debug.window), _("Debug Window")); + + debug.tview = gnt_text_view_new(); + gnt_box_add_widget(GNT_BOX(debug.window), debug.tview); + } + + gnt_widget_show(debug.window); +} + +void gg_debug_init() +{ + gg_debug_window_show(); +} + +void gg_debug_uninit() +{ +} + Property changes on: trunk/console/gntdebug.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/gntdebug.h =================================================================== --- trunk/console/gntdebug.h (rev 0) +++ trunk/console/gntdebug.h 2006-07-23 20:38:07 UTC (rev 16552) @@ -0,0 +1,8 @@ +#include "debug.h" + +GaimDebugUiOps *gg_debug_get_ui_ops(); + +void gg_debug_init(); + +void gg_debug_uninit(); + Property changes on: trunk/console/gntdebug.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/gntgaim.c =================================================================== --- trunk/console/gntgaim.c 2006-07-23 18:59:17 UTC (rev 16551) +++ trunk/console/gntgaim.c 2006-07-23 20:38:07 UTC (rev 16552) @@ -15,18 +15,25 @@ #include "util.h" #include "whiteboard.h" +#include "gntdebug.h" #include "gntgaim.h" +#include "gntprefs.h" #include "gntui.h" #define _GNU_SOURCE #include <getopt.h> -/* Anything IO-related is directly copied from gtkgaim's source tree */ +static void +debug_init() +{ + gg_debug_init(); + gaim_debug_set_ui_ops(gg_debug_get_ui_ops()); +} static GaimCoreUiOps core_ops = { - NULL, /*gaim_gtk_prefs_init,*/ - NULL, /*debug_init,*/ + gg_prefs_init, + debug_init, NULL, /*gaim_gtk_ui_init,*/ NULL, /*gaim_gtk_quit*/ }; @@ -37,6 +44,8 @@ return &core_ops; } +/* Anything IO-related is directly copied from gtkgaim's source tree */ + #define GAIM_GTK_READ_COND (G_IO_IN | G_IO_HUP | G_IO_ERR) #define GAIM_GTK_WRITE_COND (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL) @@ -293,6 +302,8 @@ /* XXX: Don't puke */ freopen(".error", "w", stderr); + gnt_init(); + /* Initialize the libgaim stuff */ if (!init_libgaim(argc, argv)) return 0; Added: trunk/console/gntprefs.c =================================================================== --- trunk/console/gntprefs.c (rev 0) +++ trunk/console/gntprefs.c 2006-07-23 20:38:07 UTC (rev 16552) @@ -0,0 +1,14 @@ +#include <prefs.h> + +#include "gntprefs.h" +#include "gntgaim.h" + +void gg_prefs_init() +{ + gaim_prefs_add_none("/gaim"); + gaim_prefs_add_none("/gaim/gnt"); + + gaim_prefs_add_none("/gaim/gnt/plugins"); + gaim_prefs_add_string_list("/gaim/gnt/plugins/loaded", NULL); +} + Property changes on: trunk/console/gntprefs.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/gntprefs.h =================================================================== --- trunk/console/gntprefs.h (rev 0) +++ trunk/console/gntprefs.h 2006-07-23 20:38:07 UTC (rev 16552) @@ -0,0 +1,2 @@ +void gg_prefs_init(); + Property changes on: trunk/console/gntprefs.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/gntrequest.c =================================================================== --- trunk/console/gntrequest.c (rev 0) +++ trunk/console/gntrequest.c 2006-07-23 20:38:07 UTC (rev 16552) @@ -0,0 +1,218 @@ +#include <gnt.h> +#include <gntbox.h> +#include <gntbutton.h> +#include <gntcombobox.h> +#include <gntentry.h> +#include <gntlabel.h> + +#include "gntrequest.h" + +static GntWidget * +setup_request_window(const char *title, const char *primary, + const char *secondary) +{ + GntWidget *window; + + window = gnt_vbox_new(FALSE); + gnt_box_set_toplevel(GNT_BOX(window), TRUE); + gnt_box_set_title(GNT_BOX(window), title); + gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); + + if (primary) + gnt_box_add_widget(GNT_BOX(window), + gnt_label_new_with_format(primary, GNT_TEXT_FLAG_BOLD)); + if (secondary) + gnt_box_add_widget(GNT_BOX(window), gnt_label_new(secondary)); + + return window; +} + +static GntWidget * +setup_button_box(gpointer userdata, gpointer cb, gpointer data, ...) +{ + GntWidget *box, *button; + va_list list; + const char *text; + gpointer callback; + + box = gnt_hbox_new(TRUE); + + va_start(list, data); + + while ((text = va_arg(list, const char *))) + { + callback = va_arg(list, gpointer); + button = gnt_button_new(text); + gnt_box_add_widget(GNT_BOX(box), button); + g_object_set_data(G_OBJECT(button), "activate-callback", callback); + g_object_set_data(G_OBJECT(button), "activate-userdata", userdata); + g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(cb), data); + } + + va_end(list); + return box; +} + +static void +notify_input_cb(GntWidget *button, GntWidget *entry) +{ + GaimRequestInputCb callback = g_object_get_data(G_OBJECT(button), "activate-callback"); + gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata"); + const char *text = gnt_entry_get_text(GNT_ENTRY(entry)); + + if (callback) + callback(data, text); + + while (button->parent) + button = button->parent; + + gaim_request_close(GAIM_REQUEST_INPUT, button); +} + +static void * +gg_request_input(const char *title, const char *primary, + const char *secondary, const char *default_value, + gboolean multiline, gboolean masked, gchar *hint, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + void *user_data) +{ + GntWidget *window, *box, *entry; + + window = setup_request_window(title, primary, secondary); + + entry = gnt_entry_new(default_value); + if (masked) + gnt_entry_set_masked(GNT_ENTRY(entry), TRUE); + gnt_box_add_widget(GNT_BOX(window), entry); + + box = setup_button_box(user_data, notify_input_cb, entry, + ok_text, ok_cb, cancel_text, cancel_cb, NULL); + gnt_box_add_widget(GNT_BOX(window), box); + + gnt_widget_show(window); + + return window; +} + +static void +gg_close_request(GaimRequestType type, gpointer ui_handle) +{ + GntWidget *widget = GNT_WIDGET(ui_handle); + while (widget->parent) + widget = widget->parent; + gnt_widget_destroy(widget); +} + +static void +request_choice_cb(GntWidget *button, GntComboBox *combo) +{ + GaimRequestChoiceCb callback = g_object_get_data(G_OBJECT(button), "activate-callback"); + gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata"); + int choice = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo))) - 1; + + if (callback) + callback(data, choice); + + while (button->parent) + button = button->parent; + + gaim_request_close(GAIM_REQUEST_INPUT, button); +} + +static void * +gg_request_choice(const char *title, const char *primary, + const char *secondary, unsigned int default_value, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + void *user_data, va_list choices) +{ + GntWidget *window, *combo, *box; + const char *text; + int val; + + window = setup_request_window(title, primary, secondary); + + combo = gnt_combo_box_new(); + gnt_box_add_widget(GNT_BOX(window), combo); + while ((text = va_arg(choices, const char *))) + { + val = va_arg(choices, int); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), GINT_TO_POINTER(val + 1), text); + } + gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), GINT_TO_POINTER(default_value + 1)); + + box = setup_button_box(user_data, request_choice_cb, combo, + ok_text, ok_cb, cancel_text, cancel_cb, NULL); + gnt_box_add_widget(GNT_BOX(window), box); + + gnt_widget_show(window); + + return window; +} + +static void +request_action_cb(GntWidget *button, GntWidget *window) +{ + GaimRequestActionCb callback = g_object_get_data(G_OBJECT(button), "activate-callback"); + gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata"); + int id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "activate-id")); + + callback(data, id); + + gaim_request_close(GAIM_REQUEST_ACTION, window); +} + +static void* +gg_request_action(const char *title, const char *primary, + const char *secondary, unsigned int default_value, + void *user_data, size_t actioncount, + va_list actions) +{ + GntWidget *window, *box, *button; + int i; + + window = setup_request_window(title, primary, secondary); + + box = gnt_hbox_new(TRUE); + gnt_box_add_widget(GNT_BOX(window), box); + for (i = 0; i < actioncount; i++) + { + const char *text = va_arg(actions, const char *); + GaimRequestActionCb callback = va_arg(actions, GaimRequestActionCb); + + button = gnt_button_new(text); + gnt_box_add_widget(GNT_BOX(box), button); + + g_object_set_data(G_OBJECT(button), "activate-callback", callback); + g_object_set_data(G_OBJECT(button), "activate-userdata", user_data); + g_object_set_data(G_OBJECT(button), "activate-id", GINT_TO_POINTER(i)); + g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(request_action_cb), window); + } + + gnt_widget_show(window); + + return window; +} + +static GaimRequestUiOps uiops = +{ + .request_input = gg_request_input, + .close_request = gg_close_request, + .request_choice = gg_request_choice, + .request_action = gg_request_action, +}; + +GaimRequestUiOps *gg_request_get_ui_ops() +{ + return &uiops; +} + +void gg_request_init() +{ +} + +void gg_request_uninit() +{ +} + Property changes on: trunk/console/gntrequest.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/gntrequest.h =================================================================== --- trunk/console/gntrequest.h (rev 0) +++ trunk/console/gntrequest.h 2006-07-23 20:38:07 UTC (rev 16552) @@ -0,0 +1,8 @@ +#include "request.h" + +GaimRequestUiOps *gg_request_get_ui_ops(); + +void gg_request_init(); + +void gg_request_uninit(); + Property changes on: trunk/console/gntrequest.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/gntui.c =================================================================== --- trunk/console/gntui.c 2006-07-23 18:59:17 UTC (rev 16551) +++ trunk/console/gntui.c 2006-07-23 20:38:07 UTC (rev 16552) @@ -5,6 +5,7 @@ #include "gntconn.h" #include "gntconv.h" #include "gntnotify.h" +#include "gntrequest.h" void init_gnt_ui() { @@ -31,6 +32,9 @@ gg_notify_init(); gaim_notify_set_ui_ops(gg_notify_get_ui_ops()); + gg_request_init(); + gaim_request_set_ui_ops(gg_request_get_ui_ops()); + #ifdef STANDALONE gnt_main(); @@ -49,6 +53,9 @@ gaim_notify_set_ui_ops(NULL); gg_notify_uninit(); + gaim_request_set_ui_ops(NULL); + gg_request_uninit(); + gnt_quit(); #endif } Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-23 18:59:17 UTC (rev 16551) +++ trunk/console/libgnt/gntmain.c 2006-07-23 20:38:07 UTC (rev 16552) @@ -524,7 +524,12 @@ void gnt_init() { - GIOChannel *channel = g_io_channel_unix_new(0); + static GIOChannel *channel = NULL; + + if (channel) + return; + + channel = g_io_channel_unix_new(0); g_io_channel_set_encoding(channel, NULL, NULL); g_io_channel_set_buffered(channel, FALSE); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-24 01:03:11
|
Revision: 16555 Author: sadrul Date: 2006-07-23 18:03:07 -0700 (Sun, 23 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16555&view=rev Log Message: ----------- Do not crash when you close the debug window, or use the "/clear" command. Enable the stuff in gntaccount.c that were waiting on the request-ui. Modified Paths: -------------- trunk/console/gntaccount.c trunk/console/gntconv.c trunk/console/gntdebug.c Modified: trunk/console/gntaccount.c =================================================================== --- trunk/console/gntaccount.c 2006-07-24 00:52:01 UTC (rev 16554) +++ trunk/console/gntaccount.c 2006-07-24 01:03:07 UTC (rev 16555) @@ -644,9 +644,7 @@ 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; @@ -693,6 +691,31 @@ } static void +free_add_user_data(AddUserData *data) +{ + g_free(data->username); + + if (data->alias != NULL) + g_free(data->alias); + + g_free(data); +} + +static void +add_user_cb(AddUserData *data) +{ + GaimConnection *gc = gaim_account_get_connection(data->account); + + if (g_list_find(gaim_connections_get_all(), gc)) + { + gaim_blist_request_add_buddy(data->account, data->username, + NULL, data->alias); + } + + free_add_user_data(data); +} + +static void request_add(GaimAccount *account, const char *remote_user, const char *id, const char *alias, const char *msg) @@ -709,12 +732,10 @@ 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); } @@ -724,17 +745,7 @@ .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; Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-24 00:52:01 UTC (rev 16554) +++ trunk/console/gntconv.c 2006-07-24 01:03:07 UTC (rev 16555) @@ -159,6 +159,7 @@ g_hash_table_insert(ggconvs, conv, ggc); ggc->conv = conv; + conv->ui_data = ggc; type = gaim_conversation_get_type(conv); title = g_strdup_printf(_("%s"), gaim_conversation_get_name(conv)); Modified: trunk/console/gntdebug.c =================================================================== --- trunk/console/gntdebug.c 2006-07-24 00:52:01 UTC (rev 16554) +++ trunk/console/gntdebug.c 2006-07-24 01:03:07 UTC (rev 16555) @@ -80,6 +80,12 @@ return &uiops; } +static void +reset_debug_win(GntWidget *w, gpointer null) +{ + debug.window = debug.tview = NULL; +} + void gg_debug_window_show() { if (debug.window == NULL) @@ -90,6 +96,8 @@ debug.tview = gnt_text_view_new(); gnt_box_add_widget(GNT_BOX(debug.window), debug.tview); + + g_signal_connect(G_OBJECT(debug.window), "destroy", G_CALLBACK(reset_debug_win), NULL); } gnt_widget_show(debug.window); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-24 09:25:54
|
Revision: 16561 Author: sadrul Date: 2006-07-24 02:25:48 -0700 (Mon, 24 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16561&view=rev Log Message: ----------- Appropriately handle the notify dialogs when they close to prevent crashes. Modified Paths: -------------- trunk/console/gntconv.c trunk/console/gntnotify.c Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-24 05:12:57 UTC (rev 16560) +++ trunk/console/gntconv.c 2006-07-24 09:25:48 UTC (rev 16561) @@ -200,7 +200,7 @@ gg_write_common(GaimConversation *conv, const char *who, const char *message, GaimMessageFlags flags, time_t mtime) { - GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); + GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); /* XXX: ggconv = conv->ui_data; should do */ char *strip; GntTextFormatFlags fl = 0; Modified: trunk/console/gntnotify.c =================================================================== --- trunk/console/gntnotify.c 2006-07-24 05:12:57 UTC (rev 16560) +++ trunk/console/gntnotify.c 2006-07-24 09:25:48 UTC (rev 16561) @@ -15,6 +15,12 @@ GntWidget *tree; } emaildialog; +static void +notify_msg_window_destroy_cb(GntWidget *window, GaimNotifyMsgType type) +{ + gaim_notify_close(type, window); +} + static void * gg_notify_message(GaimNotifyMsgType type, const char *title, const char *primary, const char *secondary) @@ -48,7 +54,10 @@ 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); + g_signal_connect_swapped(G_OBJECT(button), "activate", + G_CALLBACK(gnt_widget_destroy), window); + g_signal_connect(G_OBJECT(window), "destroy", + G_CALLBACK(notify_msg_window_destroy_cb), GINT_TO_POINTER(type)); gnt_widget_show(window); return window; @@ -58,11 +67,20 @@ static void gg_close_notify(GaimNotifyType type, void *handle) { GntWidget *widget = handle; + + if (!widget) + return; + while (widget->parent) widget = widget->parent; if (type == GAIM_NOTIFY_SEARCHRESULTS) gaim_notify_searchresults_free(g_object_get_data(handle, "notify-results")); +#if 0 + /* This does not seem to be necessary */ + g_signal_handlers_disconnect_by_func(G_OBJECT(widget), + G_CALLBACK(notify_msg_window_destroy_cb), GINT_TO_POINTER(type)); +#endif gnt_widget_destroy(widget); } @@ -77,7 +95,7 @@ secondary ? "\n" : "", unformat ? unformat : ""); - void *ret = gg_notify_message(GAIM_NOTIFY_MSG_INFO, title, primary, t); + void *ret = gg_notify_message(GAIM_NOTIFY_FORMATTED, title, primary, t); g_free(t); g_free(unformat); @@ -157,7 +175,7 @@ return NULL; } - ret = gg_notify_message(GAIM_NOTIFY_MSG_INFO, _("New Mail"), _("You have mail!"), message->str); + ret = gg_notify_message(GAIM_NOTIFY_EMAIL, _("New Mail"), _("You have mail!"), message->str); g_string_free(message, TRUE); return ret; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-31 23:19:28
|
Revision: 16602 Author: sadrul Date: 2006-07-31 16:19:12 -0700 (Mon, 31 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16602&view=rev Log Message: ----------- Allow plugins to be loaded and unloaded. Remember the window positions and sizes. All turning on/off shadow from ~/.gntrc (off by default). Modified Paths: -------------- trunk/console/Makefile trunk/console/gntblist.c trunk/console/gntconv.c trunk/console/gntdebug.c trunk/console/gntui.c trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbutton.c trunk/console/libgnt/gntline.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntstyle.c trunk/console/libgnt/gntstyle.h 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 Added Paths: ----------- trunk/console/gntplugin.c trunk/console/gntplugin.h Modified: trunk/console/Makefile =================================================================== --- trunk/console/Makefile 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/Makefile 2006-07-31 23:19:12 UTC (rev 16602) @@ -1,7 +1,7 @@ VERSION=gntgaim-0.0.0dev CC=gcc 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 +LDFLAGS=`pkg-config --libs gaim gobject-2.0 libxml-2.0 gnt` -pg -lgaim GG_SOURCES = \ gntaccount.c \ @@ -10,6 +10,7 @@ gntconv.c \ gntdebug.c \ gntnotify.c \ + gntplugin.c \ gntprefs.c \ gntrequest.c \ gntui.c @@ -22,6 +23,7 @@ gntdebug.h \ gntnotify.h \ gntprefs.h \ + gntplugin.h \ gntrequest.h \ gntui.h @@ -32,6 +34,7 @@ gntconv.o \ gntdebug.o \ gntnotify.o \ + gntplugin.o \ gntprefs.o \ gntrequest.o \ gntui.o Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/gntblist.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -13,6 +13,8 @@ #include "gntblist.h" #include <string.h> +#define PREF_ROOT "/gaim/gnt/blist" + typedef struct { GntWidget *window; @@ -274,6 +276,8 @@ gnt_append_menu_action(GntTree *tree, GaimMenuAction *action, gpointer parent) { GList *list; + if (action == NULL) + return; gnt_tree_add_row_after(tree, action, gnt_tree_create_row(tree, action->label), parent, NULL); @@ -677,8 +681,30 @@ remove_context_menu(ggblist); } +static void +size_changed_cb(GntWidget *w, int width, int height) +{ + gaim_prefs_set_int(PREF_ROOT "/size/width", width); + gaim_prefs_set_int(PREF_ROOT "/size/height", height); +} + +static void +save_position_cb(GntWidget *w, int x, int y) +{ + gaim_prefs_set_int(PREF_ROOT "/position/x", x); + gaim_prefs_set_int(PREF_ROOT "/position/y", y); +} + void gg_blist_init() { + gaim_prefs_add_none(PREF_ROOT); + gaim_prefs_add_none(PREF_ROOT "/size"); + gaim_prefs_add_int(PREF_ROOT "/size/width", 20); + gaim_prefs_add_int(PREF_ROOT "/size/height", 20); + gaim_prefs_add_none(PREF_ROOT "/position"); + gaim_prefs_add_int(PREF_ROOT "/position/x", 0); + gaim_prefs_add_int(PREF_ROOT "/position/y", 0); + ggblist = g_new0(GGBlist, 1); gaim_get_blist()->ui_data = ggblist; @@ -692,7 +718,10 @@ ggblist->tree = gnt_tree_new(); GNT_WIDGET_SET_FLAGS(ggblist->tree, GNT_WIDGET_NO_BORDER); gnt_tree_set_col_width(GNT_TREE(ggblist->tree), 0, 25); - gnt_widget_set_size(ggblist->tree, 0, getmaxy(stdscr) - 4); + gnt_widget_set_size(ggblist->tree, gaim_prefs_get_int(PREF_ROOT "/size/width"), + gaim_prefs_get_int(PREF_ROOT "/size/height")); + gnt_widget_set_position(ggblist->window, gaim_prefs_get_int(PREF_ROOT "/position/x"), + gaim_prefs_get_int(PREF_ROOT "/position/y")); gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->tree); gnt_widget_show(ggblist->window); @@ -725,6 +754,9 @@ ggblist, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); g_signal_connect_data(G_OBJECT(ggblist->tree), "lost-focus", G_CALLBACK(remove_peripherals), ggblist, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); + g_signal_connect(G_OBJECT(ggblist->tree), "size_changed", G_CALLBACK(size_changed_cb), NULL); + g_signal_connect(G_OBJECT(ggblist->window), "position_set", G_CALLBACK(save_position_cb), NULL); + } void gg_blist_uninit() Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/gntconv.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -1,6 +1,7 @@ #include <string.h> #include <cmds.h> +#include <prefs.h> #include <util.h> #include "gntgaim.h" @@ -12,6 +13,8 @@ #include "gntentry.h" #include "gnttextview.h" +#define PREF_ROOT "/gaim/gnt/conversations" + GHashTable *ggconvs; typedef struct _GGConv GGConv; @@ -142,19 +145,29 @@ } static void +size_changed_cb(GntWidget *w, int width, int height) +{ + gaim_prefs_set_int(PREF_ROOT "/size/width", width); + gaim_prefs_set_int(PREF_ROOT "/size/height", height); +} + +static void +save_position_cb(GntWidget *w, int x, int y) +{ + gaim_prefs_set_int(PREF_ROOT "/position/x", x); + gaim_prefs_set_int(PREF_ROOT "/position/y", y); +} + +static void gg_create_conversation(GaimConversation *conv) { 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); @@ -172,7 +185,8 @@ 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) - 3 - x - width, getmaxy(stdscr) - 5); + gnt_widget_set_size(ggc->tv, gaim_prefs_get_int(PREF_ROOT "/size/width"), + gaim_prefs_get_int(PREF_ROOT "/size/height")); ggc->entry = gnt_entry_new(NULL); gnt_box_add_widget(GNT_BOX(ggc->window), ggc->entry); @@ -181,12 +195,13 @@ 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); - /* 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_set_position(ggc->window, gaim_prefs_get_int(PREF_ROOT "/position/x"), + gaim_prefs_get_int(PREF_ROOT "/position/y")); gnt_widget_show(ggc->window); + g_signal_connect(G_OBJECT(ggc->tv), "size_changed", G_CALLBACK(size_changed_cb), NULL); + g_signal_connect(G_OBJECT(ggc->window), "position_set", G_CALLBACK(save_position_cb), NULL); + g_free(title); } @@ -465,7 +480,15 @@ { ggconvs = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, destroy_ggconv); - /* Xerox */ + gaim_prefs_add_none(PREF_ROOT); + gaim_prefs_add_none(PREF_ROOT "/size"); + gaim_prefs_add_int(PREF_ROOT "/size/width", 70); + gaim_prefs_add_int(PREF_ROOT "/size/height", 20); + gaim_prefs_add_none(PREF_ROOT "/position"); + gaim_prefs_add_int(PREF_ROOT "/position/x", 0); + gaim_prefs_add_int(PREF_ROOT "/position/y", 0); + + /* Xerox the commands */ gaim_cmd_register("say", "S", GAIM_CMD_P_DEFAULT, GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, say_command_cb, _("say <message>: Send a message normally as if you weren't using a command."), NULL); Modified: trunk/console/gntdebug.c =================================================================== --- trunk/console/gntdebug.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/gntdebug.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -39,9 +39,7 @@ gg_debug_print(GaimDebugLevel level, const char *category, const char *args) { - if (debug.window == NULL) - fprintf(stderr, "%s: %s\n", category, args); - else + if (debug.window) { GntTextFormatFlags flag = GNT_TEXT_FLAG_NORMAL; @@ -105,7 +103,8 @@ void gg_debug_init() { - gg_debug_window_show(); + if (gaim_debug_is_enabled()) + gg_debug_window_show(); } void gg_debug_uninit() Added: trunk/console/gntplugin.c =================================================================== --- trunk/console/gntplugin.c (rev 0) +++ trunk/console/gntplugin.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -0,0 +1,124 @@ +#include <gnt.h> +#include <gntbox.h> +#include <gntlabel.h> +#include <gntline.h> +#include <gnttree.h> + +#include "notify.h" + +#include "gntgaim.h" +#include "gntplugin.h" + +static struct +{ + GntWidget *tree; + GntWidget *window; + GntWidget *aboot; +} plugins; + +static void +plugin_toggled_cb(GntWidget *tree, GaimPlugin *plugin, gpointer null) +{ + if (gnt_tree_get_choice(GNT_TREE(tree), plugin)) + { + if(!gaim_plugin_load(plugin)) + gaim_notify_error(NULL, "ERROR", "loading plugin failed", NULL); + } + else + { + if (!gaim_plugin_unload(plugin)) + gaim_notify_error(NULL, "ERROR", "unloading plugin failed", NULL); + } + gg_plugins_save_loaded(); +} + +/* Xerox */ +void +gg_plugins_save_loaded(void) +{ + GList *pl; + GList *files = NULL; + GaimPlugin *p; + + for (pl = gaim_plugins_get_loaded(); pl != NULL; pl = pl->next) { + p = pl->data; + + if (p->info->type != GAIM_PLUGIN_PROTOCOL && + p->info->type != GAIM_PLUGIN_LOADER) { + + files = g_list_append(files, p->path); + } + } + + gaim_prefs_set_string_list("/gaim/gnt/plugins/loaded", files); + g_list_free(files); +} + +static void +selection_changed(GntWidget *widget, gpointer old, gpointer current, gpointer null) +{ + GaimPlugin *plugin = current; + char *text; + + /* XXX: Use formatting and stuff */ + gnt_text_view_clear(GNT_TEXT_VIEW(plugins.aboot)); + text = g_strdup_printf(_("Name: %s\nVersion: %s\nDescription: %s\nAuthor: %s\nWebsite: %s\nFilename: %s\n"), + plugin->info->name, plugin->info->version, plugin->info->description, + plugin->info->author, plugin->info->homepage, plugin->path); + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(plugins.aboot), + text, GNT_TEXT_FLAG_NORMAL); + gnt_text_view_scroll(GNT_TEXT_VIEW(plugins.aboot), 0); +} + +void gg_plugins_show_all() +{ + GntWidget *window, *tree, *box, *aboot; + GList *iter; + if (plugins.window) + return; + + gaim_plugins_probe(G_MODULE_SUFFIX); + + plugins.window = window = gnt_vbox_new(FALSE); + gnt_box_set_toplevel(GNT_BOX(window), TRUE); + gnt_box_set_title(GNT_BOX(window), _("Plugins")); + gnt_box_set_pad(GNT_BOX(window), 0); + + gnt_box_add_widget(GNT_BOX(window), + gnt_label_new(_("You can (un)load plugins from the following list."))); + gnt_box_add_widget(GNT_BOX(window), gnt_hline_new()); + + box = gnt_hbox_new(FALSE); + gnt_box_add_widget(GNT_BOX(window), box); + gnt_box_add_widget(GNT_BOX(window), gnt_hline_new()); + + gnt_box_set_pad(GNT_BOX(box), 0); + plugins.tree = tree = gnt_tree_new(); + GNT_WIDGET_SET_FLAGS(tree, GNT_WIDGET_NO_BORDER); + gnt_box_add_widget(GNT_BOX(box), tree); + gnt_box_add_widget(GNT_BOX(box), gnt_vline_new()); + + plugins.aboot = aboot = gnt_text_view_new(); + gnt_widget_set_size(aboot, 40, 20); + gnt_box_add_widget(GNT_BOX(box), aboot); + + for (iter = gaim_plugins_get_all(); iter; iter = iter->next) + { + GaimPlugin *plug = iter->data; + + if (plug->info->type != GAIM_PLUGIN_STANDARD || + (plug->info->flags & GAIM_PLUGIN_FLAG_INVISIBLE) || + plug->error) + continue; + + gnt_tree_add_choice(GNT_TREE(tree), plug, + gnt_tree_create_row(GNT_TREE(tree), plug->info->name), NULL, NULL); + gnt_tree_set_choice(GNT_TREE(tree), plug, gaim_plugin_is_loaded(plug)); + } + gnt_tree_set_col_width(GNT_TREE(tree), 0, 30); + g_signal_connect(G_OBJECT(tree), "toggled", G_CALLBACK(plugin_toggled_cb), NULL); + g_signal_connect(G_OBJECT(tree), "selection_changed", G_CALLBACK(selection_changed), NULL); + + gnt_widget_show(window); +} + Property changes on: trunk/console/gntplugin.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/gntplugin.h =================================================================== --- trunk/console/gntplugin.h (rev 0) +++ trunk/console/gntplugin.h 2006-07-31 23:19:12 UTC (rev 16602) @@ -0,0 +1,6 @@ +#include <plugin.h> + +void gg_plugins_show_all(); + +void gg_plugins_save_loaded(); + Property changes on: trunk/console/gntplugin.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/gntui.c =================================================================== --- trunk/console/gntui.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/gntui.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -5,13 +5,19 @@ #include "gntconn.h" #include "gntconv.h" #include "gntnotify.h" +#include "gntplugin.h" #include "gntrequest.h" +#include <prefs.h> + void init_gnt_ui() { #ifdef STANDALONE gnt_init(); #endif + + gaim_prefs_add_none("/gaim/gnt"); + /* Accounts */ gg_accounts_init(); gaim_accounts_set_ui_ops(gg_accounts_get_ui_ops()); @@ -35,7 +41,12 @@ gg_request_init(); gaim_request_set_ui_ops(gg_request_get_ui_ops()); + gg_plugins_show_all(); + #ifdef STANDALONE + + gg_plugins_save_loaded(); + gnt_main(); gaim_accounts_set_ui_ops(NULL); Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/libgnt/gntbox.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -430,8 +430,11 @@ 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); + if (wid != i->data) + { + gnt_widget_get_size(GNT_WIDGET(i->data), &tw, &th); + gnt_widget_set_size(i->data, tw + wchange, th + hchange); + } } reposition_children(widget); Modified: trunk/console/libgnt/gntbutton.c =================================================================== --- trunk/console/libgnt/gntbutton.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/libgnt/gntbutton.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -33,7 +33,7 @@ GntButton *button = GNT_BUTTON(widget); widget->priv.width = g_utf8_strlen(button->priv->text, -1) + 4; widget->priv.height = 1; - if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) widget->priv.height += 2; } Modified: trunk/console/libgnt/gntline.c =================================================================== --- trunk/console/libgnt/gntline.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/libgnt/gntline.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -14,10 +14,10 @@ GntLine *line = GNT_LINE(widget); if (line->vertical) mvwvline(widget->window, 1, 0, ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL), - widget->priv.height - 3); + widget->priv.height - 2); else mvwhline(widget->window, 0, 1, ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL), - widget->priv.width - 3); + widget->priv.width - 2); } static void Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/libgnt/gntmain.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -551,6 +551,7 @@ initscr(); gnt_init_colors(); + gnt_init_styles(); filename = g_build_filename(g_get_home_dir(), ".gntrc", NULL); gnt_style_read_configure_file(filename); @@ -708,6 +709,7 @@ void gnt_quit() { gnt_uninit_colors(); + gnt_uninit_styles(); endwin(); } Modified: trunk/console/libgnt/gntstyle.c =================================================================== --- trunk/console/libgnt/gntstyle.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/libgnt/gntstyle.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -1,6 +1,76 @@ #include "gntstyle.h" #include "gntcolors.h" +#include <string.h> + +static char * str_styles[GNT_STYLES]; +static int int_styles[GNT_STYLES]; +static int bool_styles[GNT_STYLES]; + +const char *gnt_style_get(GntStyle style) +{ + return str_styles[style]; +} + +gboolean gnt_style_get_bool(GntStyle style, gboolean def) +{ + int i; + const char * str; + + if (bool_styles[style] != -1) + return bool_styles[style]; + + str = gnt_style_get(style); + + if (str) + { + if (strcmp(str, "false") == 0) + def = FALSE; + else if (strcmp(str, "true") == 0) + def = TRUE; + else if (sscanf(str, "%d", &i) == 1) + { + if (i) + def = TRUE; + else + def = FALSE; + } + } + + bool_styles[style] = def; + return bool_styles[style]; +} + +static void +read_general_style(GKeyFile *kfile) +{ + GError *error = NULL; + gsize nkeys; + char **keys = g_key_file_get_keys(kfile, "general", &nkeys, &error); + int i; + struct + { + const char *style; + GntStyle en; + } styles[] = {{"shadow", GNT_STYLE_SHADOW}, + {NULL, 0}}; + + if (error) + { + /* XXX: some error happened. */ + g_error_free(error); + } + else + { + for (i = 0; styles[i].style; i++) + { + error = NULL; + str_styles[styles[i].en] = + g_key_file_get_string(kfile, "general", styles[i].style, &error); + } + } +} + void gnt_style_read_configure_file(const char *filename) { #if GLIB_CHECK_VERSION(2,6,0) @@ -14,8 +84,27 @@ return; } gnt_colors_parse(kfile); + read_general_style(kfile); g_key_file_free(kfile); #endif } +void gnt_init_styles() +{ + int i; + for (i = 0; i < GNT_STYLES; i++) + { + str_styles[i] = NULL; + int_styles[i] = -1; + bool_styles[i] = -1; + } +} + +void gnt_uninit_styles() +{ + int i; + for (i = 0; i < GNT_STYLES; i++) + g_free(str_styles[i]); +} + Modified: trunk/console/libgnt/gntstyle.h =================================================================== --- trunk/console/libgnt/gntstyle.h 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/libgnt/gntstyle.h 2006-07-31 23:19:12 UTC (rev 16602) @@ -1,4 +1,19 @@ #include "gnt.h" +typedef enum +{ + GNT_STYLE_SHADOW = 0, + GNT_STYLES +} GntStyle; + void gnt_style_read_configure_file(const char *filename); +/* Returned strings are all lowercase */ +const char *gnt_style_get(GntStyle style); + +gboolean gnt_style_get_bool(GntStyle style, gboolean def); + +void gnt_init_styles(); + +void gnt_uninit_styles(); + Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/libgnt/gnttextview.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -182,14 +182,22 @@ view->list = g_list_first(view->list); - split = g_strsplit(text, "\n", 0); + split = g_strsplit(text, "\n", -1); for (i = 0; split[i]; i++) { - GntTextLine *line = view->list->data; + GntTextLine *line; int len = g_utf8_strlen(split[i], -1); char *iter = split[i]; int prev = 0; + if (i) + { + line = g_new0(GntTextLine, 1); + view->list = g_list_prepend(g_list_first(view->list), line); + } + + line = view->list->data; + while (iter && *iter) { GntTextSegment *seg = g_new0(GntTextSegment, 1); Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/libgnt/gnttree.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -387,7 +387,7 @@ static void tree_selection_changed(GntTree *tree, GntTreeRow *old, GntTreeRow *current) { - g_signal_emit(tree, signals[SIG_SELECTION_CHANGED], 0, old, current); + g_signal_emit(tree, signals[SIG_SELECTION_CHANGED], 0, old->key, current->key); } static GntTreeRow * Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/libgnt/gntwidget.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -1,6 +1,7 @@ /* Stuff brutally ripped from Gflib */ #include "gntwidget.h" +#include "gntstyle.h" #include "gntmarshal.h" #include "gnt.h" @@ -290,7 +291,7 @@ { gboolean shadow = TRUE; - if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + if (!gnt_widget_has_shadow(widget)) shadow = FALSE; widget->window = newwin(widget->priv.height + shadow, widget->priv.width + shadow, @@ -325,7 +326,7 @@ 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)) + if (gnt_widget_has_shadow(widget)) mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height); #endif gnt_screen_release(widget); @@ -361,7 +362,7 @@ gnt_widget_get_size(GntWidget *wid, int *width, int *height) { gboolean shadow = TRUE; - if (GNT_WIDGET_IS_FLAG_SET(wid, GNT_WIDGET_NO_SHADOW)) + if (!gnt_widget_has_shadow(wid)) shadow = FALSE; if (width) @@ -376,7 +377,7 @@ { gboolean shadow = TRUE; - if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + if (!gnt_widget_has_shadow(widget)) shadow = FALSE; wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL)); @@ -384,9 +385,16 @@ if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER)) { - WINDOW *tmp = derwin(widget->window, widget->priv.height, widget->priv.width, 0, 0); - box(tmp, 0, 0); - delwin(tmp); + /* - This is ugly. */ + /* - What's your point? */ + mvwvline(widget->window, 0, 0, ACS_VLINE, widget->priv.height); + mvwvline(widget->window, 0, widget->priv.width - 1, ACS_VLINE, widget->priv.height); + mvwhline(widget->window, widget->priv.height - 1, 0, ACS_HLINE, widget->priv.width); + mvwhline(widget->window, 0, 0, ACS_HLINE, widget->priv.width); + mvwaddch(widget->window, 0, 0, ACS_ULCORNER); + mvwaddch(widget->window, 0, widget->priv.width - 1, ACS_URCORNER); + mvwaddch(widget->window, widget->priv.height - 1, 0, ACS_LLCORNER); + mvwaddch(widget->window, widget->priv.height - 1, widget->priv.width - 1, ACS_LRCORNER); } if (shadow) @@ -402,7 +410,7 @@ { gboolean ret = TRUE; - if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + if (gnt_widget_has_shadow(widget)) { width--; height--; @@ -418,7 +426,7 @@ gboolean shadow = TRUE; int oldw, oldh; - if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW)) + if (!gnt_widget_has_shadow(widget)) shadow = FALSE; oldw = widget->priv.width; @@ -518,3 +526,9 @@ GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_INVISIBLE); } +gboolean gnt_widget_has_shadow(GntWidget *widget) +{ + return (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW) && + gnt_style_get_bool(GNT_STYLE_SHADOW, FALSE)); +} + Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/libgnt/gntwidget.h 2006-07-31 23:19:12 UTC (rev 16602) @@ -129,6 +129,8 @@ void gnt_widget_set_visible(GntWidget *widget, gboolean set); +gboolean gnt_widget_has_shadow(GntWidget *widget); + G_END_DECLS #endif /* GNT_WIDGET_H */ Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-07-30 15:55:30 UTC (rev 16601) +++ trunk/console/libgnt/test/multiwin.c 2006-07-31 23:19:12 UTC (rev 16602) @@ -27,6 +27,7 @@ gnt_widget_set_name(box2, "box2"); tree = gnt_tree_new_with_columns(3); + GNT_WIDGET_SET_FLAGS(tree, GNT_WIDGET_NO_BORDER); gnt_tree_set_column_titles(GNT_TREE(tree), "12345678901234567890", "column 2", "column3"); gnt_tree_set_show_title(GNT_TREE(tree), TRUE); gnt_widget_set_name(tree, "tree"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-31 23:57:53
|
Revision: 16603 Author: sadrul Date: 2006-07-31 16:56:35 -0700 (Mon, 31 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16603&view=rev Log Message: ----------- wabz says: "gaim_strdup_withhtml in util.c is purely for converting linebreaks to <br> - some protocols use it for various reasons, but not msn - not sure where it's done for that (might not be? gtkconv doesnt use gaim_markup_strip_html). i reckon since you're using gaim_markup_strip_html, you may as well play it safe and just use gaim_strdup_withhtml before the strip?" So let's do it until GntTextView can parse html. (after all, that's 20% of the users ;) ) Modified Paths: -------------- trunk/console/gntconv.c trunk/console/libgnt/gntwidget.c Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-07-31 23:19:12 UTC (rev 16602) +++ trunk/console/gntconv.c 2006-07-31 23:56:35 UTC (rev 16603) @@ -216,7 +216,7 @@ GaimMessageFlags flags, time_t mtime) { GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); /* XXX: ggconv = conv->ui_data; should do */ - char *strip; + char *strip, *newline; GntTextFormatFlags fl = 0; g_return_if_fail(ggconv != NULL); @@ -236,12 +236,15 @@ if (flags & GAIM_MESSAGE_NICK) fl |= GNT_TEXT_FLAG_UNDERLINE; - strip = gaim_markup_strip_html(message); + /* XXX: Remove this workaround when textview can parse messages. */ + newline = gaim_strdup_withhtml(message); + strip = gaim_markup_strip_html(newline); 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(newline); g_free(strip); if (flags & (GAIM_MESSAGE_RECV | GAIM_MESSAGE_NICK | GAIM_MESSAGE_ERROR)) Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-07-31 23:19:12 UTC (rev 16602) +++ trunk/console/libgnt/gntwidget.c 2006-07-31 23:56:35 UTC (rev 16603) @@ -387,14 +387,19 @@ { /* - This is ugly. */ /* - What's your point? */ - mvwvline(widget->window, 0, 0, ACS_VLINE, widget->priv.height); - mvwvline(widget->window, 0, widget->priv.width - 1, ACS_VLINE, widget->priv.height); - mvwhline(widget->window, widget->priv.height - 1, 0, ACS_HLINE, widget->priv.width); - mvwhline(widget->window, 0, 0, ACS_HLINE, widget->priv.width); - mvwaddch(widget->window, 0, 0, ACS_ULCORNER); - mvwaddch(widget->window, 0, widget->priv.width - 1, ACS_URCORNER); - mvwaddch(widget->window, widget->priv.height - 1, 0, ACS_LLCORNER); - mvwaddch(widget->window, widget->priv.height - 1, widget->priv.width - 1, ACS_LRCORNER); + mvwvline(widget->window, 0, 0, ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL), widget->priv.height); + mvwvline(widget->window, 0, widget->priv.width - 1, + ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL), widget->priv.height); + mvwhline(widget->window, widget->priv.height - 1, 0, + ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL), widget->priv.width); + mvwhline(widget->window, 0, 0, ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL), widget->priv.width); + mvwaddch(widget->window, 0, 0, ACS_ULCORNER | COLOR_PAIR(GNT_COLOR_NORMAL)); + mvwaddch(widget->window, 0, widget->priv.width - 1, + ACS_URCORNER | COLOR_PAIR(GNT_COLOR_NORMAL)); + mvwaddch(widget->window, widget->priv.height - 1, 0, + ACS_LLCORNER | COLOR_PAIR(GNT_COLOR_NORMAL)); + mvwaddch(widget->window, widget->priv.height - 1, widget->priv.width - 1, + ACS_LRCORNER | COLOR_PAIR(GNT_COLOR_NORMAL)); } if (shadow) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-03 07:16:54
|
Revision: 16622 Author: sadrul Date: 2006-08-03 00:16:35 -0700 (Thu, 03 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16622&view=rev Log Message: ----------- Add commands /accounts, /buddylist, /debugwin and /plugins. It allows the user to close those windows, and pop them back up when necessary -- provided a conversation window is open -- which I am assuming would be the case most of the time. Until there's some better way of accessing these dialogs (eg. menus), this is the only way. Modified Paths: -------------- trunk/console/gntaccount.c trunk/console/gntblist.c trunk/console/gntblist.h trunk/console/gntconv.c trunk/console/gntdebug.h trunk/console/gntplugin.c Modified: trunk/console/gntaccount.c =================================================================== --- trunk/console/gntaccount.c 2006-08-02 23:52:45 UTC (rev 16621) +++ trunk/console/gntaccount.c 2006-08-03 07:16:35 UTC (rev 16622) @@ -548,6 +548,13 @@ gaim_account_set_enabled(account, GAIM_GNT_UI, gnt_tree_get_choice(GNT_TREE(widget), key)); } +static void +reset_accounts_win(GntWidget *widget, gpointer null) +{ + accounts.window = NULL; + accounts.tree = NULL; +} + void gg_accounts_show_all() { GList *iter; @@ -597,6 +604,8 @@ g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(delete_account_cb), accounts.tree); gnt_box_add_widget(GNT_BOX(accounts.window), box); + + g_signal_connect(G_OBJECT(accounts.window), "destroy", G_CALLBACK(reset_accounts_win), NULL); gnt_widget_show(accounts.window); } @@ -641,7 +650,8 @@ void gg_accounts_uninit() { - gnt_widget_destroy(accounts.window); + if (accounts.window) + gnt_widget_destroy(accounts.window); } /* The following uiops stuff are copied from gtkaccount.c */ Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-02 23:52:45 UTC (rev 16621) +++ trunk/console/gntblist.c 2006-08-03 07:16:35 UTC (rev 16622) @@ -66,7 +66,7 @@ { GGBlist *ggblist = list->ui_data; - if (node->ui_data == NULL) + if (ggblist == NULL || node->ui_data == NULL) return; gnt_tree_remove(GNT_TREE(ggblist->tree), node); @@ -85,6 +85,9 @@ static void node_update(GaimBuddyList *list, GaimBlistNode *node) { + if (list->ui_data == NULL) + return; + if (node->ui_data != NULL) { gnt_tree_change_text(GNT_TREE(ggblist->tree), node, @@ -744,6 +747,40 @@ gaim_prefs_set_int(PREF_ROOT "/position/y", y); } +static void +reset_blist_window(GntWidget *window, gpointer null) +{ + GaimBlistNode *node; + gaim_signals_disconnect_by_handle(gg_blist_get_handle()); + gaim_get_blist()->ui_data = NULL; + + node = gaim_blist_get_root(); + while (node) + { + node->ui_data = NULL; + node = gaim_blist_node_next(node, TRUE); + } + + remove_peripherals(ggblist); + g_free(ggblist); + ggblist = NULL; +} + +static void +populate_buddylist() +{ + GaimBlistNode *node; + GaimBuddyList *list; + + list = gaim_get_blist(); + node = gaim_blist_get_root(); + while (node) + { + node_update(list, node); + node = gaim_blist_node_next(node, TRUE); + } +} + void gg_blist_init() { gaim_prefs_add_none(PREF_ROOT); @@ -754,6 +791,16 @@ gaim_prefs_add_int(PREF_ROOT "/position/x", 0); gaim_prefs_add_int(PREF_ROOT "/position/y", 0); + gg_blist_show(); + + return; +} + +void gg_blist_show() +{ + if (ggblist) + return; + ggblist = g_new0(GGBlist, 1); gaim_get_blist()->ui_data = ggblist; @@ -805,11 +852,16 @@ ggblist, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); g_signal_connect(G_OBJECT(ggblist->tree), "size_changed", G_CALLBACK(size_changed_cb), NULL); g_signal_connect(G_OBJECT(ggblist->window), "position_set", G_CALLBACK(save_position_cb), NULL); + g_signal_connect(G_OBJECT(ggblist->window), "destroy", G_CALLBACK(reset_blist_window), NULL); + populate_buddylist(); } void gg_blist_uninit() { + if (ggblist == NULL) + return; + gnt_widget_destroy(ggblist->window); g_free(ggblist); ggblist = NULL; Modified: trunk/console/gntblist.h =================================================================== --- trunk/console/gntblist.h 2006-08-02 23:52:45 UTC (rev 16621) +++ trunk/console/gntblist.h 2006-08-03 07:16:35 UTC (rev 16622) @@ -6,6 +6,8 @@ void gg_blist_uninit(); +void gg_blist_show(); + void gg_blist_get_position(int *x, int *y); void gg_blist_set_position(int x, int y); Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-08-02 23:52:45 UTC (rev 16621) +++ trunk/console/gntconv.c 2006-08-03 07:16:35 UTC (rev 16622) @@ -5,8 +5,11 @@ #include <util.h> #include "gntgaim.h" +#include "gntaccount.h" #include "gntblist.h" #include "gntconv.h" +#include "gntdebug.h" +#include "gntplugin.h" #include "gnt.h" #include "gntbox.h" @@ -478,6 +481,13 @@ return GAIM_CMD_STATUS_OK; } +static GaimCmdRet +cmd_show_window(GaimConversation *conv, const char *cmd, char **args, char **error, gpointer data) +{ + void (*callback)() = data; + callback(); + return GAIM_CMD_STATUS_OK; +} void gg_conversation_init() { @@ -507,6 +517,20 @@ gaim_cmd_register("help", "w", GAIM_CMD_P_DEFAULT, GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, NULL, help_command_cb, _("help <command>: Help on a specific command."), NULL); + + /* Now some commands to bring up some other windows */ + gaim_cmd_register("plugins", "", GAIM_CMD_P_DEFAULT, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, + cmd_show_window, _("plugins: Show the plugins window."), gg_plugins_show_all); + gaim_cmd_register("buddylist", "", GAIM_CMD_P_DEFAULT, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, + cmd_show_window, _("buddylist: Show the buddylist."), gg_blist_show); + gaim_cmd_register("accounts", "", GAIM_CMD_P_DEFAULT, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, + cmd_show_window, _("accounts: Show the accounts window."), gg_accounts_show_all); + gaim_cmd_register("debugwin", "", GAIM_CMD_P_DEFAULT, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, + cmd_show_window, _("debugwin: Show the debug window."), gg_debug_window_show); } void gg_conversation_uninit() Modified: trunk/console/gntdebug.h =================================================================== --- trunk/console/gntdebug.h 2006-08-02 23:52:45 UTC (rev 16621) +++ trunk/console/gntdebug.h 2006-08-03 07:16:35 UTC (rev 16622) @@ -6,3 +6,4 @@ void gg_debug_uninit(); +void gg_debug_window_show(); Modified: trunk/console/gntplugin.c =================================================================== --- trunk/console/gntplugin.c 2006-08-02 23:52:45 UTC (rev 16621) +++ trunk/console/gntplugin.c 2006-08-03 07:16:35 UTC (rev 16622) @@ -70,6 +70,14 @@ gnt_text_view_scroll(GNT_TEXT_VIEW(plugins.aboot), 0); } +static void +reset_plugin_window(GntWidget *window, gpointer null) +{ + plugins.window = NULL; + plugins.tree = NULL; + plugins.aboot = NULL; +} + void gg_plugins_show_all() { GntWidget *window, *tree, *box, *aboot; @@ -118,6 +126,7 @@ gnt_tree_set_col_width(GNT_TREE(tree), 0, 30); g_signal_connect(G_OBJECT(tree), "toggled", G_CALLBACK(plugin_toggled_cb), NULL); g_signal_connect(G_OBJECT(tree), "selection_changed", G_CALLBACK(selection_changed), NULL); + g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(reset_plugin_window), NULL); gnt_widget_show(window); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-05 02:56:23
|
Revision: 16632 Author: sadrul Date: 2006-08-04 19:56:18 -0700 (Fri, 04 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16632&view=rev Log Message: ----------- Do not auto-scroll when I am reading the backlog. Modified Paths: -------------- trunk/console/gntconv.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttextview.h Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-08-05 02:19:19 UTC (rev 16631) +++ trunk/console/gntconv.c 2006-08-05 02:56:18 UTC (rev 16632) @@ -221,6 +221,7 @@ GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); /* XXX: ggconv = conv->ui_data; should do */ char *strip, *newline; GntTextFormatFlags fl = 0; + int pos; g_return_if_fail(ggconv != NULL); @@ -239,13 +240,16 @@ if (flags & GAIM_MESSAGE_NICK) fl |= GNT_TEXT_FLAG_UNDERLINE; + pos = gnt_text_view_get_lines_below(GNT_TEXT_VIEW(ggconv->tv)); + /* XXX: Remove this workaround when textview can parse messages. */ newline = gaim_strdup_withhtml(message); strip = gaim_markup_strip_html(newline); 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); + if (pos <= 1) + gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 0); g_free(newline); g_free(strip); Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-08-05 02:19:19 UTC (rev 16631) +++ trunk/console/libgnt/gnttextview.c 2006-08-05 02:56:18 UTC (rev 16632) @@ -93,6 +93,7 @@ gnt_text_view_destroy(GntWidget *widget) { GntTextView *view = GNT_TEXT_VIEW(widget); + view->list = g_list_first(view->list); g_list_foreach(view->list, free_text_line, NULL); g_list_free(view->list); } @@ -294,3 +295,24 @@ gnt_widget_draw(GNT_WIDGET(view)); } +int gnt_text_view_get_lines_below(GntTextView *view) +{ + int below = 0; + GList *list = view->list; + while ((list = list->prev)) + ++below; + return below; +} + +int gnt_text_view_get_lines_above(GntTextView *view) +{ + int above = 0; + GList *list = view->list; + list = g_list_nth(view->list, GNT_WIDGET(view)->priv.height); + if (!list) + return 0; + while ((list = list->next)) + ++above; + return above; +} + Modified: trunk/console/libgnt/gnttextview.h =================================================================== --- trunk/console/libgnt/gnttextview.h 2006-08-05 02:19:19 UTC (rev 16631) +++ trunk/console/libgnt/gnttextview.h 2006-08-05 02:56:18 UTC (rev 16632) @@ -69,6 +69,10 @@ void gnt_text_view_clear(GntTextView *view); +int gnt_text_view_get_lines_below(GntTextView *view); + +int gnt_text_view_get_lines_above(GntTextView *view); + G_END_DECLS #endif /* GNT_TEXT_VIEW_H */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-05 11:32:06
|
Revision: 16647 Author: sadrul Date: 2006-08-05 04:31:54 -0700 (Sat, 05 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16647&view=rev Log Message: ----------- Statusbox comes in. It's now possible to change the account status. There's nothing yet for creating custom statuses. It's also possible now to delete accounts. Modified Paths: -------------- trunk/console/gntaccount.c trunk/console/gntblist.c trunk/console/libgnt/gntbox.c trunk/console/libgnt/gntbox.h trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gntentry.c trunk/console/libgnt/test/tv.c Modified: trunk/console/gntaccount.c =================================================================== --- trunk/console/gntaccount.c 2006-08-05 10:05:07 UTC (rev 16646) +++ trunk/console/gntaccount.c 2006-08-05 11:31:54 UTC (rev 16647) @@ -49,6 +49,9 @@ GntWidget *remember; } AccountEditDialog; +/* This is necessary to close an edit-dialog when an account is deleted */ +static GList *accountdialogs; + static void account_add(GaimAccount *account) { @@ -64,6 +67,7 @@ static void edit_dialog_destroy(AccountEditDialog *dialog) { + accountdialogs = g_list_remove(accountdialogs, dialog); g_list_free(dialog->prpl_entries); g_list_free(dialog->split_entries); g_free(dialog); @@ -143,7 +147,6 @@ gaim_account_set_password(account, NULL); /* Mail notification */ - /* XXX: Only if the protocol has anything to do with emails */ gaim_account_set_check_mail(account, gnt_check_box_get_checked(GNT_CHECK_BOX(dialog->newmail))); @@ -426,7 +429,19 @@ GList *list, *iter; AccountEditDialog *dialog; + if (account) + { + GList *iter; + for (iter = accountdialogs; iter; iter = iter->next) + { + AccountEditDialog *dlg = iter->data; + if (dlg->account == account) + return; + } + } + dialog = g_new0(AccountEditDialog, 1); + accountdialogs = g_list_prepend(accountdialogs, dialog); dialog->window = window = gnt_box_new(FALSE, TRUE); dialog->account = account; @@ -534,10 +549,38 @@ } static void +really_delete_account(GaimAccount *account) +{ + GList *iter; + for (iter = accountdialogs; iter; iter = iter->next) + { + AccountEditDialog *dlg = iter->data; + if (dlg->account == account) + { + gnt_widget_destroy(dlg->window); + break; + } + } + gaim_accounts_delete(account); +} + +static void delete_account_cb(GntWidget *widget, GntTree *tree) { - /* XXX: After the request-api is complete */ - /* Note: remove the modify-dialog for the account */ + GaimAccount *account; + char *prompt; + + account = gnt_tree_get_selection_data(tree); + if (!account) + return; + + prompt = g_strdup_printf(_("Are you sure you want to delete %s?"), + gaim_account_get_username(account)); + + gaim_request_close_with_handle(account); /* Close any other opened delete window */ + gaim_request_action(account, _("Delete Account"), prompt, NULL, 0, account, 2, + _("Delete"), really_delete_account, _("Cancel"), NULL); + g_free(prompt); } static void Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-05 10:05:07 UTC (rev 16646) +++ trunk/console/gntblist.c 2006-08-05 11:31:54 UTC (rev 16647) @@ -1,19 +1,25 @@ #include <account.h> #include <blist.h> #include <request.h> +#include <savedstatuses.h> #include <server.h> #include <signal.h> +#include <status.h> #include <util.h> #include "gntgaim.h" #include "gntbox.h" +#include "gntcombobox.h" +#include "gntentry.h" #include "gntlabel.h" +#include "gntline.h" #include "gnttree.h" #include "gntblist.h" #include <string.h> #define PREF_ROOT "/gaim/gnt/blist" +#define TYPING_TIMEOUT 4000 typedef struct { @@ -25,8 +31,29 @@ GntWidget *context; GaimBlistNode *cnode; + + /* XXX: I am KISSing */ + GntWidget *status; /* Dropdown with the statuses */ + GntWidget *statustext; /* Status message */ + int typing; } GGBlist; +typedef enum +{ + STATUS_PRIMITIVE = 0, + STATUS_SAVED +} StatusType; + +typedef struct +{ + StatusType type; + union + { + GaimStatusPrimitive prim; + GaimSavedStatus *saved; + } u; +} StatusBoxItem; + GGBlist *ggblist; static void add_buddy(GaimBuddy *buddy, GGBlist *ggblist); @@ -34,6 +61,7 @@ static void add_chat(GaimChat *chat, GGBlist *ggblist); static void add_node(GaimBlistNode *node, GGBlist *ggblist); static void draw_tooltip(GGBlist *ggblist); +static void remove_typing_cb(gpointer null); static void remove_peripherals(GGBlist *ggblist); static const char * get_display_name(GaimBlistNode *node); @@ -113,7 +141,7 @@ { } -static GaimBlistUiOps blist_ui_ops = +static GaimBlistUiOps blist_ui_ops = { new_list, new_node, @@ -202,6 +230,8 @@ GaimBlistNode *node = (GaimBlistNode *)chat; if (node->ui_data) return; + if (!gaim_account_is_connected(chat->account)) + return; group = gaim_chat_get_group(chat); add_node((GaimBlistNode*)group, ggblist); @@ -290,7 +320,7 @@ GList *list; if (action == NULL) return; - + gnt_tree_add_row_after(tree, action, gnt_tree_create_row(tree, action->label), parent, NULL); for (list = action->children; list; list = list->next) @@ -367,7 +397,7 @@ add_custom_action(tree, _("View Log"), GAIM_CALLBACK(gg_blist_view_log_cb)), buddy); #endif - + /* Protocol actions */ append_proto_menu(tree, gaim_account_get_connection(gaim_buddy_get_account(buddy)), @@ -436,9 +466,9 @@ name = ((GaimGroup*)node)->name; else g_return_if_reached(); - + prompt = g_strdup_printf(_("Please enter the new name for %s"), name); - + gaim_request_input(node, _("Rename"), prompt, _("Enter empty string to reset the name."), name, FALSE, FALSE, NULL, _("Rename"), G_CALLBACK(rename_blist_node), _("Cancel"), NULL, node); @@ -682,7 +712,7 @@ ret = gnt_widget_key_pressed(ggblist->context, text); stop = TRUE; } - + if (text[0] == 27) { if (strcmp(text + 1, GNT_KEY_POPUP) == 0) @@ -760,7 +790,8 @@ node->ui_data = NULL; node = gaim_blist_node_next(node, TRUE); } - + + remove_typing_cb(NULL); remove_peripherals(ggblist); g_free(ggblist); ggblist = NULL; @@ -777,10 +808,55 @@ while (node) { node_update(list, node); - node = gaim_blist_node_next(node, TRUE); + node = gaim_blist_node_next(node, FALSE); } } +static void +destroy_status_list(GList *list) +{ + g_list_foreach(list, (GFunc)g_free, NULL); + g_list_free(list); +} + +static void +populate_status_dropdown() +{ + int i; + GList *iter; + GList *items = NULL; + + /* First the primitives */ + GaimStatusPrimitive prims[] = {GAIM_STATUS_AVAILABLE, GAIM_STATUS_AWAY, + GAIM_STATUS_INVISIBLE, GAIM_STATUS_OFFLINE, GAIM_STATUS_UNSET}; + + for (i = 0; prims[i] != GAIM_STATUS_UNSET; i++) + { + StatusBoxItem *item = g_new0(StatusBoxItem, 1); + item->type = STATUS_PRIMITIVE; + item->u.prim = prims[i]; + items = g_list_prepend(items, item); + gnt_combo_box_add_data(GNT_COMBO_BOX(ggblist->status), item, + gaim_primitive_get_name_from_type(prims[i])); + } + + /* Now the popular statuses */ + for (iter = gaim_savedstatuses_get_popular(6); iter; iter = iter->next) + { + StatusBoxItem *item = g_new0(StatusBoxItem, 1); + item->type = STATUS_SAVED; + item->u.saved = iter->data; + items = g_list_prepend(items, item); + gnt_combo_box_add_data(GNT_COMBO_BOX(ggblist->status), item, + gaim_savedstatus_get_title(iter->data)); + } + + /* The keys for the combobox are created here, and never used + * anywhere else. So make sure the keys are freed when the widget + * is destroyed. */ + g_object_set_data_full(G_OBJECT(ggblist->status), "list of statuses", items, (GDestroyNotify)destroy_status_list); +} + void gg_blist_init() { gaim_prefs_add_none(PREF_ROOT); @@ -796,6 +872,120 @@ return; } +static void +remove_typing_cb(gpointer null) +{ + GaimSavedStatus *current; + const char *message, *newmessage; + GaimStatusPrimitive prim, newprim; + StatusBoxItem *item; + + current = gaim_savedstatus_get_current(); + message = gaim_savedstatus_get_message(current); + prim = gaim_savedstatus_get_type(current); + + newmessage = gnt_entry_get_text(GNT_ENTRY(ggblist->statustext)); + item = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(ggblist->status)); + g_return_if_fail(item->type == STATUS_PRIMITIVE); + newprim = item->u.prim; + + if (newprim != prim || ((message && !newmessage) || + (!message && newmessage) || + (message && newmessage && g_utf8_collate(message, newmessage) != 0))) + { + GaimSavedStatus *status = gaim_savedstatus_find_transient_by_type_and_message(newprim, newmessage); + /* Holy Crap! That's a LAWNG function name */ + if (status == NULL) + { + status = gaim_savedstatus_new(NULL, newprim); + gaim_savedstatus_set_message(status, newmessage); + } + + gaim_savedstatus_activate(status); + } + + gnt_box_give_focus_to_child(GNT_BOX(ggblist->window), ggblist->tree); + g_source_remove(ggblist->typing); + ggblist->typing = 0; +} + +static void +status_selection_changed(GntComboBox *box, StatusBoxItem *old, StatusBoxItem *now, gpointer null) +{ + gnt_entry_set_text(GNT_ENTRY(ggblist->statustext), NULL); + if (now->type == STATUS_SAVED) + { + /* Set the status immediately */ + gaim_savedstatus_activate(now->u.saved); + } + else if (now->type == STATUS_PRIMITIVE) + { + /* Move the focus to the entry box */ + gnt_box_move_focus(GNT_BOX(ggblist->window), 1); + ggblist->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, NULL); + } + else + g_return_if_reached(); +} + +static gboolean +status_text_changed(GntEntry *entry, const char *text, gpointer null) +{ + if (text[0] == 27 && ggblist->typing == 0) + return FALSE; + + g_source_remove(ggblist->typing); + ggblist->typing = 0; + + if (text[0] == '\r' && text[1] == 0) + { + /* Set the status only after you press 'Enter' */ + remove_typing_cb(NULL); + return TRUE; + } + + ggblist->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, NULL); + return FALSE; +} + +static void +savedstatus_changed(GaimSavedStatus *now, GaimSavedStatus *old) +{ + /* Block the signals we don't want to emit */ + GList *list; + GaimStatusPrimitive prim; + const char *message; + + if (!ggblist) + return; + + g_signal_handlers_block_matched(ggblist->status, G_SIGNAL_MATCH_FUNC, + 0, 0, NULL, status_selection_changed, NULL); + g_signal_handlers_block_matched(ggblist->statustext, G_SIGNAL_MATCH_FUNC, + 0, 0, NULL, status_text_changed, NULL); + + prim = gaim_savedstatus_get_type(now); + message = gaim_savedstatus_get_message(now); + + list = g_object_get_data(G_OBJECT(ggblist->status), "list of statuses"); + for (; list; list = list->next) + { + StatusBoxItem *item = list->data; + if (item->type == STATUS_PRIMITIVE && item->u.prim == prim) + { + gnt_combo_box_set_selected(GNT_COMBO_BOX(ggblist->status), item); + gnt_entry_set_text(GNT_ENTRY(ggblist->statustext), message); + gnt_widget_draw(ggblist->status); + break; + } + } + + g_signal_handlers_unblock_matched(ggblist->status, G_SIGNAL_MATCH_FUNC, + 0, 0, NULL, status_selection_changed, NULL); + g_signal_handlers_unblock_matched(ggblist->statustext, G_SIGNAL_MATCH_FUNC, + 0, 0, NULL, status_text_changed, NULL); +} + void gg_blist_show() { if (ggblist) @@ -805,7 +995,7 @@ gaim_get_blist()->ui_data = ggblist; - ggblist->window = gnt_box_new(FALSE, FALSE); + ggblist->window = gnt_vbox_new(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")); @@ -820,13 +1010,23 @@ gaim_prefs_get_int(PREF_ROOT "/position/y")); gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->tree); + + gnt_box_add_widget(GNT_BOX(ggblist->window), gnt_hline_new()); + + ggblist->status = gnt_combo_box_new(); + gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->status); + ggblist->statustext = gnt_entry_new(NULL); + gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->statustext); + + populate_status_dropdown(); + 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); 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(), GAIM_CALLBACK(buddy_signed_on), ggblist); @@ -854,7 +1054,17 @@ g_signal_connect(G_OBJECT(ggblist->window), "position_set", G_CALLBACK(save_position_cb), NULL); g_signal_connect(G_OBJECT(ggblist->window), "destroy", G_CALLBACK(reset_blist_window), NULL); + /* Status signals */ + gaim_signal_connect(gaim_savedstatuses_get_handle(), "savedstatus-changed", gg_blist_get_handle(), + GAIM_CALLBACK(savedstatus_changed), NULL); + g_signal_connect(G_OBJECT(ggblist->status), "selection_changed", + G_CALLBACK(status_selection_changed), NULL); + g_signal_connect(G_OBJECT(ggblist->statustext), "key_pressed", + G_CALLBACK(status_text_changed), NULL); + populate_buddylist(); + + savedstatus_changed(gaim_savedstatus_get_current(), NULL); } void gg_blist_uninit() Modified: trunk/console/libgnt/gntbox.c =================================================================== --- trunk/console/libgnt/gntbox.c 2006-08-05 10:05:07 UTC (rev 16646) +++ trunk/console/libgnt/gntbox.c 2006-08-05 11:31:54 UTC (rev 16647) @@ -245,6 +245,28 @@ } while (box->active != last); } +static void +find_prev_focus(GntBox *box) +{ + gpointer last = box->active; + + if (!box->focus) + return; + + do + { + GList *iter = g_list_find(box->focus, box->active); + if (!iter) + box->active = box->focus->data; + else if (!iter->prev) + box->active = g_list_last(box->focus)->data; + else + box->active = iter->prev->data; + if (!GNT_WIDGET_IS_FLAG_SET(box->active, GNT_WIDGET_INVISIBLE)) + break; + } while (box->active != last); +} + static gboolean gnt_box_key_pressed(GntWidget *widget, const char *text) { @@ -263,15 +285,7 @@ { if (strcmp(text+1, GNT_KEY_LEFT) == 0) { - 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; - } + find_prev_focus(box); } else if (strcmp(text+1, GNT_KEY_RIGHT) == 0) { @@ -689,3 +703,46 @@ box->fill = fill; } +void gnt_box_move_focus(GntBox *box, int dir) +{ + GntWidget *now; + + if (box->active == NULL) + { + find_focusable_widget(box); + return; + } + + now = box->active; + + if (dir == 1) + find_next_focus(box); + else if (dir == -1) + find_prev_focus(box); + + if (now && now != box->active) + { + gnt_widget_set_focus(now, FALSE); + gnt_widget_set_focus(box->active, TRUE); + } + + if (GNT_WIDGET(box)->window) + gnt_widget_draw(GNT_WIDGET(box)); +} + +void gnt_box_give_focus_to_child(GntBox *box, GntWidget *widget) +{ + GList *find = g_list_find(box->focus, widget); + gpointer now = box->active; + if (find) + box->active = widget; + if (now && now != box->active) + { + gnt_widget_set_focus(now, FALSE); + gnt_widget_set_focus(box->active, TRUE); + } + + if (GNT_WIDGET(box)->window) + gnt_widget_draw(GNT_WIDGET(box)); +} + Modified: trunk/console/libgnt/gntbox.h =================================================================== --- trunk/console/libgnt/gntbox.h 2006-08-05 10:05:07 UTC (rev 16646) +++ trunk/console/libgnt/gntbox.h 2006-08-05 11:31:54 UTC (rev 16647) @@ -88,6 +88,10 @@ void gnt_box_set_fill(GntBox *box, gboolean fill); +void gnt_box_move_focus(GntBox *box, int dir); /* +1 to move forward, -1 for backward */ + +void gnt_box_give_focus_to_child(GntBox *box, GntWidget *widget); + G_END_DECLS #endif /* GNT_BOX_H */ Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-08-05 10:05:07 UTC (rev 16646) +++ trunk/console/libgnt/gntcombobox.c 2006-08-05 11:31:54 UTC (rev 16647) @@ -23,11 +23,11 @@ /* XXX: make sure the key actually does exist */ gpointer old = box->selected; box->selected = key; - g_signal_emit(box, signals[SIG_SELECTION_CHANGED], 0, old, key); if (GNT_WIDGET(box)->window) gnt_widget_draw(GNT_WIDGET(box)); if (box->dropdown) gnt_tree_set_selected(GNT_TREE(box->dropdown), key); + g_signal_emit(box, signals[SIG_SELECTION_CHANGED], 0, old, key); } } @@ -65,7 +65,7 @@ } mvwprintw(widget->window, 1, 1, text); - whline(widget->window, '\0' | COLOR_PAIR(type), widget->priv.width - 4 - len); + whline(widget->window, ' ' | COLOR_PAIR(type), widget->priv.width - 4 - len); mvwaddch(widget->window, 1, widget->priv.width - 3, ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL)); mvwaddch(widget->window, 1, widget->priv.width - 2, ACS_DARROW | COLOR_PAIR(GNT_COLOR_NORMAL)); Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-08-05 10:05:07 UTC (rev 16646) +++ trunk/console/libgnt/gntentry.c 2006-08-05 11:31:54 UTC (rev 16647) @@ -16,8 +16,9 @@ { GntEntry *entry = GNT_ENTRY(widget); int stop; + gboolean focus; - if (gnt_widget_has_focus(widget)) + if ((focus = 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)); @@ -34,8 +35,9 @@ if (stop < widget->priv.width) mvwhline(widget->window, 0, stop, ENTRY_CHAR, widget->priv.width - stop); - mvwchgat(widget->window, 0, g_utf8_pointer_to_offset(entry->scroll, entry->cursor), 1, - A_REVERSE, COLOR_PAIR(GNT_COLOR_TEXT_NORMAL), NULL); + if (focus) + mvwchgat(widget->window, 0, g_utf8_pointer_to_offset(entry->scroll, entry->cursor), + 1, A_REVERSE, COLOR_PAIR(GNT_COLOR_TEXT_NORMAL), NULL); DEBUG; } Modified: trunk/console/libgnt/test/tv.c =================================================================== --- trunk/console/libgnt/test/tv.c 2006-08-05 10:05:07 UTC (rev 16646) +++ trunk/console/libgnt/test/tv.c 2006-08-05 11:31:54 UTC (rev 16647) @@ -16,7 +16,8 @@ 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); + if (gnt_text_view_get_lines_below(GNT_TEXT_VIEW(view)) <= 1) + gnt_text_view_scroll(GNT_TEXT_VIEW(view), 0); return TRUE; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-05 17:04:58
|
Revision: 16648 Author: sadrul Date: 2006-08-05 10:04:47 -0700 (Sat, 05 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16648&view=rev Log Message: ----------- Do not give focus to new windows. Instead, set the urgent-hint for them. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gntwidget.h Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-05 11:31:54 UTC (rev 16647) +++ trunk/console/gntblist.c 2006-08-05 17:04:47 UTC (rev 16648) @@ -679,6 +679,7 @@ gnt_widget_set_position(box, x, y); GNT_WIDGET_UNSET_FLAGS(box, GNT_WIDGET_CAN_TAKE_FOCUS); + GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_TRANSIENT); gnt_widget_draw(box); g_free(title); Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-08-05 11:31:54 UTC (rev 16647) +++ trunk/console/libgnt/gntcombobox.c 2006-08-05 17:04:47 UTC (rev 16648) @@ -129,6 +129,7 @@ widget->priv.y - 9 + 1, widget->priv.x); } + GNT_WIDGET_SET_FLAGS(parent, GNT_WIDGET_TRANSIENT); gnt_widget_draw(parent); return TRUE; } Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-05 11:31:54 UTC (rev 16647) +++ trunk/console/libgnt/gntmain.c 2006-08-05 17:04:47 UTC (rev 16648) @@ -67,7 +67,7 @@ /* 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); + focus_list = g_list_find(focus_list, w ? w : widget); gnt_widget_set_focus(widget, TRUE); if (w) @@ -757,7 +757,14 @@ 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); + if (!GNT_WIDGET_IS_FLAG_SET(node->me, GNT_WIDGET_TRANSIENT)) + { + bottom_panel(node->panel); /* New windows should not grab focus */ + gnt_widget_set_urgent(node->me); + } + } if (window_list.window) { Modified: trunk/console/libgnt/gntwidget.h =================================================================== --- trunk/console/libgnt/gntwidget.h 2006-08-05 11:31:54 UTC (rev 16647) +++ trunk/console/libgnt/gntwidget.h 2006-08-05 17:04:47 UTC (rev 16648) @@ -40,6 +40,7 @@ GNT_WIDGET_GROW_X = 1 << 8, GNT_WIDGET_GROW_Y = 1 << 9, GNT_WIDGET_INVISIBLE = 1 << 10, + GNT_WIDGET_TRANSIENT = 1 << 11, } 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-08-07 02:16:07
|
Revision: 16660 Author: sadrul Date: 2006-08-06 19:15:58 -0700 (Sun, 06 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16660&view=rev Log Message: ----------- A couple of minor adjustments, memory leak fixes. And request-ui is almost complete now. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntconv.c trunk/console/gntrequest.c trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gnttree.h trunk/console/libgnt/test/combo.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-06 23:56:42 UTC (rev 16659) +++ trunk/console/gntblist.c 2006-08-07 02:15:58 UTC (rev 16660) @@ -61,7 +61,7 @@ static void add_chat(GaimChat *chat, GGBlist *ggblist); static void add_node(GaimBlistNode *node, GGBlist *ggblist); static void draw_tooltip(GGBlist *ggblist); -static void remove_typing_cb(gpointer null); +static gboolean remove_typing_cb(gpointer null); static void remove_peripherals(GGBlist *ggblist); static const char * get_display_name(GaimBlistNode *node); @@ -873,7 +873,7 @@ return; } -static void +static gboolean remove_typing_cb(gpointer null) { GaimSavedStatus *current; @@ -887,7 +887,7 @@ newmessage = gnt_entry_get_text(GNT_ENTRY(ggblist->statustext)); item = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(ggblist->status)); - g_return_if_fail(item->type == STATUS_PRIMITIVE); + g_return_val_if_fail(item->type == STATUS_PRIMITIVE, FALSE); newprim = item->u.prim; if (newprim != prim || ((message && !newmessage) || @@ -908,6 +908,7 @@ gnt_box_give_focus_to_child(GNT_BOX(ggblist->window), ggblist->tree); g_source_remove(ggblist->typing); ggblist->typing = 0; + return FALSE; } static void @@ -932,7 +933,7 @@ static gboolean status_text_changed(GntEntry *entry, const char *text, gpointer null) { - if (text[0] == 27 && ggblist->typing == 0) + if ((text[0] == 27 || (text[0] == '\t' && text[1] == '\0')) && ggblist->typing == 0) return FALSE; g_source_remove(ggblist->typing); Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-08-06 23:56:42 UTC (rev 16659) +++ trunk/console/gntconv.c 2006-08-07 02:15:58 UTC (rev 16660) @@ -107,17 +107,20 @@ } else { + char *escape = g_markup_escape_text(text, -1); 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); + gaim_conv_im_send_with_flags(GAIM_CONV_IM(ggconv->conv), escape, GAIM_MESSAGE_SEND); break; case GAIM_CONV_TYPE_CHAT: - gaim_conv_chat_send(GAIM_CONV_CHAT(ggconv->conv), text); + gaim_conv_chat_send(GAIM_CONV_CHAT(ggconv->conv), escape); break; default: + g_free(escape); g_return_val_if_reached(FALSE); } + g_free(escape); } gnt_entry_clear(GNT_ENTRY(ggconv->entry)); return TRUE; Modified: trunk/console/gntrequest.c =================================================================== --- trunk/console/gntrequest.c 2006-08-06 23:56:42 UTC (rev 16659) +++ trunk/console/gntrequest.c 2006-08-07 02:15:58 UTC (rev 16660) @@ -1,15 +1,19 @@ #include <gnt.h> #include <gntbox.h> #include <gntbutton.h> +#include <gntcheckbox.h> #include <gntcombobox.h> #include <gntentry.h> #include <gntlabel.h> +#include <gntline.h> +#include <gnttree.h> +#include "gntgaim.h" #include "gntrequest.h" static GntWidget * setup_request_window(const char *title, const char *primary, - const char *secondary) + const char *secondary, GaimRequestType type) { GntWidget *window; @@ -24,6 +28,9 @@ if (secondary) gnt_box_add_widget(GNT_BOX(window), gnt_label_new(secondary)); + g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gaim_request_close), + GINT_TO_POINTER(type)); + return window; } @@ -35,7 +42,7 @@ const char *text; gpointer callback; - box = gnt_hbox_new(TRUE); + box = gnt_hbox_new(FALSE); va_start(list, data); @@ -79,7 +86,7 @@ { GntWidget *window, *box, *entry; - window = setup_request_window(title, primary, secondary); + window = setup_request_window(title, primary, secondary, GAIM_REQUEST_INPUT); entry = gnt_entry_new(default_value); if (masked) @@ -131,7 +138,7 @@ const char *text; int val; - window = setup_request_window(title, primary, secondary); + window = setup_request_window(title, primary, secondary, GAIM_REQUEST_CHOICE); combo = gnt_combo_box_new(); gnt_box_add_widget(GNT_BOX(window), combo); @@ -173,7 +180,7 @@ GntWidget *window, *box, *button; int i; - window = setup_request_window(title, primary, secondary); + window = setup_request_window(title, primary, secondary, GAIM_REQUEST_ACTION); box = gnt_hbox_new(TRUE); gnt_box_add_widget(GNT_BOX(window), box); @@ -196,12 +203,212 @@ return window; } +static void +request_fields_cb(GntWidget *button, GaimRequestFields *fields) +{ + GaimRequestFieldsCb callback = g_object_get_data(G_OBJECT(button), "activate-callback"); + gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata"); + GList *list; + + /* Update the data of the fields. GtkGaim does this differently. Instead of + * updating the fields at the end like here, it updates the appropriate field + * instantly whenever a change is made. That allows it to make sure the + * 'required' fields are entered before the user can hit OK. It's not the case + * here, althought it can be done. I am not honouring the 'required' fields + * for the moment. */ + for (list = gaim_request_fields_get_groups(fields); list; list = list->next) + { + GaimRequestFieldGroup *group = list->data; + GList *fields = gaim_request_field_group_get_fields(group); + + for (; fields ; fields = fields->next) + { + GaimRequestField *field = fields->data; + GaimRequestFieldType type = gaim_request_field_get_type(field); + if (type == GAIM_REQUEST_FIELD_BOOLEAN) + { + GntWidget *check = field->ui_data; + gboolean value = gnt_check_box_get_checked(GNT_CHECK_BOX(check)); + gaim_request_field_bool_set_value(field, value); + } + else if (type == GAIM_REQUEST_FIELD_STRING) + { + GntWidget *entry = field->ui_data; + gaim_request_field_string_set_value(field, gnt_entry_get_text(GNT_ENTRY(entry))); + } + else if (type == GAIM_REQUEST_FIELD_INTEGER) + { + GntWidget *entry = field->ui_data; + const char *text = gnt_entry_get_text(GNT_ENTRY(entry)); + int value = (text && *text) ? atoi(text) : 0; + gaim_request_field_int_set_value(field, value); + } + else if (type == GAIM_REQUEST_FIELD_CHOICE) + { + GntWidget *combo = field->ui_data;; + int id = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo))); + gaim_request_field_choice_set_value(field, id); + } + else if (type == GAIM_REQUEST_FIELD_LIST) + { + GntWidget *tree = field->ui_data; + gpointer data = gnt_tree_get_selection_data(GNT_TREE(tree)); + GList *list = g_list_append(NULL, data); /* XXX: Update when multi-select is allowed */ + gaim_request_field_list_set_selected(field, list); + g_list_free(list); + } + else if (type == GAIM_REQUEST_FIELD_ACCOUNT) + { + } + } + } + + if (callback) + callback(data, fields); + + while (button->parent) + button = button->parent; + + gaim_request_close(GAIM_REQUEST_FIELDS, button); +} + +static void * +gg_request_fields(const char *title, const char *primary, + const char *secondary, GaimRequestFields *fields, + const char *ok, GCallback ok_cb, + const char *cancel, GCallback cancel_cb, + void *userdata) +{ + GntWidget *window, *box; + GList *list; + + window = setup_request_window(title, primary, secondary, GAIM_REQUEST_FIELDS); + + /* This is how it's going to work: the request-groups are going to be + * stacked vertically one after the other. A GntLine will be separating + * the groups. */ + box = gnt_vbox_new(FALSE); + gnt_box_set_pad(GNT_BOX(box), 0); + gnt_box_set_fill(GNT_BOX(box), TRUE); + for (list = gaim_request_fields_get_groups(fields); list; list = list->next) + { + GaimRequestFieldGroup *group = list->data; + GList *fields = gaim_request_field_group_get_fields(group); + GntWidget *hbox; + + /* XXX: Do something with the title, perhaps add a bold label */ + + for (; fields ; fields = fields->next) + { + GaimRequestField *field = fields->data; + GaimRequestFieldType type = gaim_request_field_get_type(field); + const char *label = gaim_request_field_get_label(field); + + hbox = gnt_hbox_new(FALSE); + gnt_box_set_pad(GNT_BOX(hbox), 0); + gnt_box_add_widget(GNT_BOX(box), hbox); + + if (type != GAIM_REQUEST_FIELD_BOOLEAN) + gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(label)); + + if (type == GAIM_REQUEST_FIELD_BOOLEAN) + { + GntWidget *check = gnt_check_box_new(label); + gnt_check_box_set_checked(GNT_CHECK_BOX(check), + gaim_request_field_bool_get_default_value(field)); + gnt_box_add_widget(GNT_BOX(hbox), check); + field->ui_data = check; + } + else if (type == GAIM_REQUEST_FIELD_STRING) + { + GntWidget *entry = gnt_entry_new( + gaim_request_field_string_get_default_value(field)); + gnt_entry_set_masked(GNT_ENTRY(entry), + gaim_request_field_string_is_masked(field)); + gnt_box_add_widget(GNT_BOX(hbox), entry); + field->ui_data = entry; + } + else if (type == GAIM_REQUEST_FIELD_INTEGER) + { + GntWidget *entry = gnt_entry_new( + gaim_request_field_string_get_default_value(field)); + gnt_entry_set_flag(GNT_ENTRY(entry), GNT_ENTRY_FLAG_INT); + gnt_box_add_widget(GNT_BOX(hbox), entry); + field->ui_data = entry; + } + else if (type == GAIM_REQUEST_FIELD_CHOICE) + { + int id; + const GList *list; + GntWidget *combo = gnt_combo_box_new(); + gnt_box_add_widget(GNT_BOX(hbox), combo); + field->ui_data = combo; + + list = gaim_request_field_choice_get_labels(field); + for (id = 1; list; list = list->next, id++) + { + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), + GINT_TO_POINTER(id), list->data); + } + gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), + GINT_TO_POINTER(gaim_request_field_choice_get_default_value(field))); + } + else if (type == GAIM_REQUEST_FIELD_LIST) + { + /* XXX: Yet to allow multi-select, because the feature is absent in GntTree */ + const GList *list; + GntWidget *tree = gnt_tree_new(); + gnt_box_add_widget(GNT_BOX(hbox), tree); + field->ui_data = tree; + + list = gaim_request_field_list_get_items(field); + for (; list; list = list->next) + { + const char *text = list->data; + gpointer key = gaim_request_field_list_get_data(field, text); + gnt_tree_add_row_after(GNT_TREE(tree), key, + gnt_tree_create_row(GNT_TREE(tree), text), NULL, NULL); + if (gaim_request_field_list_is_selected(field, text)) + gnt_tree_set_selected(GNT_TREE(tree), key); + } + } +#if 0 + else if (type == GAIM_REQUEST_FIELD_ACCOUNT) + { + /* XXX: remember to set the field->ui_data */ + } +#endif + else + { + gnt_box_add_widget(GNT_BOX(hbox), + gnt_label_new_with_format(_("Not implemented yet."), + GNT_TEXT_FLAG_BOLD)); + } + if (fields->next) + gnt_box_add_widget(GNT_BOX(box), gnt_hline_new()); + } + } + gnt_box_add_widget(GNT_BOX(window), box); + + box = setup_button_box(userdata, request_fields_cb, fields, + ok, ok_cb, cancel, cancel_cb, NULL); + gnt_box_add_widget(GNT_BOX(window), box); + + gnt_widget_show(window); + + + return window; +} + static GaimRequestUiOps uiops = { .request_input = gg_request_input, .close_request = gg_close_request, .request_choice = gg_request_choice, .request_action = gg_request_action, + .request_fields = gg_request_fields, + .request_file = NULL, /* No plans for these */ + .request_folder = NULL }; GaimRequestUiOps *gg_request_get_ui_ops() Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-08-06 23:56:42 UTC (rev 16659) +++ trunk/console/libgnt/gntcombobox.c 2006-08-07 02:15:58 UTC (rev 16660) @@ -41,15 +41,13 @@ if (box->dropdown) { - text = (char *)gnt_tree_get_selection_text(GNT_TREE(box->dropdown)); + text = gnt_tree_get_selection_text(GNT_TREE(box->dropdown)); box->selected = gnt_tree_get_selection_data(GNT_TREE(box->dropdown)); } if (text == NULL) - text = ""; + text = g_strdup(text); - text = g_strdup(text); - if (gnt_widget_has_focus(widget)) type = GNT_COLOR_HIGHLIGHT; else @@ -102,6 +100,7 @@ case '\t': set_selection(box, gnt_tree_get_selection_data(GNT_TREE(box->dropdown))); case 27: + gnt_tree_set_selected(GNT_TREE(box->dropdown), box->selected); gnt_widget_hide(box->dropdown->parent); return TRUE; break; @@ -118,18 +117,18 @@ 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(parent, - widget->priv.x, widget->priv.y + widget->priv.height - 1); + int height = g_list_length(GNT_TREE(box->dropdown)->list); + int y = widget->priv.y + widget->priv.height - 1; + gnt_widget_set_size(box->dropdown, widget->priv.width, height + 2); + + if (y + height + 2 >= getmaxy(stdscr)) + y = widget->priv.y - height - 1; + gnt_widget_set_position(parent, widget->priv.x, y); 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); + mvwin(parent->window, y, widget->priv.x); } - GNT_WIDGET_SET_FLAGS(parent, GNT_WIDGET_TRANSIENT); gnt_widget_draw(parent); return TRUE; } @@ -192,7 +191,7 @@ combo->dropdown = gnt_tree_new(); box = gnt_box_new(FALSE, FALSE); - GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_NO_SHADOW | GNT_WIDGET_NO_BORDER); + GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_NO_SHADOW | GNT_WIDGET_NO_BORDER | GNT_WIDGET_TRANSIENT); gnt_box_set_pad(GNT_BOX(box), 0); gnt_box_add_widget(GNT_BOX(box), combo->dropdown); Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-08-06 23:56:42 UTC (rev 16659) +++ trunk/console/libgnt/gnttree.h 2006-08-07 02:15:58 UTC (rev 16660) @@ -78,6 +78,7 @@ gpointer gnt_tree_get_selection_data(GntTree *tree); +/* Returned string needs to be freed */ char *gnt_tree_get_selection_text(GntTree *tree); GList *gnt_tree_get_selection_text_list(GntTree *tree); Modified: trunk/console/libgnt/test/combo.c =================================================================== --- trunk/console/libgnt/test/combo.c 2006-08-06 23:56:42 UTC (rev 16659) +++ trunk/console/libgnt/test/combo.c 2006-08-07 02:15:58 UTC (rev 16660) @@ -46,6 +46,9 @@ gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "4", "4"); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "5", "5"); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "6", "6"); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "7", "7"); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "8", "8"); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "9", "9"); gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new("Select")); gnt_box_add_widget(GNT_BOX(hbox), combo); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-09 03:42:52
|
Revision: 16674 Author: sadrul Date: 2006-08-08 20:41:45 -0700 (Tue, 08 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16674&view=rev Log Message: ----------- Add a way to change some preferences (the preferences for the conversations do not do anything yet). I used the request-api for this, which I think is cool. But too many preferences will make the dialog long, which may not fit in the screen. It looks alright for now though. You can pop the dialog up with "/prefs" command in a converastion. And some other minor fixes. Modified Paths: -------------- trunk/console/gntaccount.c trunk/console/gntblist.c trunk/console/gntconv.c trunk/console/gntdebug.c trunk/console/gntplugin.c trunk/console/gntprefs.c trunk/console/gntprefs.h trunk/console/gntrequest.c trunk/console/libgnt/Makefile.am trunk/console/libgnt/gntbutton.c trunk/console/libgnt/gntlabel.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/test/combo.c Added Paths: ----------- trunk/console/libgnt/gntutils.c trunk/console/libgnt/gntutils.h Modified: trunk/console/gntaccount.c =================================================================== --- trunk/console/gntaccount.c 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/gntaccount.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -213,8 +213,9 @@ } else { - dialog->splits = gnt_box_new(FALSE, TRUE); + dialog->splits = gnt_vbox_new(FALSE); gnt_box_set_pad(GNT_BOX(dialog->splits), 0); + gnt_box_set_fill(GNT_BOX(dialog->splits), TRUE); } dialog->split_entries = NULL; @@ -232,7 +233,7 @@ GntWidget *entry; char *buf; - hbox = gnt_box_new(TRUE, FALSE); + hbox = gnt_hbox_new(TRUE); gnt_box_add_widget(GNT_BOX(dialog->splits), hbox); buf = g_strdup_printf("%s:", gaim_account_user_split_get_text(split)); @@ -443,16 +444,18 @@ dialog = g_new0(AccountEditDialog, 1); accountdialogs = g_list_prepend(accountdialogs, dialog); - dialog->window = window = gnt_box_new(FALSE, TRUE); + dialog->window = window = gnt_vbox_new(FALSE); dialog->account = account; gnt_box_set_toplevel(GNT_BOX(window), TRUE); gnt_box_set_title(GNT_BOX(window), account ? _("Modify Account") : _("New Account")); gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); gnt_box_set_pad(GNT_BOX(window), 0); + gnt_widget_set_name(window, "edit-account"); + gnt_box_set_fill(GNT_BOX(window), TRUE); - hbox = gnt_box_new(TRUE, FALSE); + hbox = gnt_hbox_new(TRUE); + gnt_box_set_pad(GNT_BOX(hbox), 0); 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(); @@ -461,6 +464,7 @@ gnt_combo_box_add_data(GNT_COMBO_BOX(combo), iter->data, ((GaimPlugin*)iter->data)->info->name); } + if (account) gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), gaim_plugins_find_with_id(gaim_account_get_protocol_id(account))); @@ -468,10 +472,12 @@ gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), list->data); 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); + hbox = gnt_hbox_new(TRUE); + gnt_box_set_pad(GNT_BOX(hbox), 0); gnt_box_add_widget(GNT_BOX(window), hbox); dialog->screenname = entry = gnt_entry_new(NULL); @@ -482,7 +488,8 @@ update_user_splits(dialog); gnt_box_add_widget(GNT_BOX(window), dialog->splits); - hbox = gnt_box_new(TRUE, FALSE); + hbox = gnt_hbox_new(TRUE); + gnt_box_set_pad(GNT_BOX(hbox), 0); gnt_box_add_widget(GNT_BOX(window), hbox); dialog->password = entry = gnt_entry_new(NULL); @@ -492,7 +499,8 @@ if (account) gnt_entry_set_text(GNT_ENTRY(entry), gaim_account_get_password(account)); - hbox = gnt_box_new(TRUE, FALSE); + hbox = gnt_hbox_new(TRUE); + gnt_box_set_pad(GNT_BOX(hbox), 0); gnt_box_add_widget(GNT_BOX(window), hbox); dialog->alias = entry = gnt_entry_new(NULL); @@ -515,8 +523,9 @@ /* TODO: Add proxy options */ /* The button box */ - hbox = gnt_box_new(FALSE, FALSE); + hbox = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(window), hbox); + gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); button = gnt_button_new(_("Cancel")); gnt_box_add_widget(GNT_BOX(hbox), button); @@ -603,7 +612,7 @@ GList *iter; GntWidget *box, *button; - accounts.window = gnt_box_new(FALSE, TRUE); + accounts.window = gnt_vbox_new(FALSE); 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); @@ -632,7 +641,7 @@ gnt_box_add_widget(GNT_BOX(accounts.window), gnt_line_new(FALSE)); - box = gnt_box_new(FALSE, FALSE); + box = gnt_hbox_new(FALSE); button = gnt_button_new(_("Add")); gnt_box_add_widget(GNT_BOX(box), button); Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/gntblist.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -906,7 +906,8 @@ } gnt_box_give_focus_to_child(GNT_BOX(ggblist->window), ggblist->tree); - g_source_remove(ggblist->typing); + if (ggblist->typing) + g_source_remove(ggblist->typing); ggblist->typing = 0; return FALSE; } @@ -923,6 +924,7 @@ else if (now->type == STATUS_PRIMITIVE) { /* Move the focus to the entry box */ + /* XXX: Make sure the selected status can have a message */ gnt_box_move_focus(GNT_BOX(ggblist->window), 1); ggblist->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, NULL); } @@ -936,7 +938,8 @@ if ((text[0] == 27 || (text[0] == '\t' && text[1] == '\0')) && ggblist->typing == 0) return FALSE; - g_source_remove(ggblist->typing); + if (ggblist->typing) + g_source_remove(ggblist->typing); ggblist->typing = 0; if (text[0] == '\r' && text[1] == 0) Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/gntconv.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -10,6 +10,7 @@ #include "gntconv.h" #include "gntdebug.h" #include "gntplugin.h" +#include "gntprefs.h" #include "gnt.h" #include "gntbox.h" @@ -538,6 +539,9 @@ gaim_cmd_register("debugwin", "", GAIM_CMD_P_DEFAULT, GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, cmd_show_window, _("debugwin: Show the debug window."), gg_debug_window_show); + gaim_cmd_register("prefs", "", GAIM_CMD_P_DEFAULT, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, + cmd_show_window, _("prefs: Show the preference window."), gg_prefs_show_all); } void gg_conversation_uninit() Modified: trunk/console/gntdebug.c =================================================================== --- trunk/console/gntdebug.c 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/gntdebug.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -19,7 +19,6 @@ { if (key[0] == 27) { - /* XXX: This doesn't seem to always work */ if (strcmp(key+1, GNT_KEY_DOWN) == 0) gnt_text_view_scroll(view, 1); else if (strcmp(key+1, GNT_KEY_UP) == 0) @@ -61,10 +60,7 @@ } gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(debug.tview), args, flag); - gnt_text_view_next_line(GNT_TEXT_VIEW(debug.tview)); gnt_text_view_scroll(GNT_TEXT_VIEW(debug.tview), 0); - - g_signal_connect(G_OBJECT(debug.window), "key_pressed", G_CALLBACK(debug_window_kpress_cb), debug.tview); } } @@ -95,7 +91,10 @@ debug.tview = gnt_text_view_new(); gnt_box_add_widget(GNT_BOX(debug.window), debug.tview); + /* XXX: Add checkboxes/buttons for Clear, Pause, Timestamps */ + g_signal_connect(G_OBJECT(debug.window), "destroy", G_CALLBACK(reset_debug_win), NULL); + g_signal_connect(G_OBJECT(debug.window), "key_pressed", G_CALLBACK(debug_window_kpress_cb), debug.tview); } gnt_widget_show(debug.window); Modified: trunk/console/gntplugin.c =================================================================== --- trunk/console/gntplugin.c 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/gntplugin.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -128,6 +128,8 @@ g_signal_connect(G_OBJECT(tree), "selection_changed", G_CALLBACK(selection_changed), NULL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(reset_plugin_window), NULL); + gnt_tree_set_selected(GNT_TREE(tree), gaim_plugins_get_all()->data); + gnt_widget_show(window); } Modified: trunk/console/gntprefs.c =================================================================== --- trunk/console/gntprefs.c 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/gntprefs.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -1,8 +1,11 @@ #include <prefs.h> +#include "gntgaim.h" #include "gntprefs.h" -#include "gntgaim.h" +#include "gntrequest.h" +#include <string.h> + void gg_prefs_init() { gaim_prefs_add_none("/gaim"); @@ -10,5 +13,182 @@ gaim_prefs_add_none("/gaim/gnt/plugins"); gaim_prefs_add_string_list("/gaim/gnt/plugins/loaded", NULL); + + gaim_prefs_add_none("/gaim/gnt/conversations"); + gaim_prefs_add_bool("/gaim/gnt/conversations/timestamps", TRUE); + gaim_prefs_add_bool("/gaim/gnt/conversations/notify_typing", FALSE); } +typedef struct +{ + GaimPrefType type; + const char *pref; + const char *label; + GList *(*lv)(); /* If the value is to be selected from a number of choices */ +} Prefs; + +static GList * +get_log_options() +{ + return gaim_log_logger_get_options(); +} + +static GaimRequestField * +get_pref_field(Prefs *prefs) +{ + GaimRequestField *field = NULL; + + if (prefs->lv == NULL) + { + switch (prefs->type) + { + case GAIM_PREF_BOOLEAN: + field = gaim_request_field_bool_new(prefs->pref, prefs->label, + gaim_prefs_get_bool(prefs->pref)); + break; + case GAIM_PREF_INT: + field = gaim_request_field_int_new(prefs->pref, prefs->label, + gaim_prefs_get_int(prefs->pref)); + break; + case GAIM_PREF_STRING: + field = gaim_request_field_string_new(prefs->pref, prefs->label, + gaim_prefs_get_string(prefs->pref), FALSE); + break; + default: + break; + } + } + else + { + GList *list = prefs->lv(), *iter; + field = gaim_request_field_list_new(prefs->pref, prefs->label); + for (iter = list; iter; iter = iter->next) + { + gboolean select = FALSE; + const char *data = iter->data; + iter = iter->next; + switch (prefs->type) + { + case GAIM_PREF_BOOLEAN: + if (gaim_prefs_get_bool(prefs->pref) == GPOINTER_TO_INT(iter->data)) + select = TRUE; + break; + case GAIM_PREF_INT: + if (gaim_prefs_get_int(prefs->pref) == GPOINTER_TO_INT(iter->data)) + select = TRUE; + break; + case GAIM_PREF_STRING: + if (strcmp(gaim_prefs_get_string(prefs->pref), iter->data) == 0) + select = TRUE; + break; + default: + break; + } + gaim_request_field_list_add(field, data, iter->data); + if (select) + gaim_request_field_list_add_selected(field, data); + } + g_list_free(list); + } + return field; +} + +static Prefs convs[] = +{ + {GAIM_PREF_BOOLEAN, "/gaim/gnt/conversations/timestamps", _("Show Timestamps"), NULL}, + {GAIM_PREF_BOOLEAN, "/gaim/gnt/conversations/notify_typing", _("Notify buddies when you are typing"), NULL}, + {GAIM_PREF_NONE, NULL, NULL, NULL} +}; + +static Prefs logging[] = +{ + {GAIM_PREF_STRING, "/core/logging/format", _("Log format"), get_log_options}, + {GAIM_PREF_BOOLEAN, "/core/logging/log_ims", _("Log IMs"), NULL}, + {GAIM_PREF_BOOLEAN, "/core/logging/log_chats", _("Log chats"), NULL}, + {GAIM_PREF_BOOLEAN, "/core/logging/log_system", _("Log status change events"), NULL}, + {GAIM_PREF_NONE, NULL, NULL, NULL}, +}; + +static void +save_cb(void *data, GaimRequestFields *allfields) +{ + GList *list; + for (list = gaim_request_fields_get_groups(allfields); list; list = list->next) + { + GaimRequestFieldGroup *group = list->data; + GList *fields = gaim_request_field_group_get_fields(group); + + for (; fields ; fields = fields->next) + { + GaimRequestField *field = fields->data; + GaimRequestFieldType type = gaim_request_field_get_type(field); + GaimPrefType pt; + gpointer val = NULL; + const char *id = gaim_request_field_get_id(field); + + switch (type) + { + case GAIM_REQUEST_FIELD_LIST: + val = gaim_request_field_list_get_selected(field)->data; + break; + case GAIM_REQUEST_FIELD_BOOLEAN: + val = GINT_TO_POINTER(gaim_request_field_bool_get_value(field)); + break; + case GAIM_REQUEST_FIELD_INTEGER: + val = GINT_TO_POINTER(gaim_request_field_int_get_value(field)); + break; + case GAIM_REQUEST_FIELD_STRING: + val = (gpointer)gaim_request_field_string_get_value(field); + break; + default: + break; + } + + pt = gaim_prefs_get_type(id); + switch (pt) + { + case GAIM_PREF_INT: + gaim_prefs_set_int(id, GPOINTER_TO_INT(val)); + break; + case GAIM_PREF_BOOLEAN: + gaim_prefs_set_bool(id, GPOINTER_TO_INT(val)); + break; + case GAIM_PREF_STRING: + gaim_prefs_set_string(id, val); + break; + default: + break; + } + } + } +} + +void gg_prefs_show_all() +{ + GaimRequestFields *fields; + GaimRequestField *field; + GaimRequestFieldGroup *group; + int i; + + fields = gaim_request_fields_new(); + + group = gaim_request_field_group_new(_("Conversations")); + gaim_request_fields_add_group(fields, group); + for (i = 0; convs[i].pref; i++) + { + field = get_pref_field(convs + i); + gaim_request_field_group_add_field(group, field); + } + + group = gaim_request_field_group_new(_("Logging")); + gaim_request_fields_add_group(fields, group); + for (i = 0; logging[i].pref; i++) + { + field = get_pref_field(logging + i); + gaim_request_field_group_add_field(group, field); + } + + gaim_request_fields(NULL, _("Preferences"), NULL, NULL, fields, + _("Save"), G_CALLBACK(save_cb), _("Cancel"), NULL, NULL); +} + Modified: trunk/console/gntprefs.h =================================================================== --- trunk/console/gntprefs.h 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/gntprefs.h 2006-08-09 03:41:45 UTC (rev 16674) @@ -1,2 +1,4 @@ void gg_prefs_init(); +void gg_prefs_show_all(); + Modified: trunk/console/gntrequest.c =================================================================== --- trunk/console/gntrequest.c 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/gntrequest.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -251,13 +251,12 @@ } else if (type == GAIM_REQUEST_FIELD_LIST) { - GntWidget *tree = field->ui_data; GList *list = NULL; - if (gaim_request_field_list_get_multi_select(field)) { const GList *iter; - + GntWidget *tree = field->ui_data; + iter = gaim_request_field_list_get_items(field); for (; iter; iter = iter->next) { @@ -269,7 +268,8 @@ } else { - gpointer data = gnt_tree_get_selection_data(GNT_TREE(tree)); + GntWidget *combo = field->ui_data; + gpointer data = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)); list = g_list_append(list, data); } @@ -315,7 +315,9 @@ GList *fields = gaim_request_field_group_get_fields(group); GntWidget *hbox; - /* XXX: Do something with the title, perhaps add a bold label */ + gnt_box_add_widget(GNT_BOX(box), + gnt_label_new_with_format(gaim_request_field_group_get_title(group), + GNT_TEXT_FLAG_BOLD)); for (; fields ; fields = fields->next) { @@ -328,7 +330,11 @@ gnt_box_add_widget(GNT_BOX(box), hbox); if (type != GAIM_REQUEST_FIELD_BOOLEAN) - gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(label)); + { + GntWidget *l = gnt_label_new(label); + gnt_widget_set_size(l, 0, 1); + gnt_box_add_widget(GNT_BOX(hbox), l); + } if (type == GAIM_REQUEST_FIELD_BOOLEAN) { @@ -376,28 +382,38 @@ { const GList *list; gboolean multi = gaim_request_field_list_get_multi_select(field); - GntWidget *tree = gnt_tree_new(); - gnt_box_add_widget(GNT_BOX(hbox), tree); - field->ui_data = tree; + if (multi) + { + GntWidget *tree = gnt_tree_new(); + gnt_box_add_widget(GNT_BOX(hbox), tree); + field->ui_data = tree; - list = gaim_request_field_list_get_items(field); - for (; list; list = list->next) - { - const char *text = list->data; - gpointer key = gaim_request_field_list_get_data(field, text); - if (multi) + list = gaim_request_field_list_get_items(field); + for (; list; list = list->next) { + const char *text = list->data; + gpointer key = gaim_request_field_list_get_data(field, text); gnt_tree_add_choice(GNT_TREE(tree), key, gnt_tree_create_row(GNT_TREE(tree), text), NULL, NULL); if (gaim_request_field_list_is_selected(field, text)) gnt_tree_set_choice(GNT_TREE(tree), key, TRUE); } - else + } + else + { + GntWidget *combo = gnt_combo_box_new(); + gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); + gnt_box_add_widget(GNT_BOX(hbox), combo); + field->ui_data = combo; + + list = gaim_request_field_list_get_items(field); + for (; list; list = list->next) { - gnt_tree_add_row_after(GNT_TREE(tree), key, - gnt_tree_create_row(GNT_TREE(tree), text), NULL, NULL); + const char *text = list->data; + gpointer key = gaim_request_field_list_get_data(field, text); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), key, text); if (gaim_request_field_list_is_selected(field, text)) - gnt_tree_set_selected(GNT_TREE(tree), key); + gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), key); } } } @@ -413,9 +429,9 @@ gnt_label_new_with_format(_("Not implemented yet."), GNT_TEXT_FLAG_BOLD)); } - if (fields->next) - gnt_box_add_widget(GNT_BOX(box), gnt_hline_new()); } + if (list->next) + gnt_box_add_widget(GNT_BOX(box), gnt_hline_new()); } gnt_box_add_widget(GNT_BOX(window), box); @@ -425,7 +441,6 @@ gnt_widget_show(window); - return window; } Modified: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/libgnt/Makefile.am 2006-08-09 03:41:45 UTC (rev 16674) @@ -17,6 +17,7 @@ gntstyle.c \ gnttextview.c \ gnttree.c \ + gntutils.c \ gntmain.c libgnt_la_headers = \ @@ -34,6 +35,7 @@ gntstyle.h \ gnttextview.h \ gnttree.h \ + gntutils.h \ gnt.h libgnt_laincludedir=$(includedir)/gnt Modified: trunk/console/libgnt/gntbutton.c =================================================================== --- trunk/console/libgnt/gntbutton.c 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/libgnt/gntbutton.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -1,6 +1,7 @@ #include <string.h> #include "gntbutton.h" +#include "gntutils.h" enum { @@ -31,8 +32,9 @@ gnt_button_size_request(GntWidget *widget) { GntButton *button = GNT_BUTTON(widget); - widget->priv.width = g_utf8_strlen(button->priv->text, -1) + 4; - widget->priv.height = 1; + gnt_util_get_text_bound(button->priv->text, + &widget->priv.width, &widget->priv.height); + widget->priv.width += 4; if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) widget->priv.height += 2; } Modified: trunk/console/libgnt/gntlabel.c =================================================================== --- trunk/console/libgnt/gntlabel.c 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/libgnt/gntlabel.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -1,4 +1,5 @@ #include "gntlabel.h" +#include "gntutils.h" #include <string.h> @@ -33,27 +34,9 @@ gnt_label_size_request(GntWidget *widget) { GntLabel *label = GNT_LABEL(widget); - char *s = label->text, *last = s; - int count = 1; - int max = 0; - /* XXX: ew ... everyone look away */ - while (*s) - { - if (*s == '\n' || *s == '\r') - { - count++; - if (max < s - last + 1) - max = s - last + 1; - last = s + 1; - } - s++; - } - if (max < s - last + 1) - max = s - last + 1; - widget->priv.height = count; - - widget->priv.width = max; + gnt_util_get_text_bound(label->text, + &widget->priv.width, &widget->priv.height); } static void Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/libgnt/gntmain.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -391,7 +391,14 @@ ch = ' '; break; } } - fprintf(file, "%c", ch); + if (ch == '&') + fprintf(file, "&"); + else if (ch == '<') + fprintf(file, "<"); + else if (ch == '>') + fprintf(file, ">"); + else + fprintf(file, "%c", ch); old = now; } fprintf(file, "</span>\n"); Added: trunk/console/libgnt/gntutils.c =================================================================== --- trunk/console/libgnt/gntutils.c (rev 0) +++ trunk/console/libgnt/gntutils.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -0,0 +1,33 @@ +#include "gntutils.h" + +void gnt_util_get_text_bound(const char *text, int *width, int *height) +{ + const char *s = text, *last; + int count = 1, max = 0; + int len; + + /* XXX: ew ... everyone look away */ + last = s; + while (*s) + { + if (*s == '\n' || *s == '\r') + { + count++; + len = g_utf8_pointer_to_offset(last, s); + if (max < len) + max = len; + last = s + 1; + } + s++; + } + + len = g_utf8_pointer_to_offset(last, s); + if (max < len) + max = len; + + if (height) + *height = count; + if (width) + *width = max + (count > 1); +} + Property changes on: trunk/console/libgnt/gntutils.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/libgnt/gntutils.h =================================================================== --- trunk/console/libgnt/gntutils.h (rev 0) +++ trunk/console/libgnt/gntutils.h 2006-08-09 03:41:45 UTC (rev 16674) @@ -0,0 +1,6 @@ +#include <glib.h> + +#include "gnt.h" +#include "gntwidget.h" + +void gnt_util_get_text_bound(const char *text, int *width, int *height); Property changes on: trunk/console/libgnt/gntutils.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/libgnt/test/combo.c =================================================================== --- trunk/console/libgnt/test/combo.c 2006-08-08 23:20:08 UTC (rev 16673) +++ trunk/console/libgnt/test/combo.c 2006-08-09 03:41:45 UTC (rev 16674) @@ -50,7 +50,9 @@ gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "8", "8"); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), "9", "9"); - gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new("Select")); + GntWidget *l = gnt_label_new("Select"); + gnt_box_add_widget(GNT_BOX(hbox), l); + gnt_widget_set_size(l, 0, 1); gnt_box_add_widget(GNT_BOX(hbox), combo); gnt_box_add_widget(GNT_BOX(box), hbox); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-09 06:23:48
|
Revision: 16678 Author: sadrul Date: 2006-08-08 23:23:18 -0700 (Tue, 08 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16678&view=rev Log Message: ----------- Show timestamps (or not) in conversations. Modified Paths: -------------- trunk/console/gntconv.c trunk/console/libgnt/gntutils.c Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-08-09 04:49:19 UTC (rev 16677) +++ trunk/console/gntconv.c 2006-08-09 06:23:18 UTC (rev 16678) @@ -229,6 +229,9 @@ g_return_if_fail(ggconv != NULL); + if (gaim_prefs_get_bool("/gaim/gnt/conversations/timestamps")) + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), + gaim_utf8_strftime("(%H:%M:%S) ", localtime(&mtime)), GNT_TEXT_FLAG_DIM); if (who && *who && (flags & (GAIM_MESSAGE_SEND | GAIM_MESSAGE_RECV))) { char * name = g_strdup_printf("%s: ", who); Modified: trunk/console/libgnt/gntutils.c =================================================================== --- trunk/console/libgnt/gntutils.c 2006-08-09 04:49:19 UTC (rev 16677) +++ trunk/console/libgnt/gntutils.c 2006-08-09 06:23:18 UTC (rev 16678) @@ -8,23 +8,26 @@ /* XXX: ew ... everyone look away */ last = s; - while (*s) + if (s) { - if (*s == '\n' || *s == '\r') + while (*s) { - count++; - len = g_utf8_pointer_to_offset(last, s); - if (max < len) - max = len; - last = s + 1; + if (*s == '\n' || *s == '\r') + { + count++; + len = g_utf8_pointer_to_offset(last, s); + if (max < len) + max = len; + last = s + 1; + } + s++; } - s++; + + len = g_utf8_pointer_to_offset(last, s); + if (max < len) + max = len; } - len = g_utf8_pointer_to_offset(last, s); - if (max < len) - max = len; - if (height) *height = count; if (width) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-09 17:23:03
|
Revision: 16681 Author: sadrul Date: 2006-08-09 10:22:55 -0700 (Wed, 09 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16681&view=rev Log Message: ----------- You can now add buddies or groups in the buddylist from the context-menu for a group. Adding chats is not yet possible. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntrequest.c trunk/console/libgnt/gntcombobox.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-09 15:33:53 UTC (rev 16680) +++ trunk/console/gntblist.c 2006-08-09 17:22:55 UTC (rev 16681) @@ -1,5 +1,6 @@ #include <account.h> #include <blist.h> +#include <notify.h> #include <request.h> #include <savedstatuses.h> #include <server.h> @@ -141,6 +142,103 @@ { } +static void +add_buddy_cb(void *data, GaimRequestFields *allfields) +{ + const char *username = gaim_request_fields_get_string(allfields, "screenname"); + const char *alias = gaim_request_fields_get_string(allfields, "alias"); + const char *group = gaim_request_fields_get_string(allfields, "group"); + GaimAccount *account = gaim_request_fields_get_account(allfields, "account"); + const char *error = NULL; + GaimGroup *grp; + GaimBuddy *buddy; + + if (!username) + error = _("You must provide a screename for the buddy."); + else if (!group) + error = _("You must provide a group."); + else if (!account) + error = _("You must select an account."); + + if (error) + { + gaim_notify_error(NULL, _("Error"), _("Error adding buddy"), error); + return; + } + + grp = gaim_find_group(group); + if (!grp) + { + grp = gaim_group_new(group); + gaim_blist_add_group(grp, NULL); + } + + buddy = gaim_buddy_new(account, username, alias); + gaim_blist_add_buddy(buddy, NULL, grp, NULL); + gaim_account_add_buddy(account, buddy); +} + +static void +gg_request_add_buddy(GaimAccount *account, const char *username, const char *grp, const char *alias) +{ + GaimRequestFields *fields = gaim_request_fields_new(); + GaimRequestFieldGroup *group = gaim_request_field_group_new(NULL); + GaimRequestField *field; + + gaim_request_fields_add_group(fields, group); + + field = gaim_request_field_string_new("screenname", _("Screen Name"), username, FALSE); + gaim_request_field_group_add_field(group, field); + + field = gaim_request_field_string_new("alias", _("Alias"), alias, FALSE); + gaim_request_field_group_add_field(group, field); + + field = gaim_request_field_string_new("group", _("Group"), grp, FALSE); + gaim_request_field_group_add_field(group, field); + + field = gaim_request_field_account_new("account", _("Account"), NULL); + gaim_request_field_account_set_show_all(field, FALSE); + if (account) + gaim_request_field_account_set_value(field, account); + gaim_request_field_group_add_field(group, field); + + gaim_request_fields(NULL, _("Add Buddy"), NULL, _("Please enter buddy information."), + fields, _("Add"), G_CALLBACK(add_buddy_cb), _("Cancel"), NULL, NULL); +} + +static void +add_group_cb(gpointer null, const char *group) +{ + GaimGroup *grp; + + if (!group || !*group) + { + gaim_notify_error(NULL, _("Error"), _("Error adding group"), + _("You must give a name for the group to add.")); + return; + } + + grp = gaim_find_group(group); + if (!grp) + { + grp = gaim_group_new(group); + gaim_blist_add_group(grp, NULL); + } + else + { + gaim_notify_error(NULL, _("Error"), _("Error adding group"), + _("A group with the name already exists.")); + } +} + +static void +gg_request_add_group() +{ + gaim_request_input(NULL, _("Add Group"), NULL, _("Enter the name of the group"), + NULL, FALSE, FALSE, NULL, + _("Add"), G_CALLBACK(add_group_cb), _("Cancel"), NULL, NULL); +} + static GaimBlistUiOps blist_ui_ops = { new_list, @@ -150,9 +248,9 @@ node_remove, NULL, NULL, + .request_add_buddy = gg_request_add_buddy, NULL, - NULL, - NULL + .request_add_group = gg_request_add_group }; static gpointer @@ -360,8 +458,24 @@ } static void +gg_add_buddy(GaimGroup *grp, GaimBlistNode *node) +{ + gaim_blist_request_add_buddy(NULL, NULL, grp->name, NULL); +} + +static void +gg_add_group(GaimGroup *grp, GaimBlistNode *node) +{ + gaim_blist_request_add_group(); +} + +static void create_group_menu(GntTree *tree, GaimGroup *group) { + add_custom_action(tree, _("Add Buddy"), + GAIM_CALLBACK(gg_add_buddy), group); + add_custom_action(tree, _("Add Group"), + GAIM_CALLBACK(gg_add_group), group); } static void @@ -555,6 +669,7 @@ GAIM_CALLBACK(gg_blist_remove_node_cb), node); window = gnt_vbox_new(FALSE); + GNT_WIDGET_SET_FLAGS(window, GNT_WIDGET_TRANSIENT); gnt_box_set_toplevel(GNT_BOX(window), TRUE); gnt_box_set_title(GNT_BOX(window), title); Modified: trunk/console/gntrequest.c =================================================================== --- trunk/console/gntrequest.c 2006-08-09 15:33:53 UTC (rev 16680) +++ trunk/console/gntrequest.c 2006-08-09 17:22:55 UTC (rev 16681) @@ -278,6 +278,9 @@ } else if (type == GAIM_REQUEST_FIELD_ACCOUNT) { + GntWidget *combo = field->ui_data; + GaimAccount *acc = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)); + gaim_request_field_account_set_value(field, acc); } } } @@ -293,13 +296,13 @@ static void * gg_request_fields(const char *title, const char *primary, - const char *secondary, GaimRequestFields *fields, + const char *secondary, GaimRequestFields *allfields, const char *ok, GCallback ok_cb, const char *cancel, GCallback cancel_cb, void *userdata) { GntWidget *window, *box; - GList *list; + GList *grlist; window = setup_request_window(title, primary, secondary, GAIM_REQUEST_FIELDS); @@ -309,27 +312,28 @@ box = gnt_vbox_new(FALSE); gnt_box_set_pad(GNT_BOX(box), 0); gnt_box_set_fill(GNT_BOX(box), TRUE); - for (list = gaim_request_fields_get_groups(fields); list; list = list->next) + for (grlist = gaim_request_fields_get_groups(allfields); grlist; grlist = grlist->next) { - GaimRequestFieldGroup *group = list->data; + GaimRequestFieldGroup *group = grlist->data; GList *fields = gaim_request_field_group_get_fields(group); GntWidget *hbox; - - gnt_box_add_widget(GNT_BOX(box), - gnt_label_new_with_format(gaim_request_field_group_get_title(group), - GNT_TEXT_FLAG_BOLD)); + const char *title = gaim_request_field_group_get_title(group); + if (title) + gnt_box_add_widget(GNT_BOX(box), + gnt_label_new_with_format(title, GNT_TEXT_FLAG_BOLD)); + for (; fields ; fields = fields->next) { + /* XXX: Break each of the fields into a separate function? */ GaimRequestField *field = fields->data; GaimRequestFieldType type = gaim_request_field_get_type(field); const char *label = gaim_request_field_get_label(field); - hbox = gnt_hbox_new(FALSE); - gnt_box_set_pad(GNT_BOX(hbox), 0); + hbox = gnt_hbox_new(TRUE); /* hrm */ gnt_box_add_widget(GNT_BOX(box), hbox); - if (type != GAIM_REQUEST_FIELD_BOOLEAN) + if (type != GAIM_REQUEST_FIELD_BOOLEAN && label) { GntWidget *l = gnt_label_new(label); gnt_widget_set_size(l, 0, 1); @@ -417,12 +421,44 @@ } } } -#if 0 else if (type == GAIM_REQUEST_FIELD_ACCOUNT) { - /* XXX: remember to set the field->ui_data */ + gboolean all; + GaimAccount *def; + GList *list; + GntWidget *combo = gnt_combo_box_new(); + gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); + gnt_box_add_widget(GNT_BOX(hbox), combo); + field->ui_data = combo; + + all = gaim_request_field_account_get_show_all(field); + def = gaim_request_field_account_get_default_value(field); + + if (all) + list = gaim_accounts_get_all(); + else + list = gaim_connections_get_all(); + + for (; list; list = list->next) + { + GaimAccount *account; + char *text; + + if (all) + account = list->data; + else + account = gaim_connection_get_account(list->data); + + text = g_strdup_printf("%s (%s)", + gaim_account_get_username(account), + gaim_account_get_protocol_name(account)); + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), account, text); + g_free(text); + if (account == def) + gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), account); + } + gnt_widget_set_size(combo, 20, 3); /* ew */ } -#endif else { gnt_box_add_widget(GNT_BOX(hbox), @@ -430,12 +466,12 @@ GNT_TEXT_FLAG_BOLD)); } } - if (list->next) + if (grlist->next) gnt_box_add_widget(GNT_BOX(box), gnt_hline_new()); } gnt_box_add_widget(GNT_BOX(window), box); - box = setup_button_box(userdata, request_fields_cb, fields, + box = setup_button_box(userdata, request_fields_cb, allfields, ok, ok_cb, cancel, cancel_cb, NULL); gnt_box_add_widget(GNT_BOX(window), box); Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-08-09 15:33:53 UTC (rev 16680) +++ trunk/console/libgnt/gntcombobox.c 2006-08-09 17:22:55 UTC (rev 16681) @@ -74,8 +74,13 @@ static void gnt_combo_box_size_request(GntWidget *widget) { - widget->priv.height = 3; /* For now, a combobox will have border */ - widget->priv.width = 15; + if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) + { + GntWidget *dd = GNT_COMBO_BOX(widget)->dropdown; + gnt_widget_size_request(dd); + widget->priv.height = 3; /* For now, a combobox will have border */ + widget->priv.width = MIN(10, dd->priv.width); + } } static void This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-09 18:00:42
|
Revision: 16682 Author: sadrul Date: 2006-08-09 11:00:38 -0700 (Wed, 09 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16682&view=rev Log Message: ----------- Removing buddies/groups now works. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntrequest.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-09 17:22:55 UTC (rev 16681) +++ trunk/console/gntblist.c 2006-08-09 18:00:38 UTC (rev 16682) @@ -590,24 +590,73 @@ g_free(prompt); } -/* XXX: This still doesn't do anything, because request doesn't have a ui yet */ +/* Xeroxed from gtkdialogs.c:gaim_gtkdialogs_remove_group_cb*/ static void -gg_blist_remove_node_cb(GaimBlistNode *node, GaimBlistNode *null) +remove_group(GaimGroup *group) { - void (*callback)(gpointer); + GaimBlistNode *cnode, *bnode; + cnode = ((GaimBlistNode*)group)->child; + + while (cnode) { + if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { + bnode = cnode->child; + cnode = cnode->next; + while (bnode) { + GaimBuddy *buddy; + if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { + buddy = (GaimBuddy*)bnode; + bnode = bnode->next; + if (gaim_account_is_connected(buddy->account)) { + gaim_account_remove_buddy(buddy->account, buddy, group); + gaim_blist_remove_buddy(buddy); + } + } else { + bnode = bnode->next; + } + } + } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { + GaimChat *chat = (GaimChat *)cnode; + cnode = cnode->next; + if (gaim_account_is_connected(chat->account)) + gaim_blist_remove_chat(chat); + } else { + cnode = cnode->next; + } + } + + gaim_blist_remove_group(group); +} + +static void +gg_blist_remove_node(GaimBlistNode *node) +{ if (GAIM_BLIST_NODE_IS_BUDDY(node)) - callback = (void(*)(gpointer))gaim_blist_remove_buddy; + { + GaimBuddy *buddy = (GaimBuddy*)node; + GaimGroup *group = gaim_buddy_get_group(buddy); + gaim_account_remove_buddy(gaim_buddy_get_account(buddy), buddy, group); + gaim_blist_remove_buddy(buddy); + } else if (GAIM_BLIST_NODE_IS_CHAT(node)) - callback = (void(*)(gpointer))gaim_blist_remove_chat; + { + gaim_blist_remove_chat((GaimChat*)node); + } else if (GAIM_BLIST_NODE_IS_GROUP(node)) - callback = (void(*)(gpointer))gaim_blist_remove_group; + { + remove_group((GaimGroup*)node); + } +} +/* XXX: This still doesn't do anything, because request doesn't have a ui yet */ +static void +gg_blist_remove_node_cb(GaimBlistNode *node, GaimBlistNode *null) +{ /* XXX: anything to do with the returned ui-handle? */ gaim_request_action(node, _("Confirm Remove"), _("Are you sure you want to remove ..."), NULL, /* XXX: tidy up */ 1, node, 2, - _("Remove"), callback, + _("Remove"), gg_blist_remove_node, _("No"), NULL); } Modified: trunk/console/gntrequest.c =================================================================== --- trunk/console/gntrequest.c 2006-08-09 17:22:55 UTC (rev 16681) +++ trunk/console/gntrequest.c 2006-08-09 18:00:38 UTC (rev 16682) @@ -234,7 +234,8 @@ else if (type == GAIM_REQUEST_FIELD_STRING) { GntWidget *entry = field->ui_data; - gaim_request_field_string_set_value(field, gnt_entry_get_text(GNT_ENTRY(entry))); + const char *text = gnt_entry_get_text(GNT_ENTRY(entry)); + gaim_request_field_string_set_value(field, (text && *text) ? text : NULL); } else if (type == GAIM_REQUEST_FIELD_INTEGER) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-09 18:19:22
|
Revision: 16683 Author: sadrul Date: 2006-08-09 11:19:12 -0700 (Wed, 09 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16683&view=rev Log Message: ----------- Minor adjustments. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntrequest.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-09 18:00:38 UTC (rev 16682) +++ trunk/console/gntblist.c 2006-08-09 18:19:12 UTC (rev 16683) @@ -101,7 +101,6 @@ 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); @@ -648,17 +647,33 @@ } } -/* XXX: This still doesn't do anything, because request doesn't have a ui yet */ static void gg_blist_remove_node_cb(GaimBlistNode *node, GaimBlistNode *null) { + char *primary, *sec = NULL; + const char *name; + + if (GAIM_BLIST_NODE_IS_BUDDY(node)) + name = gaim_buddy_get_name((GaimBuddy*)node); + else if (GAIM_BLIST_NODE_IS_CHAT(node)) + name = gaim_chat_get_name((GaimChat*)node); + else if (GAIM_BLIST_NODE_IS_GROUP(node)) + { + name = ((GaimGroup*)node)->name; + sec = _("Removing this group will also remove all the buddies in the group"); + } + else + return; + + primary = g_strdup_printf(_("Are you sure you want to remove %s?"), name); + /* XXX: anything to do with the returned ui-handle? */ gaim_request_action(node, _("Confirm Remove"), - _("Are you sure you want to remove ..."), NULL, /* XXX: tidy up */ + primary, sec, 1, node, 2, _("Remove"), gg_blist_remove_node, - _("No"), NULL); - + _("Cancel"), NULL); + g_free(primary); } static void Modified: trunk/console/gntrequest.c =================================================================== --- trunk/console/gntrequest.c 2006-08-09 18:00:38 UTC (rev 16682) +++ trunk/console/gntrequest.c 2006-08-09 18:19:12 UTC (rev 16683) @@ -182,7 +182,7 @@ window = setup_request_window(title, primary, secondary, GAIM_REQUEST_ACTION); - box = gnt_hbox_new(TRUE); + box = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(window), box); for (i = 0; i < actioncount; i++) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-10 15:44:56
|
Revision: 16686 Author: sadrul Date: 2006-08-10 08:44:43 -0700 (Thu, 10 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16686&view=rev Log Message: ----------- Add preference to show idletime in the 'tooltip' for the buddylist. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntprefs.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-10 15:43:55 UTC (rev 16685) +++ trunk/console/gntblist.c 2006-08-10 15:44:43 UTC (rev 16686) @@ -813,6 +813,18 @@ g_free(br); } + if (gaim_prefs_get_bool("/gaim/gnt/blist/idletime")) + { + GaimPresence *pre = gaim_buddy_get_presence(buddy); + if (gaim_presence_is_idle(pre)) + { + time_t idle = gaim_presence_get_idle_time(pre); + char *st = gaim_str_seconds_to_string(time(NULL) - idle); + g_string_append_printf(str, _("\nIdle: %s"), st); + g_free(st); + } + } + title = g_strdup(gaim_buddy_get_name(buddy)); } else if (GAIM_BLIST_NODE_IS_GROUP(node)) Modified: trunk/console/gntprefs.c =================================================================== --- trunk/console/gntprefs.c 2006-08-10 15:43:55 UTC (rev 16685) +++ trunk/console/gntprefs.c 2006-08-10 15:44:43 UTC (rev 16686) @@ -14,9 +14,12 @@ gaim_prefs_add_none("/gaim/gnt/plugins"); gaim_prefs_add_string_list("/gaim/gnt/plugins/loaded", NULL); + gaim_prefs_add_none("/gaim/gnt/blist"); + gaim_prefs_add_bool("/gaim/gnt/blist/idletime", TRUE); + gaim_prefs_add_none("/gaim/gnt/conversations"); gaim_prefs_add_bool("/gaim/gnt/conversations/timestamps", TRUE); - gaim_prefs_add_bool("/gaim/gnt/conversations/notify_typing", FALSE); + gaim_prefs_add_bool("/gaim/gnt/conversations/notify_typing", FALSE); /* XXX: Not functional yet */ } typedef struct @@ -93,6 +96,12 @@ return field; } +static Prefs blist[] = +{ + {GAIM_PREF_BOOLEAN, "/gaim/gnt/blist/idletime", _("Show Idle Time"), NULL}, + {GAIM_PREF_NONE, NULL, NULL, NULL} +}; + static Prefs convs[] = { {GAIM_PREF_BOOLEAN, "/gaim/gnt/conversations/timestamps", _("Show Timestamps"), NULL}, @@ -163,31 +172,32 @@ } } -void gg_prefs_show_all() +static void +add_pref_group(GaimRequestFields *fields, const char *title, Prefs *prefs) { - GaimRequestFields *fields; GaimRequestField *field; GaimRequestFieldGroup *group; int i; - fields = gaim_request_fields_new(); - - group = gaim_request_field_group_new(_("Conversations")); + group = gaim_request_field_group_new(title); gaim_request_fields_add_group(fields, group); - for (i = 0; convs[i].pref; i++) + for (i = 0; prefs[i].pref; i++) { - field = get_pref_field(convs + i); + field = get_pref_field(prefs + i); gaim_request_field_group_add_field(group, field); } +} - group = gaim_request_field_group_new(_("Logging")); - gaim_request_fields_add_group(fields, group); - for (i = 0; logging[i].pref; i++) - { - field = get_pref_field(logging + i); - gaim_request_field_group_add_field(group, field); - } +void gg_prefs_show_all() +{ + GaimRequestFields *fields; + fields = gaim_request_fields_new(); + + add_pref_group(fields, _("Buddy List"), blist); + add_pref_group(fields, _("Conversations"), convs); + add_pref_group(fields, _("Logging"), logging); + gaim_request_fields(NULL, _("Preferences"), NULL, NULL, fields, _("Save"), G_CALLBACK(save_cb), _("Cancel"), NULL, NULL); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-12 10:27:40
|
Revision: 16715 Author: sadrul Date: 2006-08-12 03:27:29 -0700 (Sat, 12 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16715&view=rev Log Message: ----------- Add support for tab-completion and save-history in GntEntry. Also, the keyboard-commands should now work for Xterms. Modified Paths: -------------- trunk/console/gntconv.c trunk/console/libgnt/Makefile.am trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gntentry.c trunk/console/libgnt/gntentry.h trunk/console/libgnt/gntkeys.h trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/gnttree.h trunk/console/libgnt/gntwidget.c trunk/console/libgnt/test/tv.c Added Paths: ----------- trunk/console/libgnt/gntkeys.c Modified: trunk/console/gntconv.c =================================================================== --- trunk/console/gntconv.c 2006-08-12 10:26:45 UTC (rev 16714) +++ trunk/console/gntconv.c 2006-08-12 10:27:29 UTC (rev 16715) @@ -123,6 +123,7 @@ } g_free(escape); } + gnt_entry_add_to_history(GNT_ENTRY(ggconv->entry), text); gnt_entry_clear(GNT_ENTRY(ggconv->entry)); return TRUE; } @@ -198,8 +199,11 @@ 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_entry_set_history_length(GNT_ENTRY(ggc->entry), -1); + gnt_entry_set_word_suggest(GNT_ENTRY(ggc->entry), TRUE); + gnt_entry_set_always_suggest(GNT_ENTRY(ggc->entry), FALSE); - g_signal_connect(G_OBJECT(ggc->entry), "key_pressed", G_CALLBACK(entry_key_pressed), ggc); + g_signal_connect_after(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, gaim_prefs_get_int(PREF_ROOT "/position/x"), @@ -315,6 +319,9 @@ static void gg_chat_add_users(GaimConversation *conv, GList *users, gboolean new_arrivals) { + GGConv *ggc = conv->ui_data; + GntEntry *entry = GNT_ENTRY(ggc->entry); + if (!new_arrivals) { /* Print the list of users in the room */ @@ -335,25 +342,39 @@ GAIM_MESSAGE_SYSTEM, time(NULL)); g_string_free(string, TRUE); } - /* XXX: Add the names for string completion */ + + for (; users; users = users->next) + { + GaimConvChatBuddy *cbuddy = users->data; + gnt_entry_add_suggest(entry, cbuddy->name); + gnt_entry_add_suggest(entry, cbuddy->alias); + } } static void gg_chat_rename_user(GaimConversation *conv, const char *old, const char *new_n, const char *new_a) { /* XXX: Update the name for string completion */ + GGConv *ggc = conv->ui_data; + GntEntry *entry = GNT_ENTRY(ggc->entry); + gnt_entry_remove_suggest(entry, old); + gnt_entry_add_suggest(entry, new_n); + gnt_entry_add_suggest(entry, new_a); } static void gg_chat_remove_user(GaimConversation *conv, GList *list) { /* XXX: Remove the name from string completion */ + GGConv *ggc = conv->ui_data; + GntEntry *entry = GNT_ENTRY(ggc->entry); + for (; list; list = list->next) + gnt_entry_remove_suggest(entry, list->data); } static void gg_chat_update_user(GaimConversation *conv, const char *user) { - /* XXX: This probably will not require updating the string completion */ } static GaimConversationUiOps conv_ui_ops = Modified: trunk/console/libgnt/Makefile.am =================================================================== --- trunk/console/libgnt/Makefile.am 2006-08-12 10:26:45 UTC (rev 16714) +++ trunk/console/libgnt/Makefile.am 2006-08-12 10:27:29 UTC (rev 16715) @@ -11,6 +11,7 @@ gntcolors.c \ gntcombobox.c \ gntentry.c \ + gntkeys.c \ gntlabel.c \ gntline.c \ gntmarshal.c \ Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-08-12 10:26:45 UTC (rev 16714) +++ trunk/console/libgnt/gntcombobox.c 2006-08-12 10:27:29 UTC (rev 16715) @@ -79,7 +79,7 @@ GntWidget *dd = GNT_COMBO_BOX(widget)->dropdown; gnt_widget_size_request(dd); widget->priv.height = 3; /* For now, a combobox will have border */ - widget->priv.width = MIN(10, dd->priv.width); + widget->priv.width = MIN(10, dd->priv.width + 4); } } Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-08-12 10:26:45 UTC (rev 16714) +++ trunk/console/libgnt/gntentry.c 2006-08-12 10:27:29 UTC (rev 16715) @@ -1,7 +1,9 @@ #include <ctype.h> #include <string.h> +#include "gntbox.h" #include "gntentry.h" +#include "gnttree.h" enum { @@ -12,6 +14,92 @@ static guint signals[SIGS] = { 0 }; static void +destroy_suggest(GntEntry *entry) +{ + if (entry->ddown) + { + gnt_widget_destroy(entry->ddown->parent); + entry->ddown = NULL; + } +} + +static char * +get_beginning_of_word(GntEntry *entry) +{ + char *s = entry->cursor; + while (s > entry->start) + { + char *t = g_utf8_find_prev_char(entry->start, s); + if ((*t < 'A' || *t > 'Z') && (*t < 'a' || *t > 'z')) + break; + s = t; + } + return s; +} + +static gboolean +show_suggest_dropdown(GntEntry *entry) +{ + char *suggest = NULL; + int len; + int offset = 0, x, y; + int count = 0; + GList *iter; + + if (entry->word) + { + char *s = get_beginning_of_word(entry); + suggest = g_strndup(s, entry->cursor - s); + if (entry->scroll < s) + offset = g_utf8_pointer_to_offset(entry->scroll, s); + } + else + suggest = g_strdup(entry->start); + len = strlen(suggest); /* Don't need to use the utf8-function here */ + + if (entry->ddown == NULL) + { + GntWidget *box = gnt_vbox_new(FALSE); + entry->ddown = gnt_tree_new(); + gnt_box_add_widget(GNT_BOX(box), entry->ddown); + + GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_TRANSIENT); + + gnt_widget_get_position(GNT_WIDGET(entry), &x, &y); + x += offset; + y++; + if (y + 10 >= getmaxy(stdscr)) + y -= 11; + gnt_widget_set_position(box, x, y); + + gnt_widget_draw(box); + } + else + gnt_tree_remove_all(GNT_TREE(entry->ddown)); + + for (count = 0, iter = entry->suggests; iter; iter = iter->next) + { + const char *text = iter->data; + if (strncmp(suggest, text, len) == 0 && strlen(text) >= len) + { + gnt_tree_add_row_after(GNT_TREE(entry->ddown), (gpointer)text, + gnt_tree_create_row(GNT_TREE(entry->ddown), text), + NULL, NULL); + count++; + } + } + g_free(suggest); + + if (count == 0) + { + destroy_suggest(entry); + return FALSE; + } + + return TRUE; +} + +static void gnt_entry_draw(GntWidget *widget) { GntEntry *entry = GNT_ENTRY(widget); @@ -80,6 +168,11 @@ memmove(entry->cursor, entry->cursor + len, entry->end - entry->cursor - len + 1); entry->end -= len; entry_redraw(widget); + + if (entry->ddown) + show_suggest_dropdown(entry); + + return TRUE; } else if (strcmp(text + 1, GNT_KEY_LEFT) == 0 && entry->cursor > entry->start) { @@ -87,6 +180,8 @@ if (entry->cursor < entry->scroll) entry->scroll = entry->cursor; entry_redraw(widget); + + return TRUE; } else if (strcmp(text + 1, GNT_KEY_RIGHT) == 0 && entry->cursor < entry->end) { @@ -94,15 +189,90 @@ if (g_utf8_pointer_to_offset(entry->scroll, entry->cursor) >= widget->priv.width) entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); entry_redraw(widget); + + return TRUE; } + else if (strcmp(text + 1, GNT_KEY_CTRL_DOWN) == 0 && entry->histlength) + { + if (entry->history->prev) + { + entry->history = entry->history->prev; + gnt_entry_set_text(entry, entry->history->data); + destroy_suggest(entry); + + return TRUE; + } + } + else if (strcmp(text + 1, GNT_KEY_UP) == 0 || + strcmp(text + 1, GNT_KEY_DOWN) == 0) + { + if (entry->ddown) + { + gnt_widget_key_pressed(entry->ddown, text); + return TRUE; + } + } + else if (strcmp(text + 1, GNT_KEY_CTRL_UP) == 0 && entry->histlength) + { + if (entry->history->next) + { + if (entry->history->prev == NULL) + { + /* Save the current contents */ + char *text = g_strdup(gnt_entry_get_text(entry)); + g_free(entry->history->data); + entry->history->data = text; + } + + entry->history = entry->history->next; + gnt_entry_set_text(entry, entry->history->data); + destroy_suggest(entry); + + return TRUE; + } + } /* XXX: handle other keys, like home/end, and ctrl+ goodness */ - else - return FALSE; + else if (text[1] == 0) + { + destroy_suggest(entry); + } - return TRUE; + return FALSE; } else { + if (text[0] == '\t') + { + if (entry->ddown) + destroy_suggest(entry); + else if (entry->suggests) + return show_suggest_dropdown(entry); + + return FALSE; + } + else if (text[0] == '\r' && entry->ddown) + { + char *text = g_strdup(gnt_tree_get_selection_data(GNT_TREE(entry->ddown))); + destroy_suggest(entry); + if (entry->word) + { + char *s = get_beginning_of_word(entry); + char *iter = text; + while (*s == *iter) + { + s++; + iter++; + } + gnt_entry_key_pressed(widget, iter); + } + else + { + gnt_entry_set_text(entry, text); + } + g_free(text); + return TRUE; + } + if (!iscntrl(text[0])) { const char *str, *next; @@ -143,6 +313,9 @@ while (g_utf8_pointer_to_offset(entry->scroll, entry->cursor) >= widget->priv.width) entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); + + if (entry->ddown) + show_suggest_dropdown(entry); } entry_redraw(widget); return TRUE; @@ -161,6 +334,8 @@ entry->scroll = g_utf8_find_prev_char(entry->start, entry->scroll); entry_redraw(widget); + if (entry->ddown) + show_suggest_dropdown(entry); return TRUE; } } @@ -174,9 +349,35 @@ { GntEntry *entry = GNT_ENTRY(widget); g_free(entry->start); + + if (entry->history) + { + entry->history = g_list_first(entry->history); + g_list_foreach(entry->history, (GFunc)g_free, NULL); + g_list_free(entry->history); + } + + if (entry->suggests) + { + g_list_foreach(entry->suggests, (GFunc)g_free, NULL); + g_list_free(entry->suggests); + } + + if (entry->ddown) + { + gnt_widget_destroy(entry->ddown->parent); + } } static void +gnt_entry_lost_focus(GntWidget *widget) +{ + GntEntry *entry = GNT_ENTRY(widget); + destroy_suggest(entry); + entry_redraw(widget); +} + +static void gnt_entry_class_init(GntEntryClass *klass) { parent_class = GNT_WIDGET_CLASS(klass); @@ -185,6 +386,7 @@ parent_class->map = gnt_entry_map; parent_class->size_request = gnt_entry_size_request; parent_class->key_pressed = gnt_entry_key_pressed; + parent_class->lost_focus = gnt_entry_lost_focus; DEBUG; } @@ -197,7 +399,14 @@ entry->flag = GNT_ENTRY_FLAG_ALL; entry->max = 0; + + entry->histlength = 0; + entry->history = NULL; + entry->word = TRUE; + entry->always = FALSE; + entry->suggests = NULL; + 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); @@ -302,6 +511,7 @@ gnt_entry_set_text(entry, NULL); entry->scroll = entry->cursor = entry->end = entry->start; entry_redraw(GNT_WIDGET(entry)); + destroy_suggest(entry); } void gnt_entry_set_masked(GntEntry *entry, gboolean set) @@ -309,3 +519,90 @@ entry->masked = set; } +void gnt_entry_add_to_history(GntEntry *entry, const char *text) +{ + g_return_if_fail(entry->history != NULL); /* Need to set_history_length first */ + + if (g_list_length(entry->history) >= entry->histlength) + return; + + entry->history = g_list_first(entry->history); + g_free(entry->history->data); + entry->history->data = g_strdup(text); + entry->history = g_list_prepend(entry->history, NULL); +} + +void gnt_entry_set_history_length(GntEntry *entry, int num) +{ + if (num == 0) + { + entry->histlength = num; + if (entry->history) + { + entry->history = g_list_first(entry->history); + g_list_foreach(entry->history, (GFunc)g_free, NULL); + g_list_free(entry->history); + entry->history = NULL; + } + return; + } + + if (entry->histlength == 0) + { + entry->histlength = num; + entry->history = g_list_append(NULL, NULL); + return; + } + + if (num > 0 && num < entry->histlength) + { + GList *first, *iter; + int index = 0; + for (first = entry->history, index = 0; first->prev; first = first->prev, index++); + while ((iter = g_list_nth(first, num)) != NULL) + { + g_free(iter->data); + first = g_list_delete_link(first, iter); + } + entry->histlength = num; + if (index >= num) + entry->history = g_list_last(first); + return; + } + + entry->histlength = num; +} + +void gnt_entry_set_word_suggest(GntEntry *entry, gboolean word) +{ + entry->word = word; +} + +void gnt_entry_set_always_suggest(GntEntry *entry, gboolean always) +{ + entry->always = always; +} + +void gnt_entry_add_suggest(GntEntry *entry, const char *text) +{ + GList *find; + + if (!text || !*text) + return; + + find = g_list_find_custom(entry->suggests, text, (GCompareFunc)g_utf8_collate); + if (find) + return; + entry->suggests = g_list_append(entry->suggests, g_strdup(text)); +} + +void gnt_entry_remove_suggest(GntEntry *entry, const char *text) +{ + GList *find = g_list_find_custom(entry->suggests, text, (GCompareFunc)g_utf8_collate); + if (find) + { + g_free(find->data); + entry->suggests = g_list_delete_link(entry->suggests, find); + } +} + Modified: trunk/console/libgnt/gntentry.h =================================================================== --- trunk/console/libgnt/gntentry.h 2006-08-12 10:26:45 UTC (rev 16714) +++ trunk/console/libgnt/gntentry.h 2006-08-12 10:27:29 UTC (rev 16715) @@ -50,6 +50,14 @@ int max; /* 0 means infinite */ gboolean masked; + + GList *history; /* History of the strings. User can use this by pressing ctrl+up/down */ + int histlength; /* How long can the history be? */ + + GList *suggests; /* List of suggestions */ + gboolean word; /* Are the suggestions for only a word, or for the whole thing? */ + gboolean always; /* Should the list of suggestions show at all times, or only on tab-press? */ + GntWidget *ddown; /* The dropdown with the suggested list */ }; struct _GnEntryClass @@ -70,7 +78,6 @@ void gnt_entry_set_max(GntEntry *entry, int max); -/* XXX: For now, call gnt_entry_clear before calling this */ void gnt_entry_set_text(GntEntry *entry, const char *text); void gnt_entry_set_flag(GntEntry *entry, GntEntryFlag flag); @@ -81,6 +88,18 @@ void gnt_entry_set_masked(GntEntry *entry, gboolean set); +void gnt_entry_add_to_history(GntEntry *entry, const char *text); + +void gnt_entry_set_history_length(GntEntry *entry, int num); + +void gnt_entry_set_word_suggest(GntEntry *entry, gboolean word); + +void gnt_entry_set_always_suggest(GntEntry *entry, gboolean always); + +void gnt_entry_add_suggest(GntEntry *entry, const char *text); + +void gnt_entry_remove_suggest(GntEntry *entry, const char *text); + G_END_DECLS #endif /* GNT_ENTRY_H */ Added: trunk/console/libgnt/gntkeys.c =================================================================== --- trunk/console/libgnt/gntkeys.c (rev 0) +++ trunk/console/libgnt/gntkeys.c 2006-08-12 10:27:29 UTC (rev 16715) @@ -0,0 +1,29 @@ +#include "gntkeys.h" + +#include <string.h> + +void gnt_keys_refine(char *text) +{ + if (text[0] == 27) + { + /* These are for urxvt */ + if (strcmp(text + 1, "Oa") == 0) + { + strcpy(text + 1, GNT_KEY_CTRL_UP); + } + else if (strcmp(text + 1, "Ob") == 0) + { + strcpy(text + 1, GNT_KEY_CTRL_DOWN); + } + } + else if ((unsigned char)text[0] == 195) + { + /* These for xterm */ + if (text[2] == 0) + { + text[0] = 27; + text[1] -= 64; + } + } +} + Property changes on: trunk/console/libgnt/gntkeys.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/console/libgnt/gntkeys.h =================================================================== --- trunk/console/libgnt/gntkeys.h 2006-08-12 10:26:45 UTC (rev 16714) +++ trunk/console/libgnt/gntkeys.h 2006-08-12 10:27:29 UTC (rev 16715) @@ -9,6 +9,11 @@ #define GNT_KEY_UP "[A" #define GNT_KEY_DOWN "[B" +#define GNT_KEY_CTRL_UP "[1;5A" +#define GNT_KEY_CTRL_DOWN "[1;5B" +#define GNT_KEY_CTRL_RIGHT "[1;5C" +#define GNT_KEY_CTRL_LEFT "[1;5D" + #define GNT_KEY_PGUP "[5~" #define GNT_KEY_PGDOWN "[6~" @@ -17,4 +22,9 @@ #define GNT_KEY_BACKSPACE "\177" #define GNT_KEY_DEL "[3~" +/** + * This will do stuff with the terminal settings and stuff. + */ +void gnt_keys_refine(char *text); + #endif Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-12 10:26:45 UTC (rev 16714) +++ trunk/console/libgnt/gntmain.c 2006-08-12 10:27:29 UTC (rev 16715) @@ -13,6 +13,11 @@ #include <unistd.h> #include <string.h> +/** + * Notes: Interesting functions to look at: + * scr_dump, scr_init, scr_restore: for workspaces + */ + static int lock_focus_list; static GList *focus_list; @@ -52,6 +57,14 @@ static void draw_taskbar(); static void bring_on_top(GntWidget *widget); +static gboolean +update_screen(gpointer null) +{ + update_panels(); + doupdate(); + return TRUE; +} + void gnt_screen_take_focus(GntWidget *widget) { GntWidget *w = NULL; @@ -119,8 +132,7 @@ GntNode *nd = g_hash_table_lookup(nodes, window_list.window); top_panel(nd->panel); } - update_panels(); - doupdate(); + update_screen(NULL); draw_taskbar(); } @@ -437,6 +449,8 @@ dump_screen(); } + gnt_keys_refine(buffer); + if (mode == GNT_KP_MODE_NORMAL) { if (focus_list) @@ -499,6 +513,14 @@ { shift_window(focus_list->data, 1); } + else if (strcmp(buffer + 1, "l") == 0) + { + touchwin(stdscr); + touchwin(newscr); + wrefresh(newscr); + update_screen(NULL); + draw_taskbar(); + } } } } @@ -557,8 +579,7 @@ GntNode *node = g_hash_table_lookup(nodes, widget); gnt_widget_set_position(widget, x, y); move_panel(node->panel, y, x); - update_panels(); - doupdate(); + update_screen(NULL); } } else if (*buffer == '\r') @@ -656,6 +677,10 @@ ascii_only = TRUE; initscr(); + typeahead(-1); + noecho(); + curs_set(0); + gnt_init_colors(); gnt_init_styles(); @@ -671,7 +696,6 @@ 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(); #if 0 mousemask(NCURSES_BUTTON_PRESSED | NCURSES_BUTTON_RELEASED | REPORT_MOUSE_POSITION, NULL); @@ -729,8 +753,7 @@ } } - update_panels(); - doupdate(); + update_screen(NULL); } void gnt_screen_release(GntWidget *widget) @@ -750,8 +773,7 @@ gnt_tree_remove(GNT_TREE(window_list.tree), widget); } - update_panels(); - doupdate(); + update_screen(NULL); } void gnt_screen_update(GntWidget *widget) @@ -779,8 +801,7 @@ top_panel(nd->panel); } - update_panels(); - doupdate(); + update_screen(NULL); } gboolean gnt_widget_has_focus(GntWidget *widget) @@ -844,8 +865,7 @@ gnt_widget_draw(widget); replace_panel(node->panel, widget->window); show_panel(node->panel); - update_panels(); - doupdate(); + update_screen(NULL); } } Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-08-12 10:26:45 UTC (rev 16714) +++ trunk/console/libgnt/gnttree.c 2006-08-12 10:27:29 UTC (rev 16715) @@ -770,6 +770,15 @@ } } +void gnt_tree_remove_all(GntTree *tree) +{ + tree->root = NULL; + g_hash_table_remove_all(tree->hash); + g_list_free(tree->list); + tree->list = NULL; + tree->current = tree->top = tree->bottom = NULL; +} + int gnt_tree_get_selection_visible_line(GntTree *tree) { return get_distance(tree->top, tree->current) + Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-08-12 10:26:45 UTC (rev 16714) +++ trunk/console/libgnt/gnttree.h 2006-08-12 10:27:29 UTC (rev 16715) @@ -85,6 +85,8 @@ void gnt_tree_remove(GntTree *tree, gpointer key); +void gnt_tree_remove_all(GntTree *tree); + /* Returns the visible line number of the selected row */ int gnt_tree_get_selection_visible_line(GntTree *tree); Modified: trunk/console/libgnt/gntwidget.c =================================================================== --- trunk/console/libgnt/gntwidget.c 2006-08-12 10:26:45 UTC (rev 16714) +++ trunk/console/libgnt/gntwidget.c 2006-08-12 10:27:29 UTC (rev 16715) @@ -80,6 +80,23 @@ return TRUE; } +static gboolean +gnt_boolean_handled_accumulator(GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer dummy) +{ + gboolean continue_emission; + gboolean signal_handled; + + signal_handled = g_value_get_boolean (handler_return); + g_value_set_boolean (return_accu, signal_handled); + continue_emission = !signal_handled; + + return continue_emission; +} + + static void gnt_widget_class_init(GntWidgetClass *klass) { @@ -194,7 +211,7 @@ G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(GntWidgetClass, key_pressed), - NULL, NULL, + gnt_boolean_handled_accumulator, NULL, gnt_closure_marshal_BOOLEAN__STRING, G_TYPE_BOOLEAN, 1, G_TYPE_STRING); DEBUG; Modified: trunk/console/libgnt/test/tv.c =================================================================== --- trunk/console/libgnt/test/tv.c 2006-08-12 10:26:45 UTC (rev 16714) +++ trunk/console/libgnt/test/tv.c 2006-08-12 10:27:29 UTC (rev 16715) @@ -14,19 +14,24 @@ gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(view), gnt_entry_get_text(GNT_ENTRY(w)), GNT_TEXT_FLAG_HIGHLIGHT); + gnt_entry_add_to_history(GNT_ENTRY(w), gnt_entry_get_text(GNT_ENTRY(w))); gnt_text_view_next_line(GNT_TEXT_VIEW(view)); gnt_entry_clear(GNT_ENTRY(w)); if (gnt_text_view_get_lines_below(GNT_TEXT_VIEW(view)) <= 1) gnt_text_view_scroll(GNT_TEXT_VIEW(view), 0); + gnt_entry_remove_suggest(GNT_ENTRY(w), "acb"); return TRUE; } else if (key[0] == 27) { - if (strcmp(key+1, GNT_KEY_UP)) + if (strcmp(key+1, GNT_KEY_UP) == 0) + gnt_text_view_scroll(GNT_TEXT_VIEW(view), -1); + else if (strcmp(key+1, GNT_KEY_DOWN) == 0) gnt_text_view_scroll(GNT_TEXT_VIEW(view), 1); - else if (strcmp(key+1, GNT_KEY_DOWN)) - gnt_text_view_scroll(GNT_TEXT_VIEW(view), -1); + else + return FALSE; + return TRUE; } return FALSE; @@ -53,6 +58,15 @@ gnt_widget_set_name(entry, "entry"); GNT_WIDGET_SET_FLAGS(entry, GNT_WIDGET_CAN_TAKE_FOCUS); + gnt_entry_set_word_suggest(GNT_ENTRY(entry), TRUE); + gnt_entry_set_always_suggest(GNT_ENTRY(entry), FALSE); + gnt_entry_add_suggest(GNT_ENTRY(entry), "a"); + gnt_entry_add_suggest(GNT_ENTRY(entry), "ab"); + gnt_entry_add_suggest(GNT_ENTRY(entry), "abc"); + gnt_entry_add_suggest(GNT_ENTRY(entry), "abcd"); + gnt_entry_add_suggest(GNT_ENTRY(entry), "abcde"); + gnt_entry_add_suggest(GNT_ENTRY(entry), "acb"); + view = gnt_text_view_new(); gnt_widget_set_name(view, "view"); @@ -65,7 +79,8 @@ gnt_widget_show(hbox); - g_signal_connect(G_OBJECT(entry), "key_pressed", G_CALLBACK(key_pressed), view); + gnt_entry_set_history_length(GNT_ENTRY(entry), -1); + g_signal_connect_after(G_OBJECT(entry), "key_pressed", G_CALLBACK(key_pressed), view); #ifdef STANDALONE gnt_main(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-13 23:30:32
|
Revision: 16739 Author: sadrul Date: 2006-08-13 16:30:19 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16739&view=rev Log Message: ----------- Allow autojoining chat rooms. Sort the buddies in the buddylist, and the plugins in the plugin list. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntnotify.c trunk/console/gntplugin.c trunk/console/libgnt/gntcombobox.c trunk/console/libgnt/gntentry.c 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/tv.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-13 17:38:25 UTC (rev 16738) +++ trunk/console/gntblist.c 2006-08-13 23:30:19 UTC (rev 16739) @@ -337,6 +337,9 @@ node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), chat, gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), group, NULL); + + if (gaim_blist_node_get_bool((GaimBlistNode*)chat, "gnt-autojoin")) + serv_join_chat(gaim_account_get_connection(chat->account), chat->components); } static void @@ -452,8 +455,23 @@ } static void +context_menu_toggle(GntTree *tree, GaimMenuAction *action, gpointer null) +{ + gboolean sel = gnt_tree_get_choice(tree, action); + gaim_blist_node_set_bool(action->data, "gnt-autojoin", sel); +} + +static void create_chat_menu(GntTree *tree, GaimChat *chat) { + GaimMenuAction *action = gaim_menu_action_new(_("Auto-join"), NULL, chat, NULL); + + gnt_tree_add_choice(tree, action, gnt_tree_create_row(tree, action->label), NULL, NULL); + gnt_tree_set_choice(tree, action, gaim_blist_node_get_bool((GaimBlistNode*)chat, "gnt-autojoin")); + + g_signal_connect_swapped(G_OBJECT(tree), "destroy", + G_CALLBACK(gaim_menu_action_free), action); + g_signal_connect(G_OBJECT(tree), "toggled", G_CALLBACK(context_menu_toggle), NULL); } static void @@ -1182,6 +1200,42 @@ 0, 0, NULL, status_text_changed, NULL); } +static int +blist_node_compare(GaimBlistNode *n1, GaimBlistNode *n2) +{ + const char *s1, *s2; + char *us1, *us2; + int ret; + + g_return_val_if_fail(n1->type == n2->type, -1); + + switch (n1->type) + { + case GAIM_BLIST_GROUP_NODE: + s1 = ((GaimGroup*)n1)->name; + s2 = ((GaimGroup*)n2)->name; + break; + case GAIM_BLIST_CHAT_NODE: + s1 = gaim_chat_get_name((GaimChat*)n1); + s2 = gaim_chat_get_name((GaimChat*)n2); + break; + case GAIM_BLIST_BUDDY_NODE: + s1 = gaim_buddy_get_alias((GaimBuddy*)n1); + s2 = gaim_buddy_get_alias((GaimBuddy*)n2); + break; + default: + return -1; + } + + us1 = g_utf8_strup(s1, -1); + us2 = g_utf8_strup(s2, -1); + ret = g_utf8_collate(us1, us2); + g_free(us1); + g_free(us2); + + return ret; +} + void gg_blist_show() { if (ggblist) @@ -1198,6 +1252,7 @@ gnt_box_set_pad(GNT_BOX(ggblist->window), 0); ggblist->tree = gnt_tree_new(); + gnt_tree_set_compare_func(GNT_TREE(ggblist->tree), (GCompareFunc)blist_node_compare); GNT_WIDGET_SET_FLAGS(ggblist->tree, GNT_WIDGET_NO_BORDER); gnt_tree_set_col_width(GNT_TREE(ggblist->tree), 0, 25); gnt_widget_set_size(ggblist->tree, gaim_prefs_get_int(PREF_ROOT "/size/width"), Modified: trunk/console/gntnotify.c =================================================================== --- trunk/console/gntnotify.c 2006-08-13 17:38:25 UTC (rev 16738) +++ trunk/console/gntnotify.c 2006-08-13 23:30:19 UTC (rev 16739) @@ -163,14 +163,18 @@ } else { + char *to; + setup_email_dialog(); + to = g_strdup_printf("%s (%s)", tos ? *tos : gaim_account_get_username(account), + gaim_account_get_protocol_name(account)); 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), /* XXX: Perhaps add the prpl-name */ + gnt_tree_create_row(GNT_TREE(emaildialog.tree), to, froms ? *froms : "[Unknown sender]", *subjects), NULL, NULL); + g_free(to); gnt_widget_show(emaildialog.window); return NULL; } Modified: trunk/console/gntplugin.c =================================================================== --- trunk/console/gntplugin.c 2006-08-13 17:38:25 UTC (rev 16738) +++ trunk/console/gntplugin.c 2006-08-13 23:30:19 UTC (rev 16739) @@ -68,6 +68,7 @@ gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(plugins.aboot), text, GNT_TEXT_FLAG_NORMAL); gnt_text_view_scroll(GNT_TEXT_VIEW(plugins.aboot), 0); + g_free(text); } static void @@ -78,6 +79,17 @@ plugins.aboot = NULL; } +static int +plugin_compare(GaimPlugin *p1, GaimPlugin *p2) +{ + char *s1 = g_utf8_strup(p1->info->name, -1); + char *s2 = g_utf8_strup(p2->info->name, -1); + int ret = g_utf8_collate(s1, s2); + g_free(s1); + g_free(s2); + return ret; +} + void gg_plugins_show_all() { GntWidget *window, *tree, *box, *aboot; @@ -102,6 +114,7 @@ gnt_box_set_pad(GNT_BOX(box), 0); plugins.tree = tree = gnt_tree_new(); + gnt_tree_set_compare_func(GNT_TREE(tree), (GCompareFunc)plugin_compare); GNT_WIDGET_SET_FLAGS(tree, GNT_WIDGET_NO_BORDER); gnt_box_add_widget(GNT_BOX(box), tree); gnt_box_add_widget(GNT_BOX(box), gnt_vline_new()); @@ -128,8 +141,6 @@ g_signal_connect(G_OBJECT(tree), "selection_changed", G_CALLBACK(selection_changed), NULL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(reset_plugin_window), NULL); - gnt_tree_set_selected(GNT_TREE(tree), gaim_plugins_get_all()->data); - gnt_widget_show(window); } Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-08-13 17:38:25 UTC (rev 16738) +++ trunk/console/libgnt/gntcombobox.c 2006-08-13 23:30:19 UTC (rev 16739) @@ -244,8 +244,8 @@ void gnt_combo_box_add_data(GntComboBox *box, gpointer key, const char *text) { - gnt_tree_add_row_after(GNT_TREE(box->dropdown), key, - gnt_tree_create_row(GNT_TREE(box->dropdown), text), NULL, NULL); + gnt_tree_add_row_last(GNT_TREE(box->dropdown), key, + gnt_tree_create_row(GNT_TREE(box->dropdown), text), NULL); if (box->selected == NULL) set_selection(box, key); } Modified: trunk/console/libgnt/gntentry.c =================================================================== --- trunk/console/libgnt/gntentry.c 2006-08-13 17:38:25 UTC (rev 16738) +++ trunk/console/libgnt/gntentry.c 2006-08-13 23:30:19 UTC (rev 16739) @@ -61,6 +61,7 @@ { GntWidget *box = gnt_vbox_new(FALSE); entry->ddown = gnt_tree_new(); + gnt_tree_set_compare_func(GNT_TREE(entry->ddown), (GCompareFunc)g_utf8_collate); gnt_box_add_widget(GNT_BOX(box), entry->ddown); GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_TRANSIENT); Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-08-13 17:38:25 UTC (rev 16738) +++ trunk/console/libgnt/gnttree.c 2006-08-13 23:30:19 UTC (rev 16739) @@ -249,8 +249,11 @@ int start; GntWidget *widget = GNT_WIDGET(tree); GntTreeRow *row; - int pos; + int pos, up, down, nr; + if (!GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_MAPPED)) + return; + if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) pos = 0; else @@ -288,6 +291,21 @@ start = 2; } + nr = widget->priv.height - pos * 2 - start - 1; + tree->bottom = get_next_n_opt(tree->top, nr, &down); + if (down < nr) + { + tree->top = get_prev_n(tree->bottom, nr); + if (tree->top == NULL) + tree->top = tree->root; + } + + up = get_distance(tree->top, tree->current); + if (up < 0) + tree->top = tree->current; + else if (up >= widget->priv.height - pos) + tree->top = get_prev_n(tree->current, nr); + row = tree->top; for (start = start + pos; row && start < widget->priv.height - pos; start++, row = get_next(row)) @@ -379,8 +397,13 @@ static void gnt_tree_map(GntWidget *widget) { + GntTree *tree = GNT_TREE(widget); if (widget->priv.width == 0 || widget->priv.height == 0) + { gnt_widget_size_request(widget); + } + tree->top = tree->root; + tree->current = tree->root; DEBUG; } @@ -616,12 +639,48 @@ g_signal_emit(tree, signals[SIG_SCROLLED], 0, count); } +static gpointer +find_position(GntTree *tree, gpointer key, gpointer parent) +{ + GntTreeRow *row; + + if (tree->compare == NULL) + return NULL; + + if (parent == NULL) + row = tree->root; + else + row = g_hash_table_lookup(tree->hash, parent); + + if (!row) + return NULL; + + if (parent) + row = row->child; + + while (row) + { + if (tree->compare(key, row->key) < 0) + return (row->prev ? row->prev->key : NULL); + if (row->next) + row = row->next; + else + return row->key; + } + return NULL; +} + GntTreeRow *gnt_tree_add_row_after(GntTree *tree, void *key, GntTreeRow *row, void *parent, void *bigbro) { GntTreeRow *pr = NULL; g_hash_table_replace(tree->hash, key, row); + if (bigbro == NULL && tree->compare) + { + bigbro = find_position(tree, key, parent); + } + if (tree->root == NULL) { tree->root = row; @@ -663,12 +722,10 @@ if (pr == NULL) { GntTreeRow *r = tree->root; - while (r->next) - r = r->next; - r->next = row; - row->prev = r; - - tree->list = g_list_append(tree->list, key); + row->next = r; + if (r) r->prev = row; + tree->root = row; + tree->list = g_list_prepend(tree->list, key); } else { @@ -679,12 +736,32 @@ row->key = key; row->data = NULL; - if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_MAPPED)) - redraw_tree(tree); + redraw_tree(tree); return row; } +GntTreeRow *gnt_tree_add_row_last(GntTree *tree, void *key, GntTreeRow *row, void *parent) +{ + GntTreeRow *pr = NULL, *br = NULL; + + if (parent) + pr = g_hash_table_lookup(tree->hash, parent); + + if (pr) + br = pr->child; + else + br = tree->root; + + if (br) + { + while (br->next) + br = br->next; + } + + return gnt_tree_add_row_after(tree, key, row, parent, br ? br->key : NULL); +} + gpointer gnt_tree_get_selection_data(GntTree *tree) { if (tree->current) @@ -954,3 +1031,8 @@ tree->show_title = set; } +void gnt_tree_set_compare_func(GntTree *tree, GCompareFunc func) +{ + tree->compare = func; +} + Modified: trunk/console/libgnt/gnttree.h =================================================================== --- trunk/console/libgnt/gnttree.h 2006-08-13 17:38:25 UTC (rev 16738) +++ trunk/console/libgnt/gnttree.h 2006-08-13 23:30:19 UTC (rev 16739) @@ -46,6 +46,8 @@ char *title; } *columns; /* Would a GList be better? */ gboolean show_title; + + GCompareFunc compare; }; struct _GnTreeClass @@ -76,6 +78,8 @@ GntTreeRow *gnt_tree_add_row_after(GntTree *tree, void *key, GntTreeRow *row, void *parent, void *bigbro); +GntTreeRow *gnt_tree_add_row_last(GntTree *tree, void *key, GntTreeRow *row, void *parent); + gpointer gnt_tree_get_selection_data(GntTree *tree); /* Returned string needs to be freed */ @@ -112,6 +116,8 @@ void gnt_tree_set_show_title(GntTree *tree, gboolean set); +void gnt_tree_set_compare_func(GntTree *tree, GCompareFunc func); + G_END_DECLS #endif /* GNT_TREE_H */ Modified: trunk/console/libgnt/test/focus.c =================================================================== --- trunk/console/libgnt/test/focus.c 2006-08-13 17:38:25 UTC (rev 16738) +++ trunk/console/libgnt/test/focus.c 2006-08-13 23:30:19 UTC (rev 16739) @@ -44,13 +44,19 @@ box = gnt_box_new(FALSE, FALSE); tree = gnt_tree_new(); + gnt_tree_set_compare_func(GNT_TREE(tree), g_utf8_collate); 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), "c", gnt_tree_create_row(GNT_TREE(tree), "c"), NULL, 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), "z", gnt_tree_create_row(GNT_TREE(tree), "z"), "a", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "y", gnt_tree_create_row(GNT_TREE(tree), "y"), "a", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "g", gnt_tree_create_row(GNT_TREE(tree), "g"), "a", 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), "x", gnt_tree_create_row(GNT_TREE(tree), "x"), "a", NULL); + gnt_tree_add_row_after(GNT_TREE(tree), "k", gnt_tree_create_row(GNT_TREE(tree), "k"), "a", 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); Modified: trunk/console/libgnt/test/multiwin.c =================================================================== Modified: trunk/console/libgnt/test/tv.c =================================================================== --- trunk/console/libgnt/test/tv.c 2006-08-13 17:38:25 UTC (rev 16738) +++ trunk/console/libgnt/test/tv.c 2006-08-13 23:30:19 UTC (rev 16739) @@ -62,9 +62,10 @@ gnt_entry_set_always_suggest(GNT_ENTRY(entry), FALSE); gnt_entry_add_suggest(GNT_ENTRY(entry), "a"); gnt_entry_add_suggest(GNT_ENTRY(entry), "ab"); + gnt_entry_add_suggest(GNT_ENTRY(entry), "abe"); gnt_entry_add_suggest(GNT_ENTRY(entry), "abc"); + gnt_entry_add_suggest(GNT_ENTRY(entry), "abcde"); gnt_entry_add_suggest(GNT_ENTRY(entry), "abcd"); - gnt_entry_add_suggest(GNT_ENTRY(entry), "abcde"); gnt_entry_add_suggest(GNT_ENTRY(entry), "acb"); view = gnt_text_view_new(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-15 04:07:56
|
Revision: 16763 Author: sadrul Date: 2006-08-14 21:07:38 -0700 (Mon, 14 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16763&view=rev Log Message: ----------- Redirect the debug messages to stderr when started with -d. Fix the order of the windows in the windowlist. Modified Paths: -------------- trunk/console/gntdebug.c trunk/console/libgnt/gntmain.c Modified: trunk/console/gntdebug.c =================================================================== --- trunk/console/gntdebug.c 2006-08-15 04:05:27 UTC (rev 16762) +++ trunk/console/gntdebug.c 2006-08-15 04:07:38 UTC (rev 16763) @@ -80,6 +80,12 @@ debug.window = debug.tview = NULL; } +static void +print_stderr(const char *string) +{ + g_printerr("%s", string); +} + void gg_debug_window_show() { if (debug.window == NULL) @@ -102,6 +108,7 @@ void gg_debug_init() { + g_set_print_handler(print_stderr); /* Redirect the debug messages to stderr */ if (gaim_debug_is_enabled()) gg_debug_window_show(); } Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-15 04:05:27 UTC (rev 16762) +++ trunk/console/libgnt/gntmain.c 2006-08-15 04:07:38 UTC (rev 16763) @@ -273,8 +273,8 @@ { GntBox *box = GNT_BOX(iter->data); - gnt_tree_add_row_after(GNT_TREE(tree), box, - gnt_tree_create_row(GNT_TREE(tree), box->title), NULL, NULL); + gnt_tree_add_row_last(GNT_TREE(tree), box, + gnt_tree_create_row(GNT_TREE(tree), box->title), NULL); update_window_in_list(GNT_WIDGET(box)); } @@ -752,9 +752,9 @@ 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_tree_add_row_last(GNT_TREE(window_list.tree), widget, gnt_tree_create_row(GNT_TREE(window_list.tree), GNT_BOX(widget)->title), - NULL, NULL); + NULL); update_window_in_list(widget); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-15 18:05:25
|
Revision: 16773 Author: sadrul Date: 2006-08-15 11:05:14 -0700 (Tue, 15 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16773&view=rev Log Message: ----------- Some adjustment to the scrollbars. Deal with dialogs with NULL title. Status-selector in the buddylist should always show the active status. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/libgnt/gntmain.c trunk/console/libgnt/gnttextview.c trunk/console/libgnt/gnttree.c trunk/console/libgnt/test/multiwin.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-15 16:48:32 UTC (rev 16772) +++ trunk/console/gntblist.c 2006-08-15 18:05:14 UTC (rev 16773) @@ -67,6 +67,7 @@ static gboolean remove_typing_cb(gpointer null); static void remove_peripherals(GGBlist *ggblist); static const char * get_display_name(GaimBlistNode *node); +static void savedstatus_changed(GaimSavedStatus *now, GaimSavedStatus *old); static void new_node(GaimBlistNode *node) @@ -1150,6 +1151,9 @@ } else if (now->type == STATUS_SAVED_ALL) { + /* Restore the selection to reflect current status. */ + savedstatus_changed(gaim_savedstatus_get_current(), NULL); + gnt_box_give_focus_to_child(GNT_BOX(ggblist->window), ggblist->tree); gg_savedstatus_show_all(); } else Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-15 16:48:32 UTC (rev 16772) +++ trunk/console/libgnt/gntmain.c 2006-08-15 18:05:14 UTC (rev 16773) @@ -16,6 +16,8 @@ /** * Notes: Interesting functions to look at: * scr_dump, scr_init, scr_restore: for workspaces + * + * Need to wattrset for colors to use with PDCurses. */ static int lock_focus_list; @@ -176,6 +178,7 @@ { GntWidget *w = iter->data; int color; + const char *title; if (w == focus_list->data) { @@ -194,7 +197,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); + title = GNT_BOX(w)->title; + mvwprintw(taskbar, 0, width * i, "%s", title ? title : "<gnt>"); update_window_in_list(w); } Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-08-15 16:48:32 UTC (rev 16772) +++ trunk/console/libgnt/gnttextview.c 2006-08-15 18:05:14 UTC (rev 16773) @@ -26,7 +26,7 @@ GntTextView *view = GNT_TEXT_VIEW(widget); int i = 0; GList *lines; - int showing, position, rows, scrcol; + int rows, scrcol; werase(widget->window); @@ -51,11 +51,17 @@ rows = widget->priv.height - 2; if (rows > 0) { + int total = g_list_length(g_list_first(view->list)); + int showing, position, up, down; - showing = rows * rows / g_list_length(g_list_first(view->list)) + 1; + showing = rows * rows / total + 1; showing = MIN(rows, showing); - position = showing * g_list_length(view->list) / rows; + total -= rows; + up = g_list_length(lines); + down = total - up; + + position = (rows - showing) * up / MAX(1, up + down); position = MAX((lines != NULL), position); if (showing + position > rows) Modified: trunk/console/libgnt/gnttree.c =================================================================== --- trunk/console/libgnt/gnttree.c 2006-08-15 16:48:32 UTC (rev 16772) +++ trunk/console/libgnt/gnttree.c 2006-08-15 18:05:14 UTC (rev 16773) @@ -250,7 +250,7 @@ GntWidget *widget = GNT_WIDGET(tree); GntTreeRow *row; int pos, up, down; - int showing, position, rows, scrcol; + int rows, scrcol; if (!GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(tree), GNT_WIDGET_MAPPED)) return; @@ -371,11 +371,18 @@ rows--; if (rows > 0) { - get_next_n_opt(tree->root, g_list_length(tree->list), &i); - showing = rows * rows / MAX(i, 1) + 1; + int total; + int showing, position; + + get_next_n_opt(tree->root, g_list_length(tree->list), &total); + showing = rows * rows / MAX(total, 1) + 1; showing = MIN(rows, showing); - position = showing * get_distance(tree->root, tree->top) / rows; + total -= rows; + up = get_distance(tree->root, tree->top); + down = total - up; + + position = (rows - showing) * up / MAX(1, up + down); position = MAX((tree->top != tree->root), position); if (showing + position > rows) Modified: trunk/console/libgnt/test/multiwin.c =================================================================== --- trunk/console/libgnt/test/multiwin.c 2006-08-15 16:48:32 UTC (rev 16772) +++ trunk/console/libgnt/test/multiwin.c 2006-08-15 18:05:14 UTC (rev 16773) @@ -63,7 +63,7 @@ gnt_tree_add_row_after(GNT_TREE(tree), "6", gnt_tree_create_row(GNT_TREE(tree), "6", " long text", "a2"), "4", NULL); int i; - for (i = 110; i < 130; i++) + for (i = 110; i < 430; i++) { char *s; s = g_strdup_printf("%d", i); /* XXX: yes, leaking */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-15 20:24:09
|
Revision: 16774 Author: sadrul Date: 2006-08-15 13:23:58 -0700 (Tue, 15 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16774&view=rev Log Message: ----------- Add a new custom status dialog, and a corresponding entry in the status-selector in the buddylist. But you cannot set any per-account status yet. Modified Paths: -------------- trunk/console/gntblist.c trunk/console/gntstatus.c trunk/console/libgnt/gntcombobox.c Modified: trunk/console/gntblist.c =================================================================== --- trunk/console/gntblist.c 2006-08-15 18:05:14 UTC (rev 16773) +++ trunk/console/gntblist.c 2006-08-15 20:23:58 UTC (rev 16774) @@ -45,6 +45,7 @@ STATUS_PRIMITIVE = 0, STATUS_SAVED_POPULAR, STATUS_SAVED_ALL, + STATUS_SAVED_NEW } StatusType; typedef struct @@ -1065,6 +1066,13 @@ gaim_savedstatus_get_title(iter->data)); } + /* New savedstatus */ + item = g_new0(StatusBoxItem, 1); + item->type = STATUS_SAVED_NEW; + items = g_list_prepend(items, item); + gnt_combo_box_add_data(GNT_COMBO_BOX(ggblist->status), item, + _("New...")); + /* More savedstatuses */ item = g_new0(StatusBoxItem, 1); item->type = STATUS_SAVED_ALL; @@ -1156,6 +1164,12 @@ gnt_box_give_focus_to_child(GNT_BOX(ggblist->window), ggblist->tree); gg_savedstatus_show_all(); } + else if (now->type == STATUS_SAVED_NEW) + { + savedstatus_changed(gaim_savedstatus_get_current(), NULL); + gnt_box_give_focus_to_child(GNT_BOX(ggblist->window), ggblist->tree); + gg_savedstatus_edit(NULL); + } else g_return_if_reached(); } Modified: trunk/console/gntstatus.c =================================================================== --- trunk/console/gntstatus.c 2006-08-15 18:05:14 UTC (rev 16773) +++ trunk/console/gntstatus.c 2006-08-15 20:23:58 UTC (rev 16774) @@ -1,10 +1,12 @@ #include <gnt.h> #include <gntbox.h> #include <gntbutton.h> +#include <gntcombobox.h> #include <gntentry.h> #include <gntlabel.h> #include <gnttree.h> +#include <notify.h> #include <request.h> #include "gntgaim.h" @@ -16,6 +18,18 @@ GntWidget *tree; } statuses; +typedef struct +{ + GaimSavedStatus *saved; + GntWidget *window; + GntWidget *title; + GntWidget *type; + GntWidget *message; + /* XXX: Stuff needed for per-account statuses */ +} EditStatus; + +static GList *edits; /* List of opened edit-status dialogs */ + static void reset_status_window(GntWidget *widget, gpointer null) { @@ -48,7 +62,18 @@ static void really_delete_status(GaimSavedStatus *saved) { - /* XXX: Close any modify dialog opened for the savedstatus */ + GList *iter; + + for (iter = edits; iter; iter = iter->next) + { + EditStatus *edit = iter->data; + if (edit->saved == saved) + { + gnt_widget_destroy(edit->window); + break; + } + } + if (statuses.tree) gnt_tree_remove(GNT_TREE(statuses.tree), saved); @@ -80,6 +105,14 @@ gaim_savedstatus_activate(gnt_tree_get_selection_data(GNT_TREE(statuses.tree))); } +static void +edit_savedstatus_cb(GntWidget *widget, gpointer null) +{ + g_return_if_fail(statuses.tree != NULL); + + gg_savedstatus_edit(gnt_tree_get_selection_data(GNT_TREE(statuses.tree))); +} + void gg_savedstatus_show_all() { GntWidget *window, *tree, *box, *button; @@ -114,9 +147,13 @@ button = gnt_button_new(_("Add")); gnt_box_add_widget(GNT_BOX(box), button); + g_signal_connect_swapped(G_OBJECT(button), "activate", + G_CALLBACK(gg_savedstatus_edit), NULL); button = gnt_button_new(_("Edit")); gnt_box_add_widget(GNT_BOX(box), button); + g_signal_connect(G_OBJECT(button), "activate", + G_CALLBACK(edit_savedstatus_cb), NULL); button = gnt_button_new(_("Delete")); gnt_box_add_widget(GNT_BOX(box), button); @@ -133,7 +170,159 @@ gnt_widget_show(window); } +static void +update_edit_list(GntWidget *widget, EditStatus *edit) +{ + edits = g_list_remove(edits, edit); + gaim_notify_close_with_handle(edit); + g_free(edit); +} + +static void +save_savedstatus_cb(GntWidget *button, EditStatus *edit) +{ + const char *title, *message; + GaimStatusPrimitive prim; + GaimSavedStatus *find; + + title = gnt_entry_get_text(GNT_ENTRY(edit->title)); + message = gnt_entry_get_text(GNT_ENTRY(edit->message)); + if (!message || !*message) + message = NULL; + + prim = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(edit->type))); + + if (!title || !*title) + { + gaim_notify_error(edit, _("Error"), _("Invalid title"), + _("Please enter a non-empty title for the status.")); + return; + } + + find = gaim_savedstatus_find(title); + if (find && find != edit->saved) + { + gaim_notify_error(edit, _("Error"), _("Duplicate title"), + _("Please enter a different title for the status.")); + return; + } + + if (edit->saved == NULL) + { + edit->saved = gaim_savedstatus_new(title, prim); + gaim_savedstatus_set_message(edit->saved, message); + if (statuses.tree) + gnt_tree_add_row_last(GNT_TREE(statuses.tree), edit->saved, + gnt_tree_create_row(GNT_TREE(statuses.tree), title, + gaim_primitive_get_name_from_type(prim), message), NULL); + } + else + { + gaim_savedstatus_set_title(edit->saved, title); + gaim_savedstatus_set_type(edit->saved, prim); + gaim_savedstatus_set_message(edit->saved, message); + if (statuses.tree) + { + gnt_tree_change_text(GNT_TREE(statuses.tree), edit->saved, 0, title); + gnt_tree_change_text(GNT_TREE(statuses.tree), edit->saved, 1, + gaim_primitive_get_name_from_type(prim)); + gnt_tree_change_text(GNT_TREE(statuses.tree), edit->saved, 2, message); + } + } + + if (g_object_get_data(G_OBJECT(button), "use")) + gaim_savedstatus_activate(edit->saved); + + gnt_widget_destroy(edit->window); +} + void gg_savedstatus_edit(GaimSavedStatus *saved) { + EditStatus *edit; + GntWidget *window, *box, *button, *entry, *combo, *label; + GaimStatusPrimitive prims[] = {GAIM_STATUS_AVAILABLE, GAIM_STATUS_AWAY, + GAIM_STATUS_INVISIBLE, GAIM_STATUS_OFFLINE, GAIM_STATUS_UNSET}, current; + int i; + + if (saved) + { + GList *iter; + for (iter = edits; iter; iter = iter->next) + { + edit = iter->data; + if (edit->saved == saved) + return; + } + } + + edit = g_new0(EditStatus, 1); + edit->saved = saved; + edit->window = window = gnt_vbox_new(FALSE); + gnt_box_set_toplevel(GNT_BOX(window), TRUE); + gnt_box_set_title(GNT_BOX(window), _("Edit Status")); + gnt_box_set_fill(GNT_BOX(window), TRUE); + gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_LEFT); + gnt_box_set_pad(GNT_BOX(window), 0); + + edits = g_list_append(edits, edit); + + /* Title */ + box = gnt_hbox_new(FALSE); + gnt_box_add_widget(GNT_BOX(window), box); + gnt_box_add_widget(GNT_BOX(box), gnt_label_new(_("Title"))); + + edit->title = entry = gnt_entry_new(saved ? gaim_savedstatus_get_title(saved) : NULL); + gnt_box_add_widget(GNT_BOX(box), entry); + + /* Type */ + box = gnt_hbox_new(FALSE); + gnt_box_add_widget(GNT_BOX(window), box); + gnt_box_add_widget(GNT_BOX(box), label = gnt_label_new(_("Status"))); + gnt_widget_set_size(label, 0, 1); + + edit->type = combo = gnt_combo_box_new(); + gnt_box_add_widget(GNT_BOX(box), combo); + current = saved ? gaim_savedstatus_get_type(saved) : GAIM_STATUS_UNSET; + for (i = 0; prims[i] != GAIM_STATUS_UNSET; i++) + { + gnt_combo_box_add_data(GNT_COMBO_BOX(combo), GINT_TO_POINTER(prims[i]), + gaim_primitive_get_name_from_type(prims[i])); + if (prims[i] == current) + gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), GINT_TO_POINTER(current)); + } + + /* Message */ + box = gnt_hbox_new(FALSE); + gnt_box_add_widget(GNT_BOX(window), box); + gnt_box_add_widget(GNT_BOX(box), gnt_label_new(_("Message"))); + + edit->message = entry = gnt_entry_new(saved ? gaim_savedstatus_get_message(saved) : NULL); + gnt_box_add_widget(GNT_BOX(box), entry); + + /* The buttons */ + box = gnt_hbox_new(FALSE); + gnt_box_add_widget(GNT_BOX(window), box); + + /* Save */ + button = gnt_button_new(_("Save")); + gnt_box_add_widget(GNT_BOX(box), button); + g_object_set_data(G_OBJECT(button), "use", NULL); + g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_savedstatus_cb), edit); + + /* Save & Use */ + button = gnt_button_new(_("Save & Use")); + gnt_box_add_widget(GNT_BOX(box), button); + g_object_set_data(G_OBJECT(button), "use", GINT_TO_POINTER(TRUE)); + g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_savedstatus_cb), edit); + + /* Cancel */ + button = gnt_button_new(_("Cancel")); + gnt_box_add_widget(GNT_BOX(box), button); + g_signal_connect_swapped(G_OBJECT(button), "activate", + G_CALLBACK(gnt_widget_destroy), window); + + g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(update_edit_list), edit); + + gnt_widget_show(window); } Modified: trunk/console/libgnt/gntcombobox.c =================================================================== --- trunk/console/libgnt/gntcombobox.c 2006-08-15 18:05:14 UTC (rev 16773) +++ trunk/console/libgnt/gntcombobox.c 2006-08-15 20:23:58 UTC (rev 16774) @@ -79,7 +79,7 @@ GntWidget *dd = GNT_COMBO_BOX(widget)->dropdown; gnt_widget_size_request(dd); widget->priv.height = 3; /* For now, a combobox will have border */ - widget->priv.width = MIN(10, dd->priv.width + 4); + widget->priv.width = MAX(10, dd->priv.width + 4); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-16 05:13:06
|
Revision: 16781 Author: sadrul Date: 2006-08-15 22:12:48 -0700 (Tue, 15 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16781&view=rev Log Message: ----------- Allow setting the preferences for gnt-plugins. Add a guifications-like plugin for gntgaim. You can set its preferences. The preferences for core plugins are still not accessible. The makefile-foo will require changes once the split is complete. I am now just committing whatever works for me. Modified Paths: -------------- trunk/console/gntplugin.c trunk/console/gntplugin.h trunk/console/libgnt/gnt.h trunk/console/libgnt/gntmain.c Added Paths: ----------- trunk/console/plugins/ trunk/console/plugins/Makefile.am trunk/console/plugins/gntgf.c Modified: trunk/console/gntplugin.c =================================================================== --- trunk/console/gntplugin.c 2006-08-16 04:50:27 UTC (rev 16780) +++ trunk/console/gntplugin.c 2006-08-16 05:12:48 UTC (rev 16781) @@ -1,5 +1,6 @@ #include <gnt.h> #include <gntbox.h> +#include <gntbutton.h> #include <gntlabel.h> #include <gntline.h> #include <gnttree.h> @@ -14,9 +15,26 @@ GntWidget *tree; GntWidget *window; GntWidget *aboot; + GntWidget *conf; } plugins; static void +decide_conf_button(GaimPlugin *plugin) +{ + if (gaim_plugin_is_loaded(plugin) && + ((GAIM_IS_GNT_PLUGIN(plugin) && + GAIM_GNT_PLUGIN_UI_INFO(plugin) != NULL) || + (plugin->info->prefs_info && + plugin->info->prefs_info->get_plugin_pref_frame))) + gnt_widget_set_visible(plugins.conf, TRUE); + else + gnt_widget_set_visible(plugins.conf, FALSE); + + gnt_box_readjust(GNT_BOX(plugins.window)); + gnt_widget_draw(plugins.window); +} + +static void plugin_toggled_cb(GntWidget *tree, GaimPlugin *plugin, gpointer null) { if (gnt_tree_get_choice(GNT_TREE(tree), plugin)) @@ -29,6 +47,7 @@ if (!gaim_plugin_unload(plugin)) gaim_notify_error(NULL, "ERROR", "unloading plugin failed", NULL); } + decide_conf_button(plugin); gg_plugins_save_loaded(); } @@ -69,6 +88,7 @@ text, GNT_TEXT_FLAG_NORMAL); gnt_text_view_scroll(GNT_TEXT_VIEW(plugins.aboot), 0); g_free(text); + decide_conf_button(plugin); } static void @@ -90,9 +110,63 @@ return ret; } +static void +configure_plugin_cb(GntWidget *button, gpointer null) +{ + GaimPlugin *plugin; + GGPluginFrame callback; + + g_return_if_fail(plugins.tree != NULL); + + plugin = gnt_tree_get_selection_data(GNT_TREE(plugins.tree)); + if (!gaim_plugin_is_loaded(plugin)) + { + gaim_notify_error(plugin, _("Error"), + _("Plugin need to be loaded before you can configure it."), NULL); + return; + } + + if (GAIM_IS_GNT_PLUGIN(plugin) && + (callback = GAIM_GNT_PLUGIN_UI_INFO(plugin)) != NULL) + { + GntWidget *window = gnt_vbox_new(FALSE); + GntWidget *box, *button; + + gnt_box_set_toplevel(GNT_BOX(window), TRUE); + gnt_box_set_title(GNT_BOX(window), plugin->info->name); + gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); + + box = callback(); + gnt_box_add_widget(GNT_BOX(window), box); + + box = gnt_hbox_new(FALSE); + gnt_box_add_widget(GNT_BOX(window), box); + + 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), window); + + gnt_widget_show(window); /* XXX: This window needs to be closed when the plugin is unloaded */ + } + else if (plugin->info->prefs_info && + plugin->info->prefs_info->get_plugin_pref_frame) + { + gaim_notify_info(plugin, _("..."), + _("Still need to do something about this."), NULL); + return; + } + else + { + gaim_notify_info(plugin, _("Error"), + _("No configuration options for this plugin."), NULL); + return; + } +} + void gg_plugins_show_all() { - GntWidget *window, *tree, *box, *aboot; + GntWidget *window, *tree, *box, *aboot, *button; GList *iter; if (plugins.window) return; @@ -103,6 +177,7 @@ gnt_box_set_toplevel(GNT_BOX(window), TRUE); gnt_box_set_title(GNT_BOX(window), _("Plugins")); gnt_box_set_pad(GNT_BOX(window), 0); + gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); gnt_box_add_widget(GNT_BOX(window), gnt_label_new(_("You can (un)load plugins from the following list."))); @@ -139,8 +214,23 @@ gnt_tree_set_col_width(GNT_TREE(tree), 0, 30); g_signal_connect(G_OBJECT(tree), "toggled", G_CALLBACK(plugin_toggled_cb), NULL); g_signal_connect(G_OBJECT(tree), "selection_changed", G_CALLBACK(selection_changed), NULL); + + box = gnt_hbox_new(FALSE); + gnt_box_add_widget(GNT_BOX(window), box); + + 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), window); + + plugins.conf = button = gnt_button_new(_("Configure Plugin")); + gnt_box_add_widget(GNT_BOX(box), button); + g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(configure_plugin_cb), NULL); + g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(reset_plugin_window), NULL); gnt_widget_show(window); + + decide_conf_button(gnt_tree_get_selection_data(GNT_TREE(tree))); } Modified: trunk/console/gntplugin.h =================================================================== --- trunk/console/gntplugin.h 2006-08-16 04:50:27 UTC (rev 16780) +++ trunk/console/gntplugin.h 2006-08-16 05:12:48 UTC (rev 16781) @@ -1,5 +1,21 @@ +#include <gnt.h> + #include <plugin.h> +#include <string.h> + +typedef GntWidget* (*GGPluginFrame) (); + +/* Guess where these came from */ +#define GAIM_GNT_PLUGIN_TYPE "gnt" + +#define GAIM_IS_GNT_PLUGIN(plugin) \ + ((plugin)->info != NULL && (plugin)->info->ui_info != NULL && \ + !strcmp((plugin)->info->ui_requirement, GAIM_GNT_PLUGIN_TYPE)) + +#define GAIM_GNT_PLUGIN_UI_INFO(plugin) \ + (GGPluginFrame)((plugin)->info->ui_info) + void gg_plugins_show_all(); void gg_plugins_save_loaded(); Modified: trunk/console/libgnt/gnt.h =================================================================== --- trunk/console/libgnt/gnt.h 2006-08-16 04:50:27 UTC (rev 16780) +++ trunk/console/libgnt/gnt.h 2006-08-16 05:12:48 UTC (rev 16781) @@ -19,6 +19,8 @@ void gnt_screen_resize_widget(GntWidget *widget, int width, int height); +void gnt_screen_move_widget(GntWidget *widget, int x, int y); + gboolean gnt_widget_has_focus(GntWidget *widget); void gnt_widget_set_urgent(GntWidget *widget); Modified: trunk/console/libgnt/gntmain.c =================================================================== --- trunk/console/libgnt/gntmain.c 2006-08-16 04:50:27 UTC (rev 16780) +++ trunk/console/libgnt/gntmain.c 2006-08-16 05:12:48 UTC (rev 16781) @@ -586,10 +586,7 @@ if (changed) { - GntNode *node = g_hash_table_lookup(nodes, widget); - gnt_widget_set_position(widget, x, y); - move_panel(node->panel, y, x); - update_screen(NULL); + gnt_screen_move_widget(widget, x, y); } } else if (*buffer == '\r') @@ -879,3 +876,11 @@ } } +void gnt_screen_move_widget(GntWidget *widget, int x, int y) +{ + GntNode *node = g_hash_table_lookup(nodes, widget); + gnt_widget_set_position(widget, x, y); + move_panel(node->panel, y, x); + update_screen(NULL); +} + Added: trunk/console/plugins/Makefile.am =================================================================== --- trunk/console/plugins/Makefile.am (rev 0) +++ trunk/console/plugins/Makefile.am 2006-08-16 05:12:48 UTC (rev 16781) @@ -0,0 +1,38 @@ +gntgf_la_LDFLAGS = -module -avoid-version $(GLIB_LIBS) + +if PLUGINS + +plugin_LTLIBRARIES = \ + gntgf.la + +plugindir = $(libdir)/gaim + +gntgf_la_SOURCES = gntgf.c + +endif # PLUGINS + +EXTRA_DIST = + +GNT_CFLAGS = `pkg-config --cflags gnt` -I.. + +AM_CPPFLAGS = \ + -DDATADIR=\"$(datadir)\" \ + -DVERSION=\"$(VERSION)\" \ + -I$(top_builddir)/src \ + -I$(top_srcdir)/src \ + $(DEBUG_CFLAGS) \ + $(GNT_CFLAGS) \ + $(GLIB_CFLAGS) \ + $(PLUGIN_CFLAGS) + +# +# This part allows people to build their own plugins in here. +# Yes, it's a mess. +# +SUFFIXES = .c .so +.c.so: + $(LIBTOOL) --mode=compile $(CC) -DHAVE_CONFIG_H -I$(top_srcdir) $(AM_CPPFLAGS) $(CFLAGS) -c $< -o tmp$@.lo $(PLUGIN_CFLAGS) + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o libtmp$@.la -rpath $(plugindir) tmp$@.lo $(LIBS) $(LDFLAGS) -module -avoid-version $(PLUGIN_LIBS) + @rm -f tmp$@.lo tmp$@.o libtmp$@.la + @cp .libs/libtmp$@.so* $@ + @rm -f .libs/libtmp$@.* Property changes on: trunk/console/plugins/Makefile.am ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/console/plugins/gntgf.c =================================================================== --- trunk/console/plugins/gntgf.c (rev 0) +++ trunk/console/plugins/gntgf.c 2006-08-16 05:12:48 UTC (rev 16781) @@ -0,0 +1,271 @@ +/** + * @file gntgf.c Minimal toaster plugin in Gnt. + * + * Copyright (C) 2006 Sadrul Habib Chowdhury <sa...@us...> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define GAIM_PLUGINS + +#define PLUGIN_STATIC_NAME "GntGf" + +#define PREFS_EVENT "/plugins/gnt/gntgf/events" +#define PREFS_EVENT_SIGNONF PREFS_EVENT "/signonf" +#define PREFS_EVENT_IM_MSG PREFS_EVENT "/immsg" +#define PREFS_EVENT_CHAT_MSG PREFS_EVENT "/chatmsg" +#define PREFS_EVENT_CHAT_NICK PREFS_EVENT "/chatnick" + +#include <glib.h> + +#include <plugin.h> +#include <version.h> +#include <blist.h> +#include <conversation.h> + +#include <gnt.h> +#include <gntbox.h> +#include <gntbutton.h> +#include <gntlabel.h> +#include <gnttree.h> + +#include <gntplugin.h> + +#define _(X) X + +typedef struct +{ + GntWidget *window; + int timer; +} GntToast; + +static GList *toasters; +static int gpsy; + +static void +destroy_toaster(GntToast *toast) +{ + toasters = g_list_remove(toasters, toast); + gnt_widget_destroy(toast->window); + g_source_remove(toast->timer); + g_free(toast); +} + +static gboolean +remove_toaster(GntToast *toast) +{ + GList *iter; + int h; + + gnt_widget_get_size(toast->window, NULL, &h); + gpsy -= h; + + destroy_toaster(toast); + + for (iter = toasters; iter; iter = iter->next) + { + int x, y; + toast = iter->data; + gnt_widget_get_position(toast->window, &x, &y); + y += h; + gnt_screen_move_widget(toast->window, x, y); + } + + return FALSE; +} + +static void +notify(const char *fmt, ...) +{ + GntWidget *window; + GntToast *toast = g_new0(GntToast, 1); + char *str; + int h, w; + va_list args; + + toast->window = window = gnt_vbox_new(FALSE); + GNT_WIDGET_SET_FLAGS(window, GNT_WIDGET_TRANSIENT); + GNT_WIDGET_UNSET_FLAGS(window, GNT_WIDGET_NO_BORDER); + + va_start(args, fmt); + str = g_strdup_vprintf(fmt, args); + va_end(args); + + gnt_box_add_widget(GNT_BOX(window), + gnt_label_new_with_format(str, GNT_TEXT_FLAG_HIGHLIGHT)); + + g_free(str); + gnt_widget_size_request(window); + gnt_widget_get_size(window, &w, &h); + gpsy += h; + gnt_widget_set_position(window, getmaxx(stdscr) - w - 1, + getmaxy(stdscr) - gpsy - 1); + gnt_widget_draw(window); + + toast->timer = g_timeout_add(4000, (GSourceFunc)remove_toaster, toast); + toasters = g_list_prepend(toasters, toast); +} + +static void +buddy_signed_on(GaimBuddy *buddy, gpointer null) +{ + if (gaim_prefs_get_bool(PREFS_EVENT_SIGNONF)) + notify(_("%s just signed on"), gaim_buddy_get_alias(buddy)); +} + +static void +buddy_signed_off(GaimBuddy *buddy, gpointer null) +{ + if (gaim_prefs_get_bool(PREFS_EVENT_SIGNONF)) + notify(_("%s just signed off"), gaim_buddy_get_alias(buddy)); +} + +static void +received_im_msg(GaimAccount *account, const char *sender, const char *msg, + GaimConversation *conv, GaimMessageFlags flags, gpointer null) +{ + if (gaim_prefs_get_bool(PREFS_EVENT_IM_MSG)) + notify(_("%s sent you a message"), sender); +} + +static void +received_chat_msg(GaimAccount *account, const char *sender, const char *msg, + GaimConversation *conv, GaimMessageFlags flags, gpointer null) +{ + if (gaim_prefs_get_bool(PREFS_EVENT_CHAT_NICK) && (flags & GAIM_MESSAGE_NICK)) + notify(_("%s said your nick in %s"), sender, gaim_conversation_get_name(conv)); + else if (gaim_prefs_get_bool(PREFS_EVENT_CHAT_MSG)) + notify(_("%s sent a message in %s"), sender, gaim_conversation_get_name(conv)); +} + +static gboolean +plugin_load(GaimPlugin *plugin) +{ + gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-on", plugin, + GAIM_CALLBACK(buddy_signed_on), NULL); + gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-off", plugin, + GAIM_CALLBACK(buddy_signed_off), NULL); + gaim_signal_connect(gaim_conversations_get_handle(), "received-im-msg", plugin, + GAIM_CALLBACK(received_im_msg), NULL); + gaim_signal_connect(gaim_conversations_get_handle(), "received-chat-msg", plugin, + GAIM_CALLBACK(received_chat_msg), NULL); + + gpsy = 0; + + return TRUE; +} + +static gboolean +plugin_unload(GaimPlugin *plugin) +{ + while (toasters) + { + GntToast *toast = toasters->data; + destroy_toaster(toast); + } + return TRUE; +} + +static struct +{ + char *pref; + char *display; +} prefs[] = +{ + {PREFS_EVENT_SIGNONF, _("Buddy signs on/off")}, + {PREFS_EVENT_IM_MSG, _("You receive an IMs")}, + {PREFS_EVENT_CHAT_MSG, _("Someone speaks in a chat")}, + {PREFS_EVENT_CHAT_NICK, _("Someone says your name in a chat")}, + {NULL, NULL} +}; + +static void +pref_toggled(GntTree *tree, char *key, gpointer null) +{ + gaim_prefs_set_bool(key, gnt_tree_get_choice(tree, key)); +} + +static GntWidget * +config_frame() +{ + GntWidget *window, *tree; + int i; + + window = gnt_vbox_new(FALSE); + gnt_box_set_pad(GNT_BOX(window), 0); + gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); + gnt_box_set_fill(GNT_BOX(window), TRUE); + + gnt_box_add_widget(GNT_BOX(window), + gnt_label_new(_("Notify with a toaster when"))); + + tree = gnt_tree_new(); + gnt_box_add_widget(GNT_BOX(window), tree); + + for (i = 0; prefs[i].pref; i++) + { + gnt_tree_add_choice(GNT_TREE(tree), prefs[i].pref, + gnt_tree_create_row(GNT_TREE(tree), prefs[i].display), NULL, NULL); + gnt_tree_set_choice(GNT_TREE(tree), prefs[i].pref, + gaim_prefs_get_bool(prefs[i].pref)); + } + gnt_tree_set_col_width(GNT_TREE(tree), 0, 40); + g_signal_connect(G_OBJECT(tree), "toggled", G_CALLBACK(pref_toggled), NULL); + + return window; +} + +static GaimPluginInfo info = +{ + GAIM_PLUGIN_MAGIC, + GAIM_MAJOR_VERSION, + GAIM_MINOR_VERSION, + GAIM_PLUGIN_STANDARD, + GAIM_GNT_PLUGIN_TYPE, + 0, + NULL, + GAIM_PRIORITY_DEFAULT, + "gntgf", + N_("GntGf"), + VERSION, + N_("Toaster plugin for GntGaim."), + N_("Toaster plugin for GntGaim."), + "Sadrul H Chowdhury <sa...@us...>", + "http://gaim.sourceforge.net", + plugin_load, + plugin_unload, + NULL, + config_frame, + NULL, + NULL, + NULL +}; + +static void +init_plugin(GaimPlugin *plugin) +{ + gaim_prefs_add_none("/plugins"); + gaim_prefs_add_none("/plugins/gnt"); + + gaim_prefs_add_none("/plugins/gnt/gntgf"); + gaim_prefs_add_none(PREFS_EVENT); + + gaim_prefs_add_bool(PREFS_EVENT_SIGNONF, TRUE); + gaim_prefs_add_bool(PREFS_EVENT_IM_MSG, TRUE); + gaim_prefs_add_bool(PREFS_EVENT_CHAT_MSG, TRUE); + gaim_prefs_add_bool(PREFS_EVENT_CHAT_NICK, TRUE); +} + +GAIM_INIT_PLUGIN(PLUGIN_STATIC_NAME, init_plugin, info) Property changes on: trunk/console/plugins/gntgf.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |