1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2006-2007 Imendio AB
4 * Copyright (C) 2007-2008 Collabora Ltd.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19 * Boston, MA 02110-1301 USA
21 * Authors: Martyn Russell <martyn@imendio.com>
22 * Xavier Claessens <xclaesse@gmail.com>
32 #include <glib/gi18n.h>
33 #include <glib/gprintf.h>
35 #include <telepathy-glib/interfaces.h>
37 #include <libempathy/empathy-tp-roomlist.h>
38 #include <libempathy/empathy-chatroom.h>
39 #include <libempathy/empathy-utils.h>
40 #include <libempathy/empathy-dispatcher.h>
42 #include <libempathy-gtk/empathy-account-chooser.h>
43 #include <libempathy-gtk/empathy-ui-utils.h>
45 #include "empathy-new-chatroom-dialog.h"
46 #include "ephy-spinner.h"
48 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
49 #include <libempathy/empathy-debug.h>
52 EmpathyTpRoomlist
*room_list
;
53 /* Currently selected account */
55 /* Signal id of the "status-changed" signal connected on the currently
57 gulong status_changed_id
;
60 GtkWidget
*vbox_widgets
;
61 GtkWidget
*table_info
;
62 GtkWidget
*label_account
;
63 GtkWidget
*account_chooser
;
64 GtkWidget
*label_server
;
65 GtkWidget
*entry_server
;
66 GtkWidget
*label_room
;
67 GtkWidget
*entry_room
;
68 GtkWidget
*expander_browse
;
72 GtkWidget
*button_join
;
73 GtkWidget
*label_error_message
;
74 GtkWidget
*viewport_error
;
75 } EmpathyNewChatroomDialog
;
88 static void new_chatroom_dialog_response_cb (GtkWidget
*widget
,
90 EmpathyNewChatroomDialog
*dialog
);
91 static void new_chatroom_dialog_destroy_cb (GtkWidget
*widget
,
92 EmpathyNewChatroomDialog
*dialog
);
93 static void new_chatroom_dialog_model_setup (EmpathyNewChatroomDialog
*dialog
);
94 static void new_chatroom_dialog_model_add_columns (EmpathyNewChatroomDialog
*dialog
);
95 static void new_chatroom_dialog_update_widgets (EmpathyNewChatroomDialog
*dialog
);
96 static void new_chatroom_dialog_account_changed_cb (GtkComboBox
*combobox
,
97 EmpathyNewChatroomDialog
*dialog
);
98 static void new_chatroom_dialog_roomlist_destroy_cb (EmpathyTpRoomlist
*room_list
,
99 EmpathyNewChatroomDialog
*dialog
);
100 static void new_chatroom_dialog_new_room_cb (EmpathyTpRoomlist
*room_list
,
101 EmpathyChatroom
*chatroom
,
102 EmpathyNewChatroomDialog
*dialog
);
103 static void new_chatroom_dialog_listing_cb (EmpathyTpRoomlist
*room_list
,
105 EmpathyNewChatroomDialog
*dialog
);
106 static void start_listing_error_cb (EmpathyTpRoomlist
*room_list
,
108 EmpathyNewChatroomDialog
*dialog
);
109 static void stop_listing_error_cb (EmpathyTpRoomlist
*room_list
,
111 EmpathyNewChatroomDialog
*dialog
);
112 static void new_chatroom_dialog_model_clear (EmpathyNewChatroomDialog
*dialog
);
113 static void new_chatroom_dialog_model_row_activated_cb (GtkTreeView
*tree_view
,
115 GtkTreeViewColumn
*column
,
116 EmpathyNewChatroomDialog
*dialog
);
117 static void new_chatroom_dialog_model_selection_changed (GtkTreeSelection
*selection
,
118 EmpathyNewChatroomDialog
*dialog
);
119 static void new_chatroom_dialog_join (EmpathyNewChatroomDialog
*dialog
);
120 static void new_chatroom_dialog_entry_changed_cb (GtkWidget
*entry
,
121 EmpathyNewChatroomDialog
*dialog
);
122 static void new_chatroom_dialog_browse_start (EmpathyNewChatroomDialog
*dialog
);
123 static void new_chatroom_dialog_browse_stop (EmpathyNewChatroomDialog
*dialog
);
124 static void new_chatroom_dialog_entry_server_activate_cb (GtkWidget
*widget
,
125 EmpathyNewChatroomDialog
*dialog
);
126 static void new_chatroom_dialog_expander_browse_activate_cb (GtkWidget
*widget
,
127 EmpathyNewChatroomDialog
*dialog
);
128 static gboolean
new_chatroom_dialog_entry_server_focus_out_cb (GtkWidget
*widget
,
129 GdkEventFocus
*event
,
130 EmpathyNewChatroomDialog
*dialog
);
131 static void new_chatroom_dialog_button_close_error_clicked_cb (GtkButton
*button
,
132 EmpathyNewChatroomDialog
*dialog
);
134 static EmpathyNewChatroomDialog
*dialog_p
= NULL
;
137 * empathy_account_chooser_filter_supports_multichat:
138 * @account: a #TpAccount
139 * @user_data: user data or %NULL
141 * An #EmpathyAccountChooserFilterFunc that returns accounts that both
142 * support multiuser text chat and are connected.
144 * Return value: TRUE if @account both supports muc and is connected
147 empathy_account_chooser_filter_supports_multichat (TpAccount
*account
,
150 TpConnection
*connection
;
151 EmpathyDispatcher
*dispatcher
;
154 if (tp_account_get_connection_status (account
, NULL
) !=
155 TP_CONNECTION_STATUS_CONNECTED
)
158 /* check if CM supports multiuser text chat */
159 connection
= tp_account_get_connection (account
);
160 if (connection
== NULL
)
163 dispatcher
= empathy_dispatcher_dup_singleton ();
165 classes
= empathy_dispatcher_find_requestable_channel_classes
166 (dispatcher
, connection
, TP_IFACE_CHANNEL_TYPE_TEXT
,
167 TP_HANDLE_TYPE_ROOM
, NULL
);
169 g_object_unref (dispatcher
);
174 g_list_free (classes
);
179 empathy_new_chatroom_dialog_show (GtkWindow
*parent
)
181 EmpathyNewChatroomDialog
*dialog
;
183 GtkSizeGroup
*size_group
;
187 gtk_window_present (GTK_WINDOW (dialog_p
->window
));
191 dialog_p
= dialog
= g_new0 (EmpathyNewChatroomDialog
, 1);
193 filename
= empathy_file_lookup ("empathy-new-chatroom-dialog.ui", "src");
194 gui
= empathy_builder_get_file (filename
,
195 "new_chatroom_dialog", &dialog
->window
,
196 "table_info", &dialog
->table_info
,
197 "label_account", &dialog
->label_account
,
198 "label_server", &dialog
->label_server
,
199 "label_room", &dialog
->label_room
,
200 "entry_server", &dialog
->entry_server
,
201 "entry_room", &dialog
->entry_room
,
202 "treeview", &dialog
->treeview
,
203 "button_join", &dialog
->button_join
,
204 "expander_browse", &dialog
->expander_browse
,
205 "label_error_message", &dialog
->label_error_message
,
206 "viewport_error", &dialog
->viewport_error
,
210 empathy_builder_connect (gui
, dialog
,
211 "new_chatroom_dialog", "response", new_chatroom_dialog_response_cb
,
212 "new_chatroom_dialog", "destroy", new_chatroom_dialog_destroy_cb
,
213 "entry_server", "changed", new_chatroom_dialog_entry_changed_cb
,
214 "entry_server", "activate", new_chatroom_dialog_entry_server_activate_cb
,
215 "entry_server", "focus-out-event", new_chatroom_dialog_entry_server_focus_out_cb
,
216 "entry_room", "changed", new_chatroom_dialog_entry_changed_cb
,
217 "expander_browse", "activate", new_chatroom_dialog_expander_browse_activate_cb
,
218 "button_close_error", "clicked", new_chatroom_dialog_button_close_error_clicked_cb
,
221 g_object_unref (gui
);
223 g_object_add_weak_pointer (G_OBJECT (dialog
->window
), (gpointer
) &dialog_p
);
225 /* Label alignment */
226 size_group
= gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL
);
228 gtk_size_group_add_widget (size_group
, dialog
->label_account
);
229 gtk_size_group_add_widget (size_group
, dialog
->label_server
);
230 gtk_size_group_add_widget (size_group
, dialog
->label_room
);
232 g_object_unref (size_group
);
234 /* Set up chatrooms treeview */
235 new_chatroom_dialog_model_setup (dialog
);
238 dialog
->throbber
= ephy_spinner_new ();
239 ephy_spinner_set_size (EPHY_SPINNER (dialog
->throbber
), GTK_ICON_SIZE_LARGE_TOOLBAR
);
240 gtk_widget_show (dialog
->throbber
);
241 gtk_table_attach (GTK_TABLE (dialog
->table_info
),
246 /* Account chooser for custom */
247 dialog
->account_chooser
= empathy_account_chooser_new ();
248 empathy_account_chooser_set_filter (EMPATHY_ACCOUNT_CHOOSER (dialog
->account_chooser
),
249 empathy_account_chooser_filter_supports_multichat
,
251 gtk_table_attach_defaults (GTK_TABLE (dialog
->table_info
),
252 dialog
->account_chooser
,
254 gtk_widget_show (dialog
->account_chooser
);
256 g_signal_connect (GTK_COMBO_BOX (dialog
->account_chooser
), "changed",
257 G_CALLBACK (new_chatroom_dialog_account_changed_cb
),
259 new_chatroom_dialog_account_changed_cb (GTK_COMBO_BOX (dialog
->account_chooser
),
263 gtk_window_set_transient_for (GTK_WINDOW (dialog
->window
),
264 GTK_WINDOW (parent
));
267 gtk_widget_show (dialog
->window
);
271 new_chatroom_dialog_response_cb (GtkWidget
*widget
,
273 EmpathyNewChatroomDialog
*dialog
)
275 if (response
== GTK_RESPONSE_OK
) {
276 new_chatroom_dialog_join (dialog
);
279 gtk_widget_destroy (widget
);
283 new_chatroom_dialog_destroy_cb (GtkWidget
*widget
,
284 EmpathyNewChatroomDialog
*dialog
)
286 if (dialog
->room_list
) {
287 g_object_unref (dialog
->room_list
);
289 g_object_unref (dialog
->model
);
291 if (dialog
->account
!= NULL
) {
292 g_signal_handler_disconnect (dialog
->account
, dialog
->status_changed_id
);
293 g_object_unref (dialog
->account
);
300 new_chatroom_dialog_model_setup (EmpathyNewChatroomDialog
*dialog
)
304 GtkTreeSelection
*selection
;
307 view
= GTK_TREE_VIEW (dialog
->treeview
);
309 g_signal_connect (view
, "row-activated",
310 G_CALLBACK (new_chatroom_dialog_model_row_activated_cb
),
314 store
= gtk_list_store_new (COL_COUNT
,
315 G_TYPE_STRING
, /* Invite */
316 G_TYPE_STRING
, /* Password */
317 G_TYPE_STRING
, /* Name */
318 G_TYPE_STRING
, /* Room */
319 G_TYPE_STRING
, /* Member count */
320 G_TYPE_INT
, /* Member count int */
321 G_TYPE_STRING
); /* Tool tip */
323 dialog
->model
= GTK_TREE_MODEL (store
);
324 gtk_tree_view_set_model (view
, dialog
->model
);
325 gtk_tree_view_set_tooltip_column (view
, COL_TOOLTIP
);
326 gtk_tree_view_set_search_column (view
, COL_NAME
);
329 selection
= gtk_tree_view_get_selection (view
);
330 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store
),
331 COL_NAME
, GTK_SORT_ASCENDING
);
333 g_signal_connect (selection
, "changed",
334 G_CALLBACK (new_chatroom_dialog_model_selection_changed
),
338 new_chatroom_dialog_model_add_columns (dialog
);
342 new_chatroom_dialog_model_add_columns (EmpathyNewChatroomDialog
*dialog
)
345 GtkTreeViewColumn
*column
;
346 GtkCellRenderer
*cell
;
349 gtk_icon_size_lookup (GTK_ICON_SIZE_MENU
, &width
, &height
);
351 view
= GTK_TREE_VIEW (dialog
->treeview
);
353 cell
= gtk_cell_renderer_pixbuf_new ();
357 "stock-size", GTK_ICON_SIZE_MENU
,
359 column
= gtk_tree_view_column_new_with_attributes (NULL
,
361 "stock-id", COL_INVITE_ONLY
,
364 gtk_tree_view_column_set_sort_column_id (column
, COL_INVITE_ONLY
);
365 gtk_tree_view_append_column (view
, column
);
367 column
= gtk_tree_view_column_new_with_attributes (NULL
,
369 "stock-id", COL_NEED_PASSWORD
,
372 gtk_tree_view_column_set_sort_column_id (column
, COL_NEED_PASSWORD
);
373 gtk_tree_view_append_column (view
, column
);
375 cell
= gtk_cell_renderer_text_new ();
379 "ellipsize", PANGO_ELLIPSIZE_END
,
382 column
= gtk_tree_view_column_new_with_attributes (_("Chat Room"),
387 gtk_tree_view_column_set_sort_column_id (column
, COL_NAME
);
388 gtk_tree_view_column_set_expand (column
, TRUE
);
389 gtk_tree_view_append_column (view
, column
);
391 cell
= gtk_cell_renderer_text_new ();
395 "ellipsize", PANGO_ELLIPSIZE_END
,
396 "alignment", PANGO_ALIGN_RIGHT
,
398 column
= gtk_tree_view_column_new_with_attributes (_("Members"),
403 gtk_tree_view_column_set_sort_column_id (column
, COL_MEMBERS_INT
);
404 gtk_tree_view_append_column (view
, column
);
408 update_join_button_sensitivity (EmpathyNewChatroomDialog
*dialog
)
411 gboolean sensitive
= FALSE
;
414 room
= gtk_entry_get_text (GTK_ENTRY (dialog
->entry_room
));
415 if (EMP_STR_EMPTY (room
))
418 if (dialog
->account
== NULL
)
421 if (tp_account_get_connection_status (dialog
->account
, NULL
) !=
422 TP_CONNECTION_STATUS_CONNECTED
)
428 gtk_widget_set_sensitive (dialog
->button_join
, sensitive
);
432 new_chatroom_dialog_update_widgets (EmpathyNewChatroomDialog
*dialog
)
434 EmpathyAccountChooser
*account_chooser
;
435 const gchar
*protocol
;
437 account_chooser
= EMPATHY_ACCOUNT_CHOOSER (dialog
->account_chooser
);
439 if (dialog
->account
== NULL
)
442 protocol
= tp_account_get_protocol (dialog
->account
);
444 gtk_entry_set_text (GTK_ENTRY (dialog
->entry_server
), "");
446 /* hardcode here known protocols */
447 if (strcmp (protocol
, "jabber") == 0) {
448 gtk_widget_set_sensitive (dialog
->entry_server
, TRUE
);
450 else if (strcmp (protocol
, "local-xmpp") == 0) {
451 gtk_widget_set_sensitive (dialog
->entry_server
, FALSE
);
453 else if (strcmp (protocol
, "irc") == 0) {
454 gtk_widget_set_sensitive (dialog
->entry_server
, FALSE
);
457 gtk_widget_set_sensitive (dialog
->entry_server
, TRUE
);
460 update_join_button_sensitivity (dialog
);
462 /* Final set up of the dialog */
463 gtk_widget_grab_focus (dialog
->entry_room
);
467 account_status_changed_cb (TpAccount
*account
,
471 gchar
*dbus_error_name
,
473 EmpathyNewChatroomDialog
*self
)
475 update_join_button_sensitivity (self
);
479 new_chatroom_dialog_account_changed_cb (GtkComboBox
*combobox
,
480 EmpathyNewChatroomDialog
*dialog
)
482 EmpathyAccountChooser
*account_chooser
;
483 gboolean listing
= FALSE
;
484 gboolean expanded
= FALSE
;
485 TpConnection
*connection
;
486 EmpathyDispatcher
*dispatcher
;
488 if (dialog
->room_list
) {
489 g_object_unref (dialog
->room_list
);
490 dialog
->room_list
= NULL
;
493 ephy_spinner_stop (EPHY_SPINNER (dialog
->throbber
));
494 new_chatroom_dialog_model_clear (dialog
);
496 if (dialog
->account
!= NULL
) {
497 g_signal_handler_disconnect (dialog
->account
, dialog
->status_changed_id
);
498 g_object_unref (dialog
->account
);
501 account_chooser
= EMPATHY_ACCOUNT_CHOOSER (dialog
->account_chooser
);
502 dialog
->account
= empathy_account_chooser_dup_account (account_chooser
);
503 connection
= empathy_account_chooser_get_connection (account_chooser
);
504 if (dialog
->account
== NULL
)
507 dialog
->status_changed_id
= g_signal_connect (dialog
->account
,
508 "status-changed", G_CALLBACK (account_status_changed_cb
), dialog
);
510 dispatcher
= empathy_dispatcher_dup_singleton ();
512 if (connection
!= NULL
&&
513 empathy_dispatcher_find_requestable_channel_classes (dispatcher
,
514 connection
, TP_IFACE_CHANNEL_TYPE_ROOM_LIST
,
515 TP_HANDLE_TYPE_NONE
, NULL
) != NULL
) {
516 /* Roomlist channels are supported */
517 dialog
->room_list
= empathy_tp_roomlist_new (dialog
->account
);
520 g_object_unref (dispatcher
);
522 if (dialog
->room_list
) {
523 g_signal_connect (dialog
->room_list
, "destroy",
524 G_CALLBACK (new_chatroom_dialog_roomlist_destroy_cb
),
526 g_signal_connect (dialog
->room_list
, "new-room",
527 G_CALLBACK (new_chatroom_dialog_new_room_cb
),
529 g_signal_connect (dialog
->room_list
, "notify::is-listing",
530 G_CALLBACK (new_chatroom_dialog_listing_cb
),
532 g_signal_connect (dialog
->room_list
, "error::start",
533 G_CALLBACK (start_listing_error_cb
),
535 g_signal_connect (dialog
->room_list
, "error::stop",
536 G_CALLBACK (stop_listing_error_cb
),
539 expanded
= gtk_expander_get_expanded (GTK_EXPANDER (dialog
->expander_browse
));
541 gtk_widget_hide (dialog
->viewport_error
);
542 gtk_widget_set_sensitive (dialog
->treeview
, TRUE
);
543 new_chatroom_dialog_browse_start (dialog
);
546 listing
= empathy_tp_roomlist_is_listing (dialog
->room_list
);
548 ephy_spinner_start (EPHY_SPINNER (dialog
->throbber
));
552 gtk_widget_set_sensitive (dialog
->expander_browse
, dialog
->room_list
!= NULL
);
555 new_chatroom_dialog_update_widgets (dialog
);
559 new_chatroom_dialog_button_close_error_clicked_cb (GtkButton
*button
,
560 EmpathyNewChatroomDialog
*dialog
)
562 gtk_widget_hide (dialog
->viewport_error
);
566 new_chatroom_dialog_roomlist_destroy_cb (EmpathyTpRoomlist
*room_list
,
567 EmpathyNewChatroomDialog
*dialog
)
569 g_object_unref (dialog
->room_list
);
570 dialog
->room_list
= NULL
;
574 new_chatroom_dialog_new_room_cb (EmpathyTpRoomlist
*room_list
,
575 EmpathyChatroom
*chatroom
,
576 EmpathyNewChatroomDialog
*dialog
)
579 GtkTreeSelection
*selection
;
584 const gchar
*need_password
;
585 const gchar
*invite_only
;
587 DEBUG ("New chatroom listed: %s (%s)",
588 empathy_chatroom_get_name (chatroom
),
589 empathy_chatroom_get_room (chatroom
));
592 view
= GTK_TREE_VIEW (dialog
->treeview
);
593 selection
= gtk_tree_view_get_selection (view
);
594 store
= GTK_LIST_STORE (dialog
->model
);
595 members
= g_strdup_printf ("%d", empathy_chatroom_get_members_count (chatroom
));
596 /* Translators: Room/Join's roomlist tooltip. Parameters are a channel name,
597 yes/no, yes/no and a number. */
598 tooltip
= g_strdup_printf (_("<b>%s</b>\nInvite required: %s\nPassword required: %s\nMembers: %s"),
599 empathy_chatroom_get_name (chatroom
),
600 empathy_chatroom_get_invite_only (chatroom
) ? _("Yes") : _("No"),
601 empathy_chatroom_get_need_password (chatroom
) ? _("Yes") : _("No"),
603 invite_only
= (empathy_chatroom_get_invite_only (chatroom
) ?
604 GTK_STOCK_INDEX
: NULL
);
605 need_password
= (empathy_chatroom_get_need_password (chatroom
) ?
606 GTK_STOCK_DIALOG_AUTHENTICATION
: NULL
);
608 gtk_list_store_append (store
, &iter
);
609 gtk_list_store_set (store
, &iter
,
610 COL_NEED_PASSWORD
, need_password
,
611 COL_INVITE_ONLY
, invite_only
,
612 COL_NAME
, empathy_chatroom_get_name (chatroom
),
613 COL_ROOM
, empathy_chatroom_get_room (chatroom
),
614 COL_MEMBERS
, members
,
615 COL_MEMBERS_INT
, empathy_chatroom_get_members_count (chatroom
),
616 COL_TOOLTIP
, tooltip
,
624 start_listing_error_cb (EmpathyTpRoomlist
*room_list
,
626 EmpathyNewChatroomDialog
*dialog
)
628 gtk_label_set_text (GTK_LABEL (dialog
->label_error_message
), _("Could not start room listing"));
629 gtk_widget_show_all (dialog
->viewport_error
);
630 gtk_widget_set_sensitive (dialog
->treeview
, FALSE
);
634 stop_listing_error_cb (EmpathyTpRoomlist
*room_list
,
636 EmpathyNewChatroomDialog
*dialog
)
638 gtk_label_set_text (GTK_LABEL (dialog
->label_error_message
), _("Could not stop room listing"));
639 gtk_widget_show_all (dialog
->viewport_error
);
640 gtk_widget_set_sensitive (dialog
->treeview
, FALSE
);
644 new_chatroom_dialog_listing_cb (EmpathyTpRoomlist
*room_list
,
646 EmpathyNewChatroomDialog
*dialog
)
650 listing
= empathy_tp_roomlist_is_listing (room_list
);
652 /* Update the throbber */
654 ephy_spinner_start (EPHY_SPINNER (dialog
->throbber
));
656 ephy_spinner_stop (EPHY_SPINNER (dialog
->throbber
));
661 new_chatroom_dialog_model_clear (EmpathyNewChatroomDialog
*dialog
)
665 store
= GTK_LIST_STORE (dialog
->model
);
666 gtk_list_store_clear (store
);
670 new_chatroom_dialog_model_row_activated_cb (GtkTreeView
*tree_view
,
672 GtkTreeViewColumn
*column
,
673 EmpathyNewChatroomDialog
*dialog
)
675 gtk_widget_activate (dialog
->button_join
);
679 new_chatroom_dialog_model_selection_changed (GtkTreeSelection
*selection
,
680 EmpathyNewChatroomDialog
*dialog
)
685 gchar
*server
= NULL
;
687 if (!gtk_tree_selection_get_selected (selection
, &model
, &iter
)) {
691 gtk_tree_model_get (model
, &iter
, COL_ROOM
, &room
, -1);
692 server
= strstr (room
, "@");
698 gtk_entry_set_text (GTK_ENTRY (dialog
->entry_server
), server
? server
: "");
699 gtk_entry_set_text (GTK_ENTRY (dialog
->entry_room
), room
? room
: "");
705 new_chatroom_dialog_join (EmpathyNewChatroomDialog
*dialog
)
707 EmpathyAccountChooser
*account_chooser
;
708 TpConnection
*connection
;
710 const gchar
*server
= NULL
;
711 gchar
*room_name
= NULL
;
713 room
= gtk_entry_get_text (GTK_ENTRY (dialog
->entry_room
));
714 server
= gtk_entry_get_text (GTK_ENTRY (dialog
->entry_server
));
716 account_chooser
= EMPATHY_ACCOUNT_CHOOSER (dialog
->account_chooser
);
717 connection
= empathy_account_chooser_get_connection (account_chooser
);
719 if (!EMP_STR_EMPTY (server
)) {
720 room_name
= g_strconcat (room
, "@", server
, NULL
);
722 room_name
= g_strdup (room
);
725 DEBUG ("Requesting channel for '%s'", room_name
);
726 empathy_dispatcher_join_muc (connection
, room_name
, NULL
, NULL
);
732 new_chatroom_dialog_entry_changed_cb (GtkWidget
*entry
,
733 EmpathyNewChatroomDialog
*dialog
)
735 if (entry
== dialog
->entry_room
) {
736 update_join_button_sensitivity (dialog
);
738 /* FIXME: Select the room in the list */
743 new_chatroom_dialog_browse_start (EmpathyNewChatroomDialog
*dialog
)
745 new_chatroom_dialog_model_clear (dialog
);
746 if (dialog
->room_list
) {
747 empathy_tp_roomlist_start (dialog
->room_list
);
752 new_chatroom_dialog_browse_stop (EmpathyNewChatroomDialog
*dialog
)
754 if (dialog
->room_list
) {
755 empathy_tp_roomlist_stop (dialog
->room_list
);
760 new_chatroom_dialog_entry_server_activate_cb (GtkWidget
*widget
,
761 EmpathyNewChatroomDialog
*dialog
)
763 new_chatroom_dialog_browse_start (dialog
);
767 new_chatroom_dialog_expander_browse_activate_cb (GtkWidget
*widget
,
768 EmpathyNewChatroomDialog
*dialog
)
772 expanded
= gtk_expander_get_expanded (GTK_EXPANDER (widget
));
774 new_chatroom_dialog_browse_stop (dialog
);
775 gtk_window_set_resizable (GTK_WINDOW (dialog
->window
), FALSE
);
777 gtk_widget_hide (dialog
->viewport_error
);
778 gtk_widget_set_sensitive (dialog
->treeview
, TRUE
);
779 new_chatroom_dialog_browse_start (dialog
);
780 gtk_window_set_resizable (GTK_WINDOW (dialog
->window
), TRUE
);
785 new_chatroom_dialog_entry_server_focus_out_cb (GtkWidget
*widget
,
786 GdkEventFocus
*event
,
787 EmpathyNewChatroomDialog
*dialog
)
791 expanded
= gtk_expander_get_expanded (GTK_EXPANDER (dialog
->expander_browse
));
793 new_chatroom_dialog_browse_start (dialog
);