From: <ro...@us...> - 2006-07-08 22:43:58
|
Revision: 16465 Author: roast Date: 2006-07-08 15:43:22 -0700 (Sat, 08 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16465&view=rev Log Message: ----------- merged with svn trunk. 16395:16464. Modified Paths: -------------- branches/soc-2006-file-loggers/console/Makefile branches/soc-2006-file-loggers/console/gntblist.c branches/soc-2006-file-loggers/console/gntblist.h branches/soc-2006-file-loggers/console/gntconv.c branches/soc-2006-file-loggers/console/gntconv.h branches/soc-2006-file-loggers/console/gntgaim.c branches/soc-2006-file-loggers/console/gntui.c branches/soc-2006-file-loggers/console/libgnt/Makefile.am branches/soc-2006-file-loggers/console/libgnt/configure.ac branches/soc-2006-file-loggers/console/libgnt/gnt.h branches/soc-2006-file-loggers/console/libgnt/gntbox.c branches/soc-2006-file-loggers/console/libgnt/gntbox.h branches/soc-2006-file-loggers/console/libgnt/gntbutton.c branches/soc-2006-file-loggers/console/libgnt/gntcolors.c branches/soc-2006-file-loggers/console/libgnt/gntentry.c branches/soc-2006-file-loggers/console/libgnt/gntlabel.c branches/soc-2006-file-loggers/console/libgnt/gntmain.c branches/soc-2006-file-loggers/console/libgnt/gnttextview.c branches/soc-2006-file-loggers/console/libgnt/gnttextview.h branches/soc-2006-file-loggers/console/libgnt/gnttree.c branches/soc-2006-file-loggers/console/libgnt/gnttree.h branches/soc-2006-file-loggers/console/libgnt/gntutils.c branches/soc-2006-file-loggers/console/libgnt/gntutils.h branches/soc-2006-file-loggers/console/libgnt/gntwidget.c branches/soc-2006-file-loggers/console/libgnt/gntwidget.h branches/soc-2006-file-loggers/console/libgnt/test/Makefile branches/soc-2006-file-loggers/console/libgnt/test/focus.c branches/soc-2006-file-loggers/console/libgnt/test/multiwin.c branches/soc-2006-file-loggers/console/libgnt/test/tv.c branches/soc-2006-file-loggers/gaim.spec.in branches/soc-2006-file-loggers/plugins/ssl/ssl-gnutls.c branches/soc-2006-file-loggers/src/connection.c branches/soc-2006-file-loggers/src/connection.h branches/soc-2006-file-loggers/src/conversation.c branches/soc-2006-file-loggers/src/debug.c branches/soc-2006-file-loggers/src/debug.h branches/soc-2006-file-loggers/src/gtkblist.c branches/soc-2006-file-loggers/src/gtkdebug.c branches/soc-2006-file-loggers/src/gtkprefs.c branches/soc-2006-file-loggers/src/protocols/bonjour/bonjour.c branches/soc-2006-file-loggers/src/protocols/bonjour/bonjour.h branches/soc-2006-file-loggers/src/protocols/bonjour/buddy.c branches/soc-2006-file-loggers/src/protocols/bonjour/dns_sd.c branches/soc-2006-file-loggers/src/protocols/bonjour/dns_sd.h branches/soc-2006-file-loggers/src/protocols/bonjour/jabber.c branches/soc-2006-file-loggers/src/protocols/bonjour/jabber.h branches/soc-2006-file-loggers/src/protocols/gg/lib/libgadu.c branches/soc-2006-file-loggers/src/protocols/irc/cmds.c branches/soc-2006-file-loggers/src/protocols/jabber/roster.c branches/soc-2006-file-loggers/src/protocols/msn/httpconn.c branches/soc-2006-file-loggers/src/protocols/msn/httpconn.h branches/soc-2006-file-loggers/src/protocols/msn/msn.c branches/soc-2006-file-loggers/src/protocols/oscar/oscar.c branches/soc-2006-file-loggers/src/proxy.c branches/soc-2006-file-loggers/src/server.c branches/soc-2006-file-loggers/src/util.c Added Paths: ----------- branches/soc-2006-file-loggers/console/gntaccount.c branches/soc-2006-file-loggers/console/gntaccount.h Property Changed: ---------------- branches/soc-2006-file-loggers/src/protocols/qq/ Modified: branches/soc-2006-file-loggers/console/Makefile =================================================================== --- branches/soc-2006-file-loggers/console/Makefile 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/Makefile 2006-07-08 22:43:22 UTC (rev 16465) @@ -1,18 +1,22 @@ +VERSION=gntgaim-0.0.0dev CC=gcc -CFLAGS=`pkg-config --cflags gaim gobject-2.0 gnt` -g -Wall +CFLAGS=`pkg-config --cflags gaim gobject-2.0 gnt` -g -Wall -DVERSION=\"$(VERSION)\" LDFLAGS=`pkg-config --libs gaim gobject-2.0 libxml-2.0 gnt` -pg GG_SOURCES = \ + gntaccount.c \ gntblist.c \ gntconv.c \ gntui.c GG_HEADERS = \ + gntaccount.h \ gntblist.h \ gntconv.h \ gntui.h GG_OBJECTS = \ + gntaccount.o \ gntblist.o \ gntconv.o \ gntui.o @@ -21,6 +25,7 @@ gntgaim: gntgaim.o $(GG_OBJECTS) $(CC) -o gntgaim gntgaim.o $(GG_OBJECTS) $(LDFLAGS) +gntaccount.o: gntaccount.c $(GG_HEADERS) gntblist.o: gntblist.c $(GG_HEADERS) gntconv.o: gntconv.c $(GG_HEADERS) gntgaim.o: gntgaim.c gntgaim.h $(GG_HEADERS) Copied: branches/soc-2006-file-loggers/console/gntaccount.c (from rev 16464, trunk/console/gntaccount.c) =================================================================== --- branches/soc-2006-file-loggers/console/gntaccount.c (rev 0) +++ branches/soc-2006-file-loggers/console/gntaccount.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -0,0 +1,181 @@ +#include <gnt.h> +#include <gntbox.h> +#include <gntbutton.h> +#include <gntlabel.h> +#include <gnttree.h> + +#include <connection.h> +#include <notify.h> +#include <request.h> + +#include "gntaccount.h" +#include "gntgaim.h" + +typedef struct +{ + GntWidget *window; + GntWidget *tree; +} GGAccountList; + +static GGAccountList accounts; + +static void +account_toggled(GntWidget *widget, void *key, gpointer null) +{ + GaimAccount *account = key; + + gaim_account_set_enabled(account, GAIM_GNT_UI, gnt_tree_get_choice(GNT_TREE(widget), key)); +} + +void gg_accounts_init() +{ + GList *iter; + GntWidget *box, *button; + + accounts.window = gnt_box_new(TRUE, TRUE); + gnt_box_set_toplevel(GNT_BOX(accounts.window), TRUE); + gnt_box_set_title(GNT_BOX(accounts.window), _("Accounts")); + gnt_box_set_pad(GNT_BOX(accounts.window), 0); + gnt_widget_set_name(accounts.window, "accounts"); + + gnt_box_add_widget(GNT_BOX(accounts.window), + gnt_label_new(_("You can enable/disable accounts from the following list."))); + + accounts.tree = gnt_tree_new(); + GNT_WIDGET_SET_FLAGS(accounts.tree, GNT_WIDGET_NO_BORDER); + + for (iter = gaim_accounts_get_all(); iter; iter = iter->next) + { + GaimAccount *account = iter->data; + char *str = g_strdup_printf("%s (%s)", + gaim_account_get_username(account), gaim_account_get_protocol_id(account)); + + gnt_tree_add_choice(GNT_TREE(accounts.tree), account, + str, NULL, NULL); + gnt_tree_set_choice(GNT_TREE(accounts.tree), account, + gaim_account_get_enabled(account, GAIM_GNT_UI)); + g_free(str); + } + + g_signal_connect(G_OBJECT(accounts.tree), "toggled", G_CALLBACK(account_toggled), NULL); + + gnt_widget_set_size(accounts.tree, 40, 10); + gnt_box_add_widget(GNT_BOX(accounts.window), accounts.tree); + + box = gnt_box_new(FALSE, FALSE); + + button = gnt_button_new(_("Add")); + gnt_box_add_widget(GNT_BOX(box), button); + + button = gnt_button_new(_("Modify")); + gnt_box_add_widget(GNT_BOX(box), button); + + button = gnt_button_new(_("Delete")); + gnt_box_add_widget(GNT_BOX(box), button); + + gnt_box_add_widget(GNT_BOX(accounts.window), box); + + gnt_widget_show(accounts.window); +} + +void gg_accounts_uninit() +{ + gnt_widget_destroy(accounts.window); +} + +#if 0 +/* The following uiops stuff are copied from gtkaccount.c */ +/* Need to do some work on notify- and request-ui before this works */ +typedef struct +{ + GaimAccount *account; + char *username; + char *alias; +} AddUserData; + +static char * +make_info(GaimAccount *account, GaimConnection *gc, const char *remote_user, + const char *id, const char *alias, const char *msg) +{ + if (msg != NULL && *msg == '\0') + msg = NULL; + + return g_strdup_printf(_("%s%s%s%s has made %s his or her buddy%s%s"), + remote_user, + (alias != NULL ? " (" : ""), + (alias != NULL ? alias : ""), + (alias != NULL ? ")" : ""), + (id != NULL + ? id + : (gaim_connection_get_display_name(gc) != NULL + ? gaim_connection_get_display_name(gc) + : gaim_account_get_username(account))), + (msg != NULL ? ": " : "."), + (msg != NULL ? msg : "")); +} + +static void +notify_added(GaimAccount *account, const char *remote_user, + const char *id, const char *alias, + const char *msg) +{ + char *buffer; + GaimConnection *gc; + + gc = gaim_account_get_connection(account); + + buffer = make_info(account, gc, remote_user, id, alias, msg); + + gaim_notify_info(NULL, NULL, buffer, NULL); + + g_free(buffer); +} + +static void +request_add(GaimAccount *account, const char *remote_user, + const char *id, const char *alias, + const char *msg) +{ + char *buffer; + GaimConnection *gc; + AddUserData *data; + + gc = gaim_account_get_connection(account); + + data = g_new0(AddUserData, 1); + data->account = account; + data->username = g_strdup(remote_user); + data->alias = (alias != NULL ? g_strdup(alias) : NULL); + + buffer = make_info(account, gc, remote_user, id, alias, msg); +#if 0 + gaim_request_action(NULL, NULL, _("Add buddy to your list?"), + buffer, GAIM_DEFAULT_ACTION_NONE, data, 2, + _("Add"), G_CALLBACK(add_user_cb), + _("Cancel"), G_CALLBACK(free_add_user_data)); +#endif + g_free(buffer); +} + +static GaimAccountUiOps ui_ops = +{ + .notify_added = notify_added, + .status_changed = NULL, + .request_add = request_add +}; +#else + +static GaimAccountUiOps ui_ops = +{ + .notify_added = NULL, + .status_changed = NULL, + .request_add = NULL +}; + +#endif + +GaimAccountUiOps *gg_accounts_get_ui_ops() +{ + return &ui_ops; +} + Copied: branches/soc-2006-file-loggers/console/gntaccount.h (from rev 16464, trunk/console/gntaccount.h) =================================================================== --- branches/soc-2006-file-loggers/console/gntaccount.h (rev 0) +++ branches/soc-2006-file-loggers/console/gntaccount.h 2006-07-08 22:43:22 UTC (rev 16465) @@ -0,0 +1,7 @@ +#include "account.h" + +GaimAccountUiOps *gg_accounts_get_ui_ops(); + +void gg_accounts_init(); + +void gg_accounts_uninit(); Modified: branches/soc-2006-file-loggers/console/gntblist.c =================================================================== --- branches/soc-2006-file-loggers/console/gntblist.c 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/gntblist.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -141,7 +141,7 @@ GaimStatusPrimitive prim; GaimPresence *presence; GaimStatus *now; - + gboolean ascii = gnt_ascii_only(); presence = gaim_buddy_get_presence(buddy); now = gaim_presence_get_active_status(presence); @@ -150,29 +150,15 @@ switch(prim) { -#if 1 case GAIM_STATUS_OFFLINE: - strncpy(status, "x", sizeof(status) - 1); + strncpy(status, ascii ? "x" : "⊗", sizeof(status) - 1); break; case GAIM_STATUS_AVAILABLE: - strncpy(status, "o", sizeof(status) - 1); + strncpy(status, ascii ? "o" : "◯", sizeof(status) - 1); break; default: - strncpy(status, ".", sizeof(status) - 1); + strncpy(status, ascii ? "." : "⊖", sizeof(status) - 1); break; -#else - /* XXX: Let's use these some time */ - case GAIM_STATUS_OFFLINE: - strncpy(status, "⊗", sizeof(status) - 1); - break; - case GAIM_STATUS_AVAILABLE: - /* XXX: Detect idleness */ - strncpy(status, "◯", sizeof(status) - 1); - break; - default: - strncpy(status, "⊖", sizeof(status) - 1); - break; -#endif } name = gaim_buddy_get_alias(buddy); } @@ -217,6 +203,10 @@ node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, get_display_name(node), group, NULL); + if (gaim_presence_is_idle(gaim_buddy_get_presence(buddy))) + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, GNT_TEXT_FLAG_DIM); + else + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, 0); } #if 0 @@ -355,6 +345,7 @@ gnt_box_add_widget(GNT_BOX(box), gnt_label_new(str->str)); gnt_widget_set_position(box, x, y); + GNT_WIDGET_UNSET_FLAGS(box, GNT_WIDGET_CAN_TAKE_FOCUS); gnt_widget_draw(box); g_free(title); @@ -371,7 +362,6 @@ draw_tooltip(ggblist); } - static gboolean key_pressed(GntWidget *widget, const char *text, GGBlist *ggblist) { @@ -390,13 +380,30 @@ } static void -buddy_status_changed(GaimBuddy *buddy, GaimStatus *old, GaimStatus *now, GGBlist *ggblist) +update_buddy_display(GaimBuddy *buddy, GGBlist *ggblist) { gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, get_display_name((GaimBlistNode*)buddy)); if (ggblist->tnode == (GaimBlistNode*)buddy) draw_tooltip(ggblist); + + if (gaim_presence_is_idle(gaim_buddy_get_presence(buddy))) + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, GNT_TEXT_FLAG_DIM); + else + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, 0); } +static void +buddy_status_changed(GaimBuddy *buddy, GaimStatus *old, GaimStatus *now, GGBlist *ggblist) +{ + update_buddy_display(buddy, ggblist); +} + +static void +buddy_idle_changed(GaimBuddy *buddy, int old, int new, GGBlist *ggblist) +{ + update_buddy_display(buddy, ggblist); +} + void gg_blist_init() { ggblist = g_new0(GGBlist, 1); @@ -411,13 +418,15 @@ ggblist->tree = gnt_tree_new(); GNT_WIDGET_SET_FLAGS(ggblist->tree, GNT_WIDGET_NO_BORDER); - gnt_widget_set_size(ggblist->tree, 25, getmaxy(stdscr) - 3); + gnt_widget_set_size(ggblist->tree, 25, getmaxy(stdscr) - 4); gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->tree); gnt_widget_show(ggblist->window); 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(), @@ -438,5 +447,36 @@ g_signal_connect(G_OBJECT(ggblist->tree), "selection_changed", G_CALLBACK(selection_changed), ggblist); g_signal_connect(G_OBJECT(ggblist->tree), "key_pressed", G_CALLBACK(key_pressed), ggblist); g_signal_connect(G_OBJECT(ggblist->tree), "activate", G_CALLBACK(selection_activate), ggblist); + g_signal_connect_data(G_OBJECT(ggblist->tree), "gained-focus", G_CALLBACK(draw_tooltip), + ggblist, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); + g_signal_connect_data(G_OBJECT(ggblist->tree), "lost-focus", G_CALLBACK(remove_tooltip), + ggblist, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); } +void gg_blist_uninit() +{ + gnt_widget_destroy(ggblist->window); + g_free(ggblist); + ggblist = NULL; +} + +void gg_blist_get_position(int *x, int *y) +{ + gnt_widget_get_position(ggblist->window, x, y); +} + +void gg_blist_set_position(int x, int y) +{ + gnt_widget_set_position(ggblist->window, x, y); +} + +void gg_blist_get_size(int *width, int *height) +{ + gnt_widget_get_size(ggblist->window, width, height); +} + +void gg_blist_set_size(int width, int height) +{ + gnt_widget_set_size(ggblist->window, width, height); +} + Modified: branches/soc-2006-file-loggers/console/gntblist.h =================================================================== --- branches/soc-2006-file-loggers/console/gntblist.h 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/gntblist.h 2006-07-08 22:43:22 UTC (rev 16465) @@ -3,3 +3,14 @@ GaimBlistUiOps * gg_blist_get_ui_ops(); void gg_blist_init(); + +void gg_blist_uninit(); + +void gg_blist_get_position(int *x, int *y); + +void gg_blist_set_position(int x, int y); + +void gg_blist_get_size(int *width, int *height); + +void gg_blist_set_size(int width, int height); + Modified: branches/soc-2006-file-loggers/console/gntconv.c =================================================================== --- branches/soc-2006-file-loggers/console/gntconv.c 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/gntconv.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -2,6 +2,7 @@ #include <util.h> #include "gntgaim.h" +#include "gntblist.h" #include "gntconv.h" #include "gnt.h" @@ -91,10 +92,14 @@ GGConv *ggc = g_hash_table_lookup(ggconvs, conv); char *title; GaimConversationType type; + int x, width; if (ggc) return; + gg_blist_get_position(&x, NULL); + gg_blist_get_size(&width, NULL); + ggc = g_new0(GGConv, 1); g_hash_table_insert(ggconvs, conv, ggc); @@ -102,25 +107,28 @@ type = gaim_conversation_get_type(conv); title = g_strdup_printf(_("%s"), gaim_conversation_get_name(conv)); - ggc->window = gnt_box_new(FALSE, TRUE); + ggc->window = gnt_box_new(TRUE, TRUE); gnt_box_set_title(GNT_BOX(ggc->window), title); gnt_box_set_toplevel(GNT_BOX(ggc->window), TRUE); + gnt_box_set_pad(GNT_BOX(ggc->window), 0); gnt_widget_set_name(ggc->window, title); ggc->tv = gnt_text_view_new(); gnt_box_add_widget(GNT_BOX(ggc->window), ggc->tv); gnt_widget_set_name(ggc->tv, "conversation-window-textview"); - gnt_widget_set_size(ggc->tv, getmaxx(stdscr) - 40, getmaxy(stdscr) - 15); + gnt_widget_set_size(ggc->tv, getmaxx(stdscr) - 3 - x - width, getmaxy(stdscr) - 5); ggc->entry = gnt_entry_new(NULL); gnt_box_add_widget(GNT_BOX(ggc->window), ggc->entry); gnt_widget_set_name(ggc->entry, "conversation-window-entry"); - gnt_widget_set_size(ggc->entry, getmaxx(stdscr) - 40, 1); g_signal_connect(G_OBJECT(ggc->entry), "key_pressed", G_CALLBACK(entry_key_pressed), ggc); g_signal_connect(G_OBJECT(ggc->window), "destroy", G_CALLBACK(closing_window), ggc); - gnt_widget_set_position(ggc->window, 32, 0); + /* XXX: I am assuming the buddylist is on the leftmost corner. + * That may not always be correct, since the windows can be moved. + * It might be an option to remember the position of conv. windows. */ + gnt_widget_set_position(ggc->window, x + width, 0); gnt_widget_show(ggc->window); g_free(title); @@ -138,7 +146,7 @@ { GGConv *ggconv = g_hash_table_lookup(ggconvs, conv); char *strip; - GntTextViewFlags fl = 0; + GntTextFormatFlags fl = 0; g_return_if_fail(ggconv != NULL); @@ -165,7 +173,8 @@ g_free(strip); - gnt_widget_set_urgent(ggconv->tv); + if (flags & (GAIM_MESSAGE_RECV | GAIM_MESSAGE_NICK | GAIM_MESSAGE_ERROR)) + gnt_widget_set_urgent(ggconv->tv); } static void @@ -261,3 +270,9 @@ ggconvs = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, destroy_ggconv); } +void gg_conversation_uninit() +{ + g_hash_table_destroy(ggconvs); + ggconvs = NULL; +} + Modified: branches/soc-2006-file-loggers/console/gntconv.h =================================================================== --- branches/soc-2006-file-loggers/console/gntconv.h 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/gntconv.h 2006-07-08 22:43:22 UTC (rev 16465) @@ -3,3 +3,5 @@ GaimConversationUiOps *gg_conv_get_ui_ops(); void gg_conversation_init(); + +void gg_conversation_uninit(); Modified: branches/soc-2006-file-loggers/console/gntgaim.c =================================================================== --- branches/soc-2006-file-loggers/console/gntgaim.c 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/gntgaim.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -18,6 +18,9 @@ #include "gntgaim.h" #include "gntui.h" +#define _GNU_SOURCE +#include <getopt.h> + /* Anything IO-related is directly copied from gtkgaim's source tree */ static GaimCoreUiOps core_ops = @@ -103,12 +106,6 @@ closure->result = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, cond, gaim_gtk_io_invoke, closure, gaim_gtk_io_destroy); -#if 0 - gaim_debug(GAIM_DEBUG_MISC, "gtk_eventloop", - "CLOSURE: adding input watcher %d for fd %d\n", - closure->result, fd); -#endif - g_io_channel_unref(channel); return closure->result; } @@ -129,25 +126,124 @@ /* This is mostly copied from gtkgaim's source tree */ static void -init_libgaim() +show_usage(const char *name, gboolean terse) { + char *text; + + if (terse) { + text = g_strdup_printf(_("Gaim %s. Try `%s -h' for more information.\n"), VERSION, name); + } else { + text = g_strdup_printf(_("Gaim %s\n" + "Usage: %s [OPTION]...\n\n" + " -c, --config=DIR use DIR for config files\n" + " -d, --debug print debugging messages to stdout\n" + " -h, --help display this help and exit\n" + " -n, --nologin don't automatically login\n" + " -v, --version display the current version and exit\n"), VERSION, name); + } + + gaim_print_utf8_to_console(stdout, text); + g_free(text); +} + +static int +init_libgaim(int argc, char **argv) +{ char *path; + int opt; + gboolean opt_help = FALSE; + gboolean opt_nologin = FALSE; + gboolean opt_version = FALSE; + char *opt_config_dir_arg = NULL; + char *opt_session_arg = NULL; + gboolean debug_enabled = FALSE; - gaim_debug_set_enabled(FALSE); + struct option long_options[] = { + {"config", required_argument, NULL, 'c'}, + {"debug", no_argument, NULL, 'd'}, + {"help", no_argument, NULL, 'h'}, + {"nologin", no_argument, NULL, 'n'}, + {"session", required_argument, NULL, 's'}, + {"version", no_argument, NULL, 'v'}, + {0, 0, 0, 0} + }; + /* scan command-line options */ + opterr = 1; + while ((opt = getopt_long(argc, argv, +#ifndef _WIN32 + "c:dhn::s:v", +#else + "c:dhn::v", +#endif + long_options, NULL)) != -1) { + switch (opt) { + case 'c': /* config dir */ + g_free(opt_config_dir_arg); + opt_config_dir_arg = g_strdup(optarg); + break; + case 'd': /* debug */ + debug_enabled = TRUE; + break; + case 'h': /* help */ + opt_help = TRUE; + break; + case 'n': /* no autologin */ + opt_nologin = TRUE; + break; + case 's': /* use existing session ID */ + g_free(opt_session_arg); + opt_session_arg = g_strdup(optarg); + break; + case 'v': /* version */ + opt_version = TRUE; + break; + case '?': /* show terse help */ + default: + show_usage(argv[0], TRUE); + return 0; + break; + } + } + + /* show help message */ + if (opt_help) { + show_usage(argv[0], FALSE); + return 0; + } + /* show version message */ + if (opt_version) { + printf("Gaim %s\n", VERSION); + return 0; + } + + /* set a user-specified config directory */ + if (opt_config_dir_arg != NULL) { + gaim_util_set_user_dir(opt_config_dir_arg); + } + + /* + * We're done piddling around with command line arguments. + * Fire up this baby. + */ + + /* Because we don't want debug-messages to show up and corrup the display */ + gaim_debug_set_enabled(debug_enabled); + gaim_core_set_ui_ops(gnt_core_get_ui_ops()); gaim_eventloop_set_ui_ops(gnt_eventloop_get_ui_ops()); - gaim_util_set_user_dir("/tmp/tmp/"); /* XXX: */ - path = g_build_filename(gaim_user_dir(), "plugins", NULL); gaim_plugins_add_search_path(path); g_free(path); + gaim_plugins_add_search_path("/usr/local/lib/gaim"); /* XXX: */ if (!gaim_core_init(GAIM_GNT_UI)) { - fprintf(stderr, "OOPSSS!!\n"); + fprintf(stderr, + "Initialization of the Gaim core failed. Dumping core.\n" + "Please report this!\n"); abort(); } @@ -160,11 +256,36 @@ gaim_prefs_update_old(); /* load plugins we had when we quit */ - gaim_plugins_load_saved("/gaim/gtk/plugins/loaded"); + gaim_plugins_load_saved("/gaim/gnt/plugins/loaded"); /* TODO: Move pounces loading into gaim_pounces_init() */ gaim_pounces_load(); + if (opt_nologin) + { + /* Set all accounts to "offline" */ + GaimSavedStatus *saved_status; + + /* If we've used this type+message before, lookup the transient status */ + saved_status = gaim_savedstatus_find_transient_by_type_and_message( + GAIM_STATUS_OFFLINE, NULL); + + /* If this type+message is unique then create a new transient saved status */ + if (saved_status == NULL) + saved_status = gaim_savedstatus_new(NULL, GAIM_STATUS_OFFLINE); + + /* Set the status for each account */ + gaim_savedstatus_activate(saved_status); + } + else + { + /* Everything is good to go--sign on already */ + if (!gaim_prefs_get_bool("/core/savedstatus/startup_current_status")) + gaim_savedstatus_activate(gaim_savedstatus_get_startup()); + gaim_accounts_restore_current_statuses(); + } + + return 1; } int main(int argc, char **argv) @@ -173,12 +294,10 @@ freopen(".error", "w", stderr); /* Initialize the libgaim stuff */ - init_libgaim(); + if (!init_libgaim(argc, argv)) + return 0; - /* Enable the accounts and restore the status */ - gaim_accounts_restore_current_statuses(); - - /* Initialize the UI */ + /* Initialize and run the UI */ init_gnt_ui(); gaim_core_quit(); Modified: branches/soc-2006-file-loggers/console/gntui.c =================================================================== --- branches/soc-2006-file-loggers/console/gntui.c 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/gntui.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -1,4 +1,6 @@ #include "gntui.h" + +#include "gntaccount.h" #include "gntblist.h" #include "gntconv.h" @@ -6,9 +8,9 @@ { gnt_init(); - wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); - werase(stdscr); - wrefresh(stdscr); + /* Accounts */ + gg_accounts_init(); + gaim_accounts_set_ui_ops(gg_accounts_get_ui_ops()); /* Initialize the buddy list */ gg_blist_init(); @@ -19,5 +21,16 @@ gaim_conversations_set_ui_ops(gg_conv_get_ui_ops()); gnt_main(); + + gaim_accounts_set_ui_ops(NULL); + gg_accounts_uninit(); + + gaim_blist_set_ui_ops(NULL); + gg_blist_uninit(); + + gaim_conversations_set_ui_ops(NULL); + gg_conversation_uninit(); + + gnt_quit(); } Modified: branches/soc-2006-file-loggers/console/libgnt/Makefile.am =================================================================== --- branches/soc-2006-file-loggers/console/libgnt/Makefile.am 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/libgnt/Makefile.am 2006-07-08 22:43:22 UTC (rev 16465) @@ -37,7 +37,8 @@ libgnt_la_LIBADD = \ $(GLIB_LIBS) \ $(STATIC_LINK_LIBS) \ - -lncursesw + -lncursesw -lpanelw AM_CPPFLAGS = \ - $(GLIB_CFLAGS) + $(GLIB_CFLAGS) \ + -Wall Modified: branches/soc-2006-file-loggers/console/libgnt/configure.ac =================================================================== --- branches/soc-2006-file-loggers/console/libgnt/configure.ac 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/libgnt/configure.ac 2006-07-08 22:43:22 UTC (rev 16465) @@ -239,6 +239,8 @@ AC_CHECK_HEADERS(termios.h) #AC_VAR_TIMEZONE_EXTERNALS +AC_CHECK_LIB(ncursesw, initscr, , [AC_MSG_ERROR([ +*** You need ncursesw. ])]) AC_OUTPUT([Makefile gnt.pc Modified: branches/soc-2006-file-loggers/console/libgnt/gnt.h =================================================================== --- branches/soc-2006-file-loggers/console/libgnt/gnt.h 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/libgnt/gnt.h 2006-07-08 22:43:22 UTC (rev 16465) @@ -7,6 +7,8 @@ void gnt_main(); +gboolean gnt_ascii_only(); + void gnt_screen_occupy(GntWidget *widget); void gnt_screen_release(GntWidget *widget); @@ -18,3 +20,6 @@ gboolean gnt_widget_has_focus(GntWidget *widget); void gnt_widget_set_urgent(GntWidget *widget); + +void gnt_quit(); + Modified: branches/soc-2006-file-loggers/console/libgnt/gntbox.c =================================================================== --- branches/soc-2006-file-loggers/console/libgnt/gntbox.c 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/libgnt/gntbox.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -13,10 +13,25 @@ static GntWidget * find_focusable_widget(GntBox *box); static void +add_to_focus(gpointer value, gpointer data) +{ + GntBox *box = GNT_BOX(data); + GntWidget *w = GNT_WIDGET(value); + + if (GNT_IS_BOX(w)) + g_list_foreach(GNT_BOX(w)->list, add_to_focus, box); + else if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS)) + box->focus = g_list_append(box->focus, w); +} + +static void gnt_box_draw(GntWidget *widget) { GntBox *box = GNT_BOX(widget); + if (box->focus == NULL && widget->parent == NULL) + g_list_foreach(box->list, add_to_focus, box); + g_list_foreach(box->list, (GFunc)gnt_widget_draw, NULL); gnt_box_sync_children(box); @@ -24,24 +39,29 @@ if (box->title) { gchar *title = g_strdup(box->title); - int pos = g_utf8_strlen(title, -1); + int pos = g_utf8_strlen(title, -1), right; - if (pos >= widget->priv.width - 2) + if (pos >= widget->priv.width - 4) { - g_utf8_strncpy(title, box->title, widget->priv.width - 2); - pos = 1; + g_utf8_strncpy(title, box->title, widget->priv.width - 4); + pos = 2; + right = pos + g_utf8_strlen(title, -1); } else { /* XXX: Position of the title might be configurable */ + right = pos; pos = (widget->priv.width - pos) / 2; + right += pos; } if (gnt_widget_has_focus(widget)) wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TITLE)); else wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_TITLE_D)); + mvwaddch(widget->window, 0, pos-1, ACS_RTEE | COLOR_PAIR(GNT_COLOR_NORMAL)); mvwprintw(widget->window, 0, pos, title); + mvwaddch(widget->window, 0, right, ACS_LTEE | COLOR_PAIR(GNT_COLOR_NORMAL)); g_free(title); } @@ -152,102 +172,17 @@ DEBUG; } -static GntWidget * -find_next_focus(GntBox *box) -{ - GntWidget *w = box->active; - GList *iter; - - while (w && !(iter = g_list_find(box->list, w))) - w = w->parent; - - if (!w) - box->active = NULL; - else if (iter) - { - GntWidget *next = NULL; - - do - { - next = find_next_focus(iter->data); - box->active = next; - iter = iter->next; - } while (!next && iter); - } - - if (box->active == NULL && GNT_WIDGET(box)->parent == NULL) - { - box->active = find_focusable_widget(box); - } - - if (box->active) - GNT_WIDGET_SET_FLAGS(box->active, GNT_WIDGET_HAS_FOCUS); - - return box->active; -} - /* Ensures that the current widget can take focus */ static GntWidget * find_focusable_widget(GntBox *box) { - int investigated = 0; - int total; - GntWidget *w = NULL; - GList *iter; + if (box->focus == NULL && GNT_WIDGET(box)->parent == NULL) + g_list_foreach(box->list, add_to_focus, box); - for (iter = box->list; iter; iter = iter->next) - { - w = iter->data; - if (GNT_IS_BOX(w)) - { - w = find_focusable_widget(GNT_BOX(w)); - if (w) - break; - } - else if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS)) - break; - } + if (box->active == NULL && box->focus) + box->active = box->focus->data; - if (iter) - box->active = w; - else - box->active = NULL; - - if (box->active) - GNT_WIDGET_SET_FLAGS(box->active, GNT_WIDGET_HAS_FOCUS); - return box->active; - -#if 0 - if (box->active == NULL && box->list) - box->active = box->list->data; - else - w = box->active; - - total = g_list_length(box->list); - - while (box->active && !GNT_WIDGET_IS_FLAG_SET(box->active, GNT_WIDGET_CAN_TAKE_FOCUS)) - { - box->active = box->active->next; - investigated++; - } - - /* Rotate if necessary */ - if (!box->active && investigated < total) - { - box->active = box->list; - while (investigated < total && !GNT_WIDGET_IS_FLAG_SET(box->active->data, GNT_WIDGET_CAN_TAKE_FOCUS)) - { - box->active = box->active->next; - investigated++; - } - } - - if (box->active) - gnt_widget_set_focus(box->active->data, TRUE); - if (w && w != box->active->data) - gnt_widget_set_focus(w, FALSE); -#endif } static gboolean @@ -263,93 +198,60 @@ if (text[0] == 27) { -#if 0 - GList *now = NULL; + GntWidget *now = box->active; if (strcmp(text+1, GNT_KEY_LEFT) == 0) { - now = box->active->prev; - if (now == NULL) - now = g_list_last(box->list); + GList *iter = g_list_find(box->focus, box->active); + if ((!iter || !iter->prev) && box->focus) + { + box->active = box->focus->data; + } + else + { + box->active = iter->prev->data; + } } else if (strcmp(text+1, GNT_KEY_RIGHT) == 0) { - now = box->active->next; - if (now == NULL) - now = box->list; + GList *iter = g_list_find(box->focus, box->active); + if (iter && iter->next) + { + box->active = iter->next->data; + } + else if (box->focus) + { + box->active = box->focus->data; + } } if (now && now != box->active) { - gnt_widget_set_focus(box->active->data, FALSE); - box->active = now; - gnt_widget_set_focus(box->active->data, TRUE); - + gnt_widget_set_focus(now, FALSE); + gnt_widget_set_focus(box->active, TRUE); return TRUE; } -#endif } return FALSE; } -static GntWidget *find_focused_widget(GntBox *box) -{ - GList *iter; - - for (iter = box->list; iter; iter = iter->next) - { - GntWidget *w = iter->data; - - if (GNT_IS_BOX(w)) - { - if ((w = find_focused_widget(GNT_BOX(w))) != NULL) - return w; - } - else - { - if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS) && - GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_HAS_FOCUS)) - return w; - } - } - return NULL; -} - -#if 0 static void -gnt_box_set_focus(GntWidget *widget, gboolean set) +gnt_box_lost_focus(GntWidget *widget) { - GntWidget *p = widget; - - while (p->parent) - p = p->parent; - - p = find_focused_widget(GNT_BOX(p)); - if (p) - gnt_widget_set_focus(p, set); + GntWidget *w = GNT_BOX(widget)->active; + if (w) + gnt_widget_set_focus(w, FALSE); gnt_widget_draw(widget); } static void -gnt_box_lost_focus(GntWidget *widget) -{ - gnt_box_set_focus(widget, FALSE); -} - -static void gnt_box_gained_focus(GntWidget *widget) { - GntWidget *p; - - while (widget->parent) - widget = widget->parent; - - p = find_focused_widget(GNT_BOX(widget)); - GNT_BOX(widget)->active = g_list_find(GNT_BOX(widget)->list, p); - if (p) - gnt_widget_draw(p); + GntWidget *w = GNT_BOX(widget)->active; + if (w) + gnt_widget_set_focus(w, TRUE); + gnt_widget_draw(widget); } -#endif static void gnt_box_destroy(GntWidget *w) @@ -376,6 +278,33 @@ delwin(win); } +static gboolean +gnt_box_confirm_size(GntWidget *widget, int width, int height) +{ + GList *iter; + GntBox *box = GNT_BOX(widget); + int wchange, hchange; + + wchange = widget->priv.width - width; + hchange = widget->priv.height - height; + + /* XXX: Right now, I am trying to just apply all the changes to + * just one widget. It should be possible to distribute the + * changes to all the widgets in the box. */ + for (iter = box->list; iter; iter = iter->next) + { + GntWidget *wid = iter->data; + int w, h; + + gnt_widget_get_size(wid, &w, &h); + + if (gnt_widget_set_size(wid, w - wchange, h - hchange)) + return TRUE; + } + + return FALSE; +} + static void gnt_box_class_init(GntBoxClass *klass) { @@ -387,11 +316,9 @@ parent_class->size_request = gnt_box_size_request; parent_class->set_position = gnt_box_set_position; parent_class->key_pressed = gnt_box_key_pressed; -#if 0 - /* We are going to need this when there are multiple focusble widgets in a box */ parent_class->lost_focus = gnt_box_lost_focus; parent_class->gained_focus = gnt_box_gained_focus; -#endif + parent_class->confirm_size = gnt_box_confirm_size; DEBUG; } @@ -399,6 +326,9 @@ static void gnt_box_init(GTypeInstance *instance, gpointer class) { + /* Initially make both the height and width resizable. + * Update the flags as necessary when widgets are added to it. */ + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_X | GNT_WIDGET_GROW_Y); DEBUG; } @@ -450,6 +380,17 @@ { b->list = g_list_append(b->list, widget); widget->parent = GNT_WIDGET(b); + + if (b->vertical) + { + if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X)) + GNT_WIDGET_UNSET_FLAGS(GNT_WIDGET(b), GNT_WIDGET_GROW_X); + } + else + { + if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_Y)) + GNT_WIDGET_UNSET_FLAGS(GNT_WIDGET(b), GNT_WIDGET_GROW_Y); + } } void gnt_box_set_title(GntBox *b, const char *title) @@ -468,9 +409,15 @@ { GntWidget *widget = GNT_WIDGET(box); if (set) + { GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS); + } else + { GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); + GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS); + } } void gnt_box_sync_children(GntBox *box) @@ -483,11 +430,18 @@ for (iter = box->list; iter; iter = iter->next) { GntWidget *w = GNT_WIDGET(iter->data); + int height, width; + + if (GNT_IS_BOX(w)) + gnt_box_sync_children(GNT_BOX(w)); + + gnt_widget_get_size(w, &width, &height); + copywin(w->window, widget->window, 0, 0, w->priv.y - widget->priv.y, w->priv.x - widget->priv.x, - w->priv.y - widget->priv.y + w->priv.height - 1, - w->priv.x - widget->priv.x + w->priv.width - 1, + w->priv.y - widget->priv.y + height - 1, + w->priv.x - widget->priv.x + width - 1, FALSE); } } Modified: branches/soc-2006-file-loggers/console/libgnt/gntbox.h =================================================================== --- branches/soc-2006-file-loggers/console/libgnt/gntbox.h 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/libgnt/gntbox.h 2006-07-08 22:43:22 UTC (rev 16465) @@ -26,6 +26,7 @@ int pad; /* Number of spaces to use between widgets */ char *title; + GList *focus; /* List of widgets to cycle focus (only valid for parent boxes) */ void (*gnt_reserved1)(void); void (*gnt_reserved2)(void); Modified: branches/soc-2006-file-loggers/console/libgnt/gntbutton.c =================================================================== --- branches/soc-2006-file-loggers/console/libgnt/gntbutton.c 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/libgnt/gntbutton.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -16,10 +16,11 @@ GntButton *button = GNT_BUTTON(widget); GntColorType type; - if (GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_HAS_FOCUS) + if (gnt_widget_has_focus(widget)) type = GNT_COLOR_HIGHLIGHT; else type = GNT_COLOR_NORMAL; + wbkgdset(widget->window, '\0' | COLOR_PAIR(type)); mvwprintw(widget->window, 1, 1, button->priv->text); @@ -70,6 +71,8 @@ { GntButton *button = GNT_BUTTON(instance); button->priv = g_new0(GntButtonPriv, 1); + + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(button), GNT_WIDGET_GROW_X); /* Can be resized sideways */ DEBUG; } Modified: branches/soc-2006-file-loggers/console/libgnt/gntcolors.c =================================================================== --- branches/soc-2006-file-loggers/console/libgnt/gntcolors.c 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/libgnt/gntcolors.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -29,10 +29,11 @@ else { init_pair(GNT_COLOR_NORMAL, COLOR_BLACK, COLOR_WHITE); - init_pair(GNT_COLOR_HIGHLIGHT, COLOR_YELLOW, COLOR_BLACK); + init_pair(GNT_COLOR_HIGHLIGHT, COLOR_WHITE, COLOR_BLUE); init_pair(GNT_COLOR_SHADOW, COLOR_BLACK, COLOR_BLACK); - init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLACK); - init_pair(GNT_COLOR_TEXT_NORMAL, COLOR_BLACK, COLOR_WHITE); + init_pair(GNT_COLOR_TITLE, COLOR_WHITE, COLOR_BLUE); + init_pair(GNT_COLOR_TITLE_D, COLOR_WHITE, COLOR_BLACK); + init_pair(GNT_COLOR_TEXT_NORMAL, COLOR_WHITE, COLOR_BLUE); init_pair(GNT_COLOR_HIGHLIGHT_D, COLOR_CYAN, COLOR_BLACK); init_pair(GNT_COLOR_DISABLED, COLOR_YELLOW, COLOR_WHITE); } Modified: branches/soc-2006-file-loggers/console/libgnt/gntentry.c =================================================================== --- branches/soc-2006-file-loggers/console/libgnt/gntentry.c 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/libgnt/gntentry.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -173,6 +173,7 @@ 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); DEBUG; } Modified: branches/soc-2006-file-loggers/console/libgnt/gntlabel.c =================================================================== --- branches/soc-2006-file-loggers/console/libgnt/gntlabel.c 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/libgnt/gntlabel.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -70,6 +70,7 @@ static void gnt_label_init(GTypeInstance *instance, gpointer class) { + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_X | GNT_WIDGET_GROW_Y); DEBUG; } Modified: branches/soc-2006-file-loggers/console/libgnt/gntmain.c =================================================================== --- branches/soc-2006-file-loggers/console/libgnt/gntmain.c 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/libgnt/gntmain.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -1,3 +1,5 @@ +#include <panel.h> + #include "gnt.h" #include "gntbox.h" #include "gntkeys.h" @@ -2,2 +4,3 @@ #include "gntcolors.h" +#include "gnttree.h" @@ -9,28 +12,60 @@ #include <unistd.h> #include <string.h> +static int lock_focus_list; static GList *focus_list; -static int max_x; -static int max_y; +static int X_MIN; +static int X_MAX; +static int Y_MIN; +static int Y_MAX; + +static gboolean ascii_only; + +static GMainLoop *loop; +static struct +{ + GntWidget *window; + GntWidget *tree; +} window_list; + typedef struct { GntWidget *me; - GList *below; /* List of widgets below me */ - GList *above; /* List of widgets above me */ + + PANEL *panel; } GntNode; +typedef enum +{ + GNT_KP_MODE_NORMAL, + GNT_KP_MODE_RESIZE, + GNT_KP_MODE_MOVE, + GNT_KP_MODE_MENU, + GNT_KP_MODE_WINDOW_LIST +} GntKeyPressMode; + static GHashTable *nodes; static void free_node(gpointer data); static void draw_taskbar(); +static void bring_on_top(GntWidget *widget); void gnt_screen_take_focus(GntWidget *widget) { GntWidget *w = NULL; + + if (lock_focus_list) + return; + if (focus_list) w = focus_list->data; - focus_list = g_list_prepend(focus_list, widget); + + /* XXX: ew */ + focus_list = g_list_first(focus_list); + focus_list = g_list_append(focus_list, widget); + focus_list = g_list_find(focus_list, widget); + gnt_widget_set_focus(widget, TRUE); if (w) gnt_widget_set_focus(w, FALSE); @@ -39,11 +74,24 @@ void gnt_screen_remove_widget(GntWidget *widget) { + int pos = g_list_index(g_list_first(focus_list), widget); + GList *next; + + if (lock_focus_list) + return; + + if (pos == -1) + return; + + focus_list = g_list_first(focus_list); focus_list = g_list_remove(focus_list, widget); + next = g_list_nth(focus_list, pos - 1); + if (next) + focus_list = next; + if (focus_list) { - gnt_widget_set_focus(focus_list->data, TRUE); - gnt_widget_draw(focus_list->data); + bring_on_top(focus_list->data); } draw_taskbar(); } @@ -52,29 +100,49 @@ bring_on_top(GntWidget *widget) { GntNode *node = g_hash_table_lookup(nodes, widget); - GList *iter; + g_return_if_fail(focus_list->data == widget); + if (!node) return; - for (iter = node->above; iter;) + gnt_widget_set_focus(focus_list->data, TRUE); + gnt_widget_draw(focus_list->data); + + top_panel(node->panel); + + if (window_list.window) { - GntNode *n = iter->data; - iter = iter->next; - n->below = g_list_remove(n->below, node); - n->above = g_list_prepend(n->above, node); - - node->above = g_list_remove(node->above, n); - node->below = g_list_prepend(node->below, n); + GntNode *nd = g_hash_table_lookup(nodes, window_list.window); + top_panel(nd->panel); } + update_panels(); + doupdate(); + draw_taskbar(); } static void +update_window_in_list(GntWidget *wid) +{ + GntTextFormatFlags flag = 0; + + if (window_list.window == NULL) + return; + + if (wid == focus_list->data) + flag |= GNT_TEXT_FLAG_DIM; + else if (GNT_WIDGET_IS_FLAG_SET(wid, GNT_WIDGET_URGENT)) + flag |= GNT_TEXT_FLAG_BOLD; + + gnt_tree_set_row_flags(GNT_TREE(window_list.tree), wid, flag); +} + +static void draw_taskbar() { static WINDOW *taskbar = NULL; GList *iter; - int n, width; + int n, width = 0; int i; if (taskbar == NULL) @@ -82,6 +150,7 @@ taskbar = newwin(1, getmaxx(stdscr), getmaxy(stdscr) - 1, 0); } + wbkgdset(taskbar, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); werase(taskbar); n = g_list_length(g_list_first(focus_list)); @@ -111,15 +180,106 @@ wbkgdset(taskbar, '\0' | COLOR_PAIR(color)); mvwhline(taskbar, 0, width * i, ' ' | COLOR_PAIR(color), width); mvwprintw(taskbar, 0, width * i, "%s", GNT_BOX(w)->title); + + update_window_in_list(w); } wrefresh(taskbar); } +static void +switch_window(int direction) +{ + GntWidget *w = NULL; + if (focus_list) + w = focus_list->data; + + if (direction == 1) + { + if (focus_list && focus_list->next) + focus_list = focus_list->next; + else + focus_list = g_list_first(focus_list); + } + else if (direction == -1) + { + if (focus_list && focus_list->prev) + focus_list = focus_list->prev; + else + focus_list = g_list_last(focus_list); + } + + if (focus_list) + { + bring_on_top(focus_list->data); + } + + if (w && (!focus_list || w != focus_list->data)) + { + gnt_widget_set_focus(w, FALSE); + } +} + +static void +window_list_activate(GntTree *tree, gpointer null) +{ + GntWidget *widget = gnt_tree_get_selection_data(GNT_TREE(tree)); + GntWidget *old = NULL; + + if (focus_list) + old = focus_list->data; + + focus_list = g_list_find(g_list_first(focus_list), widget); + bring_on_top(widget); + + if (old && (!focus_list || old != focus_list->data)) + { + gnt_widget_set_focus(old, FALSE); + } +} + +static void +show_window_list() +{ + GntWidget *tree, *win; + GList *iter; + + if (window_list.window) + return; + + win = window_list.window = gnt_box_new(FALSE, FALSE); + gnt_box_set_toplevel(GNT_BOX(win), TRUE); + gnt_box_set_title(GNT_BOX(win), "Window List"); + gnt_box_set_pad(GNT_BOX(win), 0); + + tree = window_list.tree = gnt_tree_new(); + + for (iter = g_list_first(focus_list); iter; iter = iter->next) + { + GntBox *box = GNT_BOX(iter->data); + + gnt_tree_add_row_after(GNT_TREE(tree), box, box->title, NULL, NULL); + update_window_in_list(GNT_WIDGET(box)); + } + + gnt_box_add_widget(GNT_BOX(win), tree); + + gnt_widget_set_size(tree, getmaxx(stdscr) / 3, getmaxy(stdscr) / 2); + gnt_widget_set_position(win, getmaxx(stdscr) / 3, getmaxy(stdscr) / 4); + + lock_focus_list = 1; + gnt_widget_show(win); + lock_focus_list = 0; + + g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(window_list_activate), NULL); +} + static gboolean io_invoke(GIOChannel *source, GIOCondition cond, gpointer null) { char buffer[256]; + gboolean ret = FALSE; + static GntKeyPressMode mode = GNT_KP_MODE_NORMAL; int rd = read(0, buffer, sizeof(buffer) - 1); if (rd < 0) @@ -137,56 +297,197 @@ buffer[rd] = 0; - if (focus_list) + if (mode == GNT_KP_MODE_NORMAL) { - gboolean ret = FALSE; - ret = gnt_widget_key_pressed(focus_list->data, buffer); + if (focus_list) + { + ret = gnt_widget_key_pressed(focus_list->data, buffer); + } + + if (!ret) + { + if (buffer[0] == 27) + { + /* Some special key has been pressed */ + if (strcmp(buffer+1, GNT_KEY_POPUP) == 0) + {} + else if (strcmp(buffer + 1, "c") == 0) + { + /* Alt + c was pressed. I am going to use it to close a window. */ + if (focus_list) + { + gnt_widget_destroy(focus_list->data); + } + } + else if (strcmp(buffer + 1, "q") == 0) + { + /* I am going to use Alt + q to quit. */ + g_main_loop_quit(loop); + } + else if (strcmp(buffer + 1, "n") == 0) + { + /* Alt + n to go to the next window */ + switch_window(1); + } + else if (strcmp(buffer + 1, "p") == 0) + { + /* Alt + p to go to the previous window */ + switch_window(-1); + } + else if (strcmp(buffer + 1, "m") == 0 && focus_list) + { + /* Move a window */ + mode = GNT_KP_MODE_MOVE; + } + else if (strcmp(buffer + 1, "w") == 0 && focus_list) + { + /* Window list */ + mode = GNT_KP_MODE_WINDOW_LIST; + show_window_list(); + } + else if (strcmp(buffer + 1, "r") == 0 && focus_list) + { + /* Resize window */ + mode = GNT_KP_MODE_RESIZE; + } + } + } } - - if (buffer[0] == 27) + else if (mode == GNT_KP_MODE_MOVE && focus_list) { - /* Some special key has been pressed */ - if (strcmp(buffer+1, GNT_KEY_POPUP) == 0) - {} - else if (strcmp(buffer + 1, "c") == 0) + if (buffer[0] == 27) { - /* Alt + c was pressed. I am going to use it to close a window. */ - if (focus_list) + gboolean changed = FALSE; + int x, y, w, h; + GntWidget *widget = GNT_WIDGET(focus_list->data); + + gnt_widget_get_position(widget, &x, &y); + gnt_widget_get_size(widget, &w, &h); + + if (strcmp(buffer + 1, GNT_KEY_LEFT) == 0) { - gnt_widget_destroy(focus_list->data); - gnt_screen_remove_widget(focus_list->data); + if (x > X_MIN) + { + x--; + changed = TRUE; + } } + else if (strcmp(buffer + 1, GNT_KEY_RIGHT) == 0) + { + if (x + w < X_MAX) + { + x++; + changed = TRUE; + } + } + else if (strcmp(buffer + 1, GNT_KEY_UP) == 0) + { + if (y > Y_MIN) + { + y--; + changed = TRUE; + } + } + else if (strcmp(buffer + 1, GNT_KEY_DOWN) == 0) + { + if (y + h < Y_MAX) + { + y++; + changed = TRUE; + } + } + else if (buffer[1] == 0) + { + mode = GNT_KP_MODE_NORMAL; + changed = TRUE; + } + + if (changed) + { + GntNode *node = g_hash_table_lookup(nodes, widget); + gnt_widget_set_position(widget, x, y); + move_panel(node->panel, y, x); + update_panels(); + doupdate(); + } } - else if (strcmp(buffer + 1, "q") == 0) + else if (*buffer == '\r') { - /* I am going to use Alt + q to quit. */ - endwin(); - exit(1); + mode = GNT_KP_MODE_NORMAL; } - else if (strcmp(buffer + 1, "n") == 0) + } + else if (mode == GNT_KP_MODE_WINDOW_LIST && window_list.window) + { + gnt_widget_key_pressed(window_list.window, buffer); + + if (buffer[0] == '\r' || (buffer[0] == 27 && buffer[1] == 0)) { - /* Alt + n to go to the next window */ - GntWidget *w = NULL; - if (focus_list) - w = focus_list->data; + mode = GNT_KP_MODE_NORMAL; + lock_focus_list = 1; + gnt_widget_destroy(window_list.window); + window_list.window = NULL; + window_list.tree = NULL; + lock_focus_list = 0; + } + } + else if (mode == GNT_KP_MODE_RESIZE) + { + if (buffer[0] == '\r' || (buffer[0] == 27 && buffer[1] == 0)) + mode = GNT_KP_MODE_NORMAL; + else if (buffer[0] == 27) + { + GntWidget *widget = focus_list->data; + gboolean changed = FALSE; + int width, height; - if (focus_list && focus_list->next) - focus_list = focus_list->next; - else - focus_list = g_list_first(focus_list); - if (focus_list) + gnt_widget_get_size(widget, &width, &height); + + if (strcmp(buffer + 1, GNT_KEY_DOWN) == 0) { - gnt_widget_set_focus(focus_list->data, TRUE); - bring_on_top(focus_list->data); - gnt_widget_draw(focus_list->data); + if (widget->priv.y + height < Y_MAX) + { + height++; + changed = TRUE; + } } + else if (strcmp(buffer + 1, GNT_KEY_UP) == 0) + { + height--; + changed = TRUE; + } + else if (strcmp(buffer + 1, GNT_KEY_LEFT) == 0) + { + width--; + changed = TRUE; + } + else if (strcmp(buffer + 1, GNT_KEY_RIGHT) == 0) + { + if (widget->priv.x + width < X_MAX) + { + width++; + changed = TRUE; + } + } - if (w && w != focus_list->data) - gnt_widget_set_focus(w, FALSE); + if (changed) + { + GntNode *node = g_hash_table_lookup(nodes, widget); + int x, y; + + gnt_widget_get_position(widget, &x, &y); + + hide_panel(node->panel); + gnt_widget_set_size(widget, width, height); + gnt_widget_set_position(widget, x, y); + gnt_widget_draw(widget); + replace_panel(node->panel, widget->window); + show_panel(node->panel); + update_panels(); + doupdate(); + } } } - draw_taskbar(); refresh(); return TRUE; @@ -203,28 +504,41 @@ int result = g_io_add_watch(channel, (G_IO_IN | G_IO_HUP | G_IO_ERR), io_invoke, NULL); + const char *locale = setlocale(LC_ALL, ""); - setlocale(LC_ALL, ""); + if (locale && (strstr(locale, "UTF") || strstr(locale, "utf"))) + ascii_only = FALSE; + else + ascii_only = TRUE; + initscr(); start_color(); gnt_init_colors(); - max_x = getmaxx(stdscr); - max_y = getmaxy(stdscr); + X_MIN = 0; + Y_MIN = 0; + X_MAX = getmaxx(stdscr); + Y_MAX = getmaxy(stdscr) - 1; nodes = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_node); wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); noecho(); refresh(); +#if MAYBE_SOMEDAY mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL); +#endif + wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); + werase(stdscr); + wrefresh(stdscr); + g_type_init(); } void gnt_main() { - GMainLoop *loop = g_main_new(FALSE); - g_main_run(loop); + loop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(loop); } /********************************* @@ -235,45 +549,17 @@ free_node(gpointer data) { GntNode *node = data; - g_list_free(node->below); - g_list_free(node->above); + hide_panel(node->panel); + del_panel(node->panel); g_free(node); } -static void -check_intersection(gpointer key, gpointer value, gpointer data) -{ - GntNode *n = value; - GntNode *nu = data; - - if (value == NULL) - return; - if (n->me == nu->me) - return; - - if (n->me->priv.x + n->me->priv.width < nu->me->priv.x) - return; - if (nu->me->priv.x + nu->me->priv.width < n->me->priv.x) - return; - - if (n->me->priv.y + n->me->priv.height < nu->me->priv.y) - return; - if (nu->me->priv.y + nu->me->priv.height < n->me->priv.y) - return; - - n->above = g_list_prepend(n->above, nu); - nu->below = g_list_prepend(nu->below, n); -} - void gnt_screen_occupy(GntWidget *widget) { GntNode *node; - if (widget->parent) - { - while (widget->parent) - widget = widget->parent; - } + while (widget->parent) + widget = widget->parent; if (g_hash_table_lookup(nodes, widget)) return; /* XXX: perhaps _update instead? */ @@ -281,97 +567,64 @@ node = g_new0(GntNode, 1); node->me = widget; - g_hash_table_foreach(nodes, check_intersection, node); g_hash_table_replace(nodes, widget, node); + + if (window_list.window) + { + if ((GNT_IS_BOX(widget) && GNT_BOX(widget)->title) && window_list.window != widget + && GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_CAN_TAKE_FOCUS)) + { + gnt_tree_add_row_after(GNT_TREE(window_list.tree), widget, + GNT_BOX(widget)->title, NULL, NULL); + update_window_in_list(widget); + } + } + + update_panels(); + doupdate(); } void gnt_screen_release(GntWidget *widget) { - WINDOW *win; - GList *iter; - GntNode *node = g_hash_table_lookup(nodes, widget); + GntNode *node; + + gnt_screen_remove_widget(widget); + node = g_hash_table_lookup(nodes, widget); + if (node == NULL) /* Yay! Nothing to do. */ return; - win = dupwin(widget->window); - werase(win); + g_hash_table_remove(nodes, widget); - /* XXX: This is not going to work. - * It will be necessary to build a topology and go from there. */ - for (iter = node->below; iter; iter = iter->next) + if (window_list.window) { - GntNode *n = iter->data; - GntWidget *w = n->me; - int left, right, top, bottom; - - left = MAX(widget->priv.x, w->priv.x) - w->priv.x; - right = MIN(widget->priv.x + widget->priv.width, w->priv.x + w->priv.width) - w->priv.x; - - top = MAX(widget->priv.y, w->priv.y) - w->priv.y; - bottom = MIN(widget->priv.y + widget->priv.height, w->priv.y + w->priv.height) - w->priv.y; - - copywin(w->window, win, top, left, - w->priv.y - widget->priv.y + top, - w->priv.x - widget->priv.x + left, - w->priv.y - widget->priv.y + bottom - 1, - w->priv.x - widget->priv.x + right - 1, FALSE); - n->above = g_list_remove(n->above, node); + gnt_tree_remove(GNT_TREE(window_list.tree), widget); } - for (iter = node->above; iter; iter = iter->next) - { - GntNode *n = iter->data; - n->below = g_list_remove(n->below, node); - } - - wrefresh(win); - delwin(win); - - g_hash_table_remove(nodes, widget); + update_panels(); + doupdate(); } void gnt_screen_update(GntWidget *widget) { - GList *iter; - WINDOW *win; GntNode *node; - if (widget->parent) - { - while (widget->parent) - widget = widget->parent; - } + while (widget->parent) + widget = widget->parent; gnt_box_sync_children(GNT_BOX(widget)); node = g_hash_table_lookup(nodes, widget); + if (node && !node->panel) + node->panel = new_panel(node->me->window); - win = dupwin(widget->window); - - if (node && node->above) + if (window_list.window) { - /* XXX: Same here: need to build a topology first. */ - for (iter = node->above; iter; iter = iter->next) - { - GntNode *n = iter->data; - GntWidget *w = n->me; - int left, right, top, bottom; - - left = MAX(widget->priv.x, w->priv.x) - w->priv.x; - right = MIN(widget->priv.x + widget->priv.width, w->priv.x + w->priv.width) - w->priv.x; - - top = MAX(widget->priv.y, w->priv.y) - w->priv.y; - bottom = MIN(widget->priv.y + widget->priv.height, w->priv.y + w->priv.height) - w->priv.y; - - copywin(w->window, win, top, left, - w->priv.y - widget->priv.y + top, - w->priv.x - widget->priv.x + left, - w->priv.y - widget->priv.y + bottom - 1, - w->priv.x - widget->priv.x + right - 1, FALSE); - } + GntNode *nd = g_hash_table_lookup(nodes, window_list.window); + top_panel(nd->panel); } - wrefresh(win); - delwin(win); + update_panels(); + doupdate(); } gboolean gnt_widget_has_focus(GntWidget *widget) @@ -383,17 +636,18 @@ w = widget; while (widget->parent) - { - fprintf(stderr, "%p %p\n", widget, widget->parent); widget = widget->parent; - } - fprintf(stderr, "%p %p\n", widget, widget->parent); - if (focus_list && focus_list->data == widget && - (!GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS) || - GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_HAS_FOCUS))) + if (widget == window_list.window) return TRUE; + if (focus_list && focus_list->data == widget) + { + if (GNT_IS_BOX(widget) && + (GNT_BOX(widget)->active == w || widget == w)) + return TRUE; + } + return FALSE; } @@ -409,3 +663,13 @@ draw_taskbar(); } +void gnt_quit() +{ + endwin(); +} + +gboolean gnt_ascii_only() +{ + return ascii_only; +} + Modified: branches/soc-2006-file-loggers/console/libgnt/gnttextview.c =================================================================== --- branches/soc-2006-file-loggers/console/libgnt/gnttextview.c 2006-07-08 22:08:51 UTC (rev 16464) +++ branches/soc-2006-file-loggers/console/libgnt/gnttextview.c 2006-07-08 22:43:22 UTC (rev 16465) @@ -7,7 +7,7 @@ typedef struct { - GntTextViewFlags flags; + GntTextFormatFlags flags; char *text; } GntTextSegment; @@ -113,6 +113,9 @@ static void gnt_text_view_init(GTypeInstance *instance, gpointer class) { + /* XXX: For now, resizing the width is not permitted. This is because + * of the way I am handling wrapped lines. */ + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_Y); DEBUG; } @@ -152,14 +155,14 @@ GntTextView *view = GNT_TEXT_VIEW(widget); GntTextLine *line = g_new0(GntTextLine, 1); - GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER); + GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); view->list = g_list_append(view->list, line); return widget; } -void gnt_text_view_append_text_with_flags(GntTextView *view, const char *text, GntTextViewFlags flags) +void gnt_text_view_append_text_with_flags(GntTextView *view, const char *text, GntTextFormatFlags flags) { GntWidget *widget = GNT_WIDGET(view); int fl = 0; @@ -198,7 +201,7 @@ { GntTextSegment *seg = g_new0(GntTextSegment, 1); seg->flags = fl; - seg->text = g_new0(char, len); /* XXX: MUST be improved */ + seg->text = g_new0(char, len + 1); /* XXX: MUST be improved */ g_utf8_strncpy(seg->text, iter, widget->priv.width - line->length - 1); line->segments = g_list_append(line->segments, seg); Modified: branches/soc-2006-file-loggers/console/libgnt/gnttextview.h ======================... [truncated message content] |