1 Description: Allow the workspace switcher to change the desktop layout when using compiz
2 Bug: https://bugzilla.gnome.org/show_bug.cgi?id=496830
4 Index: gnome-panel-2.30.0/applets/wncklet/workspace-switcher.c
5 ===================================================================
6 --- gnome-panel-2.30.0.orig/applets/wncklet/workspace-switcher.c 2010-01-14 14:26:27.000000000 +1100
7 +++ gnome-panel-2.30.0/applets/wncklet/workspace-switcher.c 2010-06-03 13:57:59.223947813 +1000
9 #define MAX_REASONABLE_ROWS 16
10 #define DEFAULT_ROWS 1
12 +#define COMPIZ_OPTIONS "/apps/compiz/general/screen0/options"
13 +#define COMPIZ_HSIZE "/apps/compiz/general/screen0/options/hsize"
14 +#define COMPIZ_VSIZE "/apps/compiz/general/screen0/options/vsize"
16 #define NEVER_SENSITIVE "never_sensitive"
17 #define NUM_WORKSPACES "/apps/metacity/general/num_workspaces"
18 #define WORKSPACE_NAME "/apps/metacity/workspace_names/name_1"
22 GtkWidget *properties_dialog;
23 + GtkWidget *switcher_frame;
24 GtkWidget *workspaces_frame;
25 GtkWidget *workspace_names_label;
26 GtkWidget *workspace_names_scroll;
28 GtkWidget *num_workspaces_spin;
29 GtkWidget *workspaces_tree;
30 GtkListStore *workspaces_store;
31 + GtkWidget *viewports_frame;
32 + GtkWidget *hsize_spin;
33 + GtkWidget *vsize_spin;
39 wnck_pager_set_n_rows (WNCK_PAGER (pager->pager),
41 - wnck_pager_set_show_all (WNCK_PAGER (pager->pager),
42 - pager->display_all);
44 + if (pager->wm == PAGER_WM_COMPIZ)
45 + wnck_pager_set_show_all (WNCK_PAGER (pager->pager),
48 + wnck_pager_set_show_all (WNCK_PAGER (pager->pager),
49 + pager->display_all);
51 if (pager->wm == PAGER_WM_METACITY)
52 wnck_pager_set_display_mode (WNCK_PAGER (pager->pager),
54 gtk_widget_show (pager->workspace_names_scroll);
55 if (pager->display_workspaces_toggle)
56 gtk_widget_show (pager->display_workspaces_toggle);
57 + if (pager->viewports_frame)
58 + gtk_widget_hide (pager->viewports_frame);
61 + if (pager->switcher_frame)
62 + gtk_widget_hide (pager->switcher_frame);
63 if (pager->workspaces_frame)
64 - gtk_widget_show (pager->workspaces_frame);
65 + gtk_widget_hide (pager->workspaces_frame);
66 if (pager->workspace_names_label)
67 gtk_widget_hide (pager->workspace_names_label);
68 if (pager->workspace_names_scroll)
69 gtk_widget_hide (pager->workspace_names_scroll);
70 if (pager->display_workspaces_toggle)
71 gtk_widget_hide (pager->display_workspaces_toggle);
72 + if (pager->viewports_frame)
73 + gtk_widget_show (pager->viewports_frame);
75 case PAGER_WM_UNKNOWN:
76 if (pager->workspaces_frame)
77 gtk_widget_hide (pager->workspaces_frame);
78 + if (pager->viewports_frame)
79 + gtk_widget_hide (pager->viewports_frame);
82 g_assert_not_reached ();
84 pager->wm = PAGER_WM_UNKNOWN;
85 else if (strcmp (wm_name, "Metacity") == 0)
86 pager->wm = PAGER_WM_METACITY;
87 - else if (strcmp (wm_name, "Compiz") == 0)
88 + else if (strcmp (wm_name, "compiz") == 0)
89 pager->wm = PAGER_WM_COMPIZ;
91 pager->wm = PAGER_WM_UNKNOWN;
93 pager->orientation = new_orient;
95 if (pager->label_row_col)
96 - gtk_label_set_text (GTK_LABEL (pager->label_row_col), pager->orientation == GTK_ORIENTATION_HORIZONTAL ? _("rows") : _("columns"));
97 + gtk_label_set_text (GTK_LABEL (pager->label_row_col),
98 + pager->orientation == GTK_ORIENTATION_HORIZONTAL ? _("rows") : _("columns"));
106 +/* compiz' "columns" */
108 +hsize_value_changed (GtkSpinButton *button,
111 + GConfClient* client = gconf_client_get_default ();
113 + gconf_client_set_int (client,
115 + gtk_spin_button_get_value_as_int (button),
117 + g_object_unref (client);
120 +/* compiz' "rows" */
122 +vsize_value_changed (GtkSpinButton *button,
125 + GConfClient* client = gconf_client_get_default ();
127 + gconf_client_set_int (client,
129 + gtk_spin_button_get_value_as_int (button),
131 + g_object_unref (client);
135 update_workspaces_model (PagerData *pager)
140 pager->properties_dialog = NULL;
141 + pager->switcher_frame = NULL;
142 pager->workspaces_frame = NULL;
143 pager->workspace_names_label = NULL;
144 pager->workspace_names_scroll = NULL;
146 pager->num_workspaces_spin = NULL;
147 pager->workspaces_tree = NULL;
148 pager->workspaces_store = NULL;
149 + pager->viewports_frame = NULL;
150 + pager->hsize_spin = NULL;
151 + pager->vsize_spin = NULL;
155 @@ -900,13 +954,49 @@
156 GtkTreeViewColumn *column;
157 GtkCellRenderer *cell;
160 + GConfClient* client = NULL;
164 + pager->switcher_frame = WID ("switcher_frame");
165 pager->workspaces_frame = WID ("workspaces_frame");
166 pager->workspace_names_label = WID ("workspace_names_label");
167 pager->workspace_names_scroll = WID ("workspace_names_scroll");
169 + if (pager->wm == PAGER_WM_COMPIZ)
171 + client = gconf_client_get_default ();
173 + pager->viewports_frame = WID ("viewports_frame");
174 + pager->hsize_spin = WID ("hsize_spin");
175 + pager->vsize_spin = WID ("vsize_spin");
177 + g_signal_connect (G_OBJECT (pager->hsize_spin),
179 + (GCallback) hsize_value_changed,
182 + g_signal_connect (G_OBJECT (pager->vsize_spin),
184 + (GCallback) vsize_value_changed,
187 + /* set value for hsize (compiz's "columns") */
188 + hsize = gconf_client_get_int (client, COMPIZ_HSIZE, NULL);
189 + gtk_spin_button_set_value (GTK_SPIN_BUTTON (pager->hsize_spin),
192 + /* set value for vsize (compiz's "rows") */
193 + vsize = gconf_client_get_int (client, COMPIZ_VSIZE, NULL);
194 + gtk_spin_button_set_value (GTK_SPIN_BUTTON (pager->vsize_spin),
197 + g_object_unref (client);
200 pager->display_workspaces_toggle = WID ("workspace_name_toggle");
201 - setup_sensitivity (pager, builder,
202 + setup_sensitivity (pager,
204 "workspace_name_toggle",
209 pager->all_workspaces_radio = WID ("all_workspaces_radio");
210 pager->current_only_radio = WID ("current_only_radio");
211 - setup_sensitivity (pager, builder,
212 + setup_sensitivity (pager,
214 "all_workspaces_radio",
215 "current_only_radio",
217 @@ -922,14 +1013,16 @@
219 pager->num_rows_spin = WID ("num_rows_spin");
220 pager->label_row_col = WID("label_row_col");
221 - setup_sensitivity (pager, builder,
222 + setup_sensitivity (pager,
227 "num_rows" /* key */);
229 pager->num_workspaces_spin = WID ("num_workspaces_spin");
230 - setup_sensitivity (pager, builder,
231 + setup_sensitivity (pager,
233 "num_workspaces_spin",
236 @@ -943,92 +1036,130 @@
237 WORKSPACE_NAME /* key */);
239 /* Display workspace names: */
241 - g_signal_connect (G_OBJECT (pager->display_workspaces_toggle), "toggled",
242 - (GCallback) display_workspace_names_toggled, pager);
243 + g_signal_connect (G_OBJECT (pager->display_workspaces_toggle),
245 + (GCallback) display_workspace_names_toggled,
248 - if (pager->display_mode == WNCK_PAGER_DISPLAY_NAME) {
249 + if (pager->display_mode == WNCK_PAGER_DISPLAY_NAME)
256 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pager->display_workspaces_toggle),
259 /* Display all workspaces: */
260 - g_signal_connect (G_OBJECT (pager->all_workspaces_radio), "toggled",
261 - (GCallback) all_workspaces_toggled, pager);
262 + g_signal_connect (G_OBJECT (pager->all_workspaces_radio),
264 + (GCallback) all_workspaces_toggled,
267 - if (pager->display_all) {
268 - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pager->all_workspaces_radio), TRUE);
269 - if ( ! g_object_get_data (G_OBJECT (pager->num_rows_spin), NEVER_SENSITIVE))
270 - gtk_widget_set_sensitive (pager->num_rows_spin, TRUE);
272 - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pager->current_only_radio), TRUE);
273 - gtk_widget_set_sensitive (pager->num_rows_spin, FALSE);
274 + if (pager->display_all)
276 + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pager->all_workspaces_radio),
279 + if (!g_object_get_data (G_OBJECT (pager->num_rows_spin),
281 + gtk_widget_set_sensitive (pager->num_rows_spin,
287 + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pager->current_only_radio),
289 + gtk_widget_set_sensitive (pager->num_rows_spin,
294 - g_signal_connect (G_OBJECT (pager->num_rows_spin), "value_changed",
295 - (GCallback) num_rows_value_changed, pager);
296 + g_signal_connect (G_OBJECT (pager->num_rows_spin),
298 + (GCallback) num_rows_value_changed,
301 - gtk_spin_button_set_value (GTK_SPIN_BUTTON (pager->num_rows_spin), pager->n_rows);
302 - gtk_label_set_text (GTK_LABEL (pager->label_row_col), pager->orientation == GTK_ORIENTATION_HORIZONTAL ? _("rows") : _("columns"));
303 + gtk_spin_button_set_value (GTK_SPIN_BUTTON (pager->num_rows_spin),
305 + gtk_label_set_text (GTK_LABEL (pager->label_row_col),
306 + pager->orientation == GTK_ORIENTATION_HORIZONTAL ? _("rows") : _("columns"));
308 - g_signal_connect (pager->properties_dialog, "destroy",
309 + g_signal_connect (pager->properties_dialog,
311 G_CALLBACK (properties_dialog_destroyed),
313 - g_signal_connect (pager->properties_dialog, "delete_event",
314 + g_signal_connect (pager->properties_dialog,
316 G_CALLBACK (delete_event),
318 - g_signal_connect (pager->properties_dialog, "response",
319 + g_signal_connect (pager->properties_dialog,
321 G_CALLBACK (response_cb),
324 - g_signal_connect (WID ("done_button"), "clicked",
325 - (GCallback) close_dialog, pager);
327 + g_signal_connect (WID ("done_button"),
329 + (GCallback) close_dialog,
332 gtk_spin_button_set_value (GTK_SPIN_BUTTON (pager->num_workspaces_spin),
333 wnck_screen_get_workspace_count (pager->screen));
334 - g_signal_connect (G_OBJECT (pager->num_workspaces_spin), "value_changed",
335 - (GCallback) num_workspaces_value_changed, pager);
337 - wncklet_connect_while_alive (pager->screen, "workspace_created",
338 - G_CALLBACK(workspace_created),
339 + g_signal_connect (G_OBJECT (pager->num_workspaces_spin),
341 + (GCallback) num_workspaces_value_changed,
344 + wncklet_connect_while_alive (pager->screen,
345 + "workspace_created",
346 + G_CALLBACK (workspace_created),
348 pager->properties_dialog);
350 - wncklet_connect_while_alive (pager->screen, "workspace_destroyed",
351 - G_CALLBACK(workspace_destroyed),
352 + wncklet_connect_while_alive (pager->screen,
353 + "workspace_destroyed",
354 + G_CALLBACK (workspace_destroyed),
356 pager->properties_dialog);
358 - g_signal_connect (G_OBJECT (pager->workspaces_tree), "focus_out_event",
359 - (GCallback) workspaces_tree_focused_out, pager);
360 + g_signal_connect (G_OBJECT (pager->workspaces_tree),
362 + (GCallback) workspaces_tree_focused_out,
365 - pager->workspaces_store = gtk_list_store_new (1, G_TYPE_STRING, NULL);
366 + pager->workspaces_store = gtk_list_store_new (1,
369 update_workspaces_model (pager);
370 - gtk_tree_view_set_model (GTK_TREE_VIEW (pager->workspaces_tree), GTK_TREE_MODEL (pager->workspaces_store));
371 + gtk_tree_view_set_model (GTK_TREE_VIEW (pager->workspaces_tree),
372 + GTK_TREE_MODEL (pager->workspaces_store));
374 g_object_unref (pager->workspaces_store);
376 - cell = g_object_new (GTK_TYPE_CELL_RENDERER_TEXT, "editable", TRUE, NULL);
377 + cell = g_object_new (GTK_TYPE_CELL_RENDERER_TEXT,
381 column = gtk_tree_view_column_new_with_attributes ("workspace",
387 - gtk_tree_view_append_column (GTK_TREE_VIEW (pager->workspaces_tree), column);
388 - g_signal_connect (cell, "edited",
389 - (GCallback) workspace_name_edited, pager);
391 + gtk_tree_view_append_column (GTK_TREE_VIEW (pager->workspaces_tree),
393 + g_signal_connect (cell,
395 + (GCallback) workspace_name_edited,
398 nr_ws = wnck_screen_get_workspace_count (pager->screen);
399 - for (i = 0; i < nr_ws; i++) {
400 - wncklet_connect_while_alive (
401 - G_OBJECT (wnck_screen_get_workspace (pager->screen, i)),
403 - G_CALLBACK(workspace_renamed),
405 - pager->properties_dialog);
406 + for (i = 0; i < nr_ws; i++)
408 + wncklet_connect_while_alive (G_OBJECT (wnck_screen_get_workspace (pager->screen,
411 + G_CALLBACK (workspace_renamed),
413 + pager->properties_dialog);
416 update_properties_for_wm (pager);
417 Index: gnome-panel-2.30.0/applets/wncklet/workspace-switcher.ui
418 ===================================================================
419 --- gnome-panel-2.30.0.orig/applets/wncklet/workspace-switcher.ui 2010-01-14 14:26:27.000000000 +1100
420 +++ gnome-panel-2.30.0/applets/wncklet/workspace-switcher.ui 2010-06-03 13:57:59.223947813 +1000
422 <property name="orientation">vertical</property>
423 <property name="spacing">12</property>
425 - <object class="GtkFrame" id="frame1">
426 + <object class="GtkFrame" id="switcher_frame">
427 <property name="visible">True</property>
428 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
429 <property name="label_xalign">0</property>
430 @@ -253,6 +253,114 @@
431 <property name="position">1</property>
435 + <object class="GtkFrame" id="viewports_frame">
436 + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
437 + <property name="no_show_all">True</property>
438 + <property name="label_xalign">0</property>
439 + <property name="shadow_type">none</property>
441 + <object class="GtkAlignment" id="viewports_alignment">
442 + <property name="visible">True</property>
443 + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
444 + <property name="left_padding">12</property>
446 + <object class="GtkVBox" id="viewports_vbox">
447 + <property name="visible">True</property>
448 + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
449 + <property name="spacing">6</property>
451 + <object class="GtkTable" id="viewports_table">
452 + <property name="visible">True</property>
453 + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
454 + <property name="n_rows">2</property>
455 + <property name="n_columns">2</property>
456 + <property name="column_spacing">6</property>
457 + <property name="row_spacing">6</property>
459 + <object class="GtkLabel" id="hsize_label">
460 + <property name="visible">True</property>
461 + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
462 + <property name="label" translatable="yes">Co_lumns:</property>
463 + <property name="use_underline">True</property>
464 + <property name="mnemonic_widget">hsize_spin</property>
467 + <property name="x_options"></property>
468 + <property name="y_options"></property>
472 + <object class="GtkSpinButton" id="hsize_spin">
473 + <property name="visible">True</property>
474 + <property name="can_focus">True</property>
475 + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
476 + <property name="adjustment">hsize_spin_adjustment</property>
477 + <property name="climb_rate">1</property>
480 + <property name="left_attach">1</property>
481 + <property name="right_attach">2</property>
482 + <property name="x_options"></property>
483 + <property name="y_options"></property>
487 + <object class="GtkLabel" id="vsize_label">
488 + <property name="visible">True</property>
489 + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
490 + <property name="label" translatable="yes">_Rows:</property>
491 + <property name="use_underline">True</property>
492 + <property name="mnemonic_widget">vsize_spin</property>
495 + <property name="top_attach">1</property>
496 + <property name="bottom_attach">2</property>
497 + <property name="x_options"></property>
498 + <property name="y_options"></property>
502 + <object class="GtkSpinButton" id="vsize_spin">
503 + <property name="visible">True</property>
504 + <property name="can_focus">True</property>
505 + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
506 + <property name="adjustment">vsize_spin_adjustment</property>
507 + <property name="climb_rate">1</property>
510 + <property name="left_attach">1</property>
511 + <property name="right_attach">2</property>
512 + <property name="top_attach">1</property>
513 + <property name="bottom_attach">2</property>
514 + <property name="x_options"></property>
515 + <property name="y_options"></property>
520 + <property name="expand">False</property>
521 + <property name="fill">False</property>
522 + <property name="position">0</property>
529 + <child type="label">
530 + <object class="GtkLabel" id="label_viewports">
531 + <property name="visible">True</property>
532 + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
533 + <property name="label" translatable="yes"><b>Workspaces</b></property>
534 + <property name="use_markup">True</property>
539 + <property name="position">2</property>
544 <property name="position">1</property>
546 <property name="step_increment">1</property>
547 <property name="page_increment">10</property>
549 + <object class="GtkAdjustment" id="hsize_spin_adjustment">
550 + <property name="value">1</property>
551 + <property name="lower">1</property>
552 + <property name="upper">16</property>
553 + <property name="step_increment">1</property>
554 + <property name="page_increment">10</property>
556 + <object class="GtkAdjustment" id="vsize_spin_adjustment">
557 + <property name="value">1</property>
558 + <property name="lower">1</property>
559 + <property name="upper">16</property>
560 + <property name="step_increment">1</property>
561 + <property name="page_increment">10</property>
564 Index: gnome-panel-2.30.0/gnome-panel/main.c
565 ===================================================================
566 --- gnome-panel-2.30.0.orig/gnome-panel/main.c 2010-01-28 02:34:38.000000000 +1100
567 +++ gnome-panel-2.30.0/gnome-panel/main.c 2010-06-03 13:57:59.223947813 +1000
569 GCONF_CLIENT_PRELOAD_NONE,
572 + gconf_client_add_dir (panel_gconf_get_client (),
573 + "/apps/compiz/general/screen0/options",
574 + GCONF_CLIENT_PRELOAD_NONE,
577 panel_global_config_load ();
578 panel_lockdown_init ();
579 panel_profile_load ();
581 panel_lockdown_finalize ();
583 gconf_client_remove_dir (panel_gconf_get_client (),
584 + "/apps/compiz/general/screen0/options",
587 + gconf_client_remove_dir (panel_gconf_get_client (),
588 "/desktop/gnome/interface",