~ubuntu-branches/ubuntu/precise/gnome-control-center/precise-updates

« back to all changes in this revision

Viewing changes to .pc/93_change_window_role_on_panel_change.patch/shell/gnome-control-center.c

  • Committer: Package Import Robot
  • Author(s): Sebastien Bacher, Jeremy Bicha, Ken VanDine
  • Date: 2012-02-15 23:16:31 UTC
  • mfrom: (1.1.56)
  • Revision ID: package-import@ubuntu.com-20120215231631-vk7me0mhofpsq0hp
Tags: 1:3.3.5-0ubuntu1
* Upload the new serie, that will bring in quite some fixes, we revert
  some problematic or risky changes as well
* The new version includes those fixes:
  - "Change Password in User Accounts panel focuses "New password" field, 
     skipping "Current password"" (lp: #821759)
  - The dialog to add online accounts should have a title 
    (lp: #822380)
  - "Remove Profile" button clickable in Color panel when 
     no profile selected (lp: #869603)
  - Move Removable Media into System Info (lp: #835880)
  - Sound preferences: mouse scrolling balance only works for right.
    (lp: #918017)
  - gnome-control-center SIGSEGV in actualize_printers_list() 
    (lp: #903009)
  - selecting preffered applications is not an info (lp: #890143)
  - Add a keyboard shortcut by default for take screenshot of a selection"
    (lp: #625518)
* debian/patches/revert_git_datetime_port.patch:
  - revert use of datetimed, we don't use systemd and ubuntu-system-service 
    doesn't support it yet
* debian/patches/revert_git_drop_library.patch:
  - consolidate "01_allow_external_panels.patch", don't drop the library
    we use it from other components on ubuntu, the patch will be improved
    later to not use a copy of files like it does in that version
* debian/patches/revert_git_stop_using_gconf.patch,
  debian/patches/revert_ua_gsettings.patch,
  debian/patches/revert_git_keyboard_gsettings.patch:
  - revert keyboard porting to gsettings, compiz still use gconf and we
    didn't update gnome-shell to the new serie (yet)

[ Jeremy Bicha ]
* New upstream release (Thanks Rico Tzchichholz!)
* debian/control.in:
  - Bump minimum dependency versions and add libwacom dependency
* debian/rules: Build without -Wl,-z,defs
* debian/watch: Watch for unstable releases
* Refreshed patches:
  - 01_allow_external_panels.patch
  - 04_add_theme_selection.patch
  - 50_ubuntu_systemwide_prefs.patch
  - 58_ubuntu_icon_views_redesign.patch
  - 59_install_gcm_components_on_demand.patch
  - 91_configure_cheese.patch
* Dropped upstream patches:
  - 00git_handle_media_dialog_close.patch
  - 03_show_wacom_under_unity.patch
  - 90_git_sound_tab_order.patch
  - 91_git_build_use_fontconfig.patch
  - 92_git_minimal_output_height.patch
  - 93_change_window_role_on_panel_change.patch
  - 94_git_adding_shortcuts.patch
  - 95_git_ctrlw_shortcut.patch
  - git_extra_keywords.patch

[ Ken VanDine ]
* debian/patches/96_sound_nua_panel.patch
  - refreshed with latest changes from ronoc

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (c) 2009, 2010 Intel, Inc.
3
 
 * Copyright (c) 2010 Red Hat, Inc.
4
 
 *
5
 
 * The Control Center is free software; you can redistribute it and/or modify
6
 
 * it under the terms of the GNU General Public License as published by the
7
 
 * Free Software Foundation; either version 2 of the License, or (at your
8
 
 * option) any later version.
9
 
 *
10
 
 * The Control Center is distributed in the hope that it will be useful, but
11
 
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12
 
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13
 
 * for more details.
14
 
 *
15
 
 * You should have received a copy of the GNU General Public License along
16
 
 * with the Control Center; if not, write to the Free Software Foundation,
17
 
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
 
 *
19
 
 * Author: Thomas Wood <thos@gnome.org>
20
 
 */
21
 
 
22
 
 
23
 
#include "gnome-control-center.h"
24
 
 
25
 
#include <glib/gi18n.h>
26
 
#include <gio/gio.h>
27
 
#include <gio/gdesktopappinfo.h>
28
 
#include <gtk/gtk.h>
29
 
#include <gdk/gdkkeysyms.h>
30
 
#include <string.h>
31
 
#define GMENU_I_KNOW_THIS_IS_UNSTABLE
32
 
#include <gmenu-tree.h>
33
 
 
34
 
#include "cc-panel.h"
35
 
#include "cc-shell.h"
36
 
#include "shell-search-renderer.h"
37
 
#include "cc-shell-category-view.h"
38
 
#include "cc-shell-model.h"
39
 
 
40
 
G_DEFINE_TYPE (GnomeControlCenter, gnome_control_center, CC_TYPE_SHELL)
41
 
 
42
 
#define CONTROL_CENTER_PRIVATE(o) \
43
 
  (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNOME_TYPE_CONTROL_CENTER, GnomeControlCenterPrivate))
44
 
 
45
 
#define W(b,x) GTK_WIDGET (gtk_builder_get_object (b, x))
46
 
 
47
 
/* Use a fixed width for the shell, since resizing horizontally is more awkward
48
 
 * for the user than resizing vertically
49
 
 * Both sizes are defined in https://live.gnome.org/Design/SystemSettings/ */
50
 
#define FIXED_WIDTH 740
51
 
#define FIXED_HEIGHT 618
52
 
#define SMALL_SCREEN_FIXED_HEIGHT 500
53
 
 
54
 
#define MIN_ICON_VIEW_HEIGHT 300
55
 
 
56
 
enum
57
 
{
58
 
  OVERVIEW_PAGE,
59
 
  SEARCH_PAGE,
60
 
  CAPPLET_PAGE
61
 
};
62
 
 
63
 
 
64
 
struct _GnomeControlCenterPrivate
65
 
{
66
 
  GtkBuilder *builder;
67
 
  GtkWidget  *notebook;
68
 
  GtkWidget  *main_vbox;
69
 
  GtkWidget  *scrolled_window;
70
 
  GtkWidget  *window;
71
 
  GtkWidget  *search_entry;
72
 
  GtkWidget  *lock_button;
73
 
 
74
 
  GMenuTree  *menu_tree;
75
 
  GtkListStore *store;
76
 
  GHashTable *category_views;
77
 
 
78
 
  GtkTreeModel *search_filter;
79
 
  GtkWidget *search_view;
80
 
  GtkCellRenderer *search_renderer;
81
 
  gchar *filter_string;
82
 
 
83
 
  guint32 last_time;
84
 
 
85
 
  GIOExtensionPoint *extension_point;
86
 
 
87
 
  gchar *default_window_title;
88
 
  gchar *default_window_icon;
89
 
 
90
 
  gboolean small_screen;
91
 
};
92
 
 
93
 
static const gchar *
94
 
get_icon_name_from_g_icon (GIcon *gicon)
95
 
{
96
 
  const gchar * const *names;
97
 
  GtkIconTheme *icon_theme;
98
 
  int i;
99
 
 
100
 
  if (!G_IS_THEMED_ICON (gicon))
101
 
    return NULL;
102
 
 
103
 
  names = g_themed_icon_get_names (G_THEMED_ICON (gicon));
104
 
  icon_theme = gtk_icon_theme_get_default ();
105
 
 
106
 
  for (i = 0; names[i] != NULL; i++)
107
 
    {
108
 
      if (gtk_icon_theme_has_icon (icon_theme, names[i]))
109
 
        return names[i];
110
 
    }
111
 
 
112
 
  return NULL;
113
 
}
114
 
 
115
 
static void
116
 
activate_panel (GnomeControlCenter *shell,
117
 
                const gchar        *id,
118
 
                const gchar       **argv,
119
 
                const gchar        *desktop_file,
120
 
                const gchar        *name,
121
 
                GIcon              *gicon)
122
 
{
123
 
  GnomeControlCenterPrivate *priv = shell->priv;
124
 
  GType panel_type = G_TYPE_INVALID;
125
 
  GList *panels, *l;
126
 
 
127
 
  /* check if there is an plugin that implements this panel */
128
 
  panels = g_io_extension_point_get_extensions (priv->extension_point);
129
 
 
130
 
  if (!desktop_file)
131
 
    return;
132
 
 
133
 
  if (id)
134
 
    {
135
 
 
136
 
      for (l = panels; l != NULL; l = l->next)
137
 
        {
138
 
          GIOExtension *extension;
139
 
          const gchar *name;
140
 
 
141
 
          extension = l->data;
142
 
 
143
 
          name = g_io_extension_get_name (extension);
144
 
 
145
 
          if (!g_strcmp0 (name, id))
146
 
            {
147
 
              panel_type = g_io_extension_get_type (extension);
148
 
              break;
149
 
            }
150
 
        }
151
 
 
152
 
      if (panel_type != G_TYPE_INVALID)
153
 
        {
154
 
          GtkWidget *panel;
155
 
          GtkWidget *box;
156
 
          gint i;
157
 
          int nat_height;
158
 
          const gchar *icon_name;
159
 
 
160
 
          /* create the panel plugin */
161
 
          panel = g_object_new (panel_type, "shell", shell, "argv", argv, NULL);
162
 
 
163
 
          gtk_lock_button_set_permission (GTK_LOCK_BUTTON (priv->lock_button),
164
 
                                          cc_panel_get_permission (CC_PANEL (panel)));
165
 
 
166
 
          box = gtk_alignment_new (0, 0, 1, 1);
167
 
          gtk_alignment_set_padding (GTK_ALIGNMENT (box), 6, 6, 6, 6);
168
 
 
169
 
          gtk_container_add (GTK_CONTAINER (box), panel);
170
 
 
171
 
          i = gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), box,
172
 
                                        NULL);
173
 
 
174
 
          /* switch to the new panel */
175
 
          gtk_widget_show (box);
176
 
          gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), i);
177
 
 
178
 
          /* set the title of the window */
179
 
          icon_name = get_icon_name_from_g_icon (gicon);
180
 
          gtk_window_set_title (GTK_WINDOW (priv->window), name);
181
 
          gtk_window_set_default_icon_name (icon_name);
182
 
          gtk_window_set_icon_name (GTK_WINDOW (priv->window), icon_name);
183
 
 
184
 
          gtk_widget_show (panel);
185
 
 
186
 
          /* set the scrolled window small so that it doesn't force
187
 
             the window to be larger than this panel */
188
 
          gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (priv->scrolled_window), MIN_ICON_VIEW_HEIGHT);
189
 
 
190
 
          /* resize to the preferred size of the panel */
191
 
          gtk_widget_set_size_request (priv->window, FIXED_WIDTH, -1);
192
 
          gtk_widget_get_preferred_height (GTK_WIDGET (priv->window),
193
 
                                           NULL, &nat_height);
194
 
          gtk_window_resize (GTK_WINDOW (priv->window),
195
 
                             FIXED_WIDTH,
196
 
                             nat_height);
197
 
          return;
198
 
        }
199
 
      else
200
 
        {
201
 
          GKeyFile *key_file;
202
 
 
203
 
          /* It might be an external panel */
204
 
          key_file = g_key_file_new ();
205
 
          if (g_key_file_load_from_file (key_file, desktop_file, G_KEY_FILE_NONE, NULL))
206
 
            {
207
 
              gchar *command;
208
 
 
209
 
              command = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL);
210
 
              if (command && command[0])
211
 
                {
212
 
                  g_spawn_command_line_async (command, NULL);
213
 
                  g_free (command);
214
 
                }
215
 
            }
216
 
 
217
 
          g_key_file_free (key_file);
218
 
        }
219
 
    }
220
 
}
221
 
 
222
 
static void
223
 
shell_show_overview_page (GnomeControlCenterPrivate *priv)
224
 
{
225
 
  gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), OVERVIEW_PAGE);
226
 
 
227
 
  gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), CAPPLET_PAGE);
228
 
 
229
 
  /* clear the search text */
230
 
  g_free (priv->filter_string);
231
 
  priv->filter_string = g_strdup ("");
232
 
  gtk_entry_set_text (GTK_ENTRY (priv->search_entry), "");
233
 
  gtk_widget_grab_focus (priv->search_entry);
234
 
 
235
 
  gtk_lock_button_set_permission (GTK_LOCK_BUTTON (priv->lock_button), NULL);
236
 
 
237
 
  /* reset window title and icon */
238
 
  gtk_window_set_title (GTK_WINDOW (priv->window), priv->default_window_title);
239
 
  gtk_window_set_default_icon_name (priv->default_window_icon);
240
 
  gtk_window_set_icon_name (GTK_WINDOW (priv->window),
241
 
                            priv->default_window_icon);
242
 
}
243
 
 
244
 
void
245
 
gnome_control_center_set_overview_page (GnomeControlCenter *center)
246
 
{
247
 
  shell_show_overview_page (center->priv);
248
 
}
249
 
 
250
 
static void
251
 
item_activated_cb (CcShellCategoryView *view,
252
 
                   gchar               *name,
253
 
                   gchar               *id,
254
 
                   gchar               *desktop_file,
255
 
                   GnomeControlCenter  *shell)
256
 
{
257
 
  GError *err = NULL;
258
 
 
259
 
  if (!cc_shell_set_active_panel_from_id (CC_SHELL (shell), id, NULL, &err))
260
 
    {
261
 
      /* TODO: show message to user */
262
 
      if (err)
263
 
        {
264
 
          g_warning ("Could not active panel \"%s\": %s", id, err->message);
265
 
          g_error_free (err);
266
 
        }
267
 
    }
268
 
}
269
 
 
270
 
static gboolean
271
 
category_focus_out (GtkWidget          *view,
272
 
                    GdkEventFocus      *event,
273
 
                    GnomeControlCenter *shell)
274
 
{
275
 
  gtk_icon_view_unselect_all (GTK_ICON_VIEW (view));
276
 
 
277
 
  return FALSE;
278
 
}
279
 
 
280
 
static gboolean
281
 
category_focus_in (GtkWidget          *view,
282
 
                   GdkEventFocus      *event,
283
 
                   GnomeControlCenter *shell)
284
 
{
285
 
  GtkTreePath *path;
286
 
 
287
 
  if (!gtk_icon_view_get_cursor (GTK_ICON_VIEW (view), &path, NULL))
288
 
    {
289
 
      path = gtk_tree_path_new_from_indices (0, -1);
290
 
      gtk_icon_view_set_cursor (GTK_ICON_VIEW (view), path, NULL, FALSE);
291
 
    }
292
 
 
293
 
  gtk_icon_view_select_path (GTK_ICON_VIEW (view), path);
294
 
  gtk_tree_path_free (path);
295
 
 
296
 
  return FALSE;
297
 
}
298
 
 
299
 
static GList *
300
 
get_item_views (GnomeControlCenter *shell)
301
 
{
302
 
  GList *list, *l;
303
 
  GList *res;
304
 
 
305
 
  list = gtk_container_get_children (GTK_CONTAINER (shell->priv->main_vbox));
306
 
  res = NULL;
307
 
  for (l = list; l; l = l->next)
308
 
    {
309
 
      if (CC_IS_SHELL_CATEGORY_VIEW (l->data))
310
 
        res = g_list_append (res, cc_shell_category_view_get_item_view (CC_SHELL_CATEGORY_VIEW (l->data)));
311
 
    }
312
 
 
313
 
  g_list_free (list);
314
 
 
315
 
  return res;
316
 
}
317
 
 
318
 
static gboolean
319
 
keynav_failed (GtkIconView        *current_view,
320
 
               GtkDirectionType    direction,
321
 
               GnomeControlCenter *shell)
322
 
{
323
 
  GList *views, *v;
324
 
  GtkIconView *new_view;
325
 
  GtkTreePath *path;
326
 
  GtkTreeModel *model;
327
 
  GtkTreeIter iter;
328
 
  gint col, c, dist, d;
329
 
  GtkTreePath *sel;
330
 
  gboolean res;
331
 
 
332
 
  res = FALSE;
333
 
 
334
 
  views = get_item_views (shell);
335
 
 
336
 
  for (v = views; v; v = v->next)
337
 
    {
338
 
      if (v->data == current_view)
339
 
        break;
340
 
    }
341
 
 
342
 
  if (direction == GTK_DIR_DOWN && v != NULL && v->next != NULL)
343
 
    {
344
 
      new_view = v->next->data;
345
 
 
346
 
      if (gtk_icon_view_get_cursor (current_view, &path, NULL))
347
 
        {
348
 
          col = gtk_icon_view_get_item_column (current_view, path);
349
 
          gtk_tree_path_free (path);
350
 
 
351
 
          sel = NULL;
352
 
          dist = 1000;
353
 
          model = gtk_icon_view_get_model (new_view);
354
 
          gtk_tree_model_get_iter_first (model, &iter);
355
 
          do {
356
 
            path = gtk_tree_model_get_path (model, &iter);
357
 
            c = gtk_icon_view_get_item_column (new_view, path);
358
 
            d = ABS (c - col);
359
 
            if (d < dist)
360
 
              {
361
 
                if (sel)
362
 
                  gtk_tree_path_free (sel);
363
 
                sel = path;
364
 
                dist = d;
365
 
              }
366
 
            else
367
 
              gtk_tree_path_free (path);
368
 
          } while (gtk_tree_model_iter_next (model, &iter));
369
 
 
370
 
          gtk_icon_view_set_cursor (new_view, sel, NULL, FALSE);
371
 
          gtk_tree_path_free (sel);
372
 
        }
373
 
 
374
 
      gtk_widget_grab_focus (GTK_WIDGET (new_view));
375
 
 
376
 
      res = TRUE;
377
 
    }
378
 
 
379
 
  if (direction == GTK_DIR_UP && v != NULL && v->prev != NULL)
380
 
    {
381
 
      new_view = v->prev->data;
382
 
 
383
 
      if (gtk_icon_view_get_cursor (current_view, &path, NULL))
384
 
        {
385
 
          col = gtk_icon_view_get_item_column (current_view, path);
386
 
          gtk_tree_path_free (path);
387
 
 
388
 
          sel = NULL;
389
 
          dist = 1000;
390
 
          model = gtk_icon_view_get_model (new_view);
391
 
          gtk_tree_model_get_iter_first (model, &iter);
392
 
          do {
393
 
            path = gtk_tree_model_get_path (model, &iter);
394
 
            c = gtk_icon_view_get_item_column (new_view, path);
395
 
            d = ABS (c - col);
396
 
            if (d <= dist)
397
 
              {
398
 
                if (sel)
399
 
                  gtk_tree_path_free (sel);
400
 
                sel = path;
401
 
                dist = d;
402
 
              }
403
 
            else
404
 
              gtk_tree_path_free (path);
405
 
          } while (gtk_tree_model_iter_next (model, &iter));
406
 
 
407
 
          gtk_icon_view_set_cursor (new_view, sel, NULL, FALSE);
408
 
          gtk_tree_path_free (sel);
409
 
        }
410
 
 
411
 
      gtk_widget_grab_focus (GTK_WIDGET (new_view));
412
 
 
413
 
      res = TRUE;
414
 
    }
415
 
 
416
 
  g_list_free (views);
417
 
 
418
 
  return res;
419
 
}
420
 
 
421
 
static gboolean
422
 
model_filter_func (GtkTreeModel              *model,
423
 
                   GtkTreeIter               *iter,
424
 
                   GnomeControlCenterPrivate *priv)
425
 
{
426
 
  gchar *name, *description;
427
 
  gchar *needle, *haystack;
428
 
  gboolean result;
429
 
  gchar **keywords;
430
 
 
431
 
  gtk_tree_model_get (model, iter,
432
 
                      COL_NAME, &name,
433
 
                      COL_DESCRIPTION, &description,
434
 
                      COL_KEYWORDS, &keywords,
435
 
                      -1);
436
 
 
437
 
  if (!priv->filter_string || !name)
438
 
    {
439
 
      g_free (name);
440
 
      g_free (description);
441
 
      g_strfreev (keywords);
442
 
      return FALSE;
443
 
    }
444
 
 
445
 
  needle = g_utf8_casefold (priv->filter_string, -1);
446
 
  haystack = g_utf8_casefold (name, -1);
447
 
 
448
 
  result = (strstr (haystack, needle) != NULL);
449
 
 
450
 
  if (!result && description)
451
 
    {
452
 
      gchar *folded;
453
 
 
454
 
      folded = g_utf8_casefold (description, -1);
455
 
      result = (strstr (folded, needle) != NULL);
456
 
      g_free (folded);
457
 
    }
458
 
 
459
 
  if (!result && keywords)
460
 
    {
461
 
      gint i;
462
 
      gchar *keyword;
463
 
 
464
 
      for (i = 0; !result && keywords[i]; i++)
465
 
        {
466
 
          keyword = g_utf8_casefold (keywords[i], -1);
467
 
          result = strstr (keyword, needle) == keyword;
468
 
          g_free (keyword);
469
 
        }
470
 
    }
471
 
 
472
 
  g_free (name);
473
 
  g_free (haystack);
474
 
  g_free (needle);
475
 
  g_strfreev (keywords);
476
 
 
477
 
  return result;
478
 
}
479
 
 
480
 
static gboolean
481
 
category_filter_func (GtkTreeModel *model,
482
 
                      GtkTreeIter  *iter,
483
 
                      gchar        *filter)
484
 
{
485
 
  gchar *category;
486
 
  gboolean result;
487
 
 
488
 
  gtk_tree_model_get (model, iter, COL_CATEGORY, &category, -1);
489
 
 
490
 
  result = (g_strcmp0 (category, filter) == 0);
491
 
 
492
 
  g_free (category);
493
 
 
494
 
  return result;
495
 
}
496
 
 
497
 
static void
498
 
search_entry_changed_cb (GtkEntry                  *entry,
499
 
                         GnomeControlCenterPrivate *priv)
500
 
{
501
 
  char *str;
502
 
 
503
 
  /* if the entry text was set manually (not by the user) */
504
 
  if (!g_strcmp0 (priv->filter_string, gtk_entry_get_text (entry)))
505
 
    return;
506
 
 
507
 
  /* Don't re-filter for added trailing or leading spaces */
508
 
  str = g_strdup (gtk_entry_get_text (entry));
509
 
  g_strstrip (str);
510
 
  if (!g_strcmp0 (str, priv->filter_string))
511
 
    {
512
 
      g_free (str);
513
 
      return;
514
 
    }
515
 
 
516
 
  g_free (priv->filter_string);
517
 
  priv->filter_string = str;
518
 
 
519
 
  g_object_set (priv->search_renderer,
520
 
                "search-string", priv->filter_string,
521
 
                NULL);
522
 
 
523
 
  if (!g_strcmp0 (priv->filter_string, ""))
524
 
    {
525
 
      shell_show_overview_page (priv);
526
 
      g_object_set (G_OBJECT (entry),
527
 
                    "secondary-icon-name", "edit-find-symbolic",
528
 
                    "secondary-icon-activatable", FALSE,
529
 
                    "secondary-icon-sensitive", FALSE,
530
 
                    NULL);
531
 
    }
532
 
  else
533
 
    {
534
 
      gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->search_filter));
535
 
      gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook),
536
 
                                     SEARCH_PAGE);
537
 
      g_object_set (G_OBJECT (entry),
538
 
                          "secondary-icon-name", "edit-clear-symbolic",
539
 
                          "secondary-icon-activatable", TRUE,
540
 
                          "secondary-icon-sensitive", TRUE,
541
 
                          NULL);
542
 
    }
543
 
}
544
 
 
545
 
static gboolean
546
 
search_entry_key_press_event_cb (GtkEntry    *entry,
547
 
                                 GdkEventKey *event,
548
 
                                 GnomeControlCenterPrivate   *priv)
549
 
{
550
 
  if (event->keyval == GDK_KEY_Return)
551
 
    {
552
 
      GtkTreePath *path;
553
 
 
554
 
      path = gtk_tree_path_new_first ();
555
 
 
556
 
      priv->last_time = event->time;
557
 
 
558
 
      gtk_icon_view_item_activated (GTK_ICON_VIEW (priv->search_view), path);
559
 
 
560
 
      gtk_tree_path_free (path);
561
 
      return TRUE;
562
 
    }
563
 
 
564
 
  if (event->keyval == GDK_KEY_Escape)
565
 
    {
566
 
      gtk_entry_set_text (entry, "");
567
 
      return TRUE;
568
 
    }
569
 
 
570
 
  return FALSE;
571
 
}
572
 
 
573
 
static void
574
 
search_entry_clear_cb (GtkEntry *entry)
575
 
{
576
 
  gtk_entry_set_text (entry, "");
577
 
}
578
 
 
579
 
 
580
 
static void
581
 
setup_search (GnomeControlCenter *shell)
582
 
{
583
 
  int margin = 12;
584
 
  int spacing = 6;
585
 
  GtkWidget *search_scrolled, *search_view, *widget;
586
 
  GnomeControlCenterPrivate *priv = shell->priv;
587
 
 
588
 
  g_return_if_fail (priv->store != NULL);
589
 
 
590
 
  /* create the search filter */
591
 
  priv->search_filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (priv->store),
592
 
                                                   NULL);
593
 
 
594
 
  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (priv->search_filter),
595
 
                                          (GtkTreeModelFilterVisibleFunc)
596
 
                                            model_filter_func,
597
 
                                          priv, NULL);
598
 
 
599
 
  /* set up the search view */
600
 
  priv->search_view = search_view = cc_shell_item_view_new ();
601
 
  gtk_icon_view_set_item_orientation (GTK_ICON_VIEW (search_view),
602
 
                                      GTK_ORIENTATION_HORIZONTAL);
603
 
  gtk_icon_view_set_margin (GTK_ICON_VIEW (search_view), margin);
604
 
  gtk_icon_view_set_spacing (GTK_ICON_VIEW (search_view), spacing);
605
 
  gtk_icon_view_set_model (GTK_ICON_VIEW (search_view),
606
 
                           GTK_TREE_MODEL (priv->search_filter));
607
 
  gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW (search_view), COL_PIXBUF);
608
 
 
609
 
  search_scrolled = W (priv->builder, "search-scrolled-window");
610
 
  gtk_container_add (GTK_CONTAINER (search_scrolled), search_view);
611
 
 
612
 
  /* add the custom renderer */
613
 
  priv->search_renderer = (GtkCellRenderer*) shell_search_renderer_new ();
614
 
  gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (search_view),
615
 
                              priv->search_renderer, TRUE);
616
 
  gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (search_view),
617
 
                                 priv->search_renderer,
618
 
                                 "title", COL_NAME);
619
 
  gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (search_view),
620
 
                                 priv->search_renderer,
621
 
                                 "search-target", COL_DESCRIPTION);
622
 
 
623
 
  /* connect the activated signal */
624
 
  g_signal_connect (search_view, "desktop-item-activated",
625
 
                    G_CALLBACK (item_activated_cb), shell);
626
 
 
627
 
  /* setup the search entry widget */
628
 
  widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "search-entry");
629
 
  priv->search_entry = widget;
630
 
  priv->filter_string = g_strdup ("");
631
 
 
632
 
  g_signal_connect (widget, "changed", G_CALLBACK (search_entry_changed_cb),
633
 
                    priv);
634
 
  g_signal_connect (widget, "key-press-event",
635
 
                    G_CALLBACK (search_entry_key_press_event_cb), priv);
636
 
 
637
 
  g_signal_connect (widget, "icon-release", G_CALLBACK (search_entry_clear_cb),
638
 
                    priv);
639
 
 
640
 
  gtk_widget_show (priv->search_view);
641
 
}
642
 
 
643
 
static void
644
 
setup_lock (GnomeControlCenter *shell)
645
 
{
646
 
  GnomeControlCenterPrivate *priv = shell->priv;
647
 
 
648
 
  priv->lock_button = W (priv->builder, "lock-button");
649
 
}
650
 
 
651
 
static void
652
 
maybe_add_category_view (GnomeControlCenter *shell,
653
 
                         const char         *name,
654
 
                         GIcon              *icon)
655
 
{
656
 
  GtkTreeModel *filter;
657
 
  GtkWidget *categoryview;
658
 
 
659
 
  if (g_hash_table_lookup (shell->priv->category_views, name) != NULL)
660
 
    return;
661
 
 
662
 
  if (g_hash_table_size (shell->priv->category_views) > 0)
663
 
    {
664
 
      GtkWidget *separator;
665
 
      separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
666
 
      gtk_widget_set_margin_top (separator, 11);
667
 
      gtk_widget_set_margin_bottom (separator, 10);
668
 
      gtk_box_pack_start (GTK_BOX (shell->priv->main_vbox), separator, FALSE, FALSE, 0);
669
 
      gtk_widget_show (separator);
670
 
    }
671
 
 
672
 
  /* create new category view for this category */
673
 
  filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (shell->priv->store),
674
 
                                      NULL);
675
 
  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
676
 
                                          (GtkTreeModelFilterVisibleFunc) category_filter_func,
677
 
                                          g_strdup (name), g_free);
678
 
 
679
 
  categoryview = cc_shell_category_view_new (name, icon, filter);
680
 
  gtk_box_pack_start (GTK_BOX (shell->priv->main_vbox), categoryview, FALSE, TRUE, 0);
681
 
 
682
 
  g_signal_connect (cc_shell_category_view_get_item_view (CC_SHELL_CATEGORY_VIEW (categoryview)),
683
 
                    "desktop-item-activated",
684
 
                    G_CALLBACK (item_activated_cb), shell);
685
 
 
686
 
  gtk_widget_show (categoryview);
687
 
 
688
 
  g_signal_connect (cc_shell_category_view_get_item_view (CC_SHELL_CATEGORY_VIEW (categoryview)),
689
 
                    "focus-in-event",
690
 
                    G_CALLBACK (category_focus_in), shell);
691
 
  g_signal_connect (cc_shell_category_view_get_item_view (CC_SHELL_CATEGORY_VIEW (categoryview)),
692
 
                    "focus-out-event",
693
 
                    G_CALLBACK (category_focus_out), shell);
694
 
  g_signal_connect (cc_shell_category_view_get_item_view (CC_SHELL_CATEGORY_VIEW (categoryview)),
695
 
                    "keynav-failed",
696
 
                    G_CALLBACK (keynav_failed), shell);
697
 
 
698
 
  g_hash_table_insert (shell->priv->category_views, g_strdup (name), categoryview);
699
 
}
700
 
 
701
 
static void
702
 
reload_menu (GnomeControlCenter *shell)
703
 
{
704
 
  GError *error;
705
 
  GMenuTreeDirectory *d;
706
 
  GMenuTreeIter *iter;
707
 
  GMenuTreeItemType next_type;
708
 
 
709
 
  error = NULL;
710
 
  if (!gmenu_tree_load_sync (shell->priv->menu_tree, &error))
711
 
    {
712
 
      g_warning ("Could not load control center menu: %s", error->message);
713
 
      g_clear_error (&error);
714
 
      return;
715
 
    }
716
 
 
717
 
 
718
 
  d = gmenu_tree_get_root_directory (shell->priv->menu_tree);
719
 
  iter = gmenu_tree_directory_iter (d);
720
 
 
721
 
  while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID)
722
 
    {
723
 
      if (next_type == GMENU_TREE_ITEM_DIRECTORY)
724
 
        {
725
 
          GMenuTreeDirectory *subdir;
726
 
          const gchar *dir_name;
727
 
          GIcon *dir_icon;
728
 
          GMenuTreeIter *sub_iter;
729
 
          GMenuTreeItemType sub_next_type;
730
 
 
731
 
          subdir = gmenu_tree_iter_get_directory (iter);
732
 
          dir_name = gmenu_tree_directory_get_name (subdir);
733
 
          dir_icon = gmenu_tree_directory_get_icon (subdir);
734
 
 
735
 
          maybe_add_category_view (shell, dir_name, dir_icon);
736
 
 
737
 
          /* add the items from this category to the model */
738
 
          sub_iter = gmenu_tree_directory_iter (subdir);
739
 
          while ((sub_next_type = gmenu_tree_iter_next (sub_iter)) != GMENU_TREE_ITEM_INVALID)
740
 
            {
741
 
              if (sub_next_type == GMENU_TREE_ITEM_ENTRY)
742
 
                {
743
 
                  GMenuTreeEntry *item = gmenu_tree_iter_get_entry (sub_iter);
744
 
                  cc_shell_model_add_item (CC_SHELL_MODEL (shell->priv->store),
745
 
                                           dir_name,
746
 
                                           item);
747
 
                  gmenu_tree_item_unref (item);
748
 
                }
749
 
            }
750
 
 
751
 
          gmenu_tree_iter_unref (sub_iter);
752
 
          gmenu_tree_item_unref (subdir);
753
 
        }
754
 
    }
755
 
 
756
 
  gmenu_tree_iter_unref (iter);
757
 
}
758
 
 
759
 
static void
760
 
on_menu_changed (GMenuTree          *monitor,
761
 
                 GnomeControlCenter *shell)
762
 
{
763
 
  gtk_list_store_clear (shell->priv->store);
764
 
  reload_menu (shell);
765
 
}
766
 
 
767
 
static void
768
 
setup_model (GnomeControlCenter *shell)
769
 
{
770
 
  GnomeControlCenterPrivate *priv = shell->priv;
771
 
 
772
 
  gtk_widget_set_margin_top( shell->priv->main_vbox, 8);
773
 
  gtk_widget_set_margin_bottom( shell->priv->main_vbox, 8);
774
 
  gtk_widget_set_margin_left( shell->priv->main_vbox, 12);
775
 
  gtk_widget_set_margin_right( shell->priv->main_vbox, 12);
776
 
  gtk_container_set_focus_vadjustment (GTK_CONTAINER (shell->priv->main_vbox),
777
 
                                       gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (shell->priv->scrolled_window)));
778
 
 
779
 
  priv->store = (GtkListStore *) cc_shell_model_new ();
780
 
  priv->category_views = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
781
 
  priv->menu_tree = gmenu_tree_new_for_path (MENUDIR "/gnomecc.menu", 0);
782
 
 
783
 
  reload_menu (shell);
784
 
 
785
 
  g_signal_connect (priv->menu_tree, "changed", G_CALLBACK (on_menu_changed), shell);
786
 
}
787
 
 
788
 
static void
789
 
load_panel_plugins (GnomeControlCenter *shell)
790
 
{
791
 
  GList *modules;
792
 
 
793
 
  /* only allow this function to be run once to prevent modules being loaded
794
 
   * twice
795
 
   */
796
 
  if (shell->priv->extension_point)
797
 
    return;
798
 
 
799
 
  /* make sure the base type is registered */
800
 
  g_type_from_name ("CcPanel");
801
 
 
802
 
  shell->priv->extension_point
803
 
    = g_io_extension_point_register (CC_SHELL_PANEL_EXTENSION_POINT);
804
 
 
805
 
  /* load all the plugins in the panels directory */
806
 
  modules = g_io_modules_load_all_in_directory (PANELS_DIR);
807
 
  g_list_free (modules);
808
 
 
809
 
}
810
 
 
811
 
 
812
 
static void
813
 
home_button_clicked_cb (GtkButton *button,
814
 
                        GnomeControlCenter *shell)
815
 
{
816
 
  shell_show_overview_page (shell->priv);
817
 
}
818
 
 
819
 
static void
820
 
notebook_switch_page_cb (GtkNotebook               *book,
821
 
                         GtkWidget                 *child,
822
 
                         gint                       page_num,
823
 
                         GnomeControlCenterPrivate *priv)
824
 
{
825
 
  /* make sure the home button is shown on all pages except the overview page */
826
 
 
827
 
  if (page_num == OVERVIEW_PAGE || page_num == SEARCH_PAGE)
828
 
    {
829
 
      gtk_widget_hide (W (priv->builder, "home-button"));
830
 
      gtk_widget_show (W (priv->builder, "search-entry"));
831
 
      gtk_widget_hide (W (priv->builder, "lock-button"));
832
 
      gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (priv->scrolled_window),
833
 
        (priv->small_screen
834
 
        ? SMALL_SCREEN_FIXED_HEIGHT
835
 
        : FIXED_HEIGHT) - 50 );
836
 
    }
837
 
  else
838
 
    {
839
 
      gtk_widget_show (W (priv->builder, "home-button"));
840
 
      gtk_widget_hide (W (priv->builder, "search-entry"));
841
 
      gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (priv->scrolled_window), MIN_ICON_VIEW_HEIGHT);
842
 
    }
843
 
}
844
 
 
845
 
/* CcShell implementation */
846
 
static gboolean
847
 
_shell_set_active_panel_from_id (CcShell      *shell,
848
 
                                 const gchar  *start_id,
849
 
                                 const gchar **argv,
850
 
                                 GError      **err)
851
 
{
852
 
  GtkTreeIter iter;
853
 
  gboolean iter_valid;
854
 
  gchar *name = NULL;
855
 
  gchar *desktop;
856
 
  GIcon *gicon;
857
 
  GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (shell)->priv;
858
 
 
859
 
 
860
 
  iter_valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->store),
861
 
                                              &iter);
862
 
 
863
 
  /* find the details for this item */
864
 
  while (iter_valid)
865
 
    {
866
 
      gchar *id;
867
 
 
868
 
      gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter,
869
 
                          COL_NAME, &name,
870
 
                          COL_DESKTOP_FILE, &desktop,
871
 
                          COL_GICON, &gicon,
872
 
                          COL_ID, &id,
873
 
                          -1);
874
 
 
875
 
      if (id && !strcmp (id, start_id))
876
 
        {
877
 
          g_free (id);
878
 
          break;
879
 
        }
880
 
      else
881
 
        {
882
 
          g_free (id);
883
 
          g_free (name);
884
 
          g_free (desktop);
885
 
          if (gicon)
886
 
            g_object_unref (gicon);
887
 
 
888
 
          name = NULL;
889
 
          id = NULL;
890
 
        }
891
 
 
892
 
      iter_valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->store),
893
 
                                             &iter);
894
 
    }
895
 
 
896
 
  if (!name)
897
 
    {
898
 
      g_warning ("Could not find settings panel \"%s\"", start_id);
899
 
      return FALSE;
900
 
    }
901
 
  else
902
 
    {
903
 
      gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), CAPPLET_PAGE);
904
 
 
905
 
      activate_panel (GNOME_CONTROL_CENTER (shell), start_id, argv, desktop,
906
 
                      name, gicon);
907
 
 
908
 
      g_free (name);
909
 
      g_free (desktop);
910
 
      if (gicon)
911
 
        g_object_unref (gicon);
912
 
 
913
 
      return TRUE;
914
 
    }
915
 
}
916
 
 
917
 
static GtkWidget *
918
 
_shell_get_toplevel (CcShell *shell)
919
 
{
920
 
  return GNOME_CONTROL_CENTER (shell)->priv->window;
921
 
}
922
 
 
923
 
/* GObject Implementation */
924
 
static void
925
 
gnome_control_center_get_property (GObject    *object,
926
 
                                   guint       property_id,
927
 
                                   GValue     *value,
928
 
                                   GParamSpec *pspec)
929
 
{
930
 
  switch (property_id)
931
 
    {
932
 
    default:
933
 
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
934
 
    }
935
 
}
936
 
 
937
 
static void
938
 
gnome_control_center_set_property (GObject      *object,
939
 
                                   guint         property_id,
940
 
                                   const GValue *value,
941
 
                                   GParamSpec   *pspec)
942
 
{
943
 
  switch (property_id)
944
 
    {
945
 
    default:
946
 
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
947
 
    }
948
 
}
949
 
 
950
 
static void
951
 
gnome_control_center_dispose (GObject *object)
952
 
{
953
 
  GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (object)->priv;
954
 
 
955
 
  if (priv->window)
956
 
    {
957
 
      gtk_widget_destroy (priv->window);
958
 
      priv->window = NULL;
959
 
 
960
 
      /* destroying the window will destroy its children */
961
 
      priv->notebook = NULL;
962
 
      priv->search_entry = NULL;
963
 
      priv->search_view = NULL;
964
 
      priv->search_renderer = NULL;
965
 
    }
966
 
 
967
 
  if (priv->builder)
968
 
    {
969
 
      g_object_unref (priv->builder);
970
 
      priv->builder = NULL;
971
 
    }
972
 
 
973
 
  if (priv->store)
974
 
    {
975
 
      g_object_unref (priv->store);
976
 
      priv->store = NULL;
977
 
    }
978
 
 
979
 
  if (priv->search_filter)
980
 
    {
981
 
      g_object_unref (priv->search_filter);
982
 
      priv->search_filter = NULL;
983
 
    }
984
 
 
985
 
 
986
 
  G_OBJECT_CLASS (gnome_control_center_parent_class)->dispose (object);
987
 
}
988
 
 
989
 
static void
990
 
gnome_control_center_finalize (GObject *object)
991
 
{
992
 
  GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (object)->priv;
993
 
 
994
 
  if (priv->filter_string)
995
 
    {
996
 
      g_free (priv->filter_string);
997
 
      priv->filter_string = NULL;
998
 
    }
999
 
 
1000
 
  if (priv->default_window_title)
1001
 
    {
1002
 
      g_free (priv->default_window_title);
1003
 
      priv->default_window_title = NULL;
1004
 
    }
1005
 
 
1006
 
  if (priv->default_window_icon)
1007
 
    {
1008
 
      g_free (priv->default_window_icon);
1009
 
      priv->default_window_icon = NULL;
1010
 
    }
1011
 
 
1012
 
  if (priv->menu_tree)
1013
 
    {
1014
 
      g_signal_handlers_disconnect_by_func (priv->menu_tree,
1015
 
                                            G_CALLBACK (on_menu_changed), object);
1016
 
      g_object_unref (priv->menu_tree);
1017
 
    }
1018
 
 
1019
 
  if (priv->category_views)
1020
 
    {
1021
 
      g_hash_table_destroy (priv->category_views);
1022
 
    }
1023
 
 
1024
 
  G_OBJECT_CLASS (gnome_control_center_parent_class)->finalize (object);
1025
 
}
1026
 
 
1027
 
static void
1028
 
gnome_control_center_class_init (GnomeControlCenterClass *klass)
1029
 
{
1030
 
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
1031
 
  CcShellClass *shell_class = CC_SHELL_CLASS (klass);
1032
 
 
1033
 
  g_type_class_add_private (klass, sizeof (GnomeControlCenterPrivate));
1034
 
 
1035
 
  object_class->get_property = gnome_control_center_get_property;
1036
 
  object_class->set_property = gnome_control_center_set_property;
1037
 
  object_class->dispose = gnome_control_center_dispose;
1038
 
  object_class->finalize = gnome_control_center_finalize;
1039
 
 
1040
 
  shell_class->set_active_panel_from_id = _shell_set_active_panel_from_id;
1041
 
  shell_class->get_toplevel = _shell_get_toplevel;
1042
 
}
1043
 
 
1044
 
static void
1045
 
viewport_style_set_cb (GtkWidget *widget,
1046
 
                       GtkStyle  *old_style,
1047
 
                       gpointer   user_data)
1048
 
{
1049
 
  GtkStyle *style;
1050
 
 
1051
 
  /* use "base" colours inside the viewport */
1052
 
 
1053
 
  g_signal_handlers_block_by_func (widget, viewport_style_set_cb, NULL);
1054
 
 
1055
 
  style = gtk_widget_get_style (widget);
1056
 
 
1057
 
  gtk_widget_modify_bg (widget, GTK_STATE_NORMAL,
1058
 
                        &style->base[GTK_STATE_NORMAL]);
1059
 
 
1060
 
  g_signal_handlers_unblock_by_func (widget, viewport_style_set_cb, NULL);
1061
 
}
1062
 
 
1063
 
static gboolean
1064
 
window_key_press_event (GtkWidget          *win,
1065
 
                        GdkEventKey        *event,
1066
 
                        GnomeControlCenter *self)
1067
 
{
1068
 
  gboolean retval;
1069
 
 
1070
 
  retval = FALSE;
1071
 
 
1072
 
  if (event->state != 0 &&
1073
 
      (event->state & GDK_CONTROL_MASK))
1074
 
    {
1075
 
      switch (event->keyval)
1076
 
        {
1077
 
          case GDK_KEY_s:
1078
 
          case GDK_KEY_S:
1079
 
          case GDK_KEY_f:
1080
 
          case GDK_KEY_F:
1081
 
            if (gtk_widget_get_visible (self->priv->search_entry))
1082
 
              {
1083
 
                gtk_widget_grab_focus (self->priv->search_entry);
1084
 
                retval = TRUE;
1085
 
              }
1086
 
            break;
1087
 
          case GDK_KEY_Q:
1088
 
          case GDK_KEY_q:
1089
 
            g_object_unref (self);
1090
 
            retval = TRUE;
1091
 
            break;
1092
 
        }
1093
 
    }
1094
 
  return retval;
1095
 
}
1096
 
 
1097
 
static gint
1098
 
get_monitor_height (void)
1099
 
{
1100
 
  GdkScreen *screen;
1101
 
  gint x, y;
1102
 
  GdkRectangle rect;
1103
 
  GdkDisplay *display = gdk_display_get_default ();
1104
 
  GdkDeviceManager *device_manager = gdk_display_get_device_manager (display);
1105
 
  GdkDevice *device = gdk_device_manager_get_client_pointer (device_manager);
1106
 
 
1107
 
  gdk_device_get_position (device, &screen, &x, &y);
1108
 
 
1109
 
  gint monitor = gdk_screen_get_monitor_at_point (screen, x, y);
1110
 
  gdk_screen_get_monitor_geometry (screen, monitor, &rect);
1111
 
  return rect.height;
1112
 
}
1113
 
 
1114
 
static void
1115
 
gnome_control_center_init (GnomeControlCenter *self)
1116
 
{
1117
 
  GtkWidget *widget;
1118
 
  GError *err = NULL;
1119
 
  GnomeControlCenterPrivate *priv;
1120
 
 
1121
 
  priv = self->priv = CONTROL_CENTER_PRIVATE (self);
1122
 
 
1123
 
  priv->small_screen = get_monitor_height() <= FIXED_HEIGHT;
1124
 
 
1125
 
  /* load the user interface */
1126
 
  priv->builder = gtk_builder_new ();
1127
 
 
1128
 
  if (!gtk_builder_add_from_file (priv->builder, UIDIR "/shell.ui", &err))
1129
 
    {
1130
 
      g_critical ("Could not build interface: %s", err->message);
1131
 
      g_error_free (err);
1132
 
 
1133
 
      return;
1134
 
    }
1135
 
 
1136
 
  /* connect various signals */
1137
 
  priv->window = W (priv->builder, "main-window");
1138
 
  if (priv->small_screen)
1139
 
    gtk_window_set_resizable (GTK_WINDOW (priv->window), TRUE);
1140
 
  g_signal_connect_swapped (priv->window, "delete-event", G_CALLBACK (g_object_unref), self);
1141
 
  g_signal_connect (priv->window, "key_press_event",
1142
 
                    G_CALLBACK (window_key_press_event), self);
1143
 
 
1144
 
  priv->notebook = W (priv->builder, "notebook");
1145
 
  priv->scrolled_window = W (priv->builder, "scrolledwindow1");
1146
 
 
1147
 
  widget = W (priv->builder, "viewport");
1148
 
  g_signal_connect (widget, "style-set", G_CALLBACK (viewport_style_set_cb),
1149
 
                    NULL);
1150
 
 
1151
 
  gtk_widget_set_size_request (priv->scrolled_window, FIXED_WIDTH, -1);
1152
 
  priv->main_vbox = W (priv->builder, "main-vbox");
1153
 
  g_signal_connect (priv->notebook, "switch-page",
1154
 
                    G_CALLBACK (notebook_switch_page_cb), priv);
1155
 
 
1156
 
  g_signal_connect (gtk_builder_get_object (priv->builder, "home-button"),
1157
 
                    "clicked", G_CALLBACK (home_button_clicked_cb), self);
1158
 
 
1159
 
  /* load the available settings panels */
1160
 
  setup_model (self);
1161
 
 
1162
 
  /* load the panels that are implemented as plugins */
1163
 
  load_panel_plugins (self);
1164
 
 
1165
 
  /* setup search functionality */
1166
 
  setup_search (self);
1167
 
 
1168
 
  setup_lock (self);
1169
 
 
1170
 
  /* store default window title and name */
1171
 
  priv->default_window_title = g_strdup (gtk_window_get_title (GTK_WINDOW (priv->window)));
1172
 
  priv->default_window_icon = g_strdup (gtk_window_get_icon_name (GTK_WINDOW (priv->window)));
1173
 
 
1174
 
  notebook_switch_page_cb (NULL, NULL, OVERVIEW_PAGE, priv);
1175
 
}
1176
 
 
1177
 
GnomeControlCenter *
1178
 
gnome_control_center_new (void)
1179
 
{
1180
 
  return g_object_new (GNOME_TYPE_CONTROL_CENTER, NULL);
1181
 
}
1182
 
 
1183
 
void
1184
 
gnome_control_center_present (GnomeControlCenter *center)
1185
 
{
1186
 
  if (center->priv->small_screen) {
1187
 
    gtk_window_maximize (GTK_WINDOW (center->priv->window));
1188
 
  }
1189
 
  gtk_window_present (GTK_WINDOW (center->priv->window));
1190
 
}
1191
 
 
1192
 
void
1193
 
gnome_control_center_show (GnomeControlCenter *center,
1194
 
                           GtkApplication     *app)
1195
 
{
1196
 
  gtk_window_set_application (GTK_WINDOW (center->priv->window), app);
1197
 
  gtk_widget_show (gtk_bin_get_child (GTK_BIN (center->priv->window)));
1198
 
}