pidgin/gtkprefs.c

changeset 39187
ff095c074d32
parent 39186
5f745be136ad
child 39188
093a6314d473
equal deleted inserted replaced
39186:5f745be136ad 39187:ff095c074d32
103 struct _PidginPrefsWindow { 103 struct _PidginPrefsWindow {
104 GtkDialog parent; 104 GtkDialog parent;
105 105
106 /* Notebook */ 106 /* Notebook */
107 GtkWidget *notebook; 107 GtkWidget *notebook;
108
109 /* Browser page */
110 struct {
111 GtkWidget *page;
112 GtkWidget *stack;
113 /* GNOME version */
114 GtkWidget *gnome_not_found;
115 GtkWidget *gnome_program;
116 gchar *gnome_program_path;
117 /* Non-GNOME version */
118 PidginPrefCombo browser;
119 GtkWidget *place_hbox;
120 PidginPrefCombo place;
121 GtkWidget *manual_command_hbox;
122 GtkWidget *manual_command;
123 } browser;
108 124
109 /* Conversations page */ 125 /* Conversations page */
110 struct { 126 struct {
111 PidginPrefCombo notification_chat; 127 PidginPrefCombo notification_chat;
112 GtkWidget *show_incoming_formatting; 128 GtkWidget *show_incoming_formatting;
852 voice_threshold = NULL; 868 voice_threshold = NULL;
853 voice_volume = NULL; 869 voice_volume = NULL;
854 video_drawing_area = NULL; 870 video_drawing_area = NULL;
855 #endif 871 #endif
856 g_free(prefs->proxy.gnome_program_path); 872 g_free(prefs->proxy.gnome_program_path);
873 g_free(prefs->browser.gnome_program_path);
857 prefs = NULL; 874 prefs = NULL;
858 } 875 }
859 876
860 static gchar * 877 static gchar *
861 get_theme_markup(const char *name, gboolean custom, const char *author, 878 get_theme_markup(const char *name, gboolean custom, const char *author,
2313 2330
2314 purple_notify_error(NULL, NULL, _("Cannot start proxy configuration program."), err->message, NULL); 2331 purple_notify_error(NULL, NULL, _("Cannot start proxy configuration program."), err->message, NULL);
2315 g_error_free(err); 2332 g_error_free(err);
2316 } 2333 }
2317 2334
2318 #ifndef _WIN32 2335 static void
2319 static void 2336 browser_button_clicked_cb(GtkWidget *button, PidginPrefsWindow *win)
2320 browser_button_clicked_cb(GtkWidget *button, gchar *path)
2321 { 2337 {
2322 GError *err = NULL; 2338 GError *err = NULL;
2323 2339
2324 if (g_spawn_command_line_async(path, &err)) 2340 if (g_spawn_command_line_async(win->browser.gnome_program_path, &err))
2325 return; 2341 return;
2326 2342
2327 purple_notify_error(NULL, NULL, _("Cannot start browser configuration program."), err->message, NULL); 2343 purple_notify_error(NULL, NULL, _("Cannot start browser configuration program."), err->message, NULL);
2328 g_error_free(err); 2344 g_error_free(err);
2329 } 2345 }
2330 #endif
2331 2346
2332 static void 2347 static void
2333 auto_ip_button_clicked_cb(GtkWidget *button, gpointer null) 2348 auto_ip_button_clicked_cb(GtkWidget *button, gpointer null)
2334 { 2349 {
2335 const char *ip; 2350 const char *ip;
2434 win->network.turn_username); 2449 win->network.turn_username);
2435 pidgin_prefs_bind_entry("/purple/network/turn_password", 2450 pidgin_prefs_bind_entry("/purple/network/turn_password",
2436 win->network.turn_password); 2451 win->network.turn_password);
2437 } 2452 }
2438 2453
2439 #ifndef _WIN32
2440 static gboolean 2454 static gboolean
2441 manual_browser_set(GtkWidget *entry, GdkEventFocus *event, gpointer data) 2455 manual_browser_set(GtkWidget *entry, GdkEventFocus *event, gpointer data)
2442 { 2456 {
2443 const char *program = gtk_entry_get_text(GTK_ENTRY(entry)); 2457 const char *program = gtk_entry_get_text(GTK_ENTRY(entry));
2444 2458
2446 2460
2447 /* carry on normally */ 2461 /* carry on normally */
2448 return FALSE; 2462 return FALSE;
2449 } 2463 }
2450 2464
2465 #ifndef _WIN32
2451 static GList * 2466 static GList *
2452 get_available_browsers(void) 2467 get_available_browsers(void)
2453 { 2468 {
2454 struct browser { 2469 struct browser {
2455 char *name; 2470 char *name;
2527 const char *browser = value; 2542 const char *browser = value;
2528 2543
2529 gtk_widget_set_sensitive(hbox, purple_strequal(browser, "custom")); 2544 gtk_widget_set_sensitive(hbox, purple_strequal(browser, "custom"));
2530 } 2545 }
2531 2546
2532 static GtkWidget * 2547 static void
2533 browser_page(void) 2548 bind_browser_page(PidginPrefsWindow *win)
2534 { 2549 {
2535 GtkWidget *ret, *vbox, *hbox, *label, *entry, *browser_button;
2536 GtkSizeGroup *sg;
2537 GList *browsers = NULL;
2538
2539 ret = gtk_box_new(GTK_ORIENTATION_VERTICAL, PIDGIN_HIG_CAT_SPACE);
2540 gtk_container_set_border_width (GTK_CONTAINER (ret), PIDGIN_HIG_BORDER);
2541
2542 vbox = pidgin_make_frame (ret, _("Browser Selection"));
2543
2544 if (purple_running_gnome()) { 2550 if (purple_running_gnome()) {
2545 gchar *path; 2551 gchar *path;
2546 2552
2547 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, PIDGIN_HIG_BOX_SPACE); 2553 gtk_stack_set_visible_child_name(GTK_STACK(win->browser.stack),
2548 label = gtk_label_new(_("Browser preferences are configured in GNOME preferences")); 2554 "gnome");
2549 gtk_container_add(GTK_CONTAINER(vbox), hbox);
2550 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
2551
2552 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, PIDGIN_HIG_BOX_SPACE);
2553 gtk_container_add(GTK_CONTAINER(vbox), hbox);
2554 2555
2555 path = g_find_program_in_path("gnome-control-center"); 2556 path = g_find_program_in_path("gnome-control-center");
2556 if (path != NULL) { 2557 if (path != NULL) {
2557 gchar *tmp = g_strdup_printf("%s info", path); 2558 gchar *tmp = g_strdup_printf("%s info", path);
2558 g_free(path); 2559 g_free(path);
2559 path = tmp; 2560 path = tmp;
2560 } else { 2561 } else {
2561 path = g_find_program_in_path("gnome-default-applications-properties"); 2562 path = g_find_program_in_path("gnome-default-applications-properties");
2562 } 2563 }
2563 2564
2564 if (path == NULL) { 2565 win->browser.gnome_program_path = path;
2565 label = gtk_label_new(NULL); 2566 gtk_widget_set_visible(win->browser.gnome_not_found,
2566 gtk_label_set_markup(GTK_LABEL(label), 2567 path == NULL);
2567 _("<b>Browser configuration program was not found.</b>")); 2568 gtk_widget_set_visible(win->browser.gnome_program,
2568 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); 2569 path != NULL);
2570 } else {
2571 GList *browsers = NULL;
2572
2573 gtk_stack_set_visible_child_name(GTK_STACK(win->browser.stack),
2574 "nongnome");
2575
2576 win->browser.browser.type = PURPLE_PREF_STRING;
2577 win->browser.browser.key = PIDGIN_PREFS_ROOT "/browsers/browser";
2578 browsers = get_available_browsers();
2579 pidgin_prefs_bind_dropdown_from_list(
2580 &win->browser.browser,
2581 browsers);
2582 g_list_free(browsers);
2583
2584 win->browser.place.type = PURPLE_PREF_INT;
2585 win->browser.place.key = PIDGIN_PREFS_ROOT "/browsers/place";
2586 pidgin_prefs_bind_dropdown(&win->browser.place);
2587
2588 purple_prefs_connect_callback(prefs,
2589 PIDGIN_PREFS_ROOT "/browsers/browser",
2590 browser_changed1_cb,
2591 win->browser.place_hbox);
2592
2593 gtk_entry_set_text(GTK_ENTRY(win->browser.manual_command),
2594 purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/manual_command"));
2595 purple_prefs_connect_callback(prefs,
2596 PIDGIN_PREFS_ROOT "/browsers/browser",
2597 browser_changed2_cb,
2598 win->browser.manual_command_hbox);
2599
2600 if (purple_strequal(
2601 purple_prefs_get_string(
2602 PIDGIN_PREFS_ROOT "/browsers/browser"),
2603 "custom")) {
2604 gtk_widget_set_sensitive(win->browser.place_hbox,
2605 FALSE);
2569 } else { 2606 } else {
2570 browser_button = gtk_button_new_with_mnemonic(_("Configure _Browser")); 2607 gtk_widget_set_sensitive(win->browser.manual_command_hbox,
2571 g_signal_connect_data(G_OBJECT(browser_button), "clicked", 2608 FALSE);
2572 G_CALLBACK(browser_button_clicked_cb), path,
2573 (GClosureNotify)g_free, 0);
2574 gtk_box_pack_start(GTK_BOX(hbox), browser_button, FALSE, FALSE, 0);
2575 } 2609 }
2576 2610 }
2577 gtk_widget_show_all(ret);
2578 } else {
2579 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
2580
2581 browsers = get_available_browsers();
2582 if (browsers != NULL) {
2583 label = pidgin_prefs_dropdown_from_list(vbox,_("_Browser:"), PURPLE_PREF_STRING,
2584 PIDGIN_PREFS_ROOT "/browsers/browser",
2585 browsers);
2586 g_list_free(browsers);
2587 gtk_label_set_xalign(GTK_LABEL(label), 0.0);
2588 gtk_label_set_yalign(GTK_LABEL(label), 0.5);
2589 gtk_size_group_add_widget(sg, label);
2590
2591 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
2592 label = pidgin_prefs_dropdown(hbox, _("_Open link in:"), PURPLE_PREF_INT,
2593 PIDGIN_PREFS_ROOT "/browsers/place",
2594 _("Browser default"), PIDGIN_BROWSER_DEFAULT,
2595 _("New window"), PIDGIN_BROWSER_NEW_WINDOW,
2596 _("New tab"), PIDGIN_BROWSER_NEW_TAB,
2597 NULL);
2598 gtk_label_set_xalign(GTK_LABEL(label), 0.0);
2599 gtk_label_set_yalign(GTK_LABEL(label), 0.5);
2600 gtk_size_group_add_widget(sg, label);
2601 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
2602
2603 if (purple_strequal(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/browser"), "custom"))
2604 gtk_widget_set_sensitive(hbox, FALSE);
2605 purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/browsers/browser",
2606 browser_changed1_cb, hbox);
2607 }
2608
2609 entry = gtk_entry_new();
2610 gtk_entry_set_text(GTK_ENTRY(entry),
2611 purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/manual_command"));
2612 g_signal_connect(G_OBJECT(entry), "focus-out-event",
2613 G_CALLBACK(manual_browser_set), NULL);
2614 hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Manual:\n(%s for URL)"), sg, entry, TRUE, NULL);
2615 if (!purple_strequal(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/browser"), "custom"))
2616 gtk_widget_set_sensitive(hbox, FALSE);
2617 purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/browsers/browser",
2618 browser_changed2_cb, hbox);
2619
2620 gtk_widget_show_all(ret);
2621 g_object_unref(sg);
2622 }
2623
2624 return ret;
2625 } 2611 }
2626 #endif /*_WIN32*/ 2612 #endif /*_WIN32*/
2627 2613
2628 static void 2614 static void
2629 bind_proxy_page(PidginPrefsWindow *win) 2615 bind_proxy_page(PidginPrefsWindow *win)
4024 GtkNotebook *notebook = GTK_NOTEBOOK(win->notebook); 4010 GtkNotebook *notebook = GTK_NOTEBOOK(win->notebook);
4025 int notebook_page = 0; 4011 int notebook_page = 0;
4026 4012
4027 prefs_notebook_add_page(notebook, _("Interface"), interface_page(), notebook_page++); 4013 prefs_notebook_add_page(notebook, _("Interface"), interface_page(), notebook_page++);
4028 4014
4029 #ifndef _WIN32 4015 #ifdef _WIN32
4030 /* We use the registered default browser in windows */ 4016 /* We use the registered default browser in windows */
4017 gtk_widget_hide(win->browser.page);
4018 #else
4031 /* if the user is running Mac OS X, hide the browsers tab */ 4019 /* if the user is running Mac OS X, hide the browsers tab */
4032 if(purple_running_osx() == FALSE) 4020 if (purple_running_osx()) {
4033 prefs_notebook_add_page(notebook, _("Browser"), browser_page(), notebook_page++); 4021 gtk_widget_hide(win->browser.page);
4022 } else {
4023 bind_browser_page(win);
4024 notebook_page++;
4025 }
4034 #endif 4026 #endif
4035 4027
4036 bind_conv_page(win); 4028 bind_conv_page(win);
4037 notebook_page++; 4029 notebook_page++;
4038 bind_logging_page(win); 4030 bind_logging_page(win);
4063 4055
4064 /* Main window */ 4056 /* Main window */
4065 gtk_widget_class_bind_template_child( 4057 gtk_widget_class_bind_template_child(
4066 widget_class, PidginPrefsWindow, notebook); 4058 widget_class, PidginPrefsWindow, notebook);
4067 gtk_widget_class_bind_template_callback(widget_class, delete_prefs); 4059 gtk_widget_class_bind_template_callback(widget_class, delete_prefs);
4060
4061 /* Browser page */
4062 gtk_widget_class_bind_template_child(
4063 widget_class, PidginPrefsWindow, browser.page);
4064 gtk_widget_class_bind_template_child(
4065 widget_class, PidginPrefsWindow, browser.stack);
4066 gtk_widget_class_bind_template_child(
4067 widget_class, PidginPrefsWindow, browser.gnome_not_found);
4068 gtk_widget_class_bind_template_child(
4069 widget_class, PidginPrefsWindow, browser.gnome_program);
4070 gtk_widget_class_bind_template_child(
4071 widget_class, PidginPrefsWindow, browser.browser.combo);
4072 gtk_widget_class_bind_template_child(
4073 widget_class, PidginPrefsWindow, browser.place_hbox);
4074 gtk_widget_class_bind_template_child(
4075 widget_class, PidginPrefsWindow, browser.place.combo);
4076 gtk_widget_class_bind_template_child(
4077 widget_class, PidginPrefsWindow, browser.manual_command_hbox);
4078 gtk_widget_class_bind_template_child(
4079 widget_class, PidginPrefsWindow, browser.manual_command);
4080 gtk_widget_class_bind_template_callback(widget_class,
4081 browser_button_clicked_cb);
4082 gtk_widget_class_bind_template_callback(widget_class,
4083 manual_browser_set);
4068 4084
4069 /* Conversations page */ 4085 /* Conversations page */
4070 gtk_widget_class_bind_template_child( 4086 gtk_widget_class_bind_template_child(
4071 widget_class, PidginPrefsWindow, 4087 widget_class, PidginPrefsWindow,
4072 conversations.notification_chat.combo); 4088 conversations.notification_chat.combo);

mercurial