2 * Copyright (C) 2004-2008 Peter Zelezny.
10 #include <gtk/gtkversion.h>
11 #include <gtk/gtkcheckbutton.h>
12 #include <gtk/gtkcellrenderertext.h>
13 #include <gtk/gtkcomboboxentry.h>
14 #include <gtk/gtkentry.h>
15 #include <gtk/gtkhbox.h>
16 #include <gtk/gtkhbbox.h>
17 #include <gtk/gtkhseparator.h>
18 #include <gtk/gtkimage.h>
19 #include <gtk/gtklabel.h>
20 #include <gtk/gtkliststore.h>
21 #include <gtk/gtkmenuitem.h>
22 #include <gtk/gtkmessagedialog.h>
23 #include <gtk/gtkscrolledwindow.h>
24 #include <gtk/gtkstock.h>
25 #include <gtk/gtktable.h>
26 #include <gtk/gtktogglebutton.h>
27 #include <gtk/gtktree.h>
28 #include <gtk/gtktreeselection.h>
29 #include <gtk/gtktreeview.h>
30 #include <gtk/gtkvbbox.h>
31 #include <gtk/gtkvbox.h>
32 #include <gtk/gtkwindow.h>
33 #include <gdk/gdkkeysyms.h>
35 #include "../common/xchat.h"
36 #include "../common/xchatc.h"
37 #include "../common/servlist.h"
38 #include "../common/cfgfiles.h"
39 #include "../common/fe.h"
47 /* servlistgui.c globals */
48 static GtkWidget
*serverlist_win
= NULL
;
49 static GtkWidget
*networks_tree
; /* network TreeView */
50 static int ignore_changed
= FALSE
;
51 static int win_width
= 364;
52 static int win_height
= 478;
54 /* global user info */
55 static GtkWidget
*entry_nick1
;
56 static GtkWidget
*entry_nick2
;
57 static GtkWidget
*entry_nick3
;
58 static GtkWidget
*entry_guser
;
59 static GtkWidget
*entry_greal
;
62 static GtkWidget
*edit_win
;
63 static GtkWidget
*edit_entry_nick
;
64 static GtkWidget
*edit_entry_nick2
;
65 static GtkWidget
*edit_entry_user
;
66 static GtkWidget
*edit_entry_real
;
67 static GtkWidget
*edit_entry_join
;
68 static GtkWidget
*edit_entry_pass
;
69 static GtkWidget
*edit_entry_cmd
;
70 static GtkWidget
*edit_entry_nickserv
;
71 static GtkWidget
*edit_label_nick
;
72 static GtkWidget
*edit_label_nick2
;
73 static GtkWidget
*edit_label_real
;
74 static GtkWidget
*edit_label_user
;
75 static GtkWidget
*edit_tree
;
77 static ircnet
*selected_net
= NULL
;
78 static ircserver
*selected_serv
= NULL
;
79 static ircnet
*fav_add_net
= NULL
; /* used in Add/Remove fav context menus */
80 static session
*servlist_sess
;
82 static void servlist_network_row_cb (GtkTreeSelection
*sel
, gpointer user_data
);
83 static GtkWidget
*servlist_open_edit (GtkWidget
*parent
, ircnet
*net
);
86 static const char *pages
[]=
89 "IRC (Latin/Unicode Hybrid)",
90 "ISO-8859-15 (Western Europe)",
91 "ISO-8859-2 (Central Europe)",
93 "ISO-8859-8 (Hebrew)",
94 "ISO-8859-9 (Turkish)",
95 "ISO-2022-JP (Japanese)",
107 /* This is our dictionary for authentication types. Keep these in sync with
108 * login_types[]! This allows us to re-order the login type dropdown in the
109 * network list without breaking config compatibility.
111 static int login_types_conf
[] =
113 0, /* default - we don't use this but it makes indexing consistent with login_types[] so it's nice */
116 1, /* /msg NickServ */
123 static const char *login_types
[]=
136 /* poor man's IndexOf() - find the dropdown string index that belongs to the given config value */
138 servlist_get_login_desc_index (int conf_value
)
141 int length
= sizeof (login_types_conf
) / sizeof (login_types_conf
[0]); /* the number of elements in the conf array */
143 for (i
= 0; i
< length
; i
++)
145 if (login_types_conf
[i
] == conf_value
)
151 return 0; /* make the compiler happy */
155 servlist_select_and_show (GtkTreeView
*treeview
, GtkTreeIter
*iter
,
159 GtkTreeSelection
*sel
;
161 sel
= gtk_tree_view_get_selection (treeview
);
163 /* select this network */
164 gtk_tree_selection_select_iter (sel
, iter
);
165 /* and make sure it's visible */
166 path
= gtk_tree_model_get_path (GTK_TREE_MODEL (store
), iter
);
169 gtk_tree_view_scroll_to_cell (treeview
, path
, NULL
, TRUE
, 0.5, 0.5);
170 gtk_tree_view_set_cursor (treeview
, path
, NULL
, FALSE
);
171 gtk_tree_path_free (path
);
176 servlist_servers_populate (ircnet
*net
, GtkWidget
*treeview
)
182 GSList
*list
= net
->servlist
;
184 store
= (GtkListStore
*)gtk_tree_view_get_model (GTK_TREE_VIEW (treeview
));
185 gtk_list_store_clear (store
);
191 gtk_list_store_append (store
, &iter
);
192 gtk_list_store_set (store
, &iter
, 0, serv
->hostname
, 1, 1, -1);
194 if (net
->selected
== i
)
195 /* select this server */
196 servlist_select_and_show (GTK_TREE_VIEW (treeview
), &iter
, store
);
204 servlist_networks_populate_ (GtkWidget
*treeview
, GSList
*netlist
, gboolean favorites
)
213 net
= servlist_net_add (_("New Network"), "", FALSE
);
214 servlist_server_add (net
, "newserver/6667");
215 netlist
= network_list
;
217 store
= (GtkListStore
*)gtk_tree_view_get_model (GTK_TREE_VIEW (treeview
));
218 gtk_list_store_clear (store
);
224 if (!favorites
|| (net
->flags
& FLAG_FAVORITE
))
227 gtk_list_store_insert_with_values (store
, &iter
, 0x7fffffff, 0, net
->name
, 1, 1, 2, 400, -1);
229 gtk_list_store_insert_with_values (store
, &iter
, 0x7fffffff, 0, net
->name
, 1, 1, 2, (net
->flags
& FLAG_FAVORITE
) ? 800 : 400, -1);
230 if (i
== prefs
.slist_select
)
232 /* select this network */
233 servlist_select_and_show (GTK_TREE_VIEW (treeview
), &iter
, store
);
238 netlist
= netlist
->next
;
243 servlist_networks_populate (GtkWidget
*treeview
, GSList
*netlist
)
245 servlist_networks_populate_ (treeview
, netlist
, prefs
.slist_fav
);
249 servlist_server_row_cb (GtkTreeSelection
*sel
, gpointer user_data
)
260 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
262 gtk_tree_model_get (model
, &iter
, 0, &servname
, -1);
263 serv
= servlist_server_find (selected_net
, servname
, &pos
);
266 selected_net
->selected
= pos
;
267 selected_serv
= serv
;
272 servlist_start_editing (GtkTreeView
*tree
)
274 GtkTreeSelection
*sel
;
279 sel
= gtk_tree_view_get_selection (tree
);
281 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
283 path
= gtk_tree_model_get_path (GTK_TREE_MODEL (model
), &iter
);
286 gtk_tree_view_set_cursor (tree
, path
,
287 gtk_tree_view_get_column (tree
, 0), TRUE
);
288 gtk_tree_path_free (path
);
294 servlist_addserver_cb (GtkWidget
*item
, GtkWidget
*treeview
)
302 store
= (GtkListStore
*)gtk_tree_view_get_model (GTK_TREE_VIEW (treeview
));
303 servlist_server_add (selected_net
, "newserver/6667");
305 gtk_list_store_append (store
, &iter
);
306 gtk_list_store_set (store
, &iter
, 0, "newserver/6667", 1, 1, -1);
308 /* select this server */
309 servlist_select_and_show (GTK_TREE_VIEW (treeview
), &iter
, store
);
310 /*servlist_start_editing (GTK_TREE_VIEW (treeview));*/
312 servlist_server_row_cb (gtk_tree_view_get_selection (GTK_TREE_VIEW (networks_tree
)), NULL
);
316 servlist_addnet_cb (GtkWidget
*item
, GtkTreeView
*treeview
)
322 net
= servlist_net_add (_("New Network"), "", TRUE
);
323 net
->encoding
= strdup ("IRC (Latin/Unicode Hybrid)");
324 servlist_server_add (net
, "newserver/6667");
326 store
= (GtkListStore
*)gtk_tree_view_get_model (treeview
);
327 gtk_list_store_prepend (store
, &iter
);
328 gtk_list_store_set (store
, &iter
, 0, net
->name
, 1, 1, -1);
330 /* select this network */
331 servlist_select_and_show (GTK_TREE_VIEW (networks_tree
), &iter
, store
);
332 servlist_start_editing (GTK_TREE_VIEW (networks_tree
));
334 servlist_network_row_cb (gtk_tree_view_get_selection (GTK_TREE_VIEW (networks_tree
)), NULL
);
338 servlist_deletenetwork (ircnet
*net
)
340 GtkTreeSelection
*sel
;
344 /* remove from GUI */
345 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW (networks_tree
));
346 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
347 gtk_list_store_remove (GTK_LIST_STORE (model
), &iter
);
349 /* remove from list */
350 servlist_net_remove (net
);
352 /* force something to be selected */
353 gtk_tree_model_get_iter_first (model
, &iter
);
354 servlist_select_and_show (GTK_TREE_VIEW (networks_tree
), &iter
,
355 GTK_LIST_STORE (model
));
356 servlist_network_row_cb (sel
, NULL
);
360 servlist_deletenetdialog_cb (GtkDialog
*dialog
, gint arg1
, ircnet
*net
)
362 gtk_widget_destroy (GTK_WIDGET (dialog
));
363 if (arg1
== GTK_RESPONSE_OK
)
364 servlist_deletenetwork (net
);
368 servlist_move_server (ircserver
*serv
, int delta
)
372 pos
= g_slist_index (selected_net
->servlist
, serv
);
378 selected_net
->servlist
= g_slist_remove (selected_net
->servlist
, serv
);
379 selected_net
->servlist
= g_slist_insert (selected_net
->servlist
, serv
, pos
);
380 servlist_servers_populate (selected_net
, edit_tree
);
386 servlist_move_network (ircnet
*net
, int delta
)
390 pos
= g_slist_index (network_list
, net
);
396 /*prefs.slist_select += delta;*/
397 network_list
= g_slist_remove (network_list
, net
);
398 network_list
= g_slist_insert (network_list
, net
, pos
);
399 servlist_networks_populate (networks_tree
, network_list
);
405 servlist_net_keypress_cb (GtkWidget
*wid
, GdkEventKey
*evt
, gpointer tree
)
410 if (evt
->state
& GDK_SHIFT_MASK
)
412 if (evt
->keyval
== GDK_Up
)
414 servlist_move_network (selected_net
, -1);
416 else if (evt
->keyval
== GDK_Down
)
418 servlist_move_network (selected_net
, +1);
426 servlist_serv_keypress_cb (GtkWidget
*wid
, GdkEventKey
*evt
, gpointer userdata
)
428 if (!selected_net
|| !selected_serv
)
431 if (evt
->state
& GDK_SHIFT_MASK
)
433 if (evt
->keyval
== GDK_Up
)
435 servlist_move_server (selected_serv
, -1);
437 else if (evt
->keyval
== GDK_Down
)
439 servlist_move_server (selected_serv
, +1);
447 servlist_compare (ircnet
*net1
, ircnet
*net2
)
449 gchar
*net1_casefolded
, *net2_casefolded
;
452 net1_casefolded
=g_utf8_casefold(net1
->name
,-1),
453 net2_casefolded
=g_utf8_casefold(net2
->name
,-1),
455 result
=g_utf8_collate(net1_casefolded
,net2_casefolded
);
457 g_free(net1_casefolded
);
458 g_free(net2_casefolded
);
465 servlist_sort (GtkWidget
*button
, gpointer none
)
467 network_list
=g_slist_sort(network_list
,(GCompareFunc
)servlist_compare
);
468 servlist_networks_populate (networks_tree
, network_list
);
472 servlist_has_selection (GtkTreeView
*tree
)
474 GtkTreeSelection
*sel
;
478 /* make sure something is selected */
479 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW (tree
));
480 return gtk_tree_selection_get_selected (sel
, &model
, &iter
);
484 servlist_favor (GtkWidget
*button
, gpointer none
)
486 GtkTreeSelection
*sel
;
493 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW (networks_tree
));
494 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
496 if (selected_net
->flags
& FLAG_FAVORITE
)
498 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, 2, 400, -1);
499 selected_net
->flags
&= ~FLAG_FAVORITE
;
503 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, 2, 800, -1);
504 selected_net
->flags
|= FLAG_FAVORITE
;
510 servlist_update_from_entry (char **str
, GtkWidget
*entry
)
515 if (GTK_ENTRY (entry
)->text
[0] == 0)
518 *str
= strdup (GTK_ENTRY (entry
)->text
);
522 servlist_edit_update (ircnet
*net
)
524 servlist_update_from_entry (&net
->nick
, edit_entry_nick
);
525 servlist_update_from_entry (&net
->nick2
, edit_entry_nick2
);
526 servlist_update_from_entry (&net
->user
, edit_entry_user
);
527 servlist_update_from_entry (&net
->real
, edit_entry_real
);
529 servlist_update_from_entry (&net
->autojoin
, edit_entry_join
);
530 servlist_update_from_entry (&net
->command
, edit_entry_cmd
);
531 servlist_update_from_entry (&net
->nickserv
, edit_entry_nickserv
);
532 servlist_update_from_entry (&net
->pass
, edit_entry_pass
);
536 servlist_edit_close_cb (GtkWidget
*button
, gpointer userdata
)
539 servlist_edit_update (selected_net
);
541 gtk_widget_destroy (edit_win
);
546 servlist_editwin_delete_cb (GtkWidget
*win
, GdkEventAny
*event
, gpointer none
)
548 servlist_edit_close_cb (NULL
, NULL
);
553 servlist_configure_cb (GtkWindow
*win
, GdkEventConfigure
*event
, gpointer none
)
555 /* remember the window size */
556 gtk_window_get_size (win
, &win_width
, &win_height
);
561 servlist_edit_cb (GtkWidget
*but
, gpointer none
)
563 if (!servlist_has_selection (GTK_TREE_VIEW (networks_tree
)))
566 edit_win
= servlist_open_edit (serverlist_win
, selected_net
);
567 gtkutil_set_icon (edit_win
);
568 servlist_servers_populate (selected_net
, edit_tree
);
569 g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (edit_tree
))),
570 "changed", G_CALLBACK (servlist_server_row_cb
), NULL
);
571 g_signal_connect (G_OBJECT (edit_win
), "delete_event",
572 G_CALLBACK (servlist_editwin_delete_cb
), 0);
573 g_signal_connect (G_OBJECT (edit_tree
), "key_press_event",
574 G_CALLBACK (servlist_serv_keypress_cb
), 0);
575 gtk_widget_show (edit_win
);
579 servlist_deletenet_cb (GtkWidget
*item
, ircnet
*net
)
583 if (!servlist_has_selection (GTK_TREE_VIEW (networks_tree
)))
589 dialog
= gtk_message_dialog_new (GTK_WINDOW (serverlist_win
),
590 GTK_DIALOG_DESTROY_WITH_PARENT
|
592 GTK_MESSAGE_QUESTION
,
593 GTK_BUTTONS_OK_CANCEL
,
594 _("Really remove network \"%s\" and all its servers?"),
596 g_signal_connect (dialog
, "response",
597 G_CALLBACK (servlist_deletenetdialog_cb
), net
);
598 gtk_window_set_position (GTK_WINDOW (dialog
), GTK_WIN_POS_MOUSE
);
599 gtk_widget_show (dialog
);
603 servlist_deleteserver (ircserver
*serv
, GtkTreeModel
*model
)
605 GtkTreeSelection
*sel
;
608 /* don't remove the last server */
609 if (selected_net
&& g_slist_length (selected_net
->servlist
) < 2)
612 /* remove from GUI */
613 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW (edit_tree
));
614 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
615 gtk_list_store_remove (GTK_LIST_STORE (model
), &iter
);
617 /* remove from list */
619 servlist_server_remove (selected_net
, serv
);
623 servlist_editserverbutton_cb (GtkWidget
*item
, gpointer none
)
625 servlist_start_editing (GTK_TREE_VIEW (edit_tree
));
629 servlist_deleteserver_cb (GtkWidget
*item
, gpointer none
)
631 GtkTreeSelection
*sel
;
638 /* find the selected item in the GUI */
639 model
= gtk_tree_view_get_model (GTK_TREE_VIEW (edit_tree
));
640 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW (edit_tree
));
642 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
644 gtk_tree_model_get (model
, &iter
, 0, &servname
, -1);
645 serv
= servlist_server_find (selected_net
, servname
, &pos
);
648 servlist_deleteserver (serv
, model
);
653 servlist_find_selected_net (GtkTreeSelection
*sel
)
661 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
663 gtk_tree_model_get (model
, &iter
, 0, &netname
, -1);
664 net
= servlist_net_find (netname
, &pos
, strcmp
);
667 prefs
.slist_select
= pos
;
674 servlist_network_row_cb (GtkTreeSelection
*sel
, gpointer user_data
)
680 net
= servlist_find_selected_net (sel
);
686 servlist_savegui (void)
690 /* check for blank username, ircd will not allow this */
691 if (GTK_ENTRY (entry_guser
)->text
[0] == 0)
694 if (GTK_ENTRY (entry_greal
)->text
[0] == 0)
697 strcpy (prefs
.nick1
, GTK_ENTRY (entry_nick1
)->text
);
698 strcpy (prefs
.nick2
, GTK_ENTRY (entry_nick2
)->text
);
699 strcpy (prefs
.nick3
, GTK_ENTRY (entry_nick3
)->text
);
700 strcpy (prefs
.username
, GTK_ENTRY (entry_guser
)->text
);
701 sp
= strchr (prefs
.username
, ' ');
703 sp
[0] = 0; /* spaces will break the login */
704 strcpy (prefs
.realname
, GTK_ENTRY (entry_greal
)->text
);
711 servlist_get_iter_from_name (GtkTreeModel
*model
, gchar
*name
, GtkTreeIter
*iter
)
713 GtkTreePath
*path
= gtk_tree_path_new_from_string (name
);
715 if (!gtk_tree_model_get_iter (model
, iter
, path
))
717 gtk_tree_path_free (path
);
721 gtk_tree_path_free (path
);
726 servlist_editchannel_cb (GtkCellRendererText
*cell
, gchar
*name
, gchar
*newval
, GtkTreeModel
*model
)
729 static int loop_guard
= FALSE
;
734 if (!servlist_get_iter_from_name (model
, name
, &iter
))
738 /* delete empty item */
740 gtk_list_store_remove (GTK_LIST_STORE (model
), &iter
);
742 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, 0, newval
, -1);
747 servlist_editkey_cb (GtkCellRendererText
*cell
, gchar
*name
, gchar
*newval
, GtkTreeModel
*model
)
751 if (!servlist_get_iter_from_name (model
, name
, &iter
))
754 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, 1, newval
, -1);
758 servlist_addchannel (GtkWidget
*tree
, char *channel
)
763 store
= (GtkListStore
*)gtk_tree_view_get_model (GTK_TREE_VIEW (tree
));
765 gtk_list_store_append (store
, &iter
);
766 gtk_list_store_set (store
, &iter
, 0, channel
, 1, "", 2, TRUE
, -1);
768 /* select this server */
769 servlist_select_and_show (GTK_TREE_VIEW (tree
), &iter
, store
);
770 servlist_start_editing (GTK_TREE_VIEW (tree
));
774 servlist_addchannel_cb (GtkWidget
*item
, GtkWidget
*tree
)
776 servlist_addchannel (tree
, _("#channel"));
780 servlist_deletechannel_cb (GtkWidget
*item
, GtkWidget
*tree
)
782 GtkTreeSelection
*sel
;
786 /* find the selected item in the GUI */
787 model
= gtk_tree_view_get_model (GTK_TREE_VIEW (tree
));
788 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW (tree
));
790 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
791 gtk_list_store_remove (GTK_LIST_STORE (model
), &iter
);
795 servlist_editchannelbutton_cb (GtkWidget
*item
, GtkWidget
*tree
)
797 servlist_start_editing (GTK_TREE_VIEW (tree
));
800 /* save everything from the GUI to the GtkEntry */
803 servlist_autojoineditok_cb (GtkWidget
*button
, GtkWidget
*tree
)
809 GSList
*channels
= NULL
, *keys
= NULL
;
811 model
= gtk_tree_view_get_model (GTK_TREE_VIEW (tree
));
813 if (gtk_tree_model_get_iter_first (model
, &iter
))
817 gtk_tree_model_get (model
, &iter
, 0, &channel
, 1, &key
, -1);
818 channels
= g_slist_append (channels
, channel
);
819 if (key
&& key
[0] == 0)
821 /* NULL out empty keys */
823 keys
= g_slist_append (keys
, NULL
);
826 keys
= g_slist_append (keys
, key
);
828 while (gtk_tree_model_iter_next (model
, &iter
));
831 gtk_widget_destroy (gtk_widget_get_toplevel (button
));
833 autojoin
= joinlist_merge (channels
, keys
);
836 if (edit_win
&& selected_net
)
837 gtk_entry_set_text (GTK_ENTRY (edit_entry_join
), autojoin
);
840 if (fav_add_net
->autojoin
)
841 free (fav_add_net
->autojoin
);
842 fav_add_net
->autojoin
= strdup (autojoin
);
847 /* this does g_free too */
848 joinlist_free (channels
, keys
);
855 servlist_autojoinedit (ircnet
*net
, char *channel
, gboolean add
)
858 GtkWidget
*scrolledwindow
;
861 GtkCellRenderer
*renderer
;
869 GtkWidget
*vbuttonbox1
;
870 GtkWidget
*buttonadd
;
871 GtkWidget
*buttonremove
;
872 GtkWidget
*buttonedit
;
876 GSList
*channels
, *keys
;
877 GSList
*clist
, *klist
;
880 if (edit_win
&& selected_net
)
881 /* update net->autojoin */
882 servlist_edit_update (selected_net
);
884 win
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
885 gtk_container_set_border_width (GTK_CONTAINER (win
), 4);
886 gtk_window_set_title (GTK_WINDOW (win
), _("XChat: Favorite Channels (Auto-Join List)"));
887 gtk_window_set_default_size (GTK_WINDOW (win
), 354, 256);
888 gtk_window_set_position (GTK_WINDOW (win
), GTK_WIN_POS_MOUSE
);
890 gtk_window_set_transient_for (GTK_WINDOW (win
), GTK_WINDOW (edit_win
));
891 gtk_window_set_modal (GTK_WINDOW (win
), TRUE
);
892 gtk_window_set_type_hint (GTK_WINDOW (win
), GDK_WINDOW_TYPE_HINT_DIALOG
);
893 gtk_window_set_role (GTK_WINDOW (win
), "editserv");
895 table
= gtk_table_new (1, 1, FALSE
);
896 gtk_container_add (GTK_CONTAINER (win
), table
);
897 gtk_widget_show (table
);
899 snprintf (buf
, sizeof (buf
), _("These channels will be joined whenever you connect to %s."), net
->name
);
900 label
= gtk_label_new (buf
);
901 gtk_label_set_justify (GTK_LABEL (label
), GTK_JUSTIFY_CENTER
);
902 gtk_table_attach (GTK_TABLE (table
), label
, 0, 2, 0, 1, GTK_FILL
|GTK_EXPAND
, GTK_FILL
, 3, 3);
903 gtk_widget_show (label
);
905 label2
= gtk_label_new ("");
906 gtk_label_set_justify (GTK_LABEL (label2
), GTK_JUSTIFY_CENTER
);
907 gtk_table_attach (GTK_TABLE (table
), label2
, 0, 2, 1, 2, GTK_FILL
, 0, 3, 3);
908 gtk_widget_show (label2
);
910 scrolledwindow
= gtk_scrolled_window_new (NULL
, NULL
);
911 gtk_table_attach (GTK_TABLE (table
), scrolledwindow
, 0, 1, 2, 3, GTK_FILL
|GTK_EXPAND
, GTK_FILL
|GTK_EXPAND
, 0, 0);
912 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow
),
913 GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
914 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow
),
916 gtk_widget_show (scrolledwindow
);
918 store
= gtk_list_store_new (3, G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_BOOLEAN
);
919 model
= GTK_TREE_MODEL (store
);
921 tree
= gtk_tree_view_new_with_model (model
);
922 g_object_unref (model
);
923 gtk_container_add (GTK_CONTAINER (scrolledwindow
), tree
);
924 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree
), TRUE
);
925 gtk_widget_show (tree
);
927 renderer
= gtk_cell_renderer_text_new ();
928 g_signal_connect (G_OBJECT (renderer
), "edited",
929 G_CALLBACK (servlist_editchannel_cb
), model
);
930 gtk_tree_view_insert_column_with_attributes (
931 GTK_TREE_VIEW (tree
), -1,
932 _("Channel"), renderer
,
937 renderer
= gtk_cell_renderer_text_new ();
938 g_signal_connect (G_OBJECT (renderer
), "edited",
939 G_CALLBACK (servlist_editkey_cb
), model
);
940 gtk_tree_view_insert_column_with_attributes (
941 GTK_TREE_VIEW (tree
), -1,
942 _("Key (Password)"), renderer
,
947 gtk_tree_view_column_set_expand (gtk_tree_view_get_column (GTK_TREE_VIEW (tree
), 0), TRUE
);
948 gtk_tree_view_column_set_expand (gtk_tree_view_get_column (GTK_TREE_VIEW (tree
), 1), TRUE
);
950 gtk_tree_sortable_set_sort_column_id ((GtkTreeSortable
*)model
, 0, GTK_SORT_ASCENDING
);
953 vbuttonbox1
= gtk_vbutton_box_new ();
954 gtk_box_set_spacing (GTK_BOX (vbuttonbox1
), 3);
955 gtk_button_box_set_layout (GTK_BUTTON_BOX (vbuttonbox1
), GTK_BUTTONBOX_START
);
956 gtk_widget_show (vbuttonbox1
);
957 gtk_table_attach (GTK_TABLE (table
), vbuttonbox1
, 1, 2, 2, 3, GTK_FILL
, GTK_FILL
, 3, 0);
959 buttonadd
= gtk_button_new_from_stock ("gtk-add");
960 g_signal_connect (G_OBJECT (buttonadd
), "clicked",
961 G_CALLBACK (servlist_addchannel_cb
), tree
);
962 gtk_widget_show (buttonadd
);
963 gtk_container_add (GTK_CONTAINER (vbuttonbox1
), buttonadd
);
964 GTK_WIDGET_SET_FLAGS (buttonadd
, GTK_CAN_DEFAULT
);
966 buttonremove
= gtk_button_new_from_stock ("gtk-remove");
967 g_signal_connect (G_OBJECT (buttonremove
), "clicked",
968 G_CALLBACK (servlist_deletechannel_cb
), tree
);
969 gtk_widget_show (buttonremove
);
970 gtk_container_add (GTK_CONTAINER (vbuttonbox1
), buttonremove
);
971 GTK_WIDGET_SET_FLAGS (buttonremove
, GTK_CAN_DEFAULT
);
973 buttonedit
= gtk_button_new_with_mnemonic (_("_Edit"));
974 g_signal_connect (G_OBJECT (buttonedit
), "clicked",
975 G_CALLBACK (servlist_editchannelbutton_cb
), tree
);
976 gtk_widget_show (buttonedit
);
977 gtk_container_add (GTK_CONTAINER (vbuttonbox1
), buttonedit
);
978 GTK_WIDGET_SET_FLAGS (buttonedit
, GTK_CAN_DEFAULT
);
980 bbox
= gtk_hbutton_box_new ();
981 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox
), GTK_BUTTONBOX_END
);
982 gtk_box_set_spacing (GTK_BOX (bbox
), 4);
983 gtk_table_attach (GTK_TABLE (table
), bbox
, 0, 1, 3, 4, GTK_FILL
|GTK_EXPAND
, GTK_FILL
, 0, 4);
984 gtk_widget_show (bbox
);
986 wid
= gtk_button_new_from_stock (GTK_STOCK_CANCEL
);
987 g_signal_connect (G_OBJECT (wid
), "clicked", G_CALLBACK (gtkutil_destroy
), win
);
988 gtk_container_add (GTK_CONTAINER (bbox
), wid
);
989 gtk_widget_show (wid
);
991 wid
= gtk_button_new_from_stock (GTK_STOCK_OK
);
992 g_signal_connect (G_OBJECT (wid
), "clicked", G_CALLBACK (servlist_autojoineditok_cb
), tree
);
993 gtk_container_add (GTK_CONTAINER (bbox
), wid
);
994 gtk_widget_show (wid
);
995 gtk_widget_grab_focus (wid
);
1000 joinlist_split (net
->autojoin
, &channels
, &keys
);
1007 if (channel
&& !add
&& !rfc_casecmp (channel
, clist
->data
))
1009 snprintf (buf
, sizeof (buf
), _("%s has been removed."), channel
);
1010 snprintf (lab
, sizeof (lab
), "<span foreground=\"#2222DD\">%s</span>", buf
);
1011 gtk_label_set_markup (GTK_LABEL (label2
), lab
);
1015 gtk_list_store_append (store
, &iter
);
1016 gtk_list_store_set (store
, &iter
, 0, clist
->data
, 1, klist
->data
, 2, TRUE
, -1);
1019 klist
= klist
->next
;
1020 clist
= clist
->next
;
1023 joinlist_free (channels
, keys
);
1028 servlist_addchannel (tree
, channel
);
1029 snprintf (buf
, sizeof (buf
), _("%s has been added."), channel
);
1030 snprintf (lab
, sizeof (lab
), "<span foreground=\"#2222DD\">%s</span>", buf
);
1031 gtk_label_set_markup (GTK_LABEL (label2
), lab
);
1036 gtk_widget_show (win
);
1040 servlist_autojoinedit_cb (GtkWidget
*button
, ircnet
*net
)
1042 servlist_autojoinedit (net
, NULL
, FALSE
);
1046 servlist_connect_cb (GtkWidget
*button
, gpointer userdata
)
1051 if (servlist_savegui () != 0)
1053 fe_message (_("User name and Real name cannot be left blank."), FE_MSG_ERROR
);
1057 if (!is_session (servlist_sess
))
1058 servlist_sess
= NULL
; /* open a new one */
1063 session
*chosen
= servlist_sess
;
1065 servlist_sess
= NULL
; /* open a new one */
1067 for (list
= sess_list
; list
; list
= list
->next
)
1070 if (sess
->server
->network
== selected_net
)
1072 servlist_sess
= sess
;
1073 if (sess
->server
->connected
)
1074 servlist_sess
= NULL
; /* open a new one */
1079 /* use the chosen one, if it's empty */
1080 if (!servlist_sess
&&
1082 !chosen
->server
->connected
&&
1083 chosen
->server
->server_session
->channel
[0] == 0)
1085 servlist_sess
= chosen
;
1089 servlist_connect (servlist_sess
, selected_net
, TRUE
);
1091 gtk_widget_destroy (serverlist_win
);
1092 serverlist_win
= NULL
;
1093 selected_net
= NULL
;
1097 servlist_celledit_cb (GtkCellRendererText
*cell
, gchar
*arg1
, gchar
*arg2
,
1100 GtkTreeModel
*model
= (GtkTreeModel
*)user_data
;
1109 path
= gtk_tree_path_new_from_string (arg1
);
1113 if (!gtk_tree_model_get_iter (model
, &iter
, path
))
1115 gtk_tree_path_free (path
);
1118 gtk_tree_model_get (model
, &iter
, 0, &netname
, -1);
1120 net
= servlist_net_find (netname
, NULL
, strcmp
);
1124 /* delete empty item */
1127 servlist_deletenetwork (net
);
1128 gtk_tree_path_free (path
);
1132 netname
= net
->name
;
1133 net
->name
= strdup (arg2
);
1134 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, 0, net
->name
, -1);
1138 gtk_tree_path_free (path
);
1142 servlist_check_cb (GtkWidget
*but
, gpointer num_p
)
1144 int num
= GPOINTER_TO_INT (num_p
);
1149 if ((1 << num
) == FLAG_CYCLE
|| (1 << num
) == FLAG_USE_PROXY
)
1151 /* these ones are reversed, so it's compat with 2.0.x */
1152 if (GTK_TOGGLE_BUTTON (but
)->active
)
1153 selected_net
->flags
&= ~(1 << num
);
1155 selected_net
->flags
|= (1 << num
);
1158 if (GTK_TOGGLE_BUTTON (but
)->active
)
1159 selected_net
->flags
|= (1 << num
);
1161 selected_net
->flags
&= ~(1 << num
);
1164 if ((1 << num
) == FLAG_USE_GLOBAL
)
1166 if (GTK_TOGGLE_BUTTON (but
)->active
)
1168 gtk_widget_hide (edit_label_nick
);
1169 gtk_widget_hide (edit_entry_nick
);
1171 gtk_widget_hide (edit_label_nick2
);
1172 gtk_widget_hide (edit_entry_nick2
);
1174 gtk_widget_hide (edit_label_user
);
1175 gtk_widget_hide (edit_entry_user
);
1177 gtk_widget_hide (edit_label_real
);
1178 gtk_widget_hide (edit_entry_real
);
1181 gtk_widget_show (edit_label_nick
);
1182 gtk_widget_show (edit_entry_nick
);
1184 gtk_widget_show (edit_label_nick2
);
1185 gtk_widget_show (edit_entry_nick2
);
1187 gtk_widget_show (edit_label_user
);
1188 gtk_widget_show (edit_entry_user
);
1190 gtk_widget_show (edit_label_real
);
1191 gtk_widget_show (edit_entry_real
);
1197 servlist_create_check (int num
, int state
, GtkWidget
*table
, int row
, int col
, char *labeltext
)
1201 but
= gtk_check_button_new_with_label (labeltext
);
1202 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (but
), state
);
1203 g_signal_connect (G_OBJECT (but
), "toggled",
1204 G_CALLBACK (servlist_check_cb
), GINT_TO_POINTER (num
));
1205 gtk_table_attach (GTK_TABLE (table
), but
, col
, col
+2, row
, row
+1,
1206 GTK_FILL
|GTK_EXPAND
, 0, 0, 0);
1207 gtk_widget_show (but
);
1213 servlist_create_entry (GtkWidget
*table
, char *labeltext
, int row
,
1214 char *def
, GtkWidget
**label_ret
, char *tip
)
1216 GtkWidget
*label
, *entry
;
1218 label
= gtk_label_new_with_mnemonic (labeltext
);
1221 gtk_widget_show (label
);
1222 gtk_table_attach (GTK_TABLE (table
), label
, 1, 2, row
, row
+1,
1224 gtk_misc_set_alignment (GTK_MISC (label
), 0, 0.5);
1226 entry
= gtk_entry_new ();
1227 add_tip (entry
, tip
);
1228 gtk_widget_show (entry
);
1229 gtk_entry_set_text (GTK_ENTRY (entry
), def
? def
: "");
1230 gtk_label_set_mnemonic_widget (GTK_LABEL (label
), entry
);
1232 if (row
== 15) /* for "Channels to Join:" */
1234 GtkWidget
*button
, *box
;
1236 box
= gtk_hbox_new (0, 0);
1237 button
= gtk_button_new_with_label ("...");
1238 g_signal_connect (G_OBJECT (button
), "clicked",
1239 G_CALLBACK (servlist_autojoinedit_cb
), selected_net
);
1241 gtk_box_pack_start (GTK_BOX (box
), entry
, TRUE
, TRUE
, 0);
1242 gtk_box_pack_end (GTK_BOX (box
), button
, 0, 0, 0);
1243 gtk_widget_show_all (box
);
1245 gtk_table_attach (GTK_TABLE (table
), box
, 2, 3, row
, row
+1,
1246 GTK_FILL
|GTK_EXPAND
, 0, 0, 0);
1250 gtk_table_attach (GTK_TABLE (table
), entry
, 2, 3, row
, row
+1,
1251 GTK_FILL
|GTK_EXPAND
, 0, 0, 0);
1258 servlist_delete_cb (GtkWidget
*win
, GdkEventAny
*event
, gpointer userdata
)
1260 servlist_savegui ();
1261 serverlist_win
= NULL
;
1262 selected_net
= NULL
;
1264 if (sess_list
== NULL
)
1271 servlist_close_cb (GtkWidget
*button
, gpointer userdata
)
1273 servlist_savegui ();
1274 gtk_widget_destroy (serverlist_win
);
1275 serverlist_win
= NULL
;
1276 selected_net
= NULL
;
1278 if (sess_list
== NULL
)
1282 /* convert "host:port" format to "host/port" */
1285 servlist_sanitize_hostname (char *host
)
1289 ret
= strdup (host
);
1291 c
= strchr (ret
, ':');
1292 e
= strrchr (ret
, ':');
1294 /* if only one colon exists it's probably not IPv6 */
1302 servlist_editserver_cb (GtkCellRendererText
*cell
, gchar
*arg1
, gchar
*arg2
,
1305 GtkTreeModel
*model
= (GtkTreeModel
*)user_data
;
1314 path
= gtk_tree_path_new_from_string (arg1
);
1316 if (!gtk_tree_model_get_iter (model
, &iter
, path
))
1318 gtk_tree_path_free (path
);
1322 gtk_tree_model_get (model
, &iter
, 0, &servname
, -1);
1323 serv
= servlist_server_find (selected_net
, servname
, NULL
);
1328 /* delete empty item */
1331 servlist_deleteserver (serv
, model
);
1332 gtk_tree_path_free (path
);
1336 servname
= serv
->hostname
;
1337 serv
->hostname
= servlist_sanitize_hostname (arg2
);
1338 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
, 0, serv
->hostname
, -1);
1342 gtk_tree_path_free (path
);
1346 servlist_combo_cb (GtkEntry
*entry
, gpointer userdata
)
1351 if (!ignore_changed
)
1353 if (selected_net
->encoding
)
1354 free (selected_net
->encoding
);
1355 selected_net
->encoding
= strdup (entry
->text
);
1359 /* Fills up the network's authentication type so that it's guaranteed to be either NULL or a valid value. */
1361 servlist_logintypecombo_cb (GtkEntry
*entry
, gpointer userdata
)
1370 if (!ignore_changed
)
1372 index
= gtk_combo_box_get_active (GTK_COMBO_BOX (entry
)); /* starts at 0, returns -1 for invalid selections */
1376 /* The selection is valid. It can be 0, which is the default type, but we need to allow
1377 * that so that you can revert from other types. servlist_save() will dump 0 anyway.
1379 selected_net
->logintype
= login_types_conf
[index
];
1386 servlist_create_charsetcombo (void)
1391 cb
= gtk_combo_box_entry_new_text ();
1392 gtk_combo_box_append_text (GTK_COMBO_BOX (cb
), "System default");
1396 gtk_combo_box_append_text (GTK_COMBO_BOX (cb
), (char *)pages
[i
]);
1399 g_signal_connect (G_OBJECT (GTK_BIN (cb
)->child
), "changed",
1400 G_CALLBACK (servlist_combo_cb
), NULL
);
1406 servlist_create_logintypecombo (void)
1411 cb
= gtk_combo_box_entry_new_text ();
1415 while (login_types
[i
])
1417 gtk_combo_box_append_text (GTK_COMBO_BOX (cb
), (char *)login_types
[i
]);
1421 g_signal_connect (G_OBJECT (GTK_BIN (cb
)), "changed", G_CALLBACK (servlist_logintypecombo_cb
), NULL
);
1427 no_servlist (GtkWidget
* igad
, gpointer serv
)
1429 if (GTK_TOGGLE_BUTTON (igad
)->active
)
1430 prefs
.slist_skip
= TRUE
;
1432 prefs
.slist_skip
= FALSE
;
1436 fav_servlist (GtkWidget
* igad
, gpointer serv
)
1438 if (GTK_TOGGLE_BUTTON (igad
)->active
)
1439 prefs
.slist_fav
= TRUE
;
1441 prefs
.slist_fav
= FALSE
;
1443 servlist_networks_populate (networks_tree
, network_list
);
1447 bold_label (char *text
)
1452 snprintf (buf
, sizeof (buf
), "<b>%s</b>", text
);
1453 label
= gtk_label_new (buf
);
1454 gtk_label_set_use_markup (GTK_LABEL (label
), TRUE
);
1455 gtk_misc_set_alignment (GTK_MISC (label
), 0, 0.5);
1456 gtk_widget_show (label
);
1462 servlist_open_edit (GtkWidget
*parent
, ircnet
*net
)
1464 GtkWidget
*editwindow
;
1471 GtkWidget
*label_logintype
;
1472 GtkWidget
*comboboxentry_charset
;
1473 GtkWidget
*comboboxentry_logintypes
;
1475 GtkWidget
*scrolledwindow2
;
1476 GtkWidget
*treeview_servers
;
1477 GtkWidget
*vbuttonbox1
;
1478 GtkWidget
*buttonadd
;
1479 GtkWidget
*buttonremove
;
1480 GtkWidget
*buttonedit
;
1481 GtkWidget
*hseparator2
;
1482 GtkWidget
*hbuttonbox4
;
1483 GtkWidget
*button10
;
1485 GtkTreeModel
*model
;
1486 GtkListStore
*store
;
1487 GtkCellRenderer
*renderer
;
1491 editwindow
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
1492 gtk_container_set_border_width (GTK_CONTAINER (editwindow
), 4);
1493 snprintf (buf
, sizeof (buf
), _("XChat: Edit %s"), net
->name
);
1494 gtk_window_set_title (GTK_WINDOW (editwindow
), buf
);
1495 gtk_window_set_default_size (GTK_WINDOW (editwindow
), 354, 0);
1496 gtk_window_set_position (GTK_WINDOW (editwindow
), GTK_WIN_POS_MOUSE
);
1497 gtk_window_set_transient_for (GTK_WINDOW (editwindow
), GTK_WINDOW (parent
));
1498 gtk_window_set_modal (GTK_WINDOW (editwindow
), TRUE
);
1499 gtk_window_set_type_hint (GTK_WINDOW (editwindow
), GDK_WINDOW_TYPE_HINT_DIALOG
);
1500 gtk_window_set_role (GTK_WINDOW (editwindow
), "editserv");
1502 vbox5
= gtk_vbox_new (FALSE
, 0);
1503 gtk_widget_show (vbox5
);
1504 gtk_container_add (GTK_CONTAINER (editwindow
), vbox5
);
1506 table3
= gtk_table_new (17, 3, FALSE
);
1507 gtk_widget_show (table3
);
1508 gtk_box_pack_start (GTK_BOX (vbox5
), table3
, TRUE
, TRUE
, 0);
1509 gtk_table_set_row_spacings (GTK_TABLE (table3
), 2);
1510 gtk_table_set_col_spacings (GTK_TABLE (table3
), 8);
1512 snprintf (buf
, sizeof (buf
), _("Servers for %s"), net
->name
);
1513 snprintf (buf2
, sizeof (buf2
), "<b>%s</b>", buf
);
1514 label16
= gtk_label_new (buf2
);
1515 gtk_widget_show (label16
);
1516 gtk_table_attach (GTK_TABLE (table3
), label16
, 0, 3, 0, 1,
1517 (GtkAttachOptions
) (GTK_FILL
),
1518 (GtkAttachOptions
) (0), 0, 3);
1519 gtk_label_set_use_markup (GTK_LABEL (label16
), TRUE
);
1520 gtk_misc_set_alignment (GTK_MISC (label16
), 0, 0.5);
1522 check
= servlist_create_check (0, !(net
->flags
& FLAG_CYCLE
), table3
,
1523 2, 1, _("Connect to selected server only"));
1524 add_tip (check
, _("Don't cycle through all the servers when the connection fails."));
1526 label17
= bold_label (_("Your Details"));
1527 gtk_table_attach (GTK_TABLE (table3
), label17
, 0, 3, 3, 4,
1528 (GtkAttachOptions
) (GTK_FILL
),
1529 (GtkAttachOptions
) (0), 0, 3);
1531 servlist_create_check (1, net
->flags
& FLAG_USE_GLOBAL
, table3
,
1532 4, 1, _("Use global user information"));
1535 servlist_create_entry (table3
, _("_Nick name:"), 5, net
->nick
,
1536 &edit_label_nick
, 0);
1539 servlist_create_entry (table3
, _("Second choice:"), 6, net
->nick2
,
1540 &edit_label_nick2
, 0);
1543 servlist_create_entry (table3
, _("_User name:"), 7, net
->user
,
1544 &edit_label_user
, 0);
1547 servlist_create_entry (table3
, _("Rea_l name:"), 8, net
->real
,
1548 &edit_label_real
, 0);
1550 label21
= bold_label (_("Connecting"));
1551 gtk_table_attach (GTK_TABLE (table3
), label21
, 0, 3, 9, 10,
1552 (GtkAttachOptions
) (GTK_FILL
),
1553 (GtkAttachOptions
) (0), 0, 3);
1555 servlist_create_check (3, net
->flags
& FLAG_AUTO_CONNECT
, table3
,
1556 11, 1, _("Auto connect to this network at startup"));
1557 servlist_create_check (4, !(net
->flags
& FLAG_USE_PROXY
), table3
,
1558 12, 1, _("Bypass proxy server"));
1559 check
= servlist_create_check (2, net
->flags
& FLAG_USE_SSL
, table3
,
1560 13, 1, _("Use SSL for all the servers on this network"));
1562 gtk_widget_set_sensitive (check
, FALSE
);
1564 check
= servlist_create_check (5, net
->flags
& FLAG_ALLOW_INVALID
, table3
,
1565 14, 1, _("Accept invalid SSL certificate"));
1567 gtk_widget_set_sensitive (check
, FALSE
);
1571 servlist_create_entry (table3
, _("_Favorite channels:"), 15,
1573 _("Channels to join, separated by commas, but not spaces!"));
1576 servlist_create_entry (table3
, _("Connect command:"), 16,
1578 _("Extra command to execute after connecting. If you need more than one, set this to LOAD -e <filename>, where <filename> is a text-file full of commands to execute."));
1580 edit_entry_nickserv
=
1581 servlist_create_entry (table3
, _("NickServ password:"), 17,
1583 _("If your nickname requires a password, enter it here. Not all IRC networks support this."));
1584 gtk_entry_set_visibility (GTK_ENTRY (edit_entry_nickserv
), FALSE
);
1586 label_logintype
= gtk_label_new (_("Login method:"));
1587 gtk_widget_show (label_logintype
);
1588 gtk_table_attach (GTK_TABLE (table3
), label_logintype
, 1, 2, 18, 19,
1589 (GtkAttachOptions
) (GTK_FILL
),
1590 (GtkAttachOptions
) (0), 0, 0);
1591 gtk_misc_set_alignment (GTK_MISC (label_logintype
), 0, 0.5);
1593 comboboxentry_logintypes
= servlist_create_logintypecombo ();
1594 ignore_changed
= TRUE
;
1595 gtk_entry_set_text (GTK_ENTRY (GTK_BIN (comboboxentry_logintypes
)->child
), net
->logintype
? login_types
[servlist_get_login_desc_index (net
->logintype
)] : login_types
[0]);
1596 ignore_changed
= FALSE
;
1597 gtk_widget_show (comboboxentry_logintypes
);
1598 gtk_table_attach (GTK_TABLE (table3
), comboboxentry_logintypes
, 2, 3, 18, 19,
1599 (GtkAttachOptions
) (GTK_FILL
),
1600 (GtkAttachOptions
) (GTK_FILL
), 0, 0);
1603 servlist_create_entry (table3
, _("Password:"), 20,
1605 _("Password used for login. If in doubt, leave blank."));
1606 gtk_entry_set_visibility (GTK_ENTRY (edit_entry_pass
), FALSE
);
1609 label34
= gtk_label_new (_("Character set:"));
1610 gtk_widget_show (label34
);
1611 gtk_table_attach (GTK_TABLE (table3
), label34
, 1, 2, 21, 22,
1612 (GtkAttachOptions
) (GTK_FILL
),
1613 (GtkAttachOptions
) (0), 0, 0);
1614 gtk_misc_set_alignment (GTK_MISC (label34
), 0, 0.5);
1616 comboboxentry_charset
= servlist_create_charsetcombo ();
1617 ignore_changed
= TRUE
;
1618 gtk_entry_set_text (GTK_ENTRY (GTK_BIN (comboboxentry_charset
)->child
), net
->encoding
? net
->encoding
: "System default");
1619 ignore_changed
= FALSE
;
1620 gtk_widget_show (comboboxentry_charset
);
1621 gtk_table_attach (GTK_TABLE (table3
), comboboxentry_charset
, 2, 3, 21, 22,
1622 (GtkAttachOptions
) (GTK_FILL
),
1623 (GtkAttachOptions
) (GTK_FILL
), 0, 0);
1625 hbox1
= gtk_hbox_new (FALSE
, 0);
1626 gtk_widget_show (hbox1
);
1627 gtk_table_attach (GTK_TABLE (table3
), hbox1
, 1, 3, 1, 2,
1628 (GtkAttachOptions
) (GTK_FILL
),
1629 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), 0, 0);
1631 scrolledwindow2
= gtk_scrolled_window_new (NULL
, NULL
);
1632 gtk_widget_show (scrolledwindow2
);
1633 gtk_box_pack_start (GTK_BOX (hbox1
), scrolledwindow2
, TRUE
, TRUE
, 0);
1634 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow2
),
1635 GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
1636 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow2
),
1639 store
= gtk_list_store_new (2, G_TYPE_STRING
, G_TYPE_BOOLEAN
);
1640 model
= GTK_TREE_MODEL (store
);
1642 edit_tree
= treeview_servers
= gtk_tree_view_new_with_model (model
);
1643 g_object_unref (model
);
1644 gtk_widget_show (treeview_servers
);
1645 gtk_container_add (GTK_CONTAINER (scrolledwindow2
), treeview_servers
);
1646 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview_servers
),
1649 renderer
= gtk_cell_renderer_text_new ();
1650 g_signal_connect (G_OBJECT (renderer
), "edited",
1651 G_CALLBACK (servlist_editserver_cb
), model
);
1652 gtk_tree_view_insert_column_with_attributes (
1653 GTK_TREE_VIEW (treeview_servers
), -1,
1659 vbuttonbox1
= gtk_vbutton_box_new ();
1660 gtk_box_set_spacing (GTK_BOX (vbuttonbox1
), 3);
1661 gtk_button_box_set_layout (GTK_BUTTON_BOX (vbuttonbox1
), GTK_BUTTONBOX_START
);
1662 gtk_widget_show (vbuttonbox1
);
1663 gtk_box_pack_start (GTK_BOX (hbox1
), vbuttonbox1
, FALSE
, FALSE
, 3);
1665 buttonadd
= gtk_button_new_from_stock ("gtk-add");
1666 g_signal_connect (G_OBJECT (buttonadd
), "clicked",
1667 G_CALLBACK (servlist_addserver_cb
), edit_tree
);
1668 gtk_widget_show (buttonadd
);
1669 gtk_container_add (GTK_CONTAINER (vbuttonbox1
), buttonadd
);
1670 GTK_WIDGET_SET_FLAGS (buttonadd
, GTK_CAN_DEFAULT
);
1672 buttonremove
= gtk_button_new_from_stock ("gtk-remove");
1673 g_signal_connect (G_OBJECT (buttonremove
), "clicked",
1674 G_CALLBACK (servlist_deleteserver_cb
), NULL
);
1675 gtk_widget_show (buttonremove
);
1676 gtk_container_add (GTK_CONTAINER (vbuttonbox1
), buttonremove
);
1677 GTK_WIDGET_SET_FLAGS (buttonremove
, GTK_CAN_DEFAULT
);
1679 buttonedit
= gtk_button_new_with_mnemonic (_("_Edit"));
1680 g_signal_connect (G_OBJECT (buttonedit
), "clicked",
1681 G_CALLBACK (servlist_editserverbutton_cb
), NULL
);
1682 gtk_widget_show (buttonedit
);
1683 gtk_container_add (GTK_CONTAINER (vbuttonbox1
), buttonedit
);
1684 GTK_WIDGET_SET_FLAGS (buttonedit
, GTK_CAN_DEFAULT
);
1686 hseparator2
= gtk_hseparator_new ();
1687 gtk_widget_show (hseparator2
);
1688 gtk_box_pack_start (GTK_BOX (vbox5
), hseparator2
, FALSE
, FALSE
, 8);
1690 hbuttonbox4
= gtk_hbutton_box_new ();
1691 gtk_widget_show (hbuttonbox4
);
1692 gtk_box_pack_start (GTK_BOX (vbox5
), hbuttonbox4
, FALSE
, FALSE
, 0);
1693 gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox4
),
1696 button10
= gtk_button_new_from_stock ("gtk-close");
1697 g_signal_connect (G_OBJECT (button10
), "clicked",
1698 G_CALLBACK (servlist_edit_close_cb
), 0);
1699 gtk_widget_show (button10
);
1700 gtk_container_add (GTK_CONTAINER (hbuttonbox4
), button10
);
1701 GTK_WIDGET_SET_FLAGS (button10
, GTK_CAN_DEFAULT
);
1703 if (net
->flags
& FLAG_USE_GLOBAL
)
1705 gtk_widget_hide (edit_label_nick
);
1706 gtk_widget_hide (edit_entry_nick
);
1708 gtk_widget_hide (edit_label_nick2
);
1709 gtk_widget_hide (edit_entry_nick2
);
1711 gtk_widget_hide (edit_label_user
);
1712 gtk_widget_hide (edit_entry_user
);
1714 gtk_widget_hide (edit_label_real
);
1715 gtk_widget_hide (edit_entry_real
);
1718 gtk_widget_grab_focus (button10
);
1719 gtk_widget_grab_default (button10
);
1725 servlist_open_networks (void)
1727 GtkWidget
*servlist
;
1744 GtkWidget
*scrolledwindow3
;
1745 GtkWidget
*treeview_networks
;
1746 GtkWidget
*checkbutton_skip
;
1747 GtkWidget
*checkbutton_fav
;
1749 GtkWidget
*vbuttonbox2
;
1750 GtkWidget
*button_add
;
1751 GtkWidget
*button_remove
;
1752 GtkWidget
*button_edit
;
1753 GtkWidget
*button_sort
;
1754 GtkWidget
*hseparator1
;
1755 GtkWidget
*hbuttonbox1
;
1756 GtkWidget
*button_connect
;
1757 GtkWidget
*button_close
;
1758 GtkTreeModel
*model
;
1759 GtkListStore
*store
;
1760 GtkCellRenderer
*renderer
;
1762 servlist
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
1763 gtk_container_set_border_width (GTK_CONTAINER (servlist
), 4);
1764 gtk_window_set_title (GTK_WINDOW (servlist
), _("XChat: Network List"));
1765 gtk_window_set_default_size (GTK_WINDOW (servlist
), win_width
, win_height
);
1766 gtk_window_set_position (GTK_WINDOW (servlist
), GTK_WIN_POS_MOUSE
);
1767 gtk_window_set_role (GTK_WINDOW (servlist
), "servlist");
1768 gtk_window_set_type_hint (GTK_WINDOW (servlist
), GDK_WINDOW_TYPE_HINT_DIALOG
);
1770 gtk_window_set_transient_for (GTK_WINDOW (servlist
), GTK_WINDOW (current_sess
->gui
->window
));
1772 vbox1
= gtk_vbox_new (FALSE
, 0);
1773 gtk_widget_show (vbox1
);
1774 gtk_container_add (GTK_CONTAINER (servlist
), vbox1
);
1776 label2
= bold_label (_("User Information"));
1777 gtk_box_pack_start (GTK_BOX (vbox1
), label2
, FALSE
, FALSE
, 0);
1779 table1
= gtk_table_new (5, 2, FALSE
);
1780 gtk_widget_show (table1
);
1781 gtk_box_pack_start (GTK_BOX (vbox1
), table1
, FALSE
, FALSE
, 0);
1782 gtk_container_set_border_width (GTK_CONTAINER (table1
), 8);
1783 gtk_table_set_row_spacings (GTK_TABLE (table1
), 2);
1784 gtk_table_set_col_spacings (GTK_TABLE (table1
), 4);
1786 label3
= gtk_label_new_with_mnemonic (_("_Nick name:"));
1787 gtk_widget_show (label3
);
1788 gtk_table_attach (GTK_TABLE (table1
), label3
, 0, 1, 0, 1,
1789 (GtkAttachOptions
) (GTK_FILL
),
1790 (GtkAttachOptions
) (0), 0, 0);
1791 gtk_misc_set_alignment (GTK_MISC (label3
), 0, 0.5);
1793 label4
= gtk_label_new (_("Second choice:"));
1794 gtk_widget_show (label4
);
1795 gtk_table_attach (GTK_TABLE (table1
), label4
, 0, 1, 1, 2,
1796 (GtkAttachOptions
) (GTK_FILL
),
1797 (GtkAttachOptions
) (0), 0, 0);
1798 gtk_misc_set_alignment (GTK_MISC (label4
), 0, 0.5);
1800 label5
= gtk_label_new (_("Third choice:"));
1801 gtk_widget_show (label5
);
1802 gtk_table_attach (GTK_TABLE (table1
), label5
, 0, 1, 2, 3,
1803 (GtkAttachOptions
) (GTK_FILL
),
1804 (GtkAttachOptions
) (0), 0, 0);
1805 gtk_misc_set_alignment (GTK_MISC (label5
), 0, 0.5);
1807 label6
= gtk_label_new_with_mnemonic (_("_User name:"));
1808 gtk_widget_show (label6
);
1809 gtk_table_attach (GTK_TABLE (table1
), label6
, 0, 1, 3, 4,
1810 (GtkAttachOptions
) (GTK_FILL
),
1811 (GtkAttachOptions
) (0), 0, 0);
1812 gtk_misc_set_alignment (GTK_MISC (label6
), 0, 0.5);
1814 label7
= gtk_label_new_with_mnemonic (_("Rea_l name:"));
1815 gtk_widget_show (label7
);
1816 gtk_table_attach (GTK_TABLE (table1
), label7
, 0, 1, 4, 5,
1817 (GtkAttachOptions
) (GTK_FILL
),
1818 (GtkAttachOptions
) (0), 0, 0);
1819 gtk_misc_set_alignment (GTK_MISC (label7
), 0, 0.5);
1821 entry_nick1
= entry1
= gtk_entry_new ();
1822 gtk_entry_set_text (GTK_ENTRY (entry1
), prefs
.nick1
);
1823 gtk_widget_show (entry1
);
1824 gtk_table_attach (GTK_TABLE (table1
), entry1
, 1, 2, 0, 1,
1825 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
1826 (GtkAttachOptions
) (0), 0, 0);
1828 entry_nick2
= entry2
= gtk_entry_new ();
1829 gtk_entry_set_text (GTK_ENTRY (entry2
), prefs
.nick2
);
1830 gtk_widget_show (entry2
);
1831 gtk_table_attach (GTK_TABLE (table1
), entry2
, 1, 2, 1, 2,
1832 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
1833 (GtkAttachOptions
) (0), 0, 0);
1835 entry_nick3
= entry3
= gtk_entry_new ();
1836 gtk_entry_set_text (GTK_ENTRY (entry3
), prefs
.nick3
);
1837 gtk_widget_show (entry3
);
1838 gtk_table_attach (GTK_TABLE (table1
), entry3
, 1, 2, 2, 3,
1839 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
1840 (GtkAttachOptions
) (0), 0, 0);
1842 entry_guser
= entry4
= gtk_entry_new ();
1843 gtk_entry_set_text (GTK_ENTRY (entry4
), prefs
.username
);
1844 gtk_widget_show (entry4
);
1845 gtk_table_attach (GTK_TABLE (table1
), entry4
, 1, 2, 3, 4,
1846 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
1847 (GtkAttachOptions
) (0), 0, 0);
1849 entry_greal
= entry5
= gtk_entry_new ();
1850 gtk_entry_set_text (GTK_ENTRY (entry5
), prefs
.realname
);
1851 gtk_widget_show (entry5
);
1852 gtk_table_attach (GTK_TABLE (table1
), entry5
, 1, 2, 4, 5,
1853 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
1854 (GtkAttachOptions
) (0), 0, 0);
1856 vbox2
= gtk_vbox_new (FALSE
, 0);
1857 gtk_widget_show (vbox2
);
1858 gtk_box_pack_start (GTK_BOX (vbox1
), vbox2
, TRUE
, TRUE
, 0);
1860 label1
= bold_label (_("Networks"));
1861 gtk_box_pack_start (GTK_BOX (vbox2
), label1
, FALSE
, FALSE
, 0);
1863 table4
= gtk_table_new (2, 2, FALSE
);
1864 gtk_widget_show (table4
);
1865 gtk_box_pack_start (GTK_BOX (vbox2
), table4
, TRUE
, TRUE
, 0);
1866 gtk_container_set_border_width (GTK_CONTAINER (table4
), 8);
1867 gtk_table_set_row_spacings (GTK_TABLE (table4
), 2);
1868 gtk_table_set_col_spacings (GTK_TABLE (table4
), 3);
1870 scrolledwindow3
= gtk_scrolled_window_new (NULL
, NULL
);
1871 gtk_widget_show (scrolledwindow3
);
1872 gtk_table_attach (GTK_TABLE (table4
), scrolledwindow3
, 0, 1, 0, 1,
1873 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
1874 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
), 0, 0);
1875 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow3
),
1876 GTK_POLICY_NEVER
, GTK_POLICY_ALWAYS
);
1877 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow3
),
1880 store
= gtk_list_store_new (3, G_TYPE_STRING
, G_TYPE_BOOLEAN
, G_TYPE_INT
);
1881 model
= GTK_TREE_MODEL (store
);
1883 networks_tree
= treeview_networks
= gtk_tree_view_new_with_model (model
);
1884 g_object_unref (model
);
1885 gtk_widget_show (treeview_networks
);
1886 gtk_container_add (GTK_CONTAINER (scrolledwindow3
), treeview_networks
);
1887 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview_networks
),
1890 renderer
= gtk_cell_renderer_text_new ();
1891 g_signal_connect (G_OBJECT (renderer
), "edited",
1892 G_CALLBACK (servlist_celledit_cb
), model
);
1893 gtk_tree_view_insert_column_with_attributes (
1894 GTK_TREE_VIEW (treeview_networks
), -1,
1901 hbox
= gtk_hbox_new (0, FALSE
);
1902 gtk_table_attach (GTK_TABLE (table4
), hbox
, 0, 2, 1, 2,
1903 (GtkAttachOptions
) (GTK_FILL
),
1904 (GtkAttachOptions
) (0), 0, 0);
1905 gtk_widget_show (hbox
);
1908 gtk_check_button_new_with_mnemonic (_("Skip network list on startup"));
1909 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton_skip
),
1911 gtk_container_add (GTK_CONTAINER (hbox
), checkbutton_skip
);
1912 g_signal_connect (G_OBJECT (checkbutton_skip
), "toggled",
1913 G_CALLBACK (no_servlist
), 0);
1914 gtk_widget_show (checkbutton_skip
);
1917 gtk_check_button_new_with_mnemonic (_("Show favorites only"));
1918 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton_fav
),
1920 gtk_container_add (GTK_CONTAINER (hbox
), checkbutton_fav
);
1921 g_signal_connect (G_OBJECT (checkbutton_fav
), "toggled",
1922 G_CALLBACK (fav_servlist
), 0);
1923 gtk_widget_show (checkbutton_fav
);
1925 vbuttonbox2
= gtk_vbutton_box_new ();
1926 gtk_box_set_spacing (GTK_BOX (vbuttonbox2
), 3);
1927 gtk_button_box_set_layout (GTK_BUTTON_BOX (vbuttonbox2
), GTK_BUTTONBOX_START
);
1928 gtk_widget_show (vbuttonbox2
);
1929 gtk_table_attach (GTK_TABLE (table4
), vbuttonbox2
, 1, 2, 0, 1,
1930 (GtkAttachOptions
) (GTK_FILL
),
1931 (GtkAttachOptions
) (GTK_FILL
), 0, 0);
1933 button_add
= gtk_button_new_from_stock ("gtk-add");
1934 g_signal_connect (G_OBJECT (button_add
), "clicked",
1935 G_CALLBACK (servlist_addnet_cb
), networks_tree
);
1936 gtk_widget_show (button_add
);
1937 gtk_container_add (GTK_CONTAINER (vbuttonbox2
), button_add
);
1938 GTK_WIDGET_SET_FLAGS (button_add
, GTK_CAN_DEFAULT
);
1940 button_remove
= gtk_button_new_from_stock ("gtk-remove");
1941 g_signal_connect (G_OBJECT (button_remove
), "clicked",
1942 G_CALLBACK (servlist_deletenet_cb
), 0);
1943 gtk_widget_show (button_remove
);
1944 gtk_container_add (GTK_CONTAINER (vbuttonbox2
), button_remove
);
1945 GTK_WIDGET_SET_FLAGS (button_remove
, GTK_CAN_DEFAULT
);
1947 button_edit
= gtk_button_new_with_mnemonic (_("_Edit..."));
1948 g_signal_connect (G_OBJECT (button_edit
), "clicked",
1949 G_CALLBACK (servlist_edit_cb
), 0);
1950 gtk_widget_show (button_edit
);
1951 gtk_container_add (GTK_CONTAINER (vbuttonbox2
), button_edit
);
1952 GTK_WIDGET_SET_FLAGS (button_edit
, GTK_CAN_DEFAULT
);
1954 button_sort
= gtk_button_new_with_mnemonic (_("_Sort"));
1955 add_tip (button_sort
, _("Sorts the network list in alphabetical order. "
1956 "Use SHIFT-UP and SHIFT-DOWN keys to move a row."));
1957 g_signal_connect (G_OBJECT (button_sort
), "clicked",
1958 G_CALLBACK (servlist_sort
), 0);
1959 gtk_widget_show (button_sort
);
1960 gtk_container_add (GTK_CONTAINER (vbuttonbox2
), button_sort
);
1961 GTK_WIDGET_SET_FLAGS (button_sort
, GTK_CAN_DEFAULT
);
1963 button_sort
= gtk_button_new_with_mnemonic (_("_Favor"));
1964 add_tip (button_sort
, _("Mark or unmark this network as a favorite."));
1965 g_signal_connect (G_OBJECT (button_sort
), "clicked",
1966 G_CALLBACK (servlist_favor
), 0);
1967 gtk_widget_show (button_sort
);
1968 gtk_container_add (GTK_CONTAINER (vbuttonbox2
), button_sort
);
1969 GTK_WIDGET_SET_FLAGS (button_sort
, GTK_CAN_DEFAULT
);
1971 hseparator1
= gtk_hseparator_new ();
1972 gtk_widget_show (hseparator1
);
1973 gtk_box_pack_start (GTK_BOX (vbox1
), hseparator1
, FALSE
, TRUE
, 4);
1975 hbuttonbox1
= gtk_hbutton_box_new ();
1976 gtk_widget_show (hbuttonbox1
);
1977 gtk_box_pack_start (GTK_BOX (vbox1
), hbuttonbox1
, FALSE
, TRUE
, 0);
1978 gtk_container_set_border_width (GTK_CONTAINER (hbuttonbox1
), 8);
1980 button_close
= gtk_button_new_from_stock ("gtk-close");
1981 gtk_widget_show (button_close
);
1982 g_signal_connect (G_OBJECT (button_close
), "clicked",
1983 G_CALLBACK (servlist_close_cb
), 0);
1984 gtk_container_add (GTK_CONTAINER (hbuttonbox1
), button_close
);
1985 GTK_WIDGET_SET_FLAGS (button_close
, GTK_CAN_DEFAULT
);
1987 button_connect
= gtkutil_button (hbuttonbox1
, GTK_STOCK_CONNECT
, NULL
,
1988 servlist_connect_cb
, NULL
, _("C_onnect"));
1989 GTK_WIDGET_SET_FLAGS (button_connect
, GTK_CAN_DEFAULT
);
1991 gtk_label_set_mnemonic_widget (GTK_LABEL (label3
), entry1
);
1992 gtk_label_set_mnemonic_widget (GTK_LABEL (label6
), entry4
);
1993 gtk_label_set_mnemonic_widget (GTK_LABEL (label7
), entry5
);
1995 gtk_widget_grab_focus (networks_tree
);
1996 gtk_widget_grab_default (button_close
);
2001 fe_serverlist_open (session
*sess
)
2005 gtk_window_present (GTK_WINDOW (serverlist_win
));
2009 servlist_sess
= sess
;
2011 serverlist_win
= servlist_open_networks ();
2012 gtkutil_set_icon (serverlist_win
);
2014 servlist_networks_populate (networks_tree
, network_list
);
2016 g_signal_connect (G_OBJECT (serverlist_win
), "delete_event",
2017 G_CALLBACK (servlist_delete_cb
), 0);
2018 g_signal_connect (G_OBJECT (serverlist_win
), "configure_event",
2019 G_CALLBACK (servlist_configure_cb
), 0);
2020 g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (networks_tree
))),
2021 "changed", G_CALLBACK (servlist_network_row_cb
), NULL
);
2022 g_signal_connect (G_OBJECT (networks_tree
), "key_press_event",
2023 G_CALLBACK (servlist_net_keypress_cb
), networks_tree
);
2025 gtk_widget_show (serverlist_win
);