pidgin/gtkprefs.c

branch
maiku.vv
changeset 26142
20ed0b892829
parent 24284
ff4a5bfdab7f
parent 26135
b7e6a25f1771
child 26152
d4b5bdf689a0
equal deleted inserted replaced
24403:3c5f5cf7f330 26142:20ed0b892829
26 */ 26 */
27 #include "internal.h" 27 #include "internal.h"
28 #include "pidgin.h" 28 #include "pidgin.h"
29 29
30 #include "debug.h" 30 #include "debug.h"
31 #ifdef USE_VV
32 #include "mediamanager.h"
33 #endif
31 #include "notify.h" 34 #include "notify.h"
32 #include "prefs.h" 35 #include "prefs.h"
33 #include "proxy.h" 36 #include "proxy.h"
34 #include "prpl.h" 37 #include "prpl.h"
35 #include "request.h" 38 #include "request.h"
143 146
144 type = GPOINTER_TO_INT(g_object_get_data(w, "type")); 147 type = GPOINTER_TO_INT(g_object_get_data(w, "type"));
145 148
146 if (type == PURPLE_PREF_INT) { 149 if (type == PURPLE_PREF_INT) {
147 int_value = GPOINTER_TO_INT(g_object_get_data(w, "value")); 150 int_value = GPOINTER_TO_INT(g_object_get_data(w, "value"));
148
149 purple_prefs_set_int(key, int_value); 151 purple_prefs_set_int(key, int_value);
150 } 152 }
151 else if (type == PURPLE_PREF_STRING) { 153 else if (type == PURPLE_PREF_STRING) {
152 str_value = (const char *)g_object_get_data(w, "value"); 154 str_value = (const char *)g_object_get_data(w, "value");
153
154 purple_prefs_set_string(key, str_value); 155 purple_prefs_set_string(key, str_value);
155 } 156 }
156 else if (type == PURPLE_PREF_BOOLEAN) { 157 else if (type == PURPLE_PREF_BOOLEAN) {
157 purple_prefs_set_bool(key, 158 purple_prefs_set_bool(key,
158 GPOINTER_TO_INT(g_object_get_data(w, "value"))); 159 GPOINTER_TO_INT(g_object_get_data(w, "value")));
943 _("Always"), "always", 944 _("Always"), "always",
944 _("On unread messages"), "pending", 945 _("On unread messages"), "pending",
945 _("Never"), "never", 946 _("Never"), "never",
946 NULL); 947 NULL);
947 gtk_size_group_add_widget(sg, label); 948 gtk_size_group_add_widget(sg, label);
948 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); 949 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
949 950
950 vbox = pidgin_make_frame(ret, _("Conversation Window Hiding")); 951 vbox = pidgin_make_frame(ret, _("Conversation Window Hiding"));
951 label = pidgin_prefs_dropdown(vbox, _("_Hide new IM conversations:"), 952 label = pidgin_prefs_dropdown(vbox, _("_Hide new IM conversations:"),
952 PURPLE_PREF_STRING, PIDGIN_PREFS_ROOT "/conversations/im/hide_new", 953 PURPLE_PREF_STRING, PIDGIN_PREFS_ROOT "/conversations/im/hide_new",
953 _("Never"), "never", 954 _("Never"), "never",
954 _("When away"), "away", 955 _("When away"), "away",
955 _("Always"), "always", 956 _("Always"), "always",
956 NULL); 957 NULL);
957 gtk_size_group_add_widget(sg, label); 958 gtk_size_group_add_widget(sg, label);
958 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); 959 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
959 960
960 961
961 /* All the tab options! */ 962 /* All the tab options! */
962 vbox = pidgin_make_frame(ret, _("Tabs")); 963 vbox = pidgin_make_frame(ret, _("Tabs"));
963 964
988 _("Left Vertical"), GTK_POS_LEFT|8, 989 _("Left Vertical"), GTK_POS_LEFT|8,
989 _("Right Vertical"), GTK_POS_RIGHT|8, 990 _("Right Vertical"), GTK_POS_RIGHT|8,
990 #endif 991 #endif
991 NULL); 992 NULL);
992 gtk_size_group_add_widget(sg, label); 993 gtk_size_group_add_widget(sg, label);
993 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); 994 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
994 995
995 names = pidgin_conv_placement_get_options(); 996 names = pidgin_conv_placement_get_options();
996 label = pidgin_prefs_dropdown_from_list(vbox2, _("N_ew conversations:"), 997 label = pidgin_prefs_dropdown_from_list(vbox2, _("N_ew conversations:"),
997 PURPLE_PREF_STRING, PIDGIN_PREFS_ROOT "/conversations/placement", names); 998 PURPLE_PREF_STRING, PIDGIN_PREFS_ROOT "/conversations/placement", names);
998 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); 999 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
2040 g_object_unref(sg); 2041 g_object_unref(sg);
2041 2042
2042 return ret; 2043 return ret;
2043 } 2044 }
2044 2045
2046 #ifdef USE_VV
2047
2048 /* get a GList of pairs name / device */
2049 static GList *
2050 get_device_items(const gchar *plugin)
2051 {
2052 GList *ret = NULL;
2053 GList *devices = purple_media_get_devices(plugin);
2054 GstElement *element = gst_element_factory_make(plugin, NULL);
2055
2056 if (element == NULL)
2057 return NULL;
2058
2059 for(; devices ; devices = g_list_delete_link(devices, devices)) {
2060 gchar *name;
2061 g_object_set(G_OBJECT(element), "device", devices->data, NULL);
2062 g_object_get(G_OBJECT(element), "device-name", &name, NULL);
2063 ret = g_list_append(ret, name);
2064 ret = g_list_append(ret, devices->data);
2065 }
2066
2067 gst_object_unref(element);
2068 return ret;
2069 }
2070
2071 /*
2072 * Test functions to run video preview
2073 */
2074 static gboolean
2075 preview_video_bus_call(GstBus *bus, GstMessage *msg, gpointer pipeline)
2076 {
2077 switch(GST_MESSAGE_TYPE(msg)) {
2078 case GST_MESSAGE_EOS:
2079 purple_debug_info("preview-video", "End of Stream\n");
2080 break;
2081 case GST_MESSAGE_ERROR: {
2082 gchar *debug = NULL;
2083 GError *err = NULL;
2084
2085 gst_message_parse_error(msg, &err, &debug);
2086
2087 purple_debug_error("preview-video", "Error: %s\n", err->message);
2088 g_error_free(err);
2089
2090 if (debug) {
2091 purple_debug_error("preview-video", "details: %s\n", debug);
2092 g_free (debug);
2093 }
2094 break;
2095 }
2096 default:
2097 return TRUE;
2098 }
2099
2100 gst_element_set_state(pipeline, GST_STATE_NULL);
2101 gst_object_unref(GST_PIPELINE(pipeline));
2102 return FALSE;
2103 }
2104
2105 static void
2106 preview_button_clicked(GtkWidget *widget, gpointer *data)
2107 {
2108 const char *plugin = purple_prefs_get_string("/purple/media/video/plugin");
2109 const char *device = purple_prefs_get_string("/purple/media/video/device");
2110 GstBus *bus;
2111
2112 /* create a preview window... */
2113 GstElement *pipeline = NULL;
2114 GError *p_err = NULL;
2115
2116 gchar *test_pipeline_str = NULL;
2117
2118 if (strlen(device) > 0)
2119 test_pipeline_str = g_strdup_printf("%s device=\"%s\" !" \
2120 " ffmpegcolorspace !" \
2121 " autovideosink",
2122 plugin, device);
2123 else
2124 test_pipeline_str = g_strdup_printf("%s ! ffmpegcolorspace !" \
2125 " autovideosink", plugin);
2126
2127 pipeline = gst_parse_launch (test_pipeline_str, &p_err);
2128
2129 g_free(test_pipeline_str);
2130
2131 if (pipeline == NULL) {
2132 purple_debug_error("gtkprefs",
2133 "Error starting preview: %s\n", p_err->message);
2134 g_error_free(p_err);
2135 return;
2136 }
2137
2138 bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
2139 gst_bus_add_watch(bus, preview_video_bus_call, pipeline);
2140 gst_object_unref(bus);
2141
2142 gst_element_set_state(pipeline, GST_STATE_PLAYING);
2143 }
2144
2145 static void
2146 media_plugin_changed_cb(const gchar *name, PurplePrefType type,
2147 gconstpointer value, gpointer data)
2148 {
2149 GtkWidget *hbox = data;
2150 GtkWidget *dd = NULL;
2151 GtkWidget *preview_button = NULL;
2152 const char *plugin = value;
2153 const char *device = purple_prefs_get_string("/purple/media/video/device");
2154 GList *video_items = get_device_items(plugin);
2155 GList *list;
2156
2157 if (video_items == NULL) {
2158 video_items = g_list_prepend(video_items, g_strdup(""));
2159 video_items = g_list_prepend(video_items, g_strdup("Default"));
2160 }
2161
2162 if (g_list_find(video_items, device) == NULL)
2163 {
2164 purple_prefs_set_string("/purple/media/video/device",
2165 g_list_next(video_items)->data);
2166 }
2167
2168 list = gtk_container_get_children(GTK_CONTAINER(hbox));
2169
2170 while (list) {
2171 gtk_widget_destroy(list->data);
2172 list = g_list_delete_link(list, list);
2173 }
2174
2175 dd = pidgin_prefs_dropdown_from_list(hbox, _("_Device:"), PURPLE_PREF_STRING,
2176 "/purple/media/video/device",
2177 video_items);
2178
2179 gtk_misc_set_alignment(GTK_MISC(dd), 0, 0.5);
2180
2181 preview_button = gtk_button_new_with_mnemonic(_("_Preview"));
2182 g_signal_connect(G_OBJECT(preview_button), "clicked",
2183 G_CALLBACK(preview_button_clicked), NULL);
2184
2185 gtk_container_add(GTK_CONTAINER(hbox), preview_button);
2186
2187 gtk_widget_show_all(hbox);
2188 }
2189
2190 static void
2191 prefs_media_input_volume_changed(GtkRange *range)
2192 {
2193 double val = (double)gtk_range_get_value(GTK_RANGE(range));
2194 GList *medias = purple_media_manager_get_media(purple_media_manager_get());
2195 purple_prefs_set_int("/purple/media/audio/volume/input", val);
2196
2197 val /= 10.0;
2198 for (; medias; medias = g_list_next(medias)) {
2199 PurpleMedia *media = PURPLE_MEDIA(medias->data);
2200 GList *sessions = purple_media_get_session_names(media);
2201 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) {
2202 const gchar *session = sessions->data;
2203 if (purple_media_get_session_type(media, session)
2204 & PURPLE_MEDIA_SEND_AUDIO) {
2205 GstElement *volume = gst_bin_get_by_name(
2206 GST_BIN(purple_media_get_src(media, session)),
2207 "purpleaudioinputvolume");
2208 g_object_set(volume, "volume", val, NULL);
2209 }
2210 }
2211 }
2212 }
2213
2214 static void
2215 prefs_media_output_volume_changed(GtkRange *range)
2216 {
2217 double val = (double)gtk_range_get_value(GTK_RANGE(range));
2218 GList *medias = purple_media_manager_get_media(purple_media_manager_get());
2219 purple_prefs_set_int("/purple/media/audio/volume/output", val);
2220
2221 val /= 10.0;
2222 for (; medias; medias = g_list_next(medias)) {
2223 PurpleMedia *media = PURPLE_MEDIA(medias->data);
2224 GList *sessions = purple_media_get_session_names(media);
2225 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) {
2226 const gchar *session = sessions->data;
2227 if (purple_media_get_session_type(media, session)
2228 & PURPLE_MEDIA_RECV_AUDIO) {
2229 GstElement *volume = gst_bin_get_by_name(
2230 GST_BIN(purple_media_get_sink(media, session)),
2231 "purpleaudiooutputvolume");
2232 g_object_set(volume, "volume", val, NULL);
2233 }
2234 }
2235 }
2236 }
2237
2238 static GtkWidget *
2239 media_page()
2240 {
2241 GtkWidget *ret;
2242 GtkWidget *vbox;
2243 GtkWidget *hbox;
2244 GtkWidget *dd;
2245 GtkWidget *preview_button;
2246 GtkWidget *sw;
2247 GtkSizeGroup *sg, *sg2;
2248 const char *plugin = purple_prefs_get_string("/purple/media/video/plugin");
2249 const char *device = purple_prefs_get_string("/purple/media/video/device");
2250 GList *video_items = get_device_items(plugin);
2251 GList *audio_items = get_device_items("alsasrc");
2252
2253 if (video_items == NULL) {
2254 video_items = g_list_prepend(video_items, "");
2255 video_items = g_list_prepend(video_items, "Default");
2256 }
2257
2258 if (g_list_find(video_items, device) == NULL)
2259 {
2260 purple_prefs_set_string("/purple/media/video/device",
2261 g_list_next(video_items)->data);
2262 }
2263
2264 ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
2265 gtk_container_set_border_width (GTK_CONTAINER (ret), PIDGIN_HIG_BORDER);
2266
2267 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
2268 sg2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
2269
2270 vbox = pidgin_make_frame (ret, _("Video Input"));
2271 gtk_size_group_add_widget(sg2, vbox);
2272
2273 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
2274 dd = pidgin_prefs_dropdown(vbox, _("_Plugin:"), PURPLE_PREF_STRING,
2275 "/purple/media/video/plugin",
2276 _("Default"), "gconfvideosrc",
2277 _("Video4Linux"), "v4lsrc",
2278 _("Video4Linux2"), "v4l2src",
2279 _("Video Test Source"), "videotestsrc",
2280 NULL);
2281
2282 gtk_size_group_add_widget(sg, dd);
2283 gtk_misc_set_alignment(GTK_MISC(dd), 0, 0.5);
2284
2285 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
2286 dd = pidgin_prefs_dropdown_from_list(hbox, _("Device:"), PURPLE_PREF_STRING,
2287 "/purple/media/video/device",
2288 video_items);
2289
2290 purple_prefs_connect_callback(prefs, "/purple/media/video/plugin",
2291 media_plugin_changed_cb, hbox);
2292
2293 g_signal_connect_swapped(hbox, "destroy",
2294 G_CALLBACK(purple_prefs_disconnect_by_handle), hbox);
2295
2296 gtk_size_group_add_widget(sg, dd);
2297 gtk_misc_set_alignment(GTK_MISC(dd), 0, 0.5);
2298
2299 preview_button = gtk_button_new_with_mnemonic(_("_Preview"));
2300 g_signal_connect(G_OBJECT(preview_button), "clicked",
2301 G_CALLBACK(preview_button_clicked), NULL);
2302
2303 gtk_container_add(GTK_CONTAINER(hbox), preview_button);
2304 gtk_container_add(GTK_CONTAINER(vbox), hbox);
2305
2306 vbox = pidgin_make_frame (ret, _("Audio Input"));
2307 gtk_size_group_add_widget(sg2, vbox);
2308 dd = pidgin_prefs_dropdown_from_list(vbox, _("Device:"), PURPLE_PREF_STRING,
2309 "/purple/media/audio/device",
2310 audio_items);
2311
2312 gtk_size_group_add_widget(sg, dd);
2313 gtk_misc_set_alignment(GTK_MISC(dd), 0, 0.5);
2314
2315 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
2316 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
2317
2318 /* Input Volume */
2319 sw = gtk_hscale_new_with_range(0.0, 100.0, 5.0);
2320 gtk_range_set_increments(GTK_RANGE(sw), 5.0, 25.0);
2321 gtk_range_set_value(GTK_RANGE(sw),
2322 purple_prefs_get_int("/purple/media/audio/volume/input"));
2323 g_signal_connect (G_OBJECT (sw), "format-value",
2324 G_CALLBACK (prefs_sound_volume_format),
2325 NULL);
2326 g_signal_connect (G_OBJECT (sw), "value-changed",
2327 G_CALLBACK (prefs_media_input_volume_changed),
2328 NULL);
2329 pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Volume:"), sg, sw, TRUE, NULL);
2330
2331 vbox = pidgin_make_frame (ret, _("Audio Output"));
2332 gtk_size_group_add_widget(sg2, vbox);
2333
2334 /* Output Volume */
2335 sw = gtk_hscale_new_with_range(0.0, 100.0, 5.0);
2336 gtk_range_set_increments(GTK_RANGE(sw), 5.0, 25.0);
2337 gtk_range_set_value(GTK_RANGE(sw),
2338 purple_prefs_get_int("/purple/media/audio/volume/output"));
2339 g_signal_connect (G_OBJECT (sw), "format-value",
2340 G_CALLBACK (prefs_sound_volume_format),
2341 NULL);
2342 g_signal_connect (G_OBJECT (sw), "value-changed",
2343 G_CALLBACK (prefs_media_output_volume_changed),
2344 NULL);
2345 pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Volume:"), sg, sw, TRUE, NULL);
2346
2347 gtk_widget_show_all(ret);
2348
2349 return ret;
2350 }
2351
2352 #endif /* USE_VV */
2045 2353
2046 static void 2354 static void
2047 set_idle_away(PurpleSavedStatus *status) 2355 set_idle_away(PurpleSavedStatus *status)
2048 { 2356 {
2049 purple_prefs_set_int("/purple/savedstatus/idleaway", purple_savedstatus_get_creation_time(status)); 2357 purple_prefs_set_int("/purple/savedstatus/idleaway", purple_savedstatus_get_creation_time(status));
2165 static void prefs_notebook_init(void) { 2473 static void prefs_notebook_init(void) {
2166 prefs_notebook_add_page(_("Interface"), interface_page(), notebook_page++); 2474 prefs_notebook_add_page(_("Interface"), interface_page(), notebook_page++);
2167 prefs_notebook_add_page(_("Conversations"), conv_page(), notebook_page++); 2475 prefs_notebook_add_page(_("Conversations"), conv_page(), notebook_page++);
2168 prefs_notebook_add_page(_("Smiley Themes"), theme_page(), notebook_page++); 2476 prefs_notebook_add_page(_("Smiley Themes"), theme_page(), notebook_page++);
2169 prefs_notebook_add_page(_("Sounds"), sound_page(), notebook_page++); 2477 prefs_notebook_add_page(_("Sounds"), sound_page(), notebook_page++);
2478
2479 #ifdef USE_VV
2480 prefs_notebook_add_page(_("Media"), media_page(), notebook_page++);
2481 #endif
2170 prefs_notebook_add_page(_("Network"), network_page(), notebook_page++); 2482 prefs_notebook_add_page(_("Network"), network_page(), notebook_page++);
2171 #ifndef _WIN32 2483 #ifndef _WIN32
2172 /* We use the registered default browser in windows */ 2484 /* We use the registered default browser in windows */
2173 /* if the user is running gnome 2.x or Mac OS X, hide the browsers tab */ 2485 /* if the user is running gnome 2.x or Mac OS X, hide the browsers tab */
2174 if ((purple_running_gnome() == FALSE) && (purple_running_osx() == FALSE)) { 2486 if ((purple_running_gnome() == FALSE) && (purple_running_osx() == FALSE)) {
2289 purple_prefs_add_string(PIDGIN_PREFS_ROOT "/smileys/theme", "Default"); 2601 purple_prefs_add_string(PIDGIN_PREFS_ROOT "/smileys/theme", "Default");
2290 2602
2291 /* Smiley Callbacks */ 2603 /* Smiley Callbacks */
2292 purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/smileys/theme", 2604 purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/smileys/theme",
2293 smiley_theme_pref_cb, NULL); 2605 smiley_theme_pref_cb, NULL);
2606
2607 #ifdef USE_VV
2608 purple_prefs_add_none("/purple/media");
2609 purple_prefs_add_none("/purple/media/video");
2610 purple_prefs_add_string("/purple/media/video/plugin", "gconfvideosrc");
2611 purple_prefs_add_string("/purple/media/video/device", "");
2612 purple_prefs_add_none("/purple/media/audio");
2613 purple_prefs_add_string("/purple/media/audio/device", "");
2614 purple_prefs_add_none("/purple/media/audio/volume");
2615 purple_prefs_add_int("/purple/media/audio/volume/input", 10);
2616 purple_prefs_add_int("/purple/media/audio/volume/output", 10);
2617 #endif /* USE_VV */
2294 2618
2295 pidgin_prefs_update_old(); 2619 pidgin_prefs_update_old();
2296 } 2620 }
2297 2621
2298 void pidgin_prefs_update_old() 2622 void pidgin_prefs_update_old()

mercurial