~noskcaj/ubuntu/trusty/xfdesktop4/4.11.2-1

« back to all changes in this revision

Viewing changes to settings/main.c

  • Committer: Package Import Robot
  • Author(s): Lionel Le Folgoc
  • Date: 2012-05-18 22:18:02 UTC
  • mfrom: (3.1.7 experimental)
  • Revision ID: package-import@ubuntu.com-20120518221802-htmj6h4apaij25l2
Tags: 4.10.0-1ubuntu1
* Merge from Debian experimental, remaining Ubuntu change:
  - debian/patches/xubuntu_improve-nautilus-interactions.patch: added,
    should prevent nautilus from taking over the desktop if xfdesktop is
    running (and vice-versa).

Show diffs side-by-side

added added

removed removed

Lines of Context:
46
46
#include <libxfce4util/libxfce4util.h>
47
47
#include <xfconf/xfconf.h>
48
48
#include <libxfce4ui/libxfce4ui.h>
49
 
 
50
 
#ifdef HAVE_LIBEXO
51
49
#include <exo/exo.h>
52
 
#endif
53
50
 
54
51
#include "xfdesktop-common.h"
55
52
#include "xfdesktop-settings-ui.h"
56
53
#include "xfdesktop-settings-appearance-frame-ui.h"
57
54
 
58
55
#define PREVIEW_HEIGHT  48
 
56
#define MAX_ASPECT_RATIO 3.0f
59
57
 
60
58
#define SHOW_DESKTOP_MENU_PROP               "/desktop-menu/show"
61
59
#define DESKTOP_MENU_SHOW_ICONS_PROP         "/desktop-menu/show-icons"
105
103
 
106
104
    GtkWidget *brightness_slider;
107
105
    GtkWidget *saturation_slider;
 
106
 
 
107
    GtkWidget *backdrop_cycle_spinbox;
 
108
    GtkWidget *backdrop_cycle_chkbox;
 
109
 
 
110
    GtkWidget *chk_xinerama_stretch;
108
111
} AppearancePanel;
109
112
 
110
113
typedef struct
151
154
                       COL_FILENAME, &filename,
152
155
                       -1);
153
156
 
154
 
    gdk_threads_leave();
155
 
 
156
157
    pix = gdk_pixbuf_new_from_file(filename, NULL);
157
158
    g_free(filename);
158
159
    if(pix) {
166
167
                                   name, width, height);
167
168
 
168
169
        aspect = (gdouble)width / height;
 
170
 
 
171
        /* Keep the aspect ratio sensible otherwise the treeview looks bad */
 
172
        if(aspect > MAX_ASPECT_RATIO) {
 
173
            aspect = MAX_ASPECT_RATIO;
 
174
        }
 
175
 
169
176
        width = PREVIEW_HEIGHT * aspect;
170
177
        height = PREVIEW_HEIGHT;
171
178
        pix_scaled = gdk_pixbuf_scale_simple(pix, width, height,
175
182
    }
176
183
    g_free(name);
177
184
 
178
 
    gdk_threads_enter();
179
 
 
180
185
    if(new_name) {
181
186
        gtk_list_store_set(GTK_LIST_STORE(model), iter,
182
187
                           COL_NAME, new_name,
198
203
    PreviewData *pdata = data;
199
204
    GSList *l;
200
205
 
201
 
    gdk_threads_enter();
 
206
    GDK_THREADS_ENTER ();
 
207
 
202
208
    for(l = pdata->iters; l; l = l->next)
203
209
        xfdesktop_settings_do_single_preview(pdata->model, l->data);
204
 
    gdk_threads_leave();
 
210
 
 
211
    GDK_THREADS_LEAVE ();
205
212
 
206
213
    g_object_unref(G_OBJECT(pdata->model));
207
214
    g_slist_foreach(pdata->iters, (GFunc)gtk_tree_iter_free, NULL);
218
225
    GtkTreeView *tree_view;
219
226
    GtkTreeIter iter;
220
227
 
221
 
    gdk_threads_enter();
 
228
    GDK_THREADS_ENTER ();
 
229
 
222
230
    if(gtk_tree_model_get_iter_first(model, &iter)) {
223
231
        do {
224
232
            xfdesktop_settings_do_single_preview(model, &iter);
231
239
        GtkTreeSelection *selection = gtk_tree_view_get_selection(tree_view);
232
240
 
233
241
        if(gtk_tree_selection_get_mode(selection) != GTK_SELECTION_MULTIPLE
234
 
           && gtk_tree_selection_get_selected(selection, NULL, &iter)) 
 
242
           && gtk_tree_selection_get_selected(selection, NULL, &iter))
235
243
        {
236
244
            GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
237
245
            gtk_tree_view_scroll_to_cell(tree_view, path, NULL, TRUE, 0.0, 0.0);
239
247
    }
240
248
    g_object_set_data(G_OBJECT(model), "xfdesktop-tree-view", NULL);
241
249
 
242
 
    gdk_threads_leave();
 
250
    GDK_THREADS_LEAVE ();
243
251
 
244
252
    g_object_unref(G_OBJECT(model));
245
253
 
715
723
 
716
724
        /* remember the tree view to scroll to the selected image in the
717
725
         * thread that creates all the previews */
718
 
        g_object_set_data_full(G_OBJECT(ls), "xfdesktop-tree-view", 
 
726
        g_object_set_data_full(G_OBJECT(ls), "xfdesktop-tree-view",
719
727
                               g_object_ref(panel->image_treeview),
720
728
                               g_object_unref);
721
729
    }
760
768
                             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
761
769
}
762
770
 
 
771
static void
 
772
cb_xfdesktop_chk_cycle_backdrop_toggled(GtkCheckButton *button,
 
773
                                        gpointer user_data)
 
774
{
 
775
    gboolean sensitive = FALSE;
 
776
    GtkWidget *spin_button = GTK_WIDGET(user_data);
 
777
 
 
778
    if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)) &&
 
779
       gtk_widget_get_sensitive(GTK_WIDGET(button))) {
 
780
           sensitive = TRUE;
 
781
    }
 
782
 
 
783
    gtk_widget_set_sensitive(spin_button, sensitive);
 
784
}
 
785
 
763
786
static gboolean
764
787
xfdesktop_spin_icon_size_timer(GtkSpinButton *button)
765
788
{
878
901
                               (GtkFileFilterFunc)gtk_true, NULL, NULL);
879
902
    gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
880
903
 
881
 
#ifdef HAVE_LIBEXO
882
904
    exo_gtk_file_chooser_add_thumbnail_preview(GTK_FILE_CHOOSER(chooser));
883
 
#endif
884
905
 
885
906
    if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) {
886
907
        GSList *filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(chooser));
995
1016
{
996
1017
    AppearancePanel *panel = user_data;
997
1018
    gchar prop_image_show[1024], prop_image_path[1024];
998
 
    
 
1019
 
999
1020
    if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
1000
1021
        return;
1001
1022
 
1026
1047
        gtk_widget_set_sensitive(panel->btn_minus, FALSE);
1027
1048
        gtk_widget_set_sensitive(panel->btn_newlist, FALSE);
1028
1049
        gtk_widget_set_sensitive(panel->frame_image_list, TRUE);
 
1050
        gtk_widget_set_sensitive(panel->backdrop_cycle_chkbox, FALSE);
 
1051
        gtk_widget_set_sensitive(panel->backdrop_cycle_spinbox, FALSE);
1029
1052
        DBG("show_image=%s", panel->show_image?"true":"false");
1030
1053
        if(!panel->show_image) {
1031
1054
            panel->show_image = TRUE;
1051
1074
        gtk_widget_set_sensitive(panel->btn_minus, TRUE);
1052
1075
        gtk_widget_set_sensitive(panel->btn_newlist, TRUE);
1053
1076
        gtk_widget_set_sensitive(panel->frame_image_list, TRUE);
 
1077
        gtk_widget_set_sensitive(panel->backdrop_cycle_chkbox, TRUE);
 
1078
        if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(panel->backdrop_cycle_chkbox)))
 
1079
            gtk_widget_set_sensitive(panel->backdrop_cycle_spinbox, TRUE);
 
1080
        else
 
1081
            gtk_widget_set_sensitive(panel->backdrop_cycle_spinbox, FALSE);
1054
1082
        DBG("show_image=%s", panel->show_image?"true":"false");
1055
1083
        if(!panel->show_image) {
1056
1084
            panel->show_image = TRUE;
1059
1087
    } else if(w == panel->radio_none) {
1060
1088
        DBG("widget is none");
1061
1089
        gtk_widget_set_sensitive(panel->frame_image_list, FALSE);
 
1090
        gtk_widget_set_sensitive(panel->backdrop_cycle_chkbox, FALSE);
 
1091
        gtk_widget_set_sensitive(panel->backdrop_cycle_spinbox, FALSE);
1062
1092
        DBG("show_image=%s", panel->show_image?"true":"false");
1063
1093
        if(panel->show_image) {
1064
1094
            panel->show_image = FALSE;
1257
1287
                     G_CALLBACK(image_treeview_drag_data_received), panel);
1258
1288
}
1259
1289
 
1260
 
static GtkWidget *
1261
 
xfdesktop_settings_dialog_new(GtkBuilder *main_gxml,
1262
 
                              XfconfChannel *channel)
 
1290
static void
 
1291
xfdesktop_settings_dialog_add_screens(GtkBuilder *main_gxml,
 
1292
                                      XfconfChannel *channel)
1263
1293
{
1264
1294
    gint i, j, nmonitors, nscreens;
1265
 
    GtkWidget *dialog, *appearance_container, *chk_custom_font_size,
 
1295
    GtkWidget *appearance_container, *chk_custom_font_size,
1266
1296
              *spin_font_size, *color_style_widget, *w, *box,
1267
1297
              *spin_icon_size, *chk_show_thumbnails, *chk_single_click;
1268
1298
 
1269
 
    dialog = GTK_WIDGET(gtk_builder_get_object(main_gxml, "prefs_dialog"));
1270
1299
    appearance_container = GTK_WIDGET(gtk_builder_get_object(main_gxml,
1271
1300
                                                             "notebook_screens"));
1272
1301
 
1294
1323
 
1295
1324
    chk_show_thumbnails = GTK_WIDGET(gtk_builder_get_object(main_gxml,
1296
1325
                                                            "chk_show_thumbnails"));
 
1326
    /* The default value when this property is not set, is 'TRUE'.
 
1327
     * the bind operation defaults to 'FALSE' for unset boolean properties. 
 
1328
     *
 
1329
     * Make the checkbox correspond to the default behaviour.
 
1330
     */
 
1331
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(chk_show_thumbnails),
 
1332
                                  TRUE);
1297
1333
 
1298
1334
    nscreens = gdk_display_get_n_screens(gdk_display_get_default());
1299
1335
 
1308
1344
        }
1309
1345
 
1310
1346
        for(j = 0; j < nmonitors; ++j) {
 
1347
 
1311
1348
            gchar buf[1024];
1312
1349
            GtkBuilder *appearance_gxml;
1313
1350
            AppearancePanel *panel = g_new0(AppearancePanel, 1);
1438
1475
            g_signal_connect(G_OBJECT(panel->btn_newlist), "clicked",
1439
1476
                             G_CALLBACK(newlist_button_clicked), panel);
1440
1477
 
 
1478
            panel->chk_xinerama_stretch = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
 
1479
                                                                            "chk_xinerama_stretch"));
 
1480
 
 
1481
            /* The first monitor has the option of doing the xinerama-stretch,
 
1482
             * but only if there's multiple monitors attached. Make it invisible
 
1483
             * in all other cases.
 
1484
             */
 
1485
            if(j == 0 && nmonitors > 1) {
 
1486
                g_snprintf(buf, sizeof(buf), "/backdrop/screen%d/xinerama-stretch",
 
1487
                           i);
 
1488
                xfconf_g_property_bind(channel, buf, G_TYPE_BOOLEAN,
 
1489
                                        G_OBJECT(panel->chk_xinerama_stretch), "active");
 
1490
                gtk_widget_set_sensitive(panel->chk_xinerama_stretch, TRUE);
 
1491
            } else {
 
1492
                gtk_widget_hide(panel->chk_xinerama_stretch);
 
1493
            }
 
1494
 
 
1495
            panel->backdrop_cycle_chkbox = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
 
1496
                                                                             "chk_cycle_backdrop"));
 
1497
            panel->backdrop_cycle_spinbox = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
 
1498
                                                                             "spin_backdrop_time_minutes"));
 
1499
 
 
1500
            g_signal_connect(G_OBJECT(panel->backdrop_cycle_chkbox), "toggled",
 
1501
                            G_CALLBACK(cb_xfdesktop_chk_cycle_backdrop_toggled),
 
1502
                            panel->backdrop_cycle_spinbox);
 
1503
 
 
1504
            g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/backdrop-cycle-enable",
 
1505
                       i, j);
 
1506
            xfconf_g_property_bind(channel, buf, G_TYPE_BOOLEAN,
 
1507
                                   G_OBJECT(panel->backdrop_cycle_chkbox), "active");
 
1508
 
 
1509
            g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/backdrop-cycle-timer",
 
1510
                       i, j);
 
1511
            xfconf_g_property_bind(channel, buf, G_TYPE_UINT,
 
1512
                           G_OBJECT(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(panel->backdrop_cycle_spinbox))),
 
1513
                           "value");
 
1514
 
1441
1515
            panel->radio_singleimage = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1442
1516
                                                                         "radio_singleimage"));
1443
1517
            g_signal_connect(G_OBJECT(panel->radio_singleimage), "toggled",
1547
1621
                           "active");
1548
1622
 
1549
1623
    setup_special_icon_list(main_gxml, channel);
 
1624
}
1550
1625
 
1551
 
    return dialog;
 
1626
static void
 
1627
xfdesktop_settings_response(GtkWidget *dialog, gint response_id)
 
1628
{
 
1629
    if(response_id == GTK_RESPONSE_HELP)
 
1630
        xfce_dialog_show_help(GTK_WINDOW(dialog), "xfdesktop", "preferences", NULL);
 
1631
    else
 
1632
        gtk_main_quit();
1552
1633
}
1553
1634
 
1554
1635
static GdkNativeWindow opt_socket_id = 0;
1567
1648
    GtkWidget *dialog;
1568
1649
    GError *error = NULL;
1569
1650
 
1570
 
    g_thread_init(NULL);
1571
 
    gdk_threads_init();
1572
 
 
1573
1651
    xfce_textdomain(GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
1574
1652
 
1575
1653
    if(!gtk_init_with_args(&argc, &argv, "", option_entries, PACKAGE, &error)) {
1618
1696
 
1619
1697
    channel = xfconf_channel_new(XFDESKTOP_CHANNEL);
1620
1698
 
1621
 
    gdk_threads_enter();
 
1699
    xfdesktop_settings_dialog_add_screens(gxml, channel);
1622
1700
 
1623
 
    dialog = xfdesktop_settings_dialog_new(gxml, channel);
1624
1701
    if(opt_socket_id == 0) {
1625
 
        g_object_unref(G_OBJECT(gxml));
1626
 
 
1627
 
        while(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_HELP)
1628
 
            g_spawn_command_line_async("xfhelp4 xfdesktop.html", NULL);
 
1702
        dialog = GTK_WIDGET(gtk_builder_get_object(gxml, "prefs_dialog"));
 
1703
        g_signal_connect(dialog, "response",
 
1704
                         G_CALLBACK(xfdesktop_settings_response), NULL);
 
1705
        gtk_window_present(GTK_WINDOW (dialog));
 
1706
 
 
1707
        /* To prevent the settings dialog to be saved in the session */
 
1708
        gdk_set_sm_client_id("FAKE ID");
 
1709
 
 
1710
        gtk_main();
1629
1711
    } else {
1630
1712
        GtkWidget *plug, *plug_child;
1631
1713
 
1640
1722
        gtk_widget_reparent(plug_child, plug);
1641
1723
        gtk_widget_show(plug_child);
1642
1724
 
1643
 
        g_object_unref(G_OBJECT(gxml));
1644
 
 
1645
1725
        gtk_main();
1646
1726
    }
1647
1727
 
1648
 
    gdk_threads_leave();
1649
 
    
 
1728
    g_object_unref(G_OBJECT(gxml));
 
1729
 
1650
1730
    g_object_unref(G_OBJECT(channel));
1651
1731
    xfconf_shutdown();
1652
1732