diff -r a1cbdeffee69 -r 533ea832c97c gtk/gtkstatusbox.c --- a/gtk/gtkstatusbox.c Mon Oct 23 19:05:14 2006 +0000 +++ b/gtk/gtkstatusbox.c Mon Oct 23 19:43:45 2006 +0000 @@ -83,6 +83,10 @@ static void do_colorshift (GdkPixbuf *dest, GdkPixbuf *src, int shift); static void icon_choose_cb(const char *filename, gpointer data); +static void (*combo_box_size_request)(GtkWidget *widget, GtkRequisition *requisition); +static void (*combo_box_size_allocate)(GtkWidget *widget, GtkAllocation *allocation); +static void (*combo_box_forall) (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); + enum { /** A GtkGaimStatusBoxItemType */ TYPE_COLUMN, @@ -118,7 +122,7 @@ PROP_ICON_SEL, }; -GtkContainer *parent_class = NULL; +GtkComboBoxClass *parent_class = NULL; static void gtk_gaim_status_box_class_init (GtkGaimStatusBoxClass *klass); static void gtk_gaim_status_box_init (GtkGaimStatusBox *status_box); @@ -144,8 +148,8 @@ NULL /* value_table */ }; - status_box_type = g_type_register_static(GTK_TYPE_CONTAINER, - "GtkGaimStatusBox", + status_box_type = g_type_register_static(GTK_TYPE_COMBO_BOX, + "GtkGaimStatusBox", &status_box_info, 0); } @@ -195,7 +199,7 @@ if (status_no != -1) { gtk_widget_set_sensitive(GTK_WIDGET(status_box), FALSE); -// gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), status_no); + gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), status_no); message = gaim_status_get_attr_string(newstatus, "message"); @@ -422,16 +426,23 @@ gtk_gaim_status_box_class_init (GtkGaimStatusBoxClass *klass) { GObjectClass *object_class; + GtkComboBoxClass *combo_class; GtkWidgetClass *widget_class; GtkContainerClass *container_class = (GtkContainerClass*)klass; parent_class = g_type_class_peek_parent(klass); + combo_class = (GtkComboBoxClass*)klass; + combo_class->changed = gtk_gaim_status_box_changed; + widget_class = (GtkWidgetClass*)klass; + combo_box_size_request = widget_class->size_request; widget_class->size_request = gtk_gaim_status_box_size_request; + combo_box_size_allocate = widget_class->size_allocate; widget_class->size_allocate = gtk_gaim_status_box_size_allocate; widget_class->expose_event = gtk_gaim_status_box_expose_event; + combo_box_forall = container_class->forall; container_class->forall = gtk_gaim_status_box_forall; container_class->remove = NULL; @@ -507,17 +518,16 @@ gpointer data; /* Primary (get the status selected in the dropdown) */ -// gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter); -// gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, -// TYPE_COLUMN, &type, -// DATA_COLUMN, &data, -// -1); -// if (type == GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE) -// primary = g_strdup(gaim_primitive_get_name_from_type(GPOINTER_TO_INT(data))); -// else -// /* This should never happen, but just in case... */ -// primary = g_strdup("New status"); - primary = g_strdup("Available"); + gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter); + gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, + TYPE_COLUMN, &type, + DATA_COLUMN, &data, + -1); + if (type == GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE) + primary = g_strdup(gaim_primitive_get_name_from_type(GPOINTER_TO_INT(data))); + else + /* This should never happen, but just in case... */ + primary = g_strdup("New status"); } else if (account_status) primary = g_strdup(gaim_status_get_name(gaim_account_get_active_status(acct))); @@ -617,7 +627,7 @@ /* Make sure to activate the only row in the tree view */ path = gtk_tree_path_new_from_string("0"); -// gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), path); + gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(status_box->cell_view), path); gtk_tree_path_free(path); update_size(status_box); @@ -683,7 +693,7 @@ (!gaim_savedstatus_has_substatuses(saved_status))) { index = get_statusbox_index(status_box, saved_status); -// gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), index); + gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), index); } else { @@ -692,7 +702,7 @@ gpointer data; /* Unset the active item */ -// gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), -1); + gtk_combo_box_set_active(GTK_COMBO_BOX(status_box), -1); /* If this saved status is in the list store, then set it as the active item */ if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(status_box->dropdown_store), &iter)) @@ -720,7 +730,7 @@ || !strcmp(name, acct_status_name)) { /* Found! */ -// gtk_combo_box_set_active_iter(GTK_COMBO_BOX(status_box), &iter); + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(status_box), &iter); g_free(name); break; } @@ -730,7 +740,7 @@ (GPOINTER_TO_INT(data) == gaim_savedstatus_get_creation_time(saved_status))) { /* Found! */ -// gtk_combo_box_set_active_iter(GTK_COMBO_BOX(status_box), &iter); + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(status_box), &iter); break; } } @@ -916,7 +926,7 @@ if (tmp != NULL) g_object_unref(tmp); } -// gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); + gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); } static void @@ -933,7 +943,7 @@ icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_STATUS_SMALL); /* Unset the model while clearing it */ -// gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), NULL); + gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), NULL); gtk_list_store_clear(status_box->dropdown_store); /* Don't set the model until the new statuses have been added to the box. * What is presumably a bug in Gtk < 2.4 causes things to get all confused @@ -975,7 +985,7 @@ gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), GTK_GAIM_STATUS_BOX_TYPE_SAVED, pixbuf, _("Saved..."), NULL, NULL); if (pixbuf) g_object_unref(G_OBJECT(pixbuf)); -// gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); + gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); status_menu_refresh_iter(status_box); } else { @@ -1177,7 +1187,7 @@ static void toggled_cb(GtkWidget *widget, GtkGaimStatusBox *box) { -// gtk_combo_box_popup(GTK_COMBO_BOX(box)); + gtk_combo_box_popup(GTK_COMBO_BOX(box)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(box->toggle_button), FALSE); } @@ -1262,9 +1272,9 @@ status_box->store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); status_box->dropdown_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); -// gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); + gtk_combo_box_set_model(GTK_COMBO_BOX(status_box), GTK_TREE_MODEL(status_box->dropdown_store)); gtk_cell_view_set_model(GTK_CELL_VIEW(status_box->cell_view), GTK_TREE_MODEL(status_box->store)); -// gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(status_box), 0); + gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(status_box), 0); gtk_list_store_append(status_box->store, &(status_box->iter)); gtk_container_add(GTK_CONTAINER(status_box->toggle_button), status_box->hbox); @@ -1278,20 +1288,20 @@ text_rend = gtk_cell_renderer_text_new(); icon_rend = gtk_cell_renderer_pixbuf_new(); -// gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), icon_rend, FALSE); -// gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), text_rend, TRUE); -// gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), icon_rend, "pixbuf", ICON_COLUMN, NULL); -// gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), text_rend, "markup", TEXT_COLUMN, NULL); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), icon_rend, FALSE); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box), text_rend, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), icon_rend, "pixbuf", ICON_COLUMN, NULL); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box), text_rend, "markup", TEXT_COLUMN, NULL); #if GTK_CHECK_VERSION(2, 6, 0) g_object_set(text_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); #endif status_box->icon_rend = gtk_cell_renderer_pixbuf_new(); status_box->text_rend = gtk_cell_renderer_text_new(); -// gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, FALSE); -// gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, TRUE); -// gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, "pixbuf", ICON_COLUMN, NULL); -// gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, "markup", TEXT_COLUMN, NULL); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, FALSE); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, "pixbuf", ICON_COLUMN, NULL); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, "markup", TEXT_COLUMN, NULL); #if GTK_CHECK_VERSION(2, 6, 0) g_object_set(status_box->text_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); #endif @@ -1331,7 +1341,7 @@ G_CALLBACK(imhtml_scroll_event_cb), status_box->imhtml); #if GTK_CHECK_VERSION(2,6,0) -// gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(status_box), dropdown_store_row_separator_func, NULL, NULL); + gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(status_box), dropdown_store_row_separator_func, NULL, NULL); #endif status_box->token_status_account = check_active_accounts_for_identical_statuses(); @@ -1366,7 +1376,7 @@ GtkRequisition *requisition) { GtkRequisition box_req; - gtk_widget_size_request(GTK_GAIM_STATUS_BOX(widget)->toggle_button, requisition); + combo_box_size_request(widget, requisition); requisition->height += 3; /* If the gtkimhtml is visible, then add some additional padding */ @@ -1428,7 +1438,7 @@ GtkAllocation parent_alc, box_alc, icon_alc; gint border_width = GTK_CONTAINER (widget)->border_width; - gtk_widget_size_request(GTK_GAIM_STATUS_BOX(widget)->toggle_button, &req); + combo_box_size_request(widget, &req); box_alc = *allocation; @@ -1467,6 +1477,7 @@ gtk_widget_size_allocate(status_box->icon_box, &icon_alc); } + combo_box_size_allocate(widget, &parent_alc); gtk_widget_size_allocate(status_box->toggle_button, &parent_alc); widget->allocation = *allocation; } @@ -1500,7 +1511,7 @@ (* callback) (status_box->icon_box, callback_data); } -// combo_box_forall(container, include_internals, callback, callback_data); + combo_box_forall(container, include_internals, callback, callback_data); } GtkWidget * @@ -1713,8 +1724,8 @@ GaimSavedStatus *saved_status = NULL; gboolean changed = TRUE; -// if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter)) -// return; + if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter)) + return; gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, TYPE_COLUMN, &type, @@ -1953,8 +1964,8 @@ status_box = GTK_GAIM_STATUS_BOX(box); -// if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter)) -// return; + if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(status_box), &iter)) + return; gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter, TYPE_COLUMN, &type, DATA_COLUMN, &data,