Mercurial > pidgin
comparison src/prefs.c @ 4428:b5669740e34c
[gaim-migrate @ 4703]
Two patches from Ray Strode to clean up browser launching (esp. Netscape and
Mozilla) and to show only available browsers in the prefs drop down list.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Sun, 26 Jan 2003 19:39:43 +0000 |
parents | 31834b4598eb |
children | bf770f11132b |
comparison
equal
deleted
inserted
replaced
4427:88920ce27a9f | 4428:b5669740e34c |
---|---|
63 GtkCTreeNode *deny_node = NULL; | 63 GtkCTreeNode *deny_node = NULL; |
64 GtkWidget *prefs_proxy_frame = NULL; | 64 GtkWidget *prefs_proxy_frame = NULL; |
65 GtkWidget *gaim_button(const char *, guint *, int, GtkWidget *); | 65 GtkWidget *gaim_button(const char *, guint *, int, GtkWidget *); |
66 GtkWidget *gaim_labeled_spin_button(GtkWidget *, const gchar *, int*, int, int, GtkSizeGroup *); | 66 GtkWidget *gaim_labeled_spin_button(GtkWidget *, const gchar *, int*, int, int, GtkSizeGroup *); |
67 static GtkWidget *gaim_dropdown(GtkWidget *, const gchar *, int *, int, ...); | 67 static GtkWidget *gaim_dropdown(GtkWidget *, const gchar *, int *, int, ...); |
68 static GtkWidget *gaim_dropdown_from_list(GtkWidget *, const gchar *, int *, int, GList *); | |
68 static GtkWidget *show_color_pref(GtkWidget *, gboolean); | 69 static GtkWidget *show_color_pref(GtkWidget *, gboolean); |
69 static void delete_prefs(GtkWidget *, void *); | 70 static void delete_prefs(GtkWidget *, void *); |
70 void set_default_away(GtkWidget *, gpointer); | 71 void set_default_away(GtkWidget *, gpointer); |
72 static gboolean program_is_valid(const char *); | |
71 | 73 |
72 struct debug_window *dw = NULL; | 74 struct debug_window *dw = NULL; |
73 GtkWidget *prefs = NULL; | 75 GtkWidget *prefs = NULL; |
74 GtkWidget *debugbutton = NULL; | 76 GtkWidget *debugbutton = NULL; |
75 static int notebook_page = 0; | 77 static int notebook_page = 0; |
779 gtk_widget_show_all(ret); | 781 gtk_widget_show_all(ret); |
780 return ret; | 782 return ret; |
781 } | 783 } |
782 | 784 |
783 #ifndef _WIN32 | 785 #ifndef _WIN32 |
784 static void browser_print_option(GtkEntry *entry, void *nullish) { | 786 static void manual_browser_set(GtkButton *button, GtkEntry *entry) { |
785 g_snprintf(web_command, sizeof(web_command), "%s", gtk_entry_get_text(entry)); | 787 |
788 const char *program = gtk_entry_get_text(entry); | |
789 if (!program_is_valid(program)) { | |
790 char *error = g_strdup_printf(_("The entered manual browser " | |
791 "'%s' is not valid. Hyperlinks will " | |
792 "not work."), program); | |
793 do_error_dialog(error, NULL, GAIM_WARNING); | |
794 } | |
795 | |
796 g_strlcpy(web_command, program, sizeof(web_command)); | |
797 } | |
798 | |
799 static void manual_browser_reset(GtkButton *button, GtkEntry *entry) { | |
800 gtk_entry_set_text(entry, web_command); | |
786 } | 801 } |
787 #endif | 802 #endif |
803 | |
804 static GList *get_available_browsers() | |
805 { | |
806 struct browser { | |
807 char *name; | |
808 char *command; | |
809 int id; | |
810 }; | |
811 | |
812 static struct browser possible_browsers[] = { | |
813 {N_("Konqueror"), "kfmclient", BROWSER_KONQ}, | |
814 {N_("Opera"), "opera", BROWSER_OPERA}, | |
815 {N_("Galeon"), "galeon", BROWSER_GALEON}, | |
816 {N_("Netscape"), "netscape", BROWSER_NETSCAPE}, | |
817 {N_("Mozilla"), "mozilla", BROWSER_MOZILLA}, | |
818 }; | |
819 static const int num_possible_browsers = 5; | |
820 | |
821 GList *browsers = NULL; | |
822 int i = 0; | |
823 | |
824 browsers = g_list_prepend(browsers, GINT_TO_POINTER(BROWSER_MANUAL)); | |
825 browsers = g_list_prepend(browsers, _("Manual")); | |
826 for (i = 0; i < num_possible_browsers; i++) { | |
827 if (program_is_valid(possible_browsers[i].command)) { | |
828 browsers = g_list_prepend(browsers, | |
829 GINT_TO_POINTER(possible_browsers[i].id)); | |
830 browsers = g_list_prepend(browsers, possible_browsers[i].name); | |
831 } | |
832 } | |
833 | |
834 return browsers; | |
835 } | |
788 | 836 |
789 GtkWidget *browser_page() { | 837 GtkWidget *browser_page() { |
790 GtkWidget *ret; | 838 GtkWidget *ret; |
791 GtkWidget *vbox; | 839 GtkWidget *vbox; |
792 #ifndef _WIN32 | 840 #ifndef _WIN32 |
793 GtkWidget *hbox; | 841 GtkWidget *hbox; |
794 #endif | 842 #endif |
795 GtkWidget *label; | 843 GtkWidget *label; |
796 GtkSizeGroup *sg; | 844 GtkSizeGroup *sg; |
845 GList *browsers = NULL; | |
797 | 846 |
798 ret = gtk_vbox_new(FALSE, 18); | 847 ret = gtk_vbox_new(FALSE, 18); |
799 gtk_container_set_border_width (GTK_CONTAINER (ret), 12); | 848 gtk_container_set_border_width (GTK_CONTAINER (ret), 12); |
800 | 849 |
801 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | 850 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
802 #ifndef _WIN32 | 851 #ifndef _WIN32 |
803 /* Registered default browser is used by Windows */ | 852 /* Registered default browser is used by Windows */ |
804 vbox = make_frame (ret, _("Browser Selection")); | 853 vbox = make_frame (ret, _("Browser Selection")); |
805 label = gaim_dropdown(vbox, _("_Browser"), &web_browser, -1, | 854 |
806 "Netscape", BROWSER_NETSCAPE, | 855 browsers = get_available_browsers(); |
807 "Konqueror", BROWSER_KONQ, | 856 if (browsers != NULL) { |
808 "Mozilla", BROWSER_MOZILLA, | 857 label = gaim_dropdown_from_list(vbox,_("_Browser"), &web_browser, -1, |
809 _("Manual"), BROWSER_MANUAL, | 858 browsers); |
810 /* fixme: GNOME binary helper | |
811 _("GNOME URL Handler"), BROWSER_GNOME, */ | |
812 "Galeon", BROWSER_GALEON, | |
813 "Opera", BROWSER_OPERA, NULL); | |
814 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | 859 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); |
815 gtk_size_group_add_widget(sg, label); | 860 gtk_size_group_add_widget(sg, label); |
861 } | |
816 | 862 |
817 hbox = gtk_hbox_new(FALSE, 5); | 863 hbox = gtk_hbox_new(FALSE, 5); |
818 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | 864 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
819 label = gtk_label_new_with_mnemonic(_("_Manual: ")); | 865 label = gtk_label_new_with_mnemonic(_("_Manual: ")); |
820 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); | 866 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); |
821 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | 867 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); |
822 gtk_size_group_add_widget(sg, label); | 868 gtk_size_group_add_widget(sg, label); |
823 browser_entry = gtk_entry_new(); | 869 browser_entry = gtk_entry_new(); |
824 gtk_label_set_mnemonic_widget(GTK_LABEL(label), browser_entry); | 870 gtk_label_set_mnemonic_widget(GTK_LABEL(label), browser_entry); |
825 if (web_browser != BROWSER_MANUAL) | 871 if (web_browser != BROWSER_MANUAL) |
826 gtk_widget_set_sensitive(browser_entry, FALSE); | 872 gtk_widget_set_sensitive(hbox, FALSE); |
827 gtk_box_pack_start (GTK_BOX (hbox), browser_entry, FALSE, FALSE, 0); | 873 gtk_box_pack_start (GTK_BOX (hbox), browser_entry, FALSE, FALSE, 0); |
828 | 874 |
829 gtk_entry_set_text(GTK_ENTRY(browser_entry), web_command); | 875 gtk_entry_set_text(GTK_ENTRY(browser_entry), web_command); |
830 g_signal_connect(GTK_OBJECT(browser_entry), "changed", | 876 g_signal_connect_swapped(GTK_OBJECT(browser_entry), "activate", |
831 G_CALLBACK(browser_print_option), NULL); | 877 G_CALLBACK(manual_browser_set), NULL); |
878 label = gtk_button_new_with_label(_("Set")); | |
879 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
880 g_signal_connect(GTK_OBJECT(label), "clicked", | |
881 G_CALLBACK(manual_browser_set), browser_entry); | |
882 label = gtk_button_new_with_label(_("Reset")); | |
883 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
884 g_signal_connect(GTK_OBJECT(label), "clicked", | |
885 G_CALLBACK(manual_browser_reset), browser_entry); | |
886 | |
832 #endif /* end !_WIN32 */ | 887 #endif /* end !_WIN32 */ |
888 if (browsers != NULL) { | |
833 vbox = make_frame (ret, _("Browser Options")); | 889 vbox = make_frame (ret, _("Browser Options")); |
890 | |
834 label = gaim_button(_("Open new _window by default"), &misc_options, OPT_MISC_BROWSER_POPUP, vbox); | 891 label = gaim_button(_("Open new _window by default"), &misc_options, OPT_MISC_BROWSER_POPUP, vbox); |
892 } | |
835 #ifdef _WIN32 | 893 #ifdef _WIN32 |
836 /* Until I figure out how to implement this on windows */ | 894 /* Until I figure out how to implement this on windows */ |
837 gtk_widget_set_sensitive(label, FALSE); | 895 gtk_widget_set_sensitive(label, FALSE); |
838 #endif | 896 #endif |
839 gtk_widget_show_all(ret); | 897 gtk_widget_show_all(ret); |
2117 default_away = g_slist_nth_data(away_messages, length - 1); | 2175 default_away = g_slist_nth_data(away_messages, length - 1); |
2118 else | 2176 else |
2119 default_away = g_slist_nth_data(away_messages, (int)i); | 2177 default_away = g_slist_nth_data(away_messages, (int)i); |
2120 } | 2178 } |
2121 | 2179 |
2180 static gboolean program_is_valid(const char *program) | |
2181 { | |
2182 GError *error = NULL; | |
2183 char **argv; | |
2184 gboolean is_valid = FALSE; | |
2185 | |
2186 if (program == NULL || *program == '\0') { | |
2187 return FALSE; | |
2188 } | |
2189 | |
2190 if (!g_shell_parse_argv(program, NULL, &argv, &error)) { | |
2191 debug_printf("Could not parse program '%s': ", error->message); | |
2192 return FALSE; | |
2193 } | |
2194 | |
2195 if (argv == NULL) { | |
2196 return FALSE; | |
2197 } | |
2198 | |
2199 is_valid = g_find_program_in_path(argv[0]) != NULL; | |
2200 | |
2201 g_strfreev(argv); | |
2202 | |
2203 return is_valid; | |
2204 } | |
2205 | |
2122 static void update_spin_value(GtkWidget *w, GtkWidget *spin) | 2206 static void update_spin_value(GtkWidget *w, GtkWidget *spin) |
2123 { | 2207 { |
2124 int *value = gtk_object_get_user_data(GTK_OBJECT(spin)); | 2208 int *value = gtk_object_get_user_data(GTK_OBJECT(spin)); |
2125 *value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin)); | 2209 *value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin)); |
2126 } | 2210 } |
2177 gtk_widget_set_sensitive(prefs_proxy_frame, FALSE); | 2261 gtk_widget_set_sensitive(prefs_proxy_frame, FALSE); |
2178 else | 2262 else |
2179 gtk_widget_set_sensitive(prefs_proxy_frame, TRUE); | 2263 gtk_widget_set_sensitive(prefs_proxy_frame, TRUE); |
2180 } else if (option == &web_browser) { | 2264 } else if (option == &web_browser) { |
2181 if (opt == BROWSER_MANUAL) | 2265 if (opt == BROWSER_MANUAL) |
2182 gtk_widget_set_sensitive(browser_entry, TRUE); | 2266 gtk_widget_set_sensitive(gtk_widget_get_parent(browser_entry), TRUE); |
2183 else | 2267 else |
2184 gtk_widget_set_sensitive(browser_entry, FALSE); | 2268 gtk_widget_set_sensitive(gtk_widget_get_parent(browser_entry), FALSE); |
2185 } else if (option == (int*)&sound_options) { | 2269 } else if (option == (int*)&sound_options) { |
2186 if (opt == OPT_SOUND_CMD) | 2270 if (opt == OPT_SOUND_CMD) |
2187 gtk_widget_set_sensitive(sndcmd, TRUE); | 2271 gtk_widget_set_sensitive(sndcmd, TRUE); |
2188 else | 2272 else |
2189 gtk_widget_set_sensitive(sndcmd, FALSE); | 2273 gtk_widget_set_sensitive(sndcmd, FALSE); |
2204 } | 2288 } |
2205 } | 2289 } |
2206 | 2290 |
2207 static GtkWidget *gaim_dropdown(GtkWidget *box, const gchar *title, int *option, int clear, ...) | 2291 static GtkWidget *gaim_dropdown(GtkWidget *box, const gchar *title, int *option, int clear, ...) |
2208 { | 2292 { |
2209 va_list menuitems; | 2293 va_list ap; |
2294 GList *menuitems = NULL; | |
2295 GtkWidget *dropdown = NULL; | |
2296 char *name; | |
2297 int id; | |
2298 | |
2299 va_start(ap, clear); | |
2300 while ((name = va_arg(ap, char *)) != NULL) { | |
2301 id = va_arg(ap, int); | |
2302 | |
2303 menuitems = g_list_prepend(menuitems, name); | |
2304 menuitems = g_list_prepend(menuitems, GINT_TO_POINTER(id)); | |
2305 } | |
2306 va_end(ap); | |
2307 | |
2308 if (menuitems == NULL) { | |
2309 return; | |
2310 } | |
2311 | |
2312 menuitems = g_list_reverse(menuitems); | |
2313 | |
2314 dropdown = gaim_dropdown_from_list(box, title, option, clear, menuitems); | |
2315 | |
2316 g_list_free(menuitems); | |
2317 | |
2318 return dropdown; | |
2319 } | |
2320 | |
2321 static GtkWidget *gaim_dropdown_from_list(GtkWidget *box, const gchar *title, int *option, int clear, GList *menuitems) | |
2322 { | |
2210 GtkWidget *dropdown, *opt, *menu; | 2323 GtkWidget *dropdown, *opt, *menu; |
2211 GtkWidget *label; | 2324 GtkWidget *label; |
2212 gchar *text; | 2325 gchar *text; |
2213 int value; | 2326 int value; |
2214 int o = 0; | 2327 int o = 0; |
2215 GtkWidget *hbox; | 2328 GtkWidget *hbox; |
2216 | 2329 |
2330 g_return_val_if_fail(menuitems != NULL, NULL); | |
2331 | |
2217 hbox = gtk_hbox_new(FALSE, 5); | 2332 hbox = gtk_hbox_new(FALSE, 5); |
2218 gtk_container_add (GTK_CONTAINER (box), hbox); | 2333 gtk_container_add (GTK_CONTAINER (box), hbox); |
2219 gtk_widget_show(hbox); | 2334 gtk_widget_show(hbox); |
2220 | 2335 |
2221 label = gtk_label_new_with_mnemonic(title); | 2336 label = gtk_label_new_with_mnemonic(title); |
2222 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | 2337 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
2223 gtk_widget_show(label); | 2338 gtk_widget_show(label); |
2224 | 2339 |
2225 va_start(menuitems, clear); | |
2226 text = va_arg(menuitems, gchar *); | |
2227 | |
2228 if (!text) | |
2229 return NULL; | |
2230 | |
2231 dropdown = gtk_option_menu_new(); | 2340 dropdown = gtk_option_menu_new(); |
2232 menu = gtk_menu_new(); | 2341 menu = gtk_menu_new(); |
2233 | 2342 |
2234 gtk_label_set_mnemonic_widget(GTK_LABEL(label), dropdown); | 2343 gtk_label_set_mnemonic_widget(GTK_LABEL(label), dropdown); |
2235 | 2344 |
2236 while (text) { | 2345 while (menuitems != NULL && (text = (char *) menuitems->data) != NULL) { |
2237 value = va_arg(menuitems, int); | 2346 menuitems = g_list_next(menuitems); |
2347 g_return_val_if_fail(menuitems != NULL, NULL); | |
2348 value = GPOINTER_TO_INT(menuitems->data); | |
2349 menuitems = g_list_next(menuitems); | |
2350 | |
2238 opt = gtk_menu_item_new_with_label(text); | 2351 opt = gtk_menu_item_new_with_label(text); |
2239 gtk_object_set_user_data(GTK_OBJECT(opt), (void *)value); | 2352 gtk_object_set_user_data(GTK_OBJECT(opt), (void *)value); |
2240 gtk_object_set_data(GTK_OBJECT(opt), "clear", (void *)clear); | 2353 gtk_object_set_data(GTK_OBJECT(opt), "clear", (void *)clear); |
2241 g_signal_connect(GTK_OBJECT(opt), "activate", | 2354 g_signal_connect(GTK_OBJECT(opt), "activate", |
2242 G_CALLBACK(dropdown_set), (void *)option); | 2355 G_CALLBACK(dropdown_set), (void *)option); |
2244 gtk_menu_shell_append(GTK_MENU_SHELL(menu), opt); | 2357 gtk_menu_shell_append(GTK_MENU_SHELL(menu), opt); |
2245 | 2358 |
2246 if (((clear > -1) && ((*option & value) == value)) || *option == value) { | 2359 if (((clear > -1) && ((*option & value) == value)) || *option == value) { |
2247 gtk_menu_set_active(GTK_MENU(menu), o); | 2360 gtk_menu_set_active(GTK_MENU(menu), o); |
2248 } | 2361 } |
2249 text = va_arg(menuitems, gchar *); | |
2250 o++; | 2362 o++; |
2251 } | 2363 |
2252 | 2364 } |
2253 va_end(menuitems); | |
2254 | 2365 |
2255 gtk_option_menu_set_menu(GTK_OPTION_MENU(dropdown), menu); | 2366 gtk_option_menu_set_menu(GTK_OPTION_MENU(dropdown), menu); |
2256 gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0); | 2367 gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0); |
2257 gtk_widget_show(dropdown); | 2368 gtk_widget_show(dropdown); |
2258 return label; | 2369 return label; |