~ubuntu-branches/ubuntu/saucy/gnome-control-center/saucy-proposed

« back to all changes in this revision

Viewing changes to panels/printers/pp-ppd-selection-dialog.c

  • Committer: Package Import Robot
  • Author(s): Sebastien Bacher, Sebastien Bacher, Robert Ancell, Iain Lane, Edward Donovan, Rico Tzschichholz, Jeremy Bicha, David Henningsson
  • Date: 2012-11-21 19:32:45 UTC
  • mfrom: (1.1.63)
  • Revision ID: package-import@ubuntu.com-20121121193245-mj61nzz1z4fk3z25
Tags: 1:3.6.3-0ubuntu1
[ Sebastien Bacher ]
* New upstream version
* debian/control.in: recommends libcanberra-pulse (lp: #1004973)
* debian/patches/58_ubuntu_icon_views_redesign.patch:
  - drop most of the changes, keep the different grid size though
    to fit on screen with our extra icons
* debian/patches/91_dont_show_in_unity.patch:
  - dropped, show the upstream printer panel and the layout tab
* debian/patches/revert_git_keyboard_gsettings.patch,
  debian/patches/revert_git_stop_using_gconf.patch:
  - dropped the gconf->gsettings reverts

[ Robert Ancell ]
* New upstream release (LP: #1010317)
* debian/control:
  - Bump build-depends on libgnome-desktop-3-dev, libwacom-dev
  - Add build-depends on libclutter-1.0-dev, libclutter-gtk-1.0-dev,
    libpwquality-dev
  - Drop build-depends on libgnomekbd-dev
* debian/patches/60_ubuntu_nav_bar.patch:
  - Disabled for now, doesn't apply
* debian/patches/revert_ua_gsettings.patch:
  - We can use GSettings for universal access now
* debian/patches/00git_online_accounts_gtkgrid.patch:
* debian/patches/00git_online_accounts_layout.part:
* debian/patches/git_wacom_translations.patch:
  - Applied upstream

[ Iain Lane ]
* Add Build-Depends on libxkbfile-dev
* New upstream release.
* Refresh all patches to apply cleanly.

[ Edward Donovan ]
* debian/source_gnome-control-center.py: Fix for Python 3. (LP: #1013171)

[ Rico Tzschichholz ]
* debian/control.in:
  - Build-depend on gtk-doc-tools instead of docbook directly
  - Bump minimum glib-2.0, gnome-desktop3, gnome-settings-daemon
     and gsettings-desktop-schemas

[ Jeremy Bicha ]
* Dropped more patches applied in new version:
  - git_unmute_sound_event.patch
  - git_fix_big_editable_labels.patch
  - 96_sound_nua_panel.patch
* debian/patches/04_new_appearance_settings.patch:
  - Dropped, this is now packaged separately as gnome-control-center-unity
* debian/patches/10_keyboard_layout_on_unity.patch:
  - Don't change the keyboard panel name when not running Unity
* debian/patches/52_ubuntu_language_list_mods.patch:
  - Don't disable adding current language to the list. While this
    fix shows the current language twice, at least it avoids the
    "Ubuntu suddenly in Chinese" bug (LP: #1035219)
* debian/patches/53_use_ubuntu_help.patch:
  - Only show Ubuntu help when running Unity
* debian/patches/58_hide_gdm_notifications.patch:
  - Hide "Show notifications when locked" settings when running Unity
    since it's a GNOME Shell-specific feature
* debian/patches/63_normal_scrollbar_in_a11y.patch:
  - Drop, overlay-scrollbars should handle this instead
* debian/patches/91_dont_show_in_unity.patch:
  - Hide Printers & Region panels in Unity until we're ready to switch
    to them.
* debian/patches/fix-crash-on-user-panel.patch:
  - Dropped, GNOME says it's obsolete
* debian/rules:
  - Build with -z,defs again
  - Explicitly disable ibus support since ibus 1.4 isn't supported in
    this version
* debian/control.in:
  - Drop ubuntu-docs and gnome-user-guide from recommends to suggests
  - Don't recommend indicators; let's leave that to Unity

[ David Henningsson ]
* sound_nua_panel.patch: Rebase to gnome 3.6 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
 
2
 *
 
3
 * Copyright 2012  Red Hat, Inc,
 
4
 *
 
5
 * This program is free software; you can redistribute it and/or modify
 
6
 * it under the terms of the GNU General Public License as published by
 
7
 * the Free Software Foundation; either version 2 of the License, or
 
8
 * (at your option) any later version.
 
9
 *
 
10
 * This program is distributed in the hope that it will be useful,
 
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
 * GNU General Public License for more details.
 
14
 *
 
15
 * You should have received a copy of the GNU General Public License
 
16
 * along with this program; if not, write to the Free Software
 
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
18
 *
 
19
 * Author: Marek Kasik <mkasik@redhat.com>
 
20
 */
 
21
 
 
22
#include "config.h"
 
23
 
 
24
#include <unistd.h>
 
25
#include <stdlib.h>
 
26
#include <sys/types.h>
 
27
#include <sys/wait.h>
 
28
 
 
29
#include <glib.h>
 
30
#include <glib/gi18n.h>
 
31
#include <glib/gstdio.h>
 
32
#include <gtk/gtk.h>
 
33
 
 
34
#include <cups/cups.h>
 
35
#include <cups/ppd.h>
 
36
 
 
37
#include "pp-ppd-selection-dialog.h"
 
38
 
 
39
static void pp_ppd_selection_dialog_hide (PpPPDSelectionDialog *dialog);
 
40
 
 
41
enum
 
42
{
 
43
  PPD_NAMES_COLUMN = 0,
 
44
  PPD_DISPLAY_NAMES_COLUMN
 
45
};
 
46
 
 
47
enum
 
48
{
 
49
  PPD_MANUFACTURERS_NAMES_COLUMN = 0,
 
50
  PPD_MANUFACTURERS_DISPLAY_NAMES_COLUMN
 
51
};
 
52
 
 
53
 
 
54
struct _PpPPDSelectionDialog {
 
55
  GtkBuilder *builder;
 
56
  GtkWidget  *parent;
 
57
  GtkWidget  *dialog;
 
58
 
 
59
  UserResponseCallback user_callback;
 
60
  gpointer             user_data;
 
61
 
 
62
  gchar           *ppd_name;
 
63
  GtkResponseType  response;
 
64
  gchar           *manufacturer;
 
65
 
 
66
  PPDList *list;
 
67
};
 
68
 
 
69
static void
 
70
manufacturer_selection_changed_cb (GtkTreeSelection *selection,
 
71
                                   gpointer          user_data)
 
72
{
 
73
  PpPPDSelectionDialog *dialog = (PpPPDSelectionDialog *) user_data;
 
74
  GtkListStore         *store;
 
75
  GtkTreeModel         *model;
 
76
  GtkTreeIter           iter;
 
77
  GtkTreeView          *models_treeview;
 
78
  gchar                *manufacturer_name = NULL;
 
79
  gint                  i, index;
 
80
 
 
81
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
 
82
    {
 
83
      gtk_tree_model_get (model, &iter,
 
84
                          PPD_MANUFACTURERS_NAMES_COLUMN, &manufacturer_name,
 
85
                          -1);
 
86
    }
 
87
 
 
88
  if (manufacturer_name)
 
89
    {
 
90
      index = -1;
 
91
      for (i = 0; i < dialog->list->num_of_manufacturers; i++)
 
92
        {
 
93
          if (g_strcmp0 (manufacturer_name,
 
94
                         dialog->list->manufacturers[i]->manufacturer_name) == 0)
 
95
            {
 
96
              index = i;
 
97
              break;
 
98
            }
 
99
        }
 
100
 
 
101
      if (index >= 0)
 
102
        {
 
103
          models_treeview = (GtkTreeView*)
 
104
            gtk_builder_get_object (dialog->builder, "ppd-selection-models-treeview");
 
105
 
 
106
          store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
 
107
 
 
108
          for (i = 0; i < dialog->list->manufacturers[index]->num_of_ppds; i++)
 
109
            {
 
110
              gtk_list_store_append (store, &iter);
 
111
              gtk_list_store_set (store, &iter,
 
112
                                  PPD_NAMES_COLUMN, dialog->list->manufacturers[index]->ppds[i]->ppd_name,
 
113
                                  PPD_DISPLAY_NAMES_COLUMN, dialog->list->manufacturers[index]->ppds[i]->ppd_display_name,
 
114
                                  -1);
 
115
            }
 
116
 
 
117
          gtk_tree_view_set_model (models_treeview, GTK_TREE_MODEL (store));
 
118
          g_object_unref (store);
 
119
        }
 
120
 
 
121
      g_free (manufacturer_name);
 
122
    }
 
123
}
 
124
 
 
125
static void
 
126
model_selection_changed_cb (GtkTreeSelection *selection,
 
127
                            gpointer          user_data)
 
128
{
 
129
  PpPPDSelectionDialog *dialog = (PpPPDSelectionDialog *) user_data;
 
130
  GtkTreeModel         *model;
 
131
  GtkTreeIter           iter;
 
132
  GtkWidget            *widget;
 
133
  gchar                *model_name = NULL;
 
134
 
 
135
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
 
136
    {
 
137
      gtk_tree_model_get (model, &iter,
 
138
                          PPD_NAMES_COLUMN, &model_name,
 
139
                          -1);
 
140
    }
 
141
 
 
142
  widget = (GtkWidget*)
 
143
    gtk_builder_get_object (dialog->builder, "ppd-selection-select-button");
 
144
 
 
145
  if (model_name)
 
146
    {
 
147
      gtk_widget_set_sensitive (widget, TRUE);
 
148
      g_free (model_name);
 
149
    }
 
150
  else
 
151
    {
 
152
      gtk_widget_set_sensitive (widget, FALSE);
 
153
    }
 
154
}
 
155
 
 
156
static void
 
157
fill_ppds_list (PpPPDSelectionDialog *dialog)
 
158
{
 
159
  GtkTreeSelection *selection;
 
160
  GtkListStore     *store;
 
161
  GtkTreePath      *path;
 
162
  GtkTreeView      *treeview;
 
163
  GtkTreeIter       iter;
 
164
  GtkTreeIter      *preselect_iter = NULL;
 
165
  GtkWidget        *widget;
 
166
  gint              i;
 
167
 
 
168
  widget = (GtkWidget*)
 
169
    gtk_builder_get_object (dialog->builder, "ppd-spinner");
 
170
  gtk_widget_hide (widget);
 
171
  gtk_spinner_stop (GTK_SPINNER (widget));
 
172
 
 
173
  widget = (GtkWidget*)
 
174
    gtk_builder_get_object (dialog->builder, "progress-label");
 
175
  gtk_widget_hide (widget);
 
176
 
 
177
  treeview = (GtkTreeView*)
 
178
    gtk_builder_get_object (dialog->builder, "ppd-selection-manufacturers-treeview");
 
179
 
 
180
  if (dialog->list)
 
181
    {
 
182
      store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
 
183
 
 
184
      for (i = 0; i < dialog->list->num_of_manufacturers; i++)
 
185
        {
 
186
          gtk_list_store_append (store, &iter);
 
187
          gtk_list_store_set (store, &iter,
 
188
                              PPD_MANUFACTURERS_NAMES_COLUMN, dialog->list->manufacturers[i]->manufacturer_name,
 
189
                              PPD_MANUFACTURERS_DISPLAY_NAMES_COLUMN, dialog->list->manufacturers[i]->manufacturer_display_name,
 
190
                              -1);
 
191
 
 
192
          if (g_strcmp0 (dialog->manufacturer,
 
193
                         dialog->list->manufacturers[i]->manufacturer_display_name) == 0)
 
194
            {
 
195
              preselect_iter = gtk_tree_iter_copy (&iter);
 
196
            }
 
197
        }
 
198
 
 
199
      gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (store));
 
200
 
 
201
      if (preselect_iter &&
 
202
          (selection = gtk_tree_view_get_selection (treeview)) != NULL)
 
203
        {
 
204
          gtk_tree_selection_select_iter (selection, preselect_iter);
 
205
          path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), preselect_iter);
 
206
          gtk_tree_view_scroll_to_cell (treeview, path, NULL, TRUE, 0.5, 0.0);
 
207
          gtk_tree_path_free (path);
 
208
          gtk_tree_iter_free (preselect_iter);
 
209
        }
 
210
 
 
211
      g_object_unref (store);
 
212
    }
 
213
}
 
214
 
 
215
static void
 
216
populate_dialog (PpPPDSelectionDialog *dialog)
 
217
{
 
218
  GtkTreeViewColumn *column;
 
219
  GtkCellRenderer   *renderer;
 
220
  GtkTreeView       *manufacturers_treeview;
 
221
  GtkTreeView       *models_treeview;
 
222
  GtkWidget         *widget;
 
223
 
 
224
  manufacturers_treeview = (GtkTreeView*)
 
225
    gtk_builder_get_object (dialog->builder, "ppd-selection-manufacturers-treeview");
 
226
 
 
227
  renderer = gtk_cell_renderer_text_new ();
 
228
 
 
229
  /* Translators: Name of column showing printer manufacturers */
 
230
  column = gtk_tree_view_column_new_with_attributes (_("Manufacturers"), renderer,
 
231
                                                     "text", PPD_MANUFACTURERS_DISPLAY_NAMES_COLUMN, NULL);
 
232
  gtk_tree_view_column_set_expand (column, TRUE);
 
233
  gtk_tree_view_append_column (manufacturers_treeview, column);
 
234
 
 
235
 
 
236
  models_treeview = (GtkTreeView*)
 
237
    gtk_builder_get_object (dialog->builder, "ppd-selection-models-treeview");
 
238
 
 
239
  renderer = gtk_cell_renderer_text_new ();
 
240
 
 
241
  /* Translators: Name of column showing printer drivers */
 
242
  column = gtk_tree_view_column_new_with_attributes (_("Drivers"), renderer,
 
243
                                                     "text", PPD_DISPLAY_NAMES_COLUMN, NULL);
 
244
  gtk_tree_view_column_set_expand (column, TRUE);
 
245
  gtk_tree_view_append_column (models_treeview, column);
 
246
 
 
247
 
 
248
  g_signal_connect (gtk_tree_view_get_selection (models_treeview),
 
249
                    "changed", G_CALLBACK (model_selection_changed_cb), dialog);
 
250
 
 
251
  g_signal_connect (gtk_tree_view_get_selection (manufacturers_treeview),
 
252
                    "changed", G_CALLBACK (manufacturer_selection_changed_cb), dialog);
 
253
 
 
254
  gtk_widget_show_all (dialog->dialog);
 
255
 
 
256
  if (!dialog->list)
 
257
    {
 
258
      widget = (GtkWidget*)
 
259
        gtk_builder_get_object (dialog->builder, "ppd-spinner");
 
260
      gtk_widget_show (widget);
 
261
      gtk_spinner_start (GTK_SPINNER (widget));
 
262
 
 
263
      widget = (GtkWidget*)
 
264
        gtk_builder_get_object (dialog->builder, "progress-label");
 
265
      gtk_widget_show (widget);
 
266
    }
 
267
  else
 
268
    {
 
269
      fill_ppds_list (dialog);
 
270
    }
 
271
}
 
272
 
 
273
static void
 
274
ppd_selection_dialog_response_cb (GtkDialog *dialog,
 
275
                                  gint       response_id,
 
276
                                  gpointer   user_data)
 
277
{
 
278
  PpPPDSelectionDialog *ppd_selection_dialog = (PpPPDSelectionDialog*) user_data;
 
279
  GtkTreeSelection     *selection;
 
280
  GtkTreeModel         *model;
 
281
  GtkTreeView          *models_treeview;
 
282
  GtkTreeIter           iter;
 
283
 
 
284
  pp_ppd_selection_dialog_hide (ppd_selection_dialog);
 
285
 
 
286
  ppd_selection_dialog->response = response_id;
 
287
  if (response_id == GTK_RESPONSE_OK)
 
288
    {
 
289
      models_treeview = (GtkTreeView*)
 
290
        gtk_builder_get_object (ppd_selection_dialog->builder, "ppd-selection-models-treeview");
 
291
 
 
292
      if (models_treeview)
 
293
        {
 
294
          selection = gtk_tree_view_get_selection (models_treeview);
 
295
 
 
296
          if (selection)
 
297
            {
 
298
              if (gtk_tree_selection_get_selected (selection, &model, &iter))
 
299
                {
 
300
                  gtk_tree_model_get (model, &iter,
 
301
                                      PPD_NAMES_COLUMN, &ppd_selection_dialog->ppd_name,
 
302
                                  -1);
 
303
                }
 
304
            }
 
305
        }
 
306
    }
 
307
 
 
308
  ppd_selection_dialog->user_callback (GTK_DIALOG (ppd_selection_dialog->dialog),
 
309
                                       response_id,
 
310
                                       ppd_selection_dialog->user_data);
 
311
}
 
312
 
 
313
static void
 
314
update_alignment_padding (GtkWidget     *widget,
 
315
                          GtkAllocation *allocation,
 
316
                          gpointer       user_data)
 
317
{
 
318
  PpPPDSelectionDialog *dialog = (PpPPDSelectionDialog*) user_data;
 
319
  GtkAllocation         allocation2;
 
320
  GtkWidget            *action_area;
 
321
  gint                  offset_left, offset_right;
 
322
  guint                 padding_left, padding_right,
 
323
                        padding_top, padding_bottom;
 
324
 
 
325
  action_area = (GtkWidget*)
 
326
    gtk_builder_get_object (dialog->builder, "dialog-action-area1");
 
327
  gtk_widget_get_allocation (action_area, &allocation2);
 
328
 
 
329
  offset_left = allocation2.x - allocation->x;
 
330
  offset_right = (allocation->x + allocation->width) -
 
331
                 (allocation2.x + allocation2.width);
 
332
 
 
333
  gtk_alignment_get_padding  (GTK_ALIGNMENT (widget),
 
334
                              &padding_top, &padding_bottom,
 
335
                              &padding_left, &padding_right);
 
336
  if (allocation->x >= 0 && allocation2.x >= 0)
 
337
    {
 
338
      if (offset_left > 0 && offset_left != padding_left)
 
339
        gtk_alignment_set_padding (GTK_ALIGNMENT (widget),
 
340
                                   padding_top, padding_bottom,
 
341
                                   offset_left, padding_right);
 
342
 
 
343
      gtk_alignment_get_padding  (GTK_ALIGNMENT (widget),
 
344
                                  &padding_top, &padding_bottom,
 
345
                                  &padding_left, &padding_right);
 
346
      if (offset_right > 0 && offset_right != padding_right)
 
347
        gtk_alignment_set_padding (GTK_ALIGNMENT (widget),
 
348
                                   padding_top, padding_bottom,
 
349
                                   padding_left, offset_right);
 
350
    }
 
351
}
 
352
 
 
353
PpPPDSelectionDialog *
 
354
pp_ppd_selection_dialog_new (GtkWindow            *parent,
 
355
                             PPDList              *ppd_list,
 
356
                             gchar                *manufacturer,
 
357
                             UserResponseCallback  user_callback,
 
358
                             gpointer              user_data)
 
359
{
 
360
  PpPPDSelectionDialog *dialog;
 
361
  GtkWidget            *widget;
 
362
  GError               *error = NULL;
 
363
  gchar                *objects[] = { "ppd-selection-dialog", NULL };
 
364
  guint                 builder_result;
 
365
 
 
366
  dialog = g_new0 (PpPPDSelectionDialog, 1);
 
367
 
 
368
  dialog->builder = gtk_builder_new ();
 
369
  dialog->parent = GTK_WIDGET (parent);
 
370
 
 
371
  builder_result = gtk_builder_add_objects_from_file (dialog->builder,
 
372
                                                      DATADIR"/ppd-selection-dialog.ui",
 
373
                                                      objects, &error);
 
374
 
 
375
  if (builder_result == 0)
 
376
    {
 
377
      g_warning ("Could not load ui: %s", error->message);
 
378
      g_error_free (error);
 
379
      return NULL;
 
380
    }
 
381
 
 
382
  dialog->dialog = (GtkWidget *) gtk_builder_get_object (dialog->builder, "ppd-selection-dialog");
 
383
  dialog->user_callback = user_callback;
 
384
  dialog->user_data = user_data;
 
385
 
 
386
  dialog->response = GTK_RESPONSE_NONE;
 
387
  dialog->list = ppd_list_copy (ppd_list);
 
388
 
 
389
  dialog->manufacturer = get_standard_manufacturers_name (manufacturer);
 
390
 
 
391
  /* connect signals */
 
392
  g_signal_connect (dialog->dialog, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL);
 
393
  g_signal_connect (dialog->dialog, "response", G_CALLBACK (ppd_selection_dialog_response_cb), dialog);
 
394
 
 
395
  widget = (GtkWidget*)
 
396
    gtk_builder_get_object (dialog->builder, "content-alignment");
 
397
  g_signal_connect (widget, "size-allocate", G_CALLBACK (update_alignment_padding), dialog);
 
398
 
 
399
  widget = (GtkWidget*)
 
400
    gtk_builder_get_object (dialog->builder, "ppd-spinner");
 
401
  gtk_spinner_start (GTK_SPINNER (widget));
 
402
 
 
403
  populate_dialog (dialog);
 
404
 
 
405
  gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog), GTK_WINDOW (parent));
 
406
  gtk_window_present (GTK_WINDOW (dialog->dialog));
 
407
  gtk_widget_show_all (GTK_WIDGET (dialog->dialog));
 
408
 
 
409
  return dialog;
 
410
}
 
411
 
 
412
void
 
413
pp_ppd_selection_dialog_free (PpPPDSelectionDialog *dialog)
 
414
{
 
415
  gtk_widget_destroy (GTK_WIDGET (dialog->dialog));
 
416
 
 
417
  g_object_unref (dialog->builder);
 
418
 
 
419
  g_free (dialog->ppd_name);
 
420
 
 
421
  g_free (dialog->manufacturer);
 
422
 
 
423
  g_free (dialog);
 
424
}
 
425
 
 
426
gchar *
 
427
pp_ppd_selection_dialog_get_ppd_name (PpPPDSelectionDialog *dialog)
 
428
{
 
429
  return g_strdup (dialog->ppd_name);
 
430
}
 
431
 
 
432
void
 
433
pp_ppd_selection_dialog_set_ppd_list (PpPPDSelectionDialog *dialog,
 
434
                                      PPDList              *list)
 
435
{
 
436
  dialog->list = list;
 
437
  fill_ppds_list (dialog);
 
438
}
 
439
 
 
440
static void
 
441
pp_ppd_selection_dialog_hide (PpPPDSelectionDialog *dialog)
 
442
{
 
443
  gtk_widget_hide (GTK_WIDGET (dialog->dialog));
 
444
}