Merge lp:~docky-core/plank/workspace-only into lp:plank

Proposed by Rico Tzschichholz
Status: Merged
Approved by: Robert Dyer
Approved revision: 714
Merged at revision: 718
Proposed branch: lp:~docky-core/plank/workspace-only
Merge into: lp:plank
Diff against target: 443 lines (+174/-42)
5 files modified
lib/DockItems.vala (+136/-38)
lib/DockPreferences.vala (+7/-0)
lib/DockRenderer.vala (+2/-4)
lib/Services/WindowControl.vala (+26/-0)
lib/libplank.symbols (+3/-0)
To merge this branch: bzr merge lp:~docky-core/plank/workspace-only
Reviewer Review Type Date Requested Status
Robert Dyer (community) Approve
Review via email: mp+127535@code.launchpad.net

Description of the change

Adds optional ability to show windows of current workspace only

DockItems: removed signals which aren't used in their desired way which makes them useless it this condition, and add a common changed signal instead

To post a comment you must log in.
lp:~docky-core/plank/workspace-only updated
688. By Rico Tzschichholz

build: dbusmenu is optional so enable it conditionally by default

don't force this dependency and make it more clear it is optional

689. By Rico Tzschichholz

build: Stop including pregenerated c-sources in tarballs

Shipping c-sources results in problems with custom configure flags and
conditional compile options. So drop them for good!

690. By Robert Dyer

plank.desktop was invalid - bug 1063970

691. By Rico Tzschichholz

Revert r690

692. By Robert Dyer

Reinstating rev 690 - Plank does not directly support any specific window manager or DE. IF a specific DE has a problem with our packages, they are welcome to package it themselves.

693. By Robert Dyer

fix theme files - bug 1034755

694. By Rico Tzschichholz

dockwindow: Restrict amount of hover-repositions using a Timeout

This is suppose to avoid spamming the WM with lots of window repositions
while fast hovering dockitems.

695. By Robert Dyer

stop timers when destructing objects

696. By Rico Tzschichholz

Move symbols generation in separate target and add non-fatal check rule

697. By Rico Tzschichholz

hoverwindow: wait for move/show/hide to be executed before continuing

This fixes the appearance of hovers with metacity (introduced with r653)

698. By Rico Tzschichholz

vapi: update Bamf bindings

699. By Rico Tzschichholz

window-control: output name of current window-manager and on its change

700. By Rico Tzschichholz

lib: make sure not to show the hoverwindow while a menu is visible

701. By Rico Tzschichholz

misc: remove custom bamf vapi generation

we are using a patched upstream generated vapi now

702. By Rico Tzschichholz

Use statically sized Gtk.Window and improve non-compositing support

Avoids visually corruptions on adding/removing items caused by set_size
and move operation on Gtk.Window

703. By Rico Tzschichholz

drawing: small optimization and add some convenience methods in Color

704. By Rico Tzschichholz

Fix visual clitch on initially showing the dockwindow

Make the dockwindow invisible until its content is fully drawn the first
time. (Reworked patch from Tom Beckmann)

705. By Rico Tzschichholz

Don't delay initial positioning of the dockwindow

706. By Rico Tzschichholz

Revert r704

It introduced problems with openbox and a race condition with metacity
resulting in the dock not showing at all.

707. By Rico Tzschichholz

update_regions: force triggering a redraw with active compositing support

A changed static_dock_region doesn't implicate the window-size changed
and DockWindow.set_size() won't trigger a redraw.

708. By Rico Tzschichholz

build: Rename libplank.pc to plank.pc

It is more common to have a matching name for vapi, header and pkg-config
files.

709. By Rico Tzschichholz

Fix size/position updates while switching screen-resolution

With enabled compositing support those updates weren't properly handled
after the introduction of "static-window" changes.

Refactor DockWindow.set_size to handle resize and reposition separately.

Move parts of PositionManager.reset_caches into update_dimensions and
cache all needed theme-values.

711. By Rico Tzschichholz

items: pass actual changed items with items_changed

712. By Rico Tzschichholz

reuse wnck.screen reference

Revision history for this message
Robert Dyer (psybers) wrote :

Line 318 - typo in comment 'wether'

Revision history for this message
Robert Dyer (psybers) wrote :

Has this been tested on multiple WMs? Compiz, Mutter, Pantheon, etc?

Revision history for this message
Rico Tzschichholz (ricotz) wrote :

> Has this been tested on multiple WMs? Compiz, Mutter, Pantheon, etc?

I am testing it with Gnome-Shell/Mutter with is comparable with Patheon (aka Gala/Mutter). So I am hoping you can give it a spin on compiz?

lp:~docky-core/plank/workspace-only updated
713. By Rico Tzschichholz

Fix typo in blurb

Revision history for this message
Robert Dyer (psybers) wrote :

In my experience Gala isn't equal to Mutter. Can you get Cassidy to test?

I'll test it on Compiz.

Revision history for this message
Robert Dyer (psybers) wrote :

Fails entirely on Compiz.

review: Needs Fixing
Revision history for this message
Rico Tzschichholz (ricotz) wrote :

> Fails entirely on Compiz.

Right, compiz doesn't use real workspaces but viewports.

lp:~docky-core/plank/workspace-only updated
714. By Rico Tzschichholz

add support for viewports which are used in compiz

Revision history for this message
Rico Tzschichholz (ricotz) wrote :

Please give it another try.

Revision history for this message
Robert Dyer (psybers) wrote :

Closer! At least now it does things.

I think I found a bug (probably not just with Compiz) though.

If an app is pinned, it will show on the dock regardless of which workspace its open window is on.

If an app is not pinned, it only shows on the dock if its window is on the current workspace.

review: Needs Fixing
Revision history for this message
Rico Tzschichholz (ricotz) wrote :

This is the behavior I intended since pinned means pinned ;)

Revision history for this message
Robert Dyer (psybers) wrote :

I think this is not what we want. Most people are only going to run apps that are pinned. So what use would this be - it would act the same as without.

Revision history for this message
Rico Tzschichholz (ricotz) wrote :

Depends on how you use the dock which works if you want to manage open windows.

But how would one handle this another way?
So if you filter pinned apps too what happens with not running pinned apps? Should they show up all the time and disappear if they are already running on another workspace? This could be quite confusing.

The how it works now it was handled in docky too.

Revision history for this message
Robert Dyer (psybers) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/DockItems.vala'
--- lib/DockItems.vala 2012-08-07 19:38:29 +0000
+++ lib/DockItems.vala 2012-11-16 19:21:20 +0000
@@ -31,27 +31,29 @@
31 public class DockItems : GLib.Object31 public class DockItems : GLib.Object
32 {32 {
33 /**33 /**
34 * Triggered when the items collection has changed.
35 *
36 * @param added the list of added items
37 * @param removed the list of removed items
38 */
39 public signal void items_changed (Gee.List<DockItem> added, Gee.List<DockItem> removed);
40
41 /**
34 * Triggered when the state of an item changes.42 * Triggered when the state of an item changes.
35 */43 */
36 public signal void item_state_changed ();44 public signal void item_state_changed ();
37 45
38 /**46 /**
39 * Triggered when a new item is added to the collection.
40 *
41 * @param item the dockitem which was added
42 */
43 public signal void item_added (DockItem item);
44 /**
45 * Triggered when an item is removed from the collection.
46 *
47 * @param item the dockitem which was removed
48 */
49 public signal void item_removed (DockItem item);
50
51 /**
52 * A list of the dock items.47 * A list of the dock items.
53 */48 */
54 public ArrayList<DockItem> Items = new ArrayList<DockItem> ();49 public unowned ArrayList<DockItem> Items {
50 get {
51 return visible_items;
52 }
53 }
54
55 ArrayList<DockItem> visible_items = new ArrayList<DockItem> ();
56 ArrayList<DockItem> internal_items = new ArrayList<DockItem> ();
55 57
56 FileMonitor? items_monitor = null;58 FileMonitor? items_monitor = null;
57 59
@@ -84,20 +86,36 @@
84 86
85 load_items ();87 load_items ();
86 add_running_apps ();88 add_running_apps ();
87 set_item_positions ();89 update_visible_items ();
90
91 controller.prefs.changed["CurrentWorkspaceOnly"].connect (handle_setting_changed);
88 92
89 Matcher.get_default ().app_opened.connect (app_opened);93 Matcher.get_default ().app_opened.connect (app_opened);
94
95 var wnck_screen = Wnck.Screen.get_default ();
96 wnck_screen.active_window_changed.connect (handle_window_changed);
97 wnck_screen.active_workspace_changed.connect (handle_workspace_changed);
98 wnck_screen.viewports_changed.connect (handle_viewports_changed);
90 }99 }
91 100
92 ~DockItems ()101 ~DockItems ()
93 {102 {
103 controller.prefs.changed["CurrentWorkspaceOnly"].disconnect (handle_setting_changed);
104
94 Matcher.get_default ().app_opened.disconnect (app_opened);105 Matcher.get_default ().app_opened.disconnect (app_opened);
95 106
107 var wnck_screen = Wnck.Screen.get_default ();
108 wnck_screen.active_window_changed.disconnect (handle_window_changed);
109 wnck_screen.active_workspace_changed.disconnect (handle_workspace_changed);
110 wnck_screen.viewports_changed.disconnect (handle_viewports_changed);
111
112 visible_items.clear ();
113
96 var items = new HashSet<DockItem> ();114 var items = new HashSet<DockItem> ();
97 items.add_all (Items);115 items.add_all (internal_items);
98 foreach (var item in items)116 foreach (var item in items)
99 remove_item_without_signaling (item);117 remove_item_without_signaling (item);
100 Items.clear ();118 internal_items.clear ();
101 119
102 if (items_monitor != null) {120 if (items_monitor != null) {
103 items_monitor.changed.disconnect (handle_items_dir_changed);121 items_monitor.changed.disconnect (handle_items_dir_changed);
@@ -114,9 +132,8 @@
114 public void add_item (DockItem item)132 public void add_item (DockItem item)
115 {133 {
116 add_item_without_signaling (item);134 add_item_without_signaling (item);
117 set_item_positions ();135
118136 update_visible_items ();
119 item_added (item);
120 }137 }
121 138
122 /**139 /**
@@ -127,9 +144,8 @@
127 public void remove_item (DockItem item)144 public void remove_item (DockItem item)
128 {145 {
129 remove_item_without_signaling (item);146 remove_item_without_signaling (item);
130 set_item_positions ();
131 147
132 item_removed (item);148 update_visible_items ();
133 }149 }
134 150
135 void signal_item_state_changed ()151 void signal_item_state_changed ()
@@ -139,7 +155,7 @@
139 155
140 ApplicationDockItem? item_for_application (Bamf.Application app)156 ApplicationDockItem? item_for_application (Bamf.Application app)
141 {157 {
142 foreach (var item in Items) {158 foreach (var item in internal_items) {
143 unowned ApplicationDockItem? appitem = (item as ApplicationDockItem);159 unowned ApplicationDockItem? appitem = (item as ApplicationDockItem);
144 if (appitem == null)160 if (appitem == null)
145 continue;161 continue;
@@ -164,7 +180,7 @@
164 var item = Factory.item_factory.make_item (file);180 var item = Factory.item_factory.make_item (file);
165 181
166 if (item.ValidItem)182 if (item.ValidItem)
167 add_item (item);183 add_item_without_signaling (item);
168 else184 else
169 warning ("The launcher '%s' in dock item '%s' does not exist", item.Launcher, file.get_path ());185 warning ("The launcher '%s' in dock item '%s' does not exist", item.Launcher, file.get_path ());
170 }186 }
@@ -174,7 +190,7 @@
174 190
175 var favs = new ArrayList<string> ();191 var favs = new ArrayList<string> ();
176 192
177 foreach (var item in Items)193 foreach (var item in internal_items)
178 if ((item is ApplicationDockItem) && !(item is TransientDockItem))194 if ((item is ApplicationDockItem) && !(item is TransientDockItem))
179 favs.add (item.Launcher);195 favs.add (item.Launcher);
180 196
@@ -183,6 +199,41 @@
183 debug ("done.");199 debug ("done.");
184 }200 }
185 201
202 void update_visible_items ()
203 {
204 Logger.verbose ("DockItems.update_visible_items ()");
205
206 var old_items = new ArrayList<DockItem> ();
207 old_items.add_all (visible_items);
208
209 visible_items.clear ();
210
211 if (controller.prefs.CurrentWorkspaceOnly) {
212 var active_workspace = Wnck.Screen.get_default ().get_active_workspace ();
213 foreach (var item in internal_items) {
214 var transient = (item as TransientDockItem);
215 if (transient != null
216 && !WindowControl.has_window_on_workspace (transient.App, active_workspace))
217 continue;
218 visible_items.add (item);
219 }
220 } else {
221 visible_items.add_all (internal_items);
222 }
223
224 set_item_positions ();
225
226 var added_items = new ArrayList<DockItem> ();
227 added_items.add_all (visible_items);
228 added_items.remove_all (old_items);
229
230 var removed_items = old_items;
231 removed_items.remove_all (visible_items);
232
233 if (added_items.size > 0 || removed_items.size > 0)
234 items_changed (added_items, removed_items);
235 }
236
186 void add_running_apps ()237 void add_running_apps ()
187 {238 {
188 // do this a better more efficient way239 // do this a better more efficient way
@@ -194,7 +245,7 @@
194 {245 {
195 var last_sort = 1000;246 var last_sort = 1000;
196 247
197 foreach (var item in Items)248 foreach (var item in internal_items)
198 if (item is TransientDockItem)249 if (item is TransientDockItem)
199 last_sort = item.Sort;250 last_sort = item.Sort;
200 251
@@ -217,7 +268,7 @@
217 void set_item_positions ()268 void set_item_positions ()
218 {269 {
219 int pos = 0;270 int pos = 0;
220 foreach (var i in Items)271 foreach (var i in visible_items)
221 i.Position = pos++;272 i.Position = pos++;
222 }273 }
223 274
@@ -242,7 +293,7 @@
242 293
243 // remove peristent and invalid items294 // remove peristent and invalid items
244 var remove = new ArrayList<DockItem> ();295 var remove = new ArrayList<DockItem> ();
245 foreach (var item in Items)296 foreach (var item in internal_items)
246 if (!(item is TransientDockItem) || !item.ValidItem)297 if (!(item is TransientDockItem) || !item.ValidItem)
247 remove.add (item);298 remove.add (item);
248 foreach (var item in remove)299 foreach (var item in remove)
@@ -250,15 +301,48 @@
250 301
251 load_items ();302 load_items ();
252 add_running_apps ();303 add_running_apps ();
253 set_item_positions ();304 update_visible_items ();
254 305 }
255 item_state_changed ();306
307 void handle_setting_changed ()
308 {
309 update_visible_items ();
310 }
311
312 void handle_window_changed (Wnck.Window? previous)
313 {
314 if (!controller.prefs.CurrentWorkspaceOnly)
315 return;
316
317 if (previous == null
318 || previous.get_workspace () == previous.get_screen ().get_active_workspace ())
319 return;
320
321 update_visible_items ();
322 }
323
324 void handle_workspace_changed (Wnck.Screen screen, Wnck.Workspace previously_active_space)
325 {
326 if (!controller.prefs.CurrentWorkspaceOnly
327 || screen.get_active_workspace ().is_virtual ())
328 return;
329
330 update_visible_items ();
331 }
332
333 void handle_viewports_changed (Wnck.Screen screen)
334 {
335 if (!controller.prefs.CurrentWorkspaceOnly
336 || !screen.get_active_workspace ().is_virtual ())
337 return;
338
339 update_visible_items ();
256 }340 }
257 341
258 void add_item_without_signaling (DockItem item)342 void add_item_without_signaling (DockItem item)
259 {343 {
260 Items.add (item);344 internal_items.add (item);
261 Items.sort ((CompareFunc) compare_items);345 internal_items.sort ((CompareFunc) compare_items);
262 346
263 item.AddTime = new DateTime.now_utc ();347 item.AddTime = new DateTime.now_utc ();
264 item.notify["Icon"].connect (signal_item_state_changed);348 item.notify["Icon"].connect (signal_item_state_changed);
@@ -289,7 +373,7 @@
289 (item as ApplicationDockItem).pin_launcher.disconnect (pin_item);373 (item as ApplicationDockItem).pin_launcher.disconnect (pin_item);
290 }374 }
291 375
292 Items.remove (item);376 internal_items.remove (item);
293 controller.unity.remove_entry (item);377 controller.unity.remove_entry (item);
294 }378 }
295 379
@@ -304,12 +388,19 @@
304 return;388 return;
305 }389 }
306 390
391 var index = internal_items.index_of (item);
392
307 remove_item_without_signaling (item);393 remove_item_without_signaling (item);
308
309 var new_item = new TransientDockItem.with_application (app);394 var new_item = new TransientDockItem.with_application (app);
310 new_item.Position = item.Position;395 new_item.Position = item.Position;
311
312 add_item_without_signaling (new_item);396 add_item_without_signaling (new_item);
397
398 if (index >= 0) {
399 internal_items.remove (new_item);
400 internal_items.insert (index, new_item);
401 }
402
403 update_visible_items ();
313 item_state_changed ();404 item_state_changed ();
314 }405 }
315 406
@@ -318,7 +409,7 @@
318 if (item is TransientDockItem) {409 if (item is TransientDockItem) {
319 var last_sort = 0;410 var last_sort = 0;
320 411
321 foreach (var i in Items) {412 foreach (var i in internal_items) {
322 if (i == item)413 if (i == item)
323 break;414 break;
324 if (!(i is TransientDockItem))415 if (!(i is TransientDockItem))
@@ -329,12 +420,19 @@
329 if (dockitem_file == null)420 if (dockitem_file == null)
330 return;421 return;
331 422
423 var index = visible_items.index_of (item);
424
332 remove_item_without_signaling (item);425 remove_item_without_signaling (item);
333 var new_item = new ApplicationDockItem.with_dockitem_file (dockitem_file);426 var new_item = new ApplicationDockItem.with_dockitem_file (dockitem_file);
334 new_item.Position = item.Position;427 new_item.Position = item.Position;
335 add_item_without_signaling (new_item);428 add_item_without_signaling (new_item);
336 429
337 item_state_changed ();430 if (index >= 0) {
431 visible_items.insert (index, new_item);
432 item_state_changed ();
433 } else {
434 update_visible_items ();
435 }
338 } else {436 } else {
339 item.delete ();437 item.delete ();
340 }438 }
341439
=== modified file 'lib/DockPreferences.vala'
--- lib/DockPreferences.vala 2012-09-26 00:34:22 +0000
+++ lib/DockPreferences.vala 2012-11-16 19:21:20 +0000
@@ -31,6 +31,9 @@
31 const int MIN_ICON_SIZE = 24;31 const int MIN_ICON_SIZE = 24;
32 const int MAX_ICON_SIZE = 128;32 const int MAX_ICON_SIZE = 128;
33 33
34 [Description(nick = "current-workspace-only", blurb = "Whether to show only windows of the current workspace.")]
35 public bool CurrentWorkspaceOnly { get; set; }
36
34 [Description(nick = "icon-size", blurb = "The size of dock icons (in pixels).")]37 [Description(nick = "icon-size", blurb = "The size of dock icons (in pixels).")]
35 public int IconSize { get; set; }38 public int IconSize { get; set; }
36 39
@@ -79,6 +82,7 @@
79 {82 {
80 Logger.verbose ("DockPreferences.reset_properties ()");83 Logger.verbose ("DockPreferences.reset_properties ()");
81 84
85 CurrentWorkspaceOnly = false;
82 IconSize = 48;86 IconSize = 48;
83 HideMode = HideType.INTELLIGENT;87 HideMode = HideType.INTELLIGENT;
84 UnhideDelay = 0;88 UnhideDelay = 0;
@@ -138,6 +142,9 @@
138 protected override void verify (string prop)142 protected override void verify (string prop)
139 {143 {
140 switch (prop) {144 switch (prop) {
145 case "CurrentWorkspaceOnly":
146 break;
147
141 case "IconSize":148 case "IconSize":
142 if (IconSize < MIN_ICON_SIZE)149 if (IconSize < MIN_ICON_SIZE)
143 IconSize = MIN_ICON_SIZE;150 IconSize = MIN_ICON_SIZE;
144151
=== modified file 'lib/DockRenderer.vala'
--- lib/DockRenderer.vala 2012-10-04 11:54:18 +0000
+++ lib/DockRenderer.vala 2012-11-16 19:21:20 +0000
@@ -86,9 +86,8 @@
86 controller.prefs.notify.connect (prefs_changed);86 controller.prefs.notify.connect (prefs_changed);
87 theme.changed.connect (theme_changed);87 theme.changed.connect (theme_changed);
88 88
89 controller.items.item_removed.connect (items_changed);
90 controller.items.item_added.connect (items_changed);
91 controller.items.item_state_changed.connect (item_state_changed);89 controller.items.item_state_changed.connect (item_state_changed);
90 controller.items.items_changed.connect (items_changed);
92 91
93 screen_is_composited = Gdk.Screen.get_default ().is_composited ();92 screen_is_composited = Gdk.Screen.get_default ().is_composited ();
94 Gdk.Screen.get_default ().composited_changed.connect (composited_changed);93 Gdk.Screen.get_default ().composited_changed.connect (composited_changed);
@@ -113,9 +112,8 @@
113 controller.prefs.notify.disconnect (prefs_changed);112 controller.prefs.notify.disconnect (prefs_changed);
114 theme.changed.disconnect (theme_changed);113 theme.changed.disconnect (theme_changed);
115 114
116 controller.items.item_removed.disconnect (items_changed);
117 controller.items.item_added.disconnect (items_changed);
118 controller.items.item_state_changed.disconnect (item_state_changed);115 controller.items.item_state_changed.disconnect (item_state_changed);
116 controller.items.items_changed.disconnect (items_changed);
119 117
120 Gdk.Screen.get_default ().composited_changed.disconnect (composited_changed);118 Gdk.Screen.get_default ().composited_changed.disconnect (composited_changed);
121119
122120
=== modified file 'lib/Services/WindowControl.vala'
--- lib/Services/WindowControl.vala 2012-10-22 06:21:06 +0000
+++ lib/Services/WindowControl.vala 2012-11-16 19:21:20 +0000
@@ -134,6 +134,32 @@
134 return false;134 return false;
135 }135 }
136 136
137 public static bool has_window_on_workspace (Bamf.Application app, Wnck.Workspace workspace)
138 {
139 Screen.get_default ();
140 Array<uint32>? xids = app.get_xids ();
141
142 warn_if_fail (xids != null);
143
144 var is_virtual = workspace.is_virtual ();
145
146 for (var i = 0; xids != null && i < xids.length; i++) {
147 var window = Wnck.Window.@get (xids.index (i));
148 if (window == null)
149 continue;
150
151 if (!is_virtual) {
152 if (window.is_on_workspace (workspace))
153 return true;
154 } else {
155 if (window.is_in_viewport (workspace))
156 return true;
157 }
158 }
159
160 return false;
161 }
162
137 public static ArrayList<Bamf.Window> get_windows (Bamf.Application app)163 public static ArrayList<Bamf.Window> get_windows (Bamf.Application app)
138 {164 {
139 var windows = new ArrayList<Bamf.Window> ();165 var windows = new ArrayList<Bamf.Window> ();
140166
=== modified file 'lib/libplank.symbols'
--- lib/libplank.symbols 2012-11-15 11:26:39 +0000
+++ lib/libplank.symbols 2012-11-16 19:21:20 +0000
@@ -3,12 +3,14 @@
3plank_dock_controller_new3plank_dock_controller_new
4plank_dock_items_add_item4plank_dock_items_add_item
5plank_dock_items_construct5plank_dock_items_construct
6plank_dock_items_get_Items
6plank_dock_items_get_type7plank_dock_items_get_type
7plank_dock_items_new8plank_dock_items_new
8plank_dock_items_remove_item9plank_dock_items_remove_item
9plank_dock_preferences_construct10plank_dock_preferences_construct
10plank_dock_preferences_construct_with_filename11plank_dock_preferences_construct_with_filename
11plank_dock_preferences_decrease_icon_size12plank_dock_preferences_decrease_icon_size
13plank_dock_preferences_get_CurrentWorkspaceOnly
12plank_dock_preferences_get_HideMode14plank_dock_preferences_get_HideMode
13plank_dock_preferences_get_IconSize15plank_dock_preferences_get_IconSize
14plank_dock_preferences_get_monitor16plank_dock_preferences_get_monitor
@@ -21,6 +23,7 @@
21plank_dock_preferences_is_horizontal_dock23plank_dock_preferences_is_horizontal_dock
22plank_dock_preferences_new24plank_dock_preferences_new
23plank_dock_preferences_new_with_filename25plank_dock_preferences_new_with_filename
26plank_dock_preferences_set_CurrentWorkspaceOnly
24plank_dock_preferences_set_HideMode27plank_dock_preferences_set_HideMode
25plank_dock_preferences_set_IconSize28plank_dock_preferences_set_IconSize
26plank_dock_preferences_set_Monitor29plank_dock_preferences_set_Monitor

Subscribers

People subscribed via source and target branches

to status/vote changes: