1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2005-2007 Imendio AB
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public
16 * License along with this program; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
20 * Authors: Richard Hult <richard@imendio.com>
21 * Martyn Russell <martyn@imendio.com>
29 #include <glib/gi18n.h>
31 #include <glade/glade.h>
33 #include <libempathy/empathy-idle.h>
34 #include <libempathy/empathy-utils.h>
35 #include <libempathy/empathy-debug.h>
36 #include <libempathy/empathy-marshal.h>
38 #include "empathy-ui-utils.h"
39 #include "empathy-images.h"
40 #include "empathy-presence-chooser.h"
41 #include "empathy-status-presets.h"
43 #define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EMPATHY_TYPE_PRESENCE_CHOOSER, EmpathyPresenceChooserPriv))
45 #define DEBUG_DOMAIN "PresenceChooser"
47 /* Flashing delay for icons (milliseconds). */
48 #define FLASH_TIMEOUT 500
58 McPresence last_state;
60 McPresence flash_state_1;
61 McPresence flash_state_2;
62 guint flash_timeout_id;
64 /* The handle the kind of unnessecary scroll support. */
65 guint scroll_timeout_id;
66 McPresence scroll_state;
68 } EmpathyPresenceChooserPriv;
75 /* States to be listed in the menu */
76 static McPresence states[] = {MC_PRESENCE_AVAILABLE,
77 MC_PRESENCE_DO_NOT_DISTURB,
80 static void empathy_presence_chooser_class_init (EmpathyPresenceChooserClass *klass);
81 static void empathy_presence_chooser_init (EmpathyPresenceChooser *chooser);
82 static void presence_chooser_finalize (GObject *object);
83 static void presence_chooser_presence_changed_cb (EmpathyPresenceChooser *chooser);
84 static void presence_chooser_reset_scroll_timeout (EmpathyPresenceChooser *chooser);
85 static gboolean presence_chooser_scroll_timeout_cb (EmpathyPresenceChooser *chooser);
86 static gboolean presence_chooser_scroll_event_cb (EmpathyPresenceChooser *chooser,
87 GdkEventScroll *event,
89 static GList * presence_chooser_get_presets (EmpathyPresenceChooser *chooser);
90 static StateAndStatus *presence_chooser_state_and_status_new (McPresence state,
92 static gboolean presence_chooser_flash_timeout_cb (EmpathyPresenceChooser *chooser);
93 static void presence_chooser_flash_start (EmpathyPresenceChooser *chooser,
96 static void presence_chooser_flash_stop (EmpathyPresenceChooser *chooser,
98 static gboolean presence_chooser_button_press_event_cb (GtkWidget *chooser,
99 GdkEventButton *event,
101 static void presence_chooser_toggled_cb (GtkWidget *chooser,
103 static void presence_chooser_menu_popup (EmpathyPresenceChooser *chooser);
104 static void presence_chooser_menu_popdown (EmpathyPresenceChooser *chooser);
105 static void presence_chooser_menu_selection_done_cb (GtkMenuShell *menushell,
106 EmpathyPresenceChooser *chooser);
107 static void presence_chooser_menu_destroy_cb (GtkWidget *menu,
108 EmpathyPresenceChooser *chooser);
109 static void presence_chooser_menu_detach (GtkWidget *attach_widget,
111 static void presence_chooser_menu_align_func (GtkMenu *menu,
116 static void presence_chooser_menu_add_item (GtkWidget *menu,
120 static void presence_chooser_clear_activate_cb (GtkWidget *item,
122 static void presence_chooser_clear_response_cb (GtkWidget *widget,
125 static void presence_chooser_noncustom_activate_cb (GtkWidget *item,
127 static void presence_chooser_set_state (McPresence state,
130 static void presence_chooser_custom_activate_cb (GtkWidget *item,
132 static void presence_chooser_show_dialog (McPresence state);
133 static void presence_chooser_dialog_response_cb (GtkWidget *dialog,
137 G_DEFINE_TYPE (EmpathyPresenceChooser, empathy_presence_chooser, GTK_TYPE_TOGGLE_BUTTON);
140 empathy_presence_chooser_class_init (EmpathyPresenceChooserClass *klass)
142 GObjectClass *object_class = G_OBJECT_CLASS (klass);
144 object_class->finalize = presence_chooser_finalize;
146 g_type_class_add_private (object_class, sizeof (EmpathyPresenceChooserPriv));
150 empathy_presence_chooser_init (EmpathyPresenceChooser *chooser)
152 EmpathyPresenceChooserPriv *priv;
154 GtkWidget *alignment;
156 priv = GET_PRIV (chooser);
158 gtk_button_set_relief (GTK_BUTTON (chooser), GTK_RELIEF_NONE);
159 gtk_button_set_focus_on_click (GTK_BUTTON (chooser), FALSE);
161 alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
162 gtk_widget_show (alignment);
163 gtk_container_add (GTK_CONTAINER (chooser), alignment);
164 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 1, 0);
166 priv->hbox = gtk_hbox_new (FALSE, 1);
167 gtk_widget_show (priv->hbox);
168 gtk_container_add (GTK_CONTAINER (alignment), priv->hbox);
170 priv->image = gtk_image_new ();
171 gtk_widget_show (priv->image);
172 gtk_box_pack_start (GTK_BOX (priv->hbox), priv->image, FALSE, TRUE, 0);
174 priv->label = gtk_label_new (NULL);
175 gtk_widget_show (priv->label);
176 gtk_box_pack_start (GTK_BOX (priv->hbox), priv->label, TRUE, TRUE, 0);
177 gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_END);
178 gtk_misc_set_alignment (GTK_MISC (priv->label), 0, 0.5);
179 gtk_misc_set_padding (GTK_MISC (priv->label), 4, 1);
181 alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
182 gtk_widget_show (alignment);
183 gtk_box_pack_start (GTK_BOX (priv->hbox), alignment, FALSE, FALSE, 0);
185 arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT);
186 gtk_widget_show (arrow);
187 gtk_container_add (GTK_CONTAINER (alignment), arrow);
189 g_signal_connect (chooser, "toggled",
190 G_CALLBACK (presence_chooser_toggled_cb),
192 g_signal_connect (chooser, "button-press-event",
193 G_CALLBACK (presence_chooser_button_press_event_cb),
195 g_signal_connect (chooser, "scroll-event",
196 G_CALLBACK (presence_chooser_scroll_event_cb),
199 priv->idle = empathy_idle_new ();
200 presence_chooser_presence_changed_cb (chooser);
201 g_signal_connect_swapped (priv->idle, "notify",
202 G_CALLBACK (presence_chooser_presence_changed_cb),
207 presence_chooser_finalize (GObject *object)
209 EmpathyPresenceChooserPriv *priv;
211 priv = GET_PRIV (object);
213 if (priv->flash_timeout_id) {
214 g_source_remove (priv->flash_timeout_id);
217 if (priv->scroll_timeout_id) {
218 g_source_remove (priv->scroll_timeout_id);
221 g_signal_handlers_disconnect_by_func (priv->idle,
222 presence_chooser_presence_changed_cb,
224 g_object_unref (priv->idle);
226 G_OBJECT_CLASS (empathy_presence_chooser_parent_class)->finalize (object);
230 empathy_presence_chooser_new (void)
234 chooser = g_object_new (EMPATHY_TYPE_PRESENCE_CHOOSER, NULL);
240 presence_chooser_presence_changed_cb (EmpathyPresenceChooser *chooser)
242 EmpathyPresenceChooserPriv *priv;
244 McPresence flash_state;
247 priv = GET_PRIV (chooser);
249 state = empathy_idle_get_state (priv->idle);
250 status = empathy_idle_get_status (priv->idle);
251 flash_state = empathy_idle_get_flash_state (priv->idle);
253 presence_chooser_reset_scroll_timeout (chooser);
254 gtk_label_set_text (GTK_LABEL (priv->label), status);
256 if (flash_state != MC_PRESENCE_UNSET) {
257 presence_chooser_flash_start (chooser, state, flash_state);
259 presence_chooser_flash_stop (chooser, state);
264 presence_chooser_reset_scroll_timeout (EmpathyPresenceChooser *chooser)
266 EmpathyPresenceChooserPriv *priv;
268 priv = GET_PRIV (chooser);
270 if (priv->scroll_timeout_id) {
271 g_source_remove (priv->scroll_timeout_id);
272 priv->scroll_timeout_id = 0;
275 g_free (priv->scroll_status);
276 priv->scroll_status = NULL;
280 presence_chooser_scroll_timeout_cb (EmpathyPresenceChooser *chooser)
282 EmpathyPresenceChooserPriv *priv;
284 priv = GET_PRIV (chooser);
286 priv->scroll_timeout_id = 0;
288 empathy_idle_set_presence (priv->idle,
290 priv->scroll_status);
292 g_free (priv->scroll_status);
293 priv->scroll_status = NULL;
299 presence_chooser_scroll_event_cb (EmpathyPresenceChooser *chooser,
300 GdkEventScroll *event,
303 EmpathyPresenceChooserPriv *priv;
305 const gchar *current_status;
309 priv = GET_PRIV (chooser);
311 switch (event->direction) {
314 case GDK_SCROLL_DOWN:
320 current_status = gtk_label_get_text (GTK_LABEL (priv->label));
322 /* Get the list of presets, which in this context means all the items
323 * without a trailing "...".
325 list = presence_chooser_get_presets (chooser);
328 for (l = list; l; l = l->next) {
331 if (sas->state == priv->last_state &&
332 strcmp (sas->status, current_status) == 0) {
335 if (event->direction == GDK_SCROLL_UP) {
340 else if (event->direction == GDK_SCROLL_DOWN) {
352 presence_chooser_reset_scroll_timeout (chooser);
354 priv->scroll_status = g_strdup (sas->status);
355 priv->scroll_state = sas->state;
357 priv->scroll_timeout_id =
359 (GSourceFunc) presence_chooser_scroll_timeout_cb,
362 presence_chooser_flash_stop (chooser, sas->state);
363 gtk_label_set_text (GTK_LABEL (priv->label), sas->status);
367 /* If we didn't get any match at all, it means the last state
368 * was a custom one. Just switch to the first one.
370 status = empathy_presence_state_get_default_status (states[0]);
372 presence_chooser_reset_scroll_timeout (chooser);
373 empathy_idle_set_presence (priv->idle, states[0], status);
376 g_list_foreach (list, (GFunc) g_free, NULL);
383 presence_chooser_get_presets (EmpathyPresenceChooser *chooser)
388 for (i = 0; i < G_N_ELEMENTS (states); i++) {
393 status = empathy_presence_state_get_default_status (states[i]);
394 sas = presence_chooser_state_and_status_new (states[i], status);
395 list = g_list_append (list, sas);
397 presets = empathy_status_presets_get (states[i], 5);
398 for (p = presets; p; p = p->next) {
399 sas = presence_chooser_state_and_status_new (states[i], p->data);
400 list = g_list_append (list, sas);
402 g_list_free (presets);
408 static StateAndStatus *
409 presence_chooser_state_and_status_new (McPresence state,
414 sas = g_new0 (StateAndStatus, 1);
417 sas->status = status;
423 presence_chooser_flash_timeout_cb (EmpathyPresenceChooser *chooser)
425 EmpathyPresenceChooserPriv *priv;
427 static gboolean on = FALSE;
429 priv = GET_PRIV (chooser);
432 state = priv->flash_state_1;
434 state = priv->flash_state_2;
437 gtk_image_set_from_icon_name (GTK_IMAGE (priv->image),
438 empathy_icon_name_for_presence_state (state),
447 presence_chooser_flash_start (EmpathyPresenceChooser *chooser,
451 EmpathyPresenceChooserPriv *priv;
453 g_return_if_fail (EMPATHY_IS_PRESENCE_CHOOSER (chooser));
455 priv = GET_PRIV (chooser);
457 priv->flash_state_1 = state_1;
458 priv->flash_state_2 = state_2;
460 if (!priv->flash_timeout_id) {
461 priv->flash_timeout_id = g_timeout_add (FLASH_TIMEOUT,
462 (GSourceFunc) presence_chooser_flash_timeout_cb,
468 presence_chooser_flash_stop (EmpathyPresenceChooser *chooser,
471 EmpathyPresenceChooserPriv *priv;
473 g_return_if_fail (EMPATHY_IS_PRESENCE_CHOOSER (chooser));
475 priv = GET_PRIV (chooser);
477 if (priv->flash_timeout_id) {
478 g_source_remove (priv->flash_timeout_id);
479 priv->flash_timeout_id = 0;
482 gtk_image_set_from_icon_name (GTK_IMAGE (priv->image),
483 empathy_icon_name_for_presence_state (state),
486 priv->last_state = state;
490 presence_chooser_button_press_event_cb (GtkWidget *chooser,
491 GdkEventButton *event,
494 if (event->button != 1 || event->type != GDK_BUTTON_PRESS) {
498 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (chooser))) {
499 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (chooser), TRUE);
507 presence_chooser_toggled_cb (GtkWidget *chooser,
510 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (chooser))) {
511 presence_chooser_menu_popup (EMPATHY_PRESENCE_CHOOSER (chooser));
513 presence_chooser_menu_popdown (EMPATHY_PRESENCE_CHOOSER (chooser));
518 presence_chooser_menu_popup (EmpathyPresenceChooser *chooser)
520 EmpathyPresenceChooserPriv *priv;
523 priv = GET_PRIV (chooser);
529 menu = empathy_presence_chooser_create_menu ();
531 g_signal_connect_after (menu, "selection-done",
532 G_CALLBACK (presence_chooser_menu_selection_done_cb),
535 g_signal_connect (menu, "destroy",
536 G_CALLBACK (presence_chooser_menu_destroy_cb),
539 gtk_menu_attach_to_widget (GTK_MENU (menu),
540 GTK_WIDGET (chooser),
541 presence_chooser_menu_detach);
543 gtk_menu_popup (GTK_MENU (menu),
545 (GtkMenuPositionFunc) presence_chooser_menu_align_func,
548 gtk_get_current_event_time ());
554 presence_chooser_menu_popdown (EmpathyPresenceChooser *chooser)
556 EmpathyPresenceChooserPriv *priv;
558 priv = GET_PRIV (chooser);
561 gtk_widget_destroy (priv->menu);
566 presence_chooser_menu_selection_done_cb (GtkMenuShell *menushell,
567 EmpathyPresenceChooser *chooser)
569 gtk_widget_destroy (GTK_WIDGET (menushell));
571 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (chooser), FALSE);
575 presence_chooser_menu_destroy_cb (GtkWidget *menu,
576 EmpathyPresenceChooser *chooser)
578 EmpathyPresenceChooserPriv *priv;
580 priv = GET_PRIV (chooser);
586 presence_chooser_menu_detach (GtkWidget *attach_widget,
589 /* We don't need to do anything, but attaching the menu means
590 * we don't own the ref count and it is cleaned up properly.
595 presence_chooser_menu_align_func (GtkMenu *menu,
605 gtk_widget_size_request (GTK_WIDGET (menu), &req);
607 gdk_window_get_origin (widget->window, x, y);
609 *x += widget->allocation.x + 1;
610 *y += widget->allocation.y;
612 screen = gtk_widget_get_screen (GTK_WIDGET (menu));
613 screen_height = gdk_screen_get_height (screen);
615 if (req.height > screen_height) {
616 /* Too big for screen height anyway. */
621 if ((*y + req.height + widget->allocation.height) > screen_height) {
622 /* Can't put it below the button. */
626 /* Put menu below button. */
627 *y += widget->allocation.height;
635 empathy_presence_chooser_create_menu (void)
643 menu = gtk_menu_new ();
645 for (i = 0; i < G_N_ELEMENTS (states); i++) {
648 status = empathy_presence_state_get_default_status (states[i]);
649 presence_chooser_menu_add_item (menu,
654 list = empathy_status_presets_get (states[i], 5);
655 for (l = list; l; l = l->next) {
656 presence_chooser_menu_add_item (menu,
663 presence_chooser_menu_add_item (menu,
664 _("Custom message..."),
669 item = gtk_menu_item_new ();
670 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
671 gtk_widget_show (item);
674 /* Offline to disconnect */
675 status = empathy_presence_state_get_default_status (MC_PRESENCE_OFFLINE);
676 presence_chooser_menu_add_item (menu,
681 item = gtk_menu_item_new ();
682 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
683 gtk_widget_show (item);
686 item = gtk_image_menu_item_new_with_label (_("Clear List..."));
687 image = gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU);
688 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
689 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
690 gtk_widget_show (image);
691 gtk_widget_show (item);
693 g_signal_connect (item,
695 G_CALLBACK (presence_chooser_clear_activate_cb),
702 presence_chooser_menu_add_item (GtkWidget *menu,
709 const gchar *icon_name;
711 item = gtk_image_menu_item_new_with_label (str);
712 icon_name = empathy_icon_name_for_presence_state (state);
715 g_signal_connect (item, "activate",
716 G_CALLBACK (presence_chooser_custom_activate_cb),
719 g_signal_connect (item, "activate",
720 G_CALLBACK (presence_chooser_noncustom_activate_cb),
724 image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
725 gtk_widget_show (image);
727 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
728 gtk_widget_show (item);
730 g_object_set_data_full (G_OBJECT (item),
731 "status", g_strdup (str),
732 (GDestroyNotify) g_free);
734 g_object_set_data (G_OBJECT (item), "state", GINT_TO_POINTER (state));
736 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
740 presence_chooser_clear_activate_cb (GtkWidget *item,
745 GtkWindow *parent = NULL;
747 toplevel = gtk_widget_get_toplevel (item);
748 if (GTK_WIDGET_TOPLEVEL (toplevel) &&
749 GTK_IS_WINDOW (toplevel)) {
753 window = GTK_WINDOW (toplevel);
754 visible = empathy_window_get_is_visible (window);
761 dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
763 GTK_MESSAGE_QUESTION,
765 _("Are you sure you want to clear the list?"));
767 gtk_message_dialog_format_secondary_text (
768 GTK_MESSAGE_DIALOG (dialog),
769 _("This will remove any custom messages you have "
770 "added to the list of preset status messages."));
772 gtk_dialog_add_buttons (GTK_DIALOG (dialog),
773 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
774 _("Clear List"), GTK_RESPONSE_OK,
777 gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), FALSE);
779 g_signal_connect (dialog, "response",
780 G_CALLBACK (presence_chooser_clear_response_cb),
783 gtk_widget_show (dialog);
787 presence_chooser_clear_response_cb (GtkWidget *widget,
791 if (response == GTK_RESPONSE_OK) {
792 empathy_status_presets_reset ();
795 gtk_widget_destroy (widget);
799 presence_chooser_noncustom_activate_cb (GtkWidget *item,
805 status = g_object_get_data (G_OBJECT (item), "status");
806 state = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "state"));
808 presence_chooser_set_state (state, status, FALSE);
812 presence_chooser_set_state (McPresence state,
818 if (!G_STR_EMPTY (status)) {
819 const gchar *default_status;
821 /* Only store the value if it differs from the default ones. */
822 default_status = empathy_presence_state_get_default_status (state);
823 if (save && strcmp (status, default_status) != 0) {
824 empathy_status_presets_set_last (state, status);
828 idle = empathy_idle_new ();
829 empathy_idle_set_presence (idle, state, status);
830 g_object_unref (idle);
834 presence_chooser_custom_activate_cb (GtkWidget *item,
839 state = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "state"));
841 presence_chooser_show_dialog (state);
845 presence_chooser_show_dialog (McPresence state)
847 static GtkWidget *dialog = NULL;
848 static GtkListStore *store[LAST_MC_PRESENCE];
853 GtkWidget *checkbutton;
854 const gchar *default_status;
857 gtk_widget_destroy (dialog);
862 for (i = 0; i < LAST_MC_PRESENCE; i++) {
867 glade = empathy_glade_get_file ("empathy-presence-chooser.glade",
868 "status_message_dialog",
870 "status_message_dialog", &dialog,
871 "comboentry_status", &combo,
872 "image_status", &image,
873 "checkbutton_add", &checkbutton,
876 g_object_unref (glade);
878 g_signal_connect (dialog, "destroy",
879 G_CALLBACK (gtk_widget_destroyed),
881 g_signal_connect (dialog, "response",
882 G_CALLBACK (presence_chooser_dialog_response_cb),
885 gtk_image_set_from_icon_name (GTK_IMAGE (image),
886 empathy_icon_name_for_presence_state (state),
893 store[state] = gtk_list_store_new (1, G_TYPE_STRING);
895 presets = empathy_status_presets_get (state, -1);
896 for (l = presets; l; l = l->next) {
897 gtk_list_store_append (store[state], &iter);
898 gtk_list_store_set (store[state], &iter, 0, l->data, -1);
901 g_list_free (presets);
904 default_status = empathy_presence_state_get_default_status (state);
906 entry = GTK_BIN (combo)->child;
907 gtk_entry_set_text (GTK_ENTRY (entry), default_status);
908 gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
909 gtk_entry_set_width_chars (GTK_ENTRY (entry), 25);
911 gtk_combo_box_set_model (GTK_COMBO_BOX (combo), GTK_TREE_MODEL (store[state]));
912 gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (combo), 0);
914 /* FIXME: Set transian for a window ? */
916 g_object_set_data (G_OBJECT (dialog), "store", store[state]);
917 g_object_set_data (G_OBJECT (dialog), "entry", entry);
918 g_object_set_data (G_OBJECT (dialog), "checkbutton", checkbutton);
919 g_object_set_data (G_OBJECT (dialog), "state", GINT_TO_POINTER (state));
921 gtk_widget_show_all (dialog);
925 presence_chooser_dialog_response_cb (GtkWidget *dialog,
929 if (response == GTK_RESPONSE_OK) {
931 GtkWidget *checkbutton;
938 gboolean duplicate = FALSE;
941 entry = g_object_get_data (G_OBJECT (dialog), "entry");
942 status = gtk_entry_get_text (GTK_ENTRY (entry));
943 store = g_object_get_data (G_OBJECT (dialog), "store");
944 model = GTK_TREE_MODEL (store);
946 has_next = gtk_tree_model_get_iter_first (model, &iter);
950 gtk_tree_model_get (model, &iter,
954 if (strcmp (status, str) == 0) {
962 has_next = gtk_tree_model_iter_next (model, &iter);
966 gtk_list_store_append (store, &iter);
967 gtk_list_store_set (store, &iter, 0, status, -1);
970 checkbutton = g_object_get_data (G_OBJECT (dialog), "checkbutton");
971 save = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton));
972 state = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog), "state"));
974 presence_chooser_set_state (state, status, save);
977 gtk_widget_destroy (dialog);