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;