# HG changeset patch # User Tim Ringenbach # Date 1130031721 0 # Node ID 03c813a42c762dbe1b2c53e91bcc4451063087a5 # Parent d9aab67a9e0754df42c33621fd0fe3da4b366350 [gaim-migrate @ 14023] here's what iw as working on, with the bits that activiate it commented out. its not finished at all, but i'm tired of people breaking it ;) hopefully this will motivate me to finish it tonight/tomorrow. committer: Tailor Script diff -r d9aab67a9e07 -r 03c813a42c76 src/account.h --- a/src/account.h Sun Oct 23 01:22:25 2005 +0000 +++ b/src/account.h Sun Oct 23 01:42:01 2005 +0000 @@ -764,7 +764,7 @@ * Deletes an account. * * This will remove any buddies from the buddy list that belong to this - * account, buddy pounces that belong to this account, and will also + * account, buddy pounces that belong to this account, and will also * destroy @a account. * * @param account The account. @@ -789,7 +789,9 @@ /** * Returns a list of all enabled accounts * - * @return A list of all enabled accounts. + * @return A list of all enabled accounts. The list is owned + * by the caller, and must be g_list_free()d to avoid + * leaking the nodes. */ GList *gaim_accounts_get_all_active(void); diff -r d9aab67a9e07 -r 03c813a42c76 src/gtkblist.c --- a/src/gtkblist.c Sun Oct 23 01:22:25 2005 +0000 +++ b/src/gtkblist.c Sun Oct 23 01:42:01 2005 +0000 @@ -3281,10 +3281,31 @@ gtk_container_add(GTK_CONTAINER(sw), gtkblist->treeview); gaim_gtk_blist_update_columns(); - gtkblist->statusbox = gtk_gaim_status_box_new(); - - gtk_widget_show(gtkblist->statusbox); - gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->statusbox, FALSE, TRUE, 0); + /* TODO: functionize this */ + { + GList *accounts, *l; + + /* Set up some per account status boxes */ + gtkblist->statusboxbox = gtk_vbox_new(FALSE, 0); + gtkblist->statusboxes = NULL; +#if 0 + for (l = accounts = gaim_accounts_get_all_active(); l; l = l->next) { + GtkWidget *statusbox = gtk_gaim_status_box_new_with_account(l->data); + gtkblist->statusboxes = g_list_append(gtkblist->statusboxes, statusbox); + gtk_box_pack_start(GTK_BOX(gtkblist->statusboxbox), statusbox, FALSE, TRUE, 0); + gtk_widget_show(statusbox); + } + g_list_free(accounts); +#endif + gtk_widget_show(gtkblist->statusboxbox); + gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->statusboxbox, FALSE, TRUE, 0); + + gtkblist->statusbox = gtk_gaim_status_box_new(); + + gtk_widget_show(gtkblist->statusbox); + gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->statusbox, FALSE, TRUE, 0); + + } /* set the Show Offline Buddies option. must be done * after the treeview or faceprint gets mad. -Robot101 diff -r d9aab67a9e07 -r 03c813a42c76 src/gtkblist.h --- a/src/gtkblist.h Sun Oct 23 01:22:25 2005 +0000 +++ b/src/gtkblist.h Sun Oct 23 01:42:01 2005 +0000 @@ -87,6 +87,8 @@ GaimBlistNode *selected_node; /**< The currently selected node */ GtkWidget *statusbox; /**< The status selector dropdown */ + GtkWidget *statusboxbox; /**< A box to hold per account status boxes */ + GList *statusboxes; /**< A list of the per account status boxes */ GdkPixbuf *east, *south; /**< Drop shadow stuff */ GdkWindow *east_shadow, *south_shadow; /**< Drop shadow stuff */ @@ -126,11 +128,11 @@ /** * Returns the default gtk buddy list - * + * * There's normally only one buddy list window, but that isn't a necessity. This function * returns the GaimGtkBuddyList we're most likely wanting to work with. This is slightly * cleaner than an externed global. - * + * * @return The default GTK+ buddy list */ GaimGtkBuddyList *gaim_gtk_blist_get_default_gtk_blist(); diff -r d9aab67a9e07 -r 03c813a42c76 src/gtkstatusbox.c --- a/src/gtkstatusbox.c Sun Oct 23 01:22:25 2005 +0000 +++ b/src/gtkstatusbox.c Sun Oct 23 01:42:01 2005 +0000 @@ -27,6 +27,7 @@ #include "internal.h" #include "savedstatuses.h" #include "status.h" +#include "debug.h" #include "gtkgaim.h" #include "gtksavedstatuses.h" @@ -36,6 +37,7 @@ static void imhtml_changed_cb(GtkTextBuffer *buffer, void *data); static void remove_typing_cb(GtkGaimStatusBox *box); +static void gtk_gaim_status_box_regenerate(GtkGaimStatusBox *status_box); static void gtk_gaim_status_box_changed(GtkComboBox *box); static void gtk_gaim_status_box_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_gaim_status_box_size_allocate (GtkWidget *widget, GtkAllocation *allocation); @@ -117,6 +119,7 @@ switch (param_id) { case PROP_ACCOUNT: statusbox->account = g_value_get_pointer(value); + gtk_gaim_status_box_regenerate(statusbox); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); @@ -216,17 +219,141 @@ g_free(text); } +static GdkPixbuf * +load_icon(const char *basename) +{ + char basename2[BUFSIZ]; + char *filename; + GdkPixbuf *pixbuf, *scale = NULL; + + if (!strcmp(basename, "available")) + basename = "online"; + else if (!strcmp(basename, "hidden")) + basename = "invisible"; + + /* + * TODO: Find a way to fallback to the GaimStatusPrimitive + * if an icon for this id does not exist. + */ + g_snprintf(basename2, sizeof(basename2), "%s.png", + basename); + + + filename = g_build_filename(DATADIR, "pixmaps", "gaim", "icons", + basename2, NULL); + pixbuf = gdk_pixbuf_new_from_file(filename, NULL); + g_free(filename); + + if (pixbuf != NULL) { + scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, + GDK_INTERP_BILINEAR); + + g_object_unref(G_OBJECT(pixbuf)); + } else { + filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", + "default", basename, NULL); + scale = gdk_pixbuf_new_from_file(filename, NULL); + g_free(filename); + } + + return scale; +} + +static void +gtk_gaim_status_box_regenerate(GtkGaimStatusBox *status_box) +{ + GdkPixbuf *pixbuf, *pixbuf2, *pixbuf3, *pixbuf4; + GtkIconSize icon_size; + const char *current_savedstatus_name; + GaimSavedStatus *saved_status; + + + icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS); + + gtk_list_store_clear(status_box->dropdown_store); + + if (!(GTK_GAIM_STATUS_BOX(status_box)->account)) { + pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_ONLINE, + icon_size, "GtkGaimStatusBox"); + pixbuf2 = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_AWAY, + icon_size, "GtkGaimStatusBox"); + pixbuf3 = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_OFFLINE, + icon_size, "GtkGaimStatusBox"); + pixbuf4 = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_INVISIBLE, + icon_size, "GtkGaimStatusBox"); + /* hacks */ + gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf, _("Available"), NULL, "available"); + gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf2, _("Away"), NULL, "away"); + gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf4, _("Invisible"), NULL, "invisible"); + gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf3, _("Offline"), NULL, "offline"); + gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf, _("Custom..."), NULL, "custom"); + gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf, _("Saved..."), NULL, "saved"); + + current_savedstatus_name = gaim_prefs_get_string("/core/status/current"); + saved_status = gaim_savedstatus_find(current_savedstatus_name); + if (saved_status == NULL) + { + /* Default to "available" */ + gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 0); + } + else + { + GaimStatusPrimitive primitive; + const char *message; + + primitive = gaim_savedstatus_get_type(saved_status); + if (gaim_savedstatus_has_substatuses(saved_status) || + ((primitive != GAIM_STATUS_AVAILABLE) && + (primitive != GAIM_STATUS_OFFLINE) && + (primitive != GAIM_STATUS_AWAY) && + (primitive != GAIM_STATUS_HIDDEN))) + { + gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 4); + } + else + { + if (primitive == GAIM_STATUS_AVAILABLE) + gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 0); + if (primitive == GAIM_STATUS_OFFLINE) + gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 3); + else if (primitive == GAIM_STATUS_AWAY) + gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 1); + else if (primitive == GAIM_STATUS_HIDDEN) + gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 2); + } + + message = gaim_savedstatus_get_message(saved_status); + if (message != NULL) + gtk_imhtml_append_text(GTK_IMHTML(status_box->imhtml), message, 0); + } + + + } else { + const GList *l; + for (l = gaim_account_get_status_types(GTK_GAIM_STATUS_BOX(status_box)->account); l != NULL; l = l->next) { + GaimStatusType *status_type = (GaimStatusType *)l->data; + + if (!gaim_status_type_is_user_settable(status_type)) + continue; + + gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), load_icon(gaim_status_type_get_id(status_type)), + gaim_status_type_get_name(status_type), + NULL, + gaim_status_type_get_id(status_type)); + + } + } + +} + static void gtk_gaim_status_box_init (GtkGaimStatusBox *status_box) { GtkCellRenderer *text_rend; GtkCellRenderer *icon_rend; GtkTextBuffer *buffer; - GdkPixbuf *pixbuf, *pixbuf2, *pixbuf3, *pixbuf4; + GtkTreePath *path; GtkIconSize icon_size; - GtkTreePath *path; - const char *current_savedstatus_name; - GaimSavedStatus *saved_status; text_rend = gtk_cell_renderer_text_new(); icon_rend = gtk_cell_renderer_pixbuf_new(); @@ -298,59 +425,8 @@ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(status_box->sw), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(status_box->sw), status_box->imhtml); gtk_box_pack_start(GTK_BOX(status_box->vbox), status_box->sw, TRUE, TRUE, 0); - pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_ONLINE, - icon_size, "GtkGaimStatusBox"); - pixbuf2 = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_AWAY, - icon_size, "GtkGaimStatusBox"); - pixbuf3 = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_OFFLINE, - icon_size, "GtkGaimStatusBox"); - pixbuf4 = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_INVISIBLE, - icon_size, "GtkGaimStatusBox"); - /* hacks */ - gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf, _("Available"), NULL, "available"); - gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf2, _("Away"), NULL, "away"); - gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf4, _("Invisible"), NULL, "invisible"); - gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf3, _("Offline"), NULL, "offline"); - gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf, _("Custom..."), NULL, "custom"); - gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), pixbuf, _("Saved..."), NULL, "saved"); - current_savedstatus_name = gaim_prefs_get_string("/core/status/current"); - saved_status = gaim_savedstatus_find(current_savedstatus_name); - if (saved_status == NULL) - { - /* Default to "available" */ - gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 0); - } - else - { - GaimStatusPrimitive primitive; - const char *message; - - primitive = gaim_savedstatus_get_type(saved_status); - if (gaim_savedstatus_has_substatuses(saved_status) || - ((primitive != GAIM_STATUS_AVAILABLE) && - (primitive != GAIM_STATUS_OFFLINE) && - (primitive != GAIM_STATUS_AWAY) && - (primitive != GAIM_STATUS_HIDDEN))) - { - gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 4); - } - else - { - if (primitive == GAIM_STATUS_AVAILABLE) - gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 0); - if (primitive == GAIM_STATUS_OFFLINE) - gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 3); - else if (primitive == GAIM_STATUS_AWAY) - gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 1); - else if (primitive == GAIM_STATUS_HIDDEN) - gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), 2); - } - - message = gaim_savedstatus_get_message(saved_status); - if (message != NULL) - gtk_imhtml_append_text(GTK_IMHTML(status_box->imhtml), message, 0); - } + gtk_gaim_status_box_regenerate(status_box); } @@ -434,7 +510,7 @@ } void -gtk_gaim_status_box_add(GtkGaimStatusBox *status_box, GdkPixbuf *pixbuf, const char *text, const char *sec_text, char *edit) +gtk_gaim_status_box_add(GtkGaimStatusBox *status_box, GdkPixbuf *pixbuf, const char *text, const char *sec_text, const char *edit) { GtkTreeIter iter; char *t; diff -r d9aab67a9e07 -r 03c813a42c76 src/gtkstatusbox.h --- a/src/gtkstatusbox.h Sun Oct 23 01:22:25 2005 +0000 +++ b/src/gtkstatusbox.h Sun Oct 23 01:42:01 2005 +0000 @@ -108,7 +108,7 @@ GtkWidget *gtk_gaim_status_box_new_with_account (GaimAccount *); void -gtk_gaim_status_box_add(GtkGaimStatusBox *status_box, GdkPixbuf *pixbuf, const char *text, const char *sec_text, char *edit); +gtk_gaim_status_box_add(GtkGaimStatusBox *status_box, GdkPixbuf *pixbuf, const char *text, const char *sec_text, const char *edit); void gtk_gaim_status_box_set_error(GtkGaimStatusBox *status_box, const gchar *error);