Merge lp:~3v1n0/unity-control-center/applications-scaling-selector into lp:unity-control-center

Proposed by Marco Trevisan (Treviño)
Status: Merged
Approved by: Sebastien Bacher
Approved revision: 12783
Merged at revision: 12767
Proposed branch: lp:~3v1n0/unity-control-center/applications-scaling-selector
Merge into: lp:unity-control-center
Diff against target: 934 lines (+456/-211)
2 files modified
panels/display/cc-display-panel.c (+166/-15)
panels/display/display-capplet.ui (+290/-196)
To merge this branch: bzr merge lp:~3v1n0/unity-control-center/applications-scaling-selector
Reviewer Review Type Date Requested Status
Sebastien Bacher Approve
PS Jenkins bot (community) continuous-integration Approve
Matthew Paul Thomas (community) design Approve
Eleni Maria Stea (community) Approve
Review via email: mp+212114@code.launchpad.net

Commit message

Display: Use 2-columns style (Monitor/General options), add more UI scaling options

Description of the change

Add a combo box to define which monitor should be used to scale applications, or if using the min/max values available. Also redesign the display panel to use a 2-columns style.

Settings are defined in lp:~3v1n0/unity/scale-factor-binding/+merge/212076

New look: http://people.ubuntu.com/~3v1n0/shots/ucc-display-scaling-rework.png

To post a comment you must log in.
12768. By Marco Trevisan (Treviño)

Display: remove unneeded variable

12769. By Marco Trevisan (Treviño)

Display: fix padding

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Eleni Maria Stea (hikiko) wrote :

It works fine for me :) Approved!

review: Approve
Revision history for this message
Eleni Maria Stea (hikiko) wrote :

+I like the pixbuf you used :D

12770. By Marco Trevisan (Treviño)

Display: move monitor name inside table

12771. By Marco Trevisan (Treviño)

Display: redesign the UI content to match new guidelines

12772. By Marco Trevisan (Treviño)

Display: properly align combo and toggle boxes

12773. By Marco Trevisan (Treviño)

Display: don't expand and fill by default, and put the view on center

12774. By Marco Trevisan (Treviño)

Display: use an GtkAlignment to control the UI scale slider size

12775. By Marco Trevisan (Treviño)

Display: remove useless left padding

12776. By Marco Trevisan (Treviño)

Display: no need to use bold markup text, we do that alredy in UI file

12777. By Marco Trevisan (Treviño)

Display: improve wording for the display content scale selector

12778. By Marco Trevisan (Treviño)

Display: set the ui scale monitor selector insensitive when mirroring the displays

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
12779. By Marco Trevisan (Treviño)

Display: show scale values on the bottom

12780. By Marco Trevisan (Treviño)

Display: align the scale elements to the left

12781. By Marco Trevisan (Treviño)

Display: change wording of combo box items, again...

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
12782. By Marco Trevisan (Treviño)

Display: new scaling wording, again... Thanks to mpt :)

12783. By Marco Trevisan (Treviño)

Display: make the monitor scale not to resize its height

Revision history for this message
Matthew Paul Thomas (mpt) wrote :

Design approved from screenshots. Thanks Marco.

review: Approve (design)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Sebastien Bacher (seb128) wrote :

Thanks, that looks mostly fine to me, some issues we might need to address later:

- the dialog resize horitontally when selecting monitors (happening at least in french local, seems like the horizontal space is used so when the monitor name changing leads to resizes)

- it's a bit weird to have settings that apply directly and some that need to be validated, but that's not new

- using the scale slider might put you in a situation where you can't get back to the control to undo your changes (if you are not a tech user who knows how to alt-click-dnd move windows), ideally the scaling should be undone if closing the dialog without confirmation or something

None of those are blockers for landing that mp, but things we might need to fix before release

review: Approve
Revision history for this message
Iain Lane (laney) wrote :

I think the instant apply question is something that should be resolved for Trusty. The other things are less important bugs that impact the UX in a more minor way, but it'd be good to fix them.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'panels/display/cc-display-panel.c'
2--- panels/display/cc-display-panel.c 2014-02-26 15:58:33 +0000
3+++ panels/display/cc-display-panel.c 2014-03-25 15:36:35 +0000
4@@ -60,6 +60,9 @@
5 #define UNITY_GSETTINGS_PATH "/org/compiz/profiles/unity/plugins/unityshell/"
6 #define UNITY_LAUNCHER_ALL_MONITORS_KEY "num-launchers"
7 #define UNITY_STICKY_EDGE_KEY "launcher-capture-mouse"
8+#define UNITY_UI_GSETTINGS_SCHEMA "com.canonical.Unity.Interface"
9+#define UNITY_UI_SCALE_FACTOR_MONITOR "app-scale-factor-monitor"
10+#define UNITY_UI_SCALE_FALLBACK_TO_MAX "app-fallback-to-maximum-scale-factor"
11 #define UNITY2D_GSETTINGS_MAIN "com.canonical.Unity2d"
12 #define UNITY2D_GSETTINGS_LAUNCHER "com.canonical.Unity2d.Launcher"
13
14@@ -87,6 +90,7 @@
15
16 GSettings *clock_settings;
17 GSettings *unity_settings;
18+ GSettings *unity_ui_settings;
19 GSettings *unity2d_settings_main;
20 GSettings *unity2d_settings_launcher;
21 GSettings *desktop_settings;
22@@ -140,6 +144,7 @@
23 GObjectConstructParam *properties);
24 static void on_screen_changed (GnomeRRScreen *scr, gpointer data);
25 static void refresh_unity_launcher_placement (CcDisplayPanel *self);
26+static void refresh_unity_monitor_scale (CcDisplayPanel *self);
27 static gboolean unity_launcher_on_all_monitors (GSettings *settings);
28
29 static void
30@@ -196,6 +201,8 @@
31 g_object_unref (self->priv->unity2d_settings_launcher);
32 if (self->priv->unity_settings != NULL)
33 g_object_unref (self->priv->unity_settings);
34+ if (self->priv->unity_ui_settings != NULL)
35+ g_object_unref (self->priv->unity_ui_settings);
36 if (self->priv->desktop_settings != NULL)
37 g_object_unref (self->priv->desktop_settings);
38
39@@ -312,7 +319,10 @@
40 select_current_output_from_dialog_position (self);
41
42 if (is_unity_session ())
43- refresh_unity_launcher_placement (self);
44+ {
45+ refresh_unity_launcher_placement (self);
46+ refresh_unity_monitor_scale (self);
47+ }
48 }
49
50 static void
51@@ -709,6 +719,7 @@
52 /* set inactive the launcher placement choice */
53 gtk_widget_set_sensitive (WID ("launcher_placement_combo"), !mirror_is_active);
54 gtk_widget_set_sensitive (WID ("stickyedge_switch"), !mirror_is_active);
55+ gtk_widget_set_sensitive (WID ("ui_scale_monitor_combo"), !mirror_is_active);
56
57 g_signal_handlers_unblock_by_func (self->priv->clone_checkbox, G_CALLBACK (on_clone_changed), self);
58 }
59@@ -729,31 +740,33 @@
60 static void
61 rebuild_current_monitor_label (CcDisplayPanel *self)
62 {
63- char *str, *tmp;
64+ gchar *str;
65 GdkRGBA color;
66 gboolean use_color;
67
68 if (self->priv->current_output)
69 {
70 if (gnome_rr_config_get_clone (self->priv->current_configuration))
71- tmp = mirror_monitor_name ();
72+ {
73+ gchar *str = mirror_monitor_name ();
74+ gtk_label_set_text (GTK_LABEL (self->priv->current_monitor_label), str);
75+ g_free (str);
76+ }
77 else
78- tmp = g_strdup (gnome_rr_output_info_get_display_name (self->priv->current_output));
79+ {
80+ str = gnome_rr_output_info_get_display_name (self->priv->current_output);
81+ gtk_label_set_text (GTK_LABEL (self->priv->current_monitor_label), str);
82+ }
83
84- str = g_strdup_printf ("<b>%s</b>", tmp);
85 cc_rr_labeler_get_rgba_for_output (self->priv->labeler, self->priv->current_output, &color);
86 use_color = TRUE;
87- g_free (tmp);
88 }
89 else
90 {
91- str = g_strdup_printf ("<b>%s</b>", _("Monitor"));
92+ gtk_label_set_text (GTK_LABEL (self->priv->current_monitor_label), _("Monitor"));
93 use_color = FALSE;
94 }
95
96- gtk_label_set_markup (GTK_LABEL (self->priv->current_monitor_label), str);
97- g_free (str);
98-
99 if (use_color)
100 {
101 GdkRGBA black = { 0, 0, 0, 1.0 };
102@@ -953,6 +966,7 @@
103 rebuild_rotation_combo (self);
104 rebuild_ui_scale (self);
105 refresh_unity_launcher_placement (self);
106+ refresh_unity_monitor_scale (self);
107
108 self->priv->ignore_gui_changes = FALSE;
109 }
110@@ -2856,6 +2870,65 @@
111 gtk_combo_box_set_active (GTK_COMBO_BOX (launcher_placement_combo), index_of_primary_screen);
112 }
113
114+static void
115+refresh_unity_monitor_scale (CcDisplayPanel *self)
116+{
117+ GtkWidget *ui_scale_monitor_combo = WID ("ui_scale_monitor_combo");
118+ GtkListStore *liststore;
119+ GtkTreeIter iter;
120+ GList *connected_outputs = NULL;
121+ GList *list;
122+ gchar *target_monitor = g_settings_get_string (self->priv->unity_ui_settings, UNITY_UI_SCALE_FACTOR_MONITOR);
123+ gint target_monitor_idx = -1;
124+ gint i;
125+
126+ liststore = (GtkListStore *) gtk_builder_get_object (self->priv->builder, "available_ui_scale_monitor_store");
127+ gtk_list_store_clear (liststore);
128+
129+ connected_outputs = list_connected_outputs (self, NULL, NULL);
130+ for (list = connected_outputs, i = 0; list != NULL; list = list->next)
131+ {
132+ gchar *monitor_name;
133+ GdkPixbuf *monitor_pixbuf;
134+ GnomeRROutputInfo *output = list->data;
135+
136+ if (!gnome_rr_output_info_is_active (output))
137+ continue;
138+
139+ gtk_list_store_append (liststore, &iter);
140+ monitor_name = g_strdup (gnome_rr_output_info_get_display_name (output));
141+ monitor_pixbuf = get_monitor_pixbuf (self, output);
142+
143+ gtk_list_store_set (liststore, &iter, 0, monitor_pixbuf, 1, monitor_name, -1);
144+
145+ /* select it if primary and only one launcher */
146+ if (g_strcmp0 (gnome_rr_output_info_get_name (output), target_monitor) == 0)
147+ target_monitor_idx = i;
148+ i++;
149+
150+ g_object_unref (monitor_pixbuf);
151+ g_free (monitor_name);
152+ }
153+
154+ gtk_list_store_append (liststore, &iter);
155+ gtk_list_store_set (liststore, &iter, 0, NULL, 1, _("Display with largest controls"), -1);
156+ gint max_idx = i++;
157+
158+ gtk_list_store_append (liststore, &iter);
159+ gtk_list_store_set (liststore, &iter, 0, NULL, 1, _("Display with smallest controls"), -1);
160+ gint min_idx = i++;
161+
162+ if (target_monitor_idx < 0)
163+ {
164+ gboolean fallback_max_scale = g_settings_get_boolean (self->priv->unity_ui_settings, UNITY_UI_SCALE_FALLBACK_TO_MAX);
165+ target_monitor_idx = fallback_max_scale ? max_idx : min_idx;
166+ }
167+
168+ gtk_combo_box_set_active (GTK_COMBO_BOX (ui_scale_monitor_combo), target_monitor_idx);
169+
170+ g_free (target_monitor);
171+}
172+
173 static gboolean
174 switcher_set_to_launcher_on_all_monitors (CcDisplayPanel *self)
175 {
176@@ -2924,6 +2997,64 @@
177 }
178
179 static void
180+on_ui_scale_monitor_combo_setting_changed (GSettings* settings,
181+ guint key,
182+ CcDisplayPanel *self)
183+{
184+ refresh_unity_monitor_scale (self);
185+}
186+
187+static void
188+on_ui_scale_monitor_combo_changed (GtkComboBox *combo, CcDisplayPanel *self)
189+{
190+ gint active = gtk_combo_box_get_active (combo);
191+ gint i;
192+ gint index_on_combo = 0;
193+ gchar *scale_monitor = NULL;
194+
195+ if (active < 0)
196+ return;
197+
198+ GnomeRROutputInfo **outputs = gnome_rr_config_get_outputs (self->priv->current_configuration);
199+
200+ for (i = 0; outputs[i] != NULL; ++i)
201+ {
202+ GnomeRROutputInfo *output = outputs[i];
203+ if (!gnome_rr_output_info_is_active (output))
204+ continue;
205+
206+ if (active == index_on_combo)
207+ {
208+ scale_monitor = g_strdup (gnome_rr_output_info_get_name (output));
209+ break;
210+ }
211+ index_on_combo++;
212+ }
213+
214+ if (!scale_monitor)
215+ {
216+ scale_monitor = g_strdup("");
217+
218+ if (active >= index_on_combo)
219+ {
220+ gboolean use_max_scaled_monitor = (active == index_on_combo);
221+ gboolean fallback_setting = g_settings_get_boolean (self->priv->unity_ui_settings, UNITY_UI_SCALE_FALLBACK_TO_MAX);
222+
223+ if (fallback_setting != use_max_scaled_monitor)
224+ g_settings_set_boolean (self->priv->unity_ui_settings, UNITY_UI_SCALE_FALLBACK_TO_MAX, use_max_scaled_monitor);
225+ }
226+ }
227+
228+ gchar *current_setting = g_settings_get_string (self->priv->unity_ui_settings, UNITY_UI_SCALE_FACTOR_MONITOR);
229+
230+ if (g_strcmp0 (current_setting, scale_monitor) != 0)
231+ g_settings_set_string (self->priv->unity_ui_settings, UNITY_UI_SCALE_FACTOR_MONITOR, scale_monitor);
232+
233+ g_free (current_setting);
234+ g_free (scale_monitor);
235+}
236+
237+static void
238 setup_unity_settings (CcDisplayPanel *self)
239 {
240 GSettingsSchema *schema;
241@@ -2943,7 +3074,14 @@
242 g_settings_schema_unref (schema);
243 }
244
245- if (!self->priv->unity_settings)
246+ schema = g_settings_schema_source_lookup (g_settings_schema_source_get_default (), UNITY_UI_GSETTINGS_SCHEMA, TRUE);
247+ if (schema)
248+ {
249+ self->priv->unity_ui_settings = g_settings_new (UNITY_UI_GSETTINGS_SCHEMA);
250+ g_settings_schema_unref (schema);
251+ }
252+
253+ if (!self->priv->unity_settings || !self->priv->unity_ui_settings)
254 return;
255
256 GtkWidget *sticky_edge_switch = WID ("stickyedge_switch");
257@@ -2954,9 +3092,16 @@
258 stickyedge_widget_refresh (GTK_SWITCH (sticky_edge_switch), self->priv->unity_settings);
259
260 g_signal_connect (G_OBJECT (WID ("launcher_placement_combo")), "changed",
261- G_CALLBACK (on_launcher_placement_combo_changed), self);
262+ G_CALLBACK (on_launcher_placement_combo_changed), self);
263 g_signal_connect (self->priv->unity_settings, "changed::" UNITY_LAUNCHER_ALL_MONITORS_KEY,
264 G_CALLBACK (ext_launcher_placement_changed_callback), self);
265+
266+ g_signal_connect (G_OBJECT (WID ("ui_scale_monitor_combo")), "changed",
267+ G_CALLBACK (on_ui_scale_monitor_combo_changed), self);
268+ g_signal_connect (self->priv->unity_ui_settings, "changed::" UNITY_UI_SCALE_FACTOR_MONITOR,
269+ G_CALLBACK (on_ui_scale_monitor_combo_setting_changed), self);
270+ g_signal_connect (self->priv->unity_ui_settings, "changed::" UNITY_UI_SCALE_FALLBACK_TO_MAX,
271+ G_CALLBACK (on_ui_scale_monitor_combo_setting_changed), self);
272 }
273
274 static void
275@@ -2976,7 +3121,8 @@
276 CcDisplayPanel *self;
277 CcShell *shell;
278 GtkWidget *toplevel;
279- gchar *objects[] = {"display-panel", "available_launcher_placement_store", NULL};
280+ gchar *objects[] = {"display-panel", "available_launcher_placement_store",
281+ "available_ui_scale_monitor_store", NULL};
282
283 obj = G_OBJECT_CLASS (cc_display_panel_parent_class)->constructor (gtype, n_properties, properties);
284 self = CC_DISPLAY_PANEL (obj);
285@@ -3069,8 +3215,6 @@
286
287 gtk_container_add (GTK_CONTAINER (align), self->priv->area);
288
289- on_screen_changed (self->priv->screen, self);
290-
291 g_signal_connect_swapped (WID ("apply_button"),
292 "clicked", G_CALLBACK (apply), self);
293
294@@ -3084,11 +3228,18 @@
295 gtk_widget_hide (WID ("sticky_edge_label"));
296 gtk_widget_hide (WID ("launcher_placement_combo"));
297 gtk_widget_hide (WID ("stickyedge_switch"));
298+ gtk_widget_hide (WID ("ui_scale_separator"));
299+ gtk_widget_hide (WID ("ui_scale_label"));
300+ gtk_widget_hide (WID ("ui_scale"));
301+ gtk_widget_hide (WID ("ui_scale_monitor_label"));
302+ gtk_widget_hide (WID ("ui_scale_monitor_combo"));
303 }
304
305 gtk_widget_show (self->priv->panel);
306 gtk_container_add (GTK_CONTAINER (self), self->priv->panel);
307
308+ on_screen_changed (self->priv->screen, self);
309+
310 return obj;
311 }
312
313
314=== modified file 'panels/display/display-capplet.ui'
315--- panels/display/display-capplet.ui 2014-03-12 17:29:59 +0000
316+++ panels/display/display-capplet.ui 2014-03-25 15:36:35 +0000
317@@ -9,6 +9,14 @@
318 <column type="gchararray"/>
319 </columns>
320 </object>
321+ <object class="GtkListStore" id="available_ui_scale_monitor_store">
322+ <columns>
323+ <!-- column-name MONITOR_PREVIEW -->
324+ <column type="GdkPixbuf"/>
325+ <!-- column-name LAUNCHER_PLACEMENT_NAME -->
326+ <column type="gchararray"/>
327+ </columns>
328+ </object>
329 <!-- interface-naming-policy toplevel-contextual -->
330 <object class="GtkWindow" id="window1">
331 <property name="can_focus">False</property>
332@@ -42,66 +50,74 @@
333 <property name="visible">True</property>
334 <property name="can_focus">False</property>
335 <property name="spacing">12</property>
336+ <property name="halign">center</property>
337 <child>
338- <object class="GtkHBox" id="hbox3">
339+ <object class="GtkHBox" id="mirror_hbox">
340 <property name="visible">True</property>
341 <property name="can_focus">False</property>
342- <property name="spacing">12</property>
343+ <property name="halign">center</property>
344 <child>
345- <object class="GtkEventBox" id="current_monitor_event_box">
346+ <object class="GtkCheckButton" id="clone_checkbox">
347 <property name="visible">True</property>
348- <property name="can_focus">False</property>
349+ <property name="xalign">0.5</property>
350+ <property name="draw_indicator">True</property>
351 <child>
352- <object class="GtkLabel" id="current_monitor_label">
353+ <object class="GtkHBox" id="clone_checkbox_label_hbox">
354 <property name="visible">True</property>
355 <property name="can_focus">False</property>
356- <property name="xalign">0</property>
357- <property name="xpad">10</property>
358- <property name="ypad">5</property>
359- <property name="label" translatable="yes">Monitor</property>
360- <attributes>
361- <attribute name="weight" value="bold"/>
362- </attributes>
363- </object>
364- </child>
365- </object>
366- <packing>
367- <property name="expand">False</property>
368- <property name="fill">False</property>
369- <property name="position">0</property>
370- </packing>
371- </child>
372- <child>
373- <object class="GtkHBox" id="hbox2">
374- <property name="visible">True</property>
375- <property name="can_focus">False</property>
376- <property name="spacing">12</property>
377- <child>
378- <object class="GtkSwitch" id="monitor_switch">
379- <property name="visible">True</property>
380- <property name="can_focus">True</property>
381- <property name="active">True</property>
382- </object>
383- <packing>
384- <property name="expand">False</property>
385- <property name="fill">False</property>
386- <property name="position">0</property>
387- </packing>
388- </child>
389- </object>
390- <packing>
391- <property name="expand">False</property>
392- <property name="fill">False</property>
393- <property name="pack_type">end</property>
394- <property name="position">1</property>
395+ <property name="halign">center</property>
396+ <child>
397+ <object class="GtkLabel" id="clone_checkbox_label">
398+ <property name="visible">True</property>
399+ <property name="can_focus">True</property>
400+ <property name="receives_default">False</property>
401+ <property name="use_underline">True</property>
402+ <property name="label" translatable="yes" comments="Note that mirror is a verb in this string">_Mirror displays</property>
403+ </object>
404+ </child>
405+ <child>
406+ <!-- This is a workaround to not re-translate the warning, to be fixed later. -->
407+ <object class="GtkLabel" id="clone_res_warning_parentesis_open">
408+ <property name="margin_left">2</property>
409+ <property name="visible">True</property>
410+ <property name="can_focus">False</property>
411+ <property name="label" translatable="no">(</property>
412+ <attributes>
413+ <attribute name="style" value="italic"/>
414+ </attributes>
415+ </object>
416+ </child>
417+ <child>
418+ <object class="GtkLabel" id="clone_resolution_warning_label">
419+ <property name="visible">True</property>
420+ <property name="can_focus">False</property>
421+ <property name="xalign">0</property>
422+ <property name="label" translatable="yes">Note: may limit resolution options</property>
423+ <attributes>
424+ <attribute name="style" value="italic"/>
425+ </attributes>
426+ </object>
427+ </child>
428+ <child>
429+ <!-- This is a workaround to not re-translate the warning, to be fixed later. -->
430+ <object class="GtkLabel" id="clone_res_warning_parentesis_open_close">
431+ <property name="visible">True</property>
432+ <property name="can_focus">False</property>
433+ <property name="label" translatable="no">)</property>
434+ <attributes>
435+ <attribute name="style" value="italic"/>
436+ </attributes>
437+ </object>
438+ </child>
439+ </object>
440+ </child>
441+ </object>
442+ <packing>
443+ <property name="expand">False</property>
444+ <property name="fill">False</property>
445 </packing>
446 </child>
447 </object>
448- <packing>
449- <property name="expand">False</property>
450- <property name="fill">False</property>
451- <property name="position">0</property>
452- </packing>
453 </child>
454 <child>
455 <object class="GtkAlignment" id="alignment1">
456@@ -109,16 +125,74 @@
457 <property name="can_focus">False</property>
458 <property name="xalign">0</property>
459 <property name="yalign">0</property>
460- <property name="left_padding">12</property>
461 <child>
462 <object class="GtkTable" id="table1">
463 <property name="visible">True</property>
464 <property name="can_focus">False</property>
465- <property name="n_rows">6</property>
466- <property name="n_columns">2</property>
467 <property name="column_spacing">12</property>
468 <property name="row_spacing">6</property>
469 <child>
470+ <object class="GtkHBox" id="hbox3">
471+ <property name="visible">True</property>
472+ <property name="can_focus">False</property>
473+ <property name="spacing">12</property>
474+ <child>
475+ <object class="GtkEventBox" id="current_monitor_event_box">
476+ <property name="visible">True</property>
477+ <property name="can_focus">False</property>
478+ <child>
479+ <object class="GtkLabel" id="current_monitor_label">
480+ <property name="visible">True</property>
481+ <property name="can_focus">False</property>
482+ <property name="xalign">0</property>
483+ <property name="ypad">5</property>
484+ <property name="label" translatable="yes">Monitor</property>
485+ <attributes>
486+ <attribute name="weight" value="bold"/>
487+ </attributes>
488+ </object>
489+ </child>
490+ </object>
491+ <packing>
492+ <property name="expand">False</property>
493+ <property name="fill">False</property>
494+ <property name="position">0</property>
495+ </packing>
496+ </child>
497+ <child>
498+ <object class="GtkHBox" id="hbox2">
499+ <property name="visible">True</property>
500+ <property name="can_focus">False</property>
501+ <property name="spacing">12</property>
502+ <property name="valign">center</property>
503+ <child>
504+ <object class="GtkSwitch" id="monitor_switch">
505+ <property name="visible">True</property>
506+ <property name="can_focus">True</property>
507+ <property name="active">True</property>
508+ </object>
509+ <packing>
510+ <property name="expand">False</property>
511+ <property name="fill">False</property>
512+ <property name="position">0</property>
513+ </packing>
514+ </child>
515+ </object>
516+ <packing>
517+ <property name="expand">False</property>
518+ <property name="fill">False</property>
519+ <property name="pack_type">start</property>
520+ <property name="position">1</property>
521+ </packing>
522+ </child>
523+ </object>
524+ <packing>
525+ <property name="right_attach">2</property>
526+ <property name="x_options">GTK_FILL</property>
527+ <property name="y_options"/>
528+ </packing>
529+ </child>
530+ <child>
531 <object class="GtkLabel" id="label2">
532 <property name="visible">True</property>
533 <property name="can_focus">False</property>
534@@ -131,6 +205,8 @@
535 </style>
536 </object>
537 <packing>
538+ <property name="top_attach">1</property>
539+ <property name="bottom_attach">2</property>
540 <property name="x_options">GTK_FILL</property>
541 <property name="y_options"/>
542 </packing>
543@@ -148,21 +224,26 @@
544 </style>
545 </object>
546 <packing>
547- <property name="top_attach">1</property>
548- <property name="bottom_attach">2</property>
549+ <property name="top_attach">2</property>
550+ <property name="bottom_attach">3</property>
551 <property name="x_options">GTK_FILL</property>
552 <property name="y_options"/>
553 </packing>
554 </child>
555 <child>
556- <object class="GtkSeparator" id="unity_launcher_placement_sep">
557+ <object class="GtkLabel" id="general_options_label">
558 <property name="visible">True</property>
559 <property name="can_focus">False</property>
560+ <property name="xalign">0</property>
561+ <property name="ypad">5</property>
562+ <property name="label" translatable="yes">General options</property>
563+ <attributes>
564+ <attribute name="weight" value="bold"/>
565+ </attributes>
566 </object>
567 <packing>
568- <property name="right_attach">2</property>
569- <property name="top_attach">2</property>
570- <property name="bottom_attach">3</property>
571+ <property name="left_attach">3</property>
572+ <property name="right_attach">4</property>
573 <property name="x_options">GTK_FILL</property>
574 <property name="y_options"/>
575 </packing>
576@@ -180,8 +261,10 @@
577 </style>
578 </object>
579 <packing>
580- <property name="top_attach">3</property>
581- <property name="bottom_attach">4</property>
582+ <property name="top_attach">1</property>
583+ <property name="bottom_attach">2</property>
584+ <property name="left_attach">3</property>
585+ <property name="right_attach">4</property>
586 <property name="x_options">GTK_FILL</property>
587 <property name="y_options"/>
588 </packing>
589@@ -199,8 +282,10 @@
590 </style>
591 </object>
592 <packing>
593- <property name="top_attach">4</property>
594- <property name="bottom_attach">5</property>
595+ <property name="left_attach">3</property>
596+ <property name="right_attach">4</property>
597+ <property name="top_attach">2</property>
598+ <property name="bottom_attach">3</property>
599 <property name="x_options">GTK_FILL</property>
600 <property name="y_options"/>
601 </packing>
602@@ -213,6 +298,8 @@
603 <packing>
604 <property name="left_attach">1</property>
605 <property name="right_attach">2</property>
606+ <property name="top_attach">1</property>
607+ <property name="bottom_attach">2</property>
608 <property name="y_options"/>
609 </packing>
610 </child>
611@@ -230,40 +317,54 @@
612 <packing>
613 <property name="left_attach">1</property>
614 <property name="right_attach">2</property>
615+ <property name="top_attach">2</property>
616+ <property name="bottom_attach">3</property>
617+ <property name="y_options"/>
618+ </packing>
619+ </child>
620+ <child>
621+ <object class="GtkHBox" id="launcher_placement_hbox">
622+ <property name="visible">True</property>
623+ <property name="can_focus">False</property>
624+ <property name="margin_bottom">1</property>
625+ <property name="spacing">12</property>
626+ <child>
627+ <object class="GtkComboBox" id="launcher_placement_combo">
628+ <property name="visible">True</property>
629+ <property name="can_focus">False</property>
630+ <property name="model">available_launcher_placement_store</property>
631+ <property name="id_column">1</property>
632+ <child>
633+ <object class="GtkCellRendererPixbuf" id="monitor_preview_renderer"/>
634+ <attributes>
635+ <attribute name="pixbuf">0</attribute>
636+ </attributes>
637+ </child>
638+ <child>
639+ <object class="GtkCellRendererText" id="launcher_placement_name_renderer"/>
640+ <attributes>
641+ <attribute name="text">1</attribute>
642+ </attributes>
643+ </child>
644+ </object>
645+ <packing>
646+ <property name="expand">False</property>
647+ <property name="fill">False</property>
648+ <property name="pack_type">start</property>
649+ <property name="position">1</property>
650+ </packing>
651+ </child>
652+ </object>
653+ <packing>
654+ <property name="left_attach">4</property>
655+ <property name="right_attach">5</property>
656 <property name="top_attach">1</property>
657 <property name="bottom_attach">2</property>
658 <property name="y_options"/>
659 </packing>
660 </child>
661 <child>
662- <object class="GtkComboBox" id="launcher_placement_combo">
663- <property name="visible">True</property>
664- <property name="can_focus">False</property>
665- <property name="model">available_launcher_placement_store</property>
666- <property name="id_column">1</property>
667- <child>
668- <object class="GtkCellRendererPixbuf" id="monitor_preview_renderer"/>
669- <attributes>
670- <attribute name="pixbuf">0</attribute>
671- </attributes>
672- </child>
673- <child>
674- <object class="GtkCellRendererText" id="launcher_placement_name_renderer"/>
675- <attributes>
676- <attribute name="text">1</attribute>
677- </attributes>
678- </child>
679- </object>
680- <packing>
681- <property name="left_attach">1</property>
682- <property name="right_attach">2</property>
683- <property name="top_attach">3</property>
684- <property name="bottom_attach">4</property>
685- <property name="y_options"/>
686- </packing>
687- </child>
688- <child>
689- <object class="GtkHBox" id="hbox4">
690+ <object class="GtkHBox" id="stickyedge_hbox">
691 <property name="visible">True</property>
692 <property name="can_focus">False</property>
693 <property name="margin_bottom">1</property>
694@@ -277,53 +378,112 @@
695 <packing>
696 <property name="expand">False</property>
697 <property name="fill">False</property>
698- <property name="pack_type">end</property>
699+ <property name="pack_type">start</property>
700 <property name="position">1</property>
701 </packing>
702 </child>
703 </object>
704 <packing>
705- <property name="left_attach">1</property>
706- <property name="right_attach">2</property>
707- <property name="top_attach">4</property>
708- <property name="bottom_attach">5</property>
709+ <property name="left_attach">4</property>
710+ <property name="right_attach">5</property>
711+ <property name="top_attach">2</property>
712+ <property name="bottom_attach">3</property>
713 <property name="y_options"/>
714 </packing>
715 </child>
716 <child>
717- <object class="GtkLabel" id="ui_label">
718+ <object class="GtkLabel" id="ui_scale_label">
719 <property name="visible">True</property>
720 <property name="can_focus">False</property>
721- <property name="xalign">1</property>
722+ <property name="xalign">0</property>
723 <property name="yalign">1</property>
724- <property name="xpad">3</property>
725- <property name="ypad">3</property>
726- <property name="label" translatable="yes">UI scale</property>
727- <style>
728- <class name="dim-label-ucc"/>
729- </style>
730- </object>
731- <packing>
732- <property name="top_attach">5</property>
733- <property name="bottom_attach">6</property>
734- </packing>
735- </child>
736- <child>
737- <object class="GtkHScale" id="ui_scale">
738- <property name="visible">True</property>
739- <property name="can_focus">True</property>
740- <property name="digits">2</property>
741- <child internal-child="accessible">
742- <object class="AtkObject" id="ui_scale-atkobject">
743- <property name="AtkObject::accessible-description" translatable="yes">Cursor blink speed</property>
744- </object>
745- </child>
746- </object>
747- <packing>
748- <property name="left_attach">1</property>
749- <property name="right_attach">2</property>
750- <property name="top_attach">5</property>
751- <property name="bottom_attach">6</property>
752+ <property name="label" translatable="yes">Scale for menu and title bars:</property>
753+ </object>
754+ <packing>
755+ <property name="top_attach">3</property>
756+ <property name="bottom_attach">4</property>
757+ <property name="right_attach">2</property>
758+ <property name="x_options">GTK_FILL</property>
759+ </packing>
760+ </child>
761+ <child>
762+ <object class="GtkAlignment" id="ui_scale_alignment">
763+ <property name="visible">True</property>
764+ <property name="width_request">150</property>
765+ <property name="xscale">0.75</property>
766+ <property name="xalign">0</property>
767+ <child>
768+ <object class="GtkHScale" id="ui_scale">
769+ <property name="visible">True</property>
770+ <property name="can_focus">True</property>
771+ <property name="digits">2</property>
772+ <property name="value_pos">bottom</property>
773+ <child internal-child="accessible">
774+ <object class="AtkObject" id="ui_scale-atkobject">
775+ <property name="AtkObject::accessible-description" translatable="yes">User interface scale factor</property>
776+ </object>
777+ </child>
778+ </object>
779+ </child>
780+ </object>
781+ <packing>
782+ <property name="right_attach">2</property>
783+ <property name="top_attach">4</property>
784+ <property name="bottom_attach">5</property>
785+ </packing>
786+ </child>
787+ <child>
788+ <object class="GtkLabel" id="ui_scale_monitor_label">
789+ <property name="visible">True</property>
790+ <property name="can_focus">False</property>
791+ <property name="xalign">0</property>
792+ <property name="label" translatable="yes">Scale all window _contents to match:</property>
793+ <property name="use_underline">True</property>
794+ <property name="mnemonic_widget">ui_scale_monitor_combo</property>
795+ </object>
796+ <packing>
797+ <property name="left_attach">3</property>
798+ <property name="right_attach">5</property>
799+ <property name="top_attach">3</property>
800+ <property name="bottom_attach">4</property>
801+ <property name="x_options">GTK_FILL</property>
802+ </packing>
803+ </child>
804+ <child>
805+ <object class="GtkHBox" id="ui_scale_monitor_combo_hbox">
806+ <property name="visible">True</property>
807+ <child>
808+ <object class="GtkComboBox" id="ui_scale_monitor_combo">
809+ <property name="visible">True</property>
810+ <property name="can_focus">False</property>
811+ <property name="model">available_ui_scale_monitor_store</property>
812+ <property name="id_column">1</property>
813+ <child>
814+ <object class="GtkCellRendererPixbuf" id="ui_scale_monitor_preview_renderer"/>
815+ <attributes>
816+ <attribute name="pixbuf">0</attribute>
817+ </attributes>
818+ </child>
819+ <child>
820+ <object class="GtkCellRendererText" id="ui_scale_name_renderer"/>
821+ <attributes>
822+ <attribute name="text">1</attribute>
823+ </attributes>
824+ </child>
825+ </object>
826+ <packing>
827+ <property name="expand">False</property>
828+ <property name="fill">False</property>
829+ <property name="position">1</property>
830+ </packing>
831+ </child>
832+ </object>
833+ <packing>
834+ <property name="left_attach">3</property>
835+ <property name="right_attach">5</property>
836+ <property name="top_attach">4</property>
837+ <property name="bottom_attach">5</property>
838+ <property name="y_options"/>
839 </packing>
840 </child>
841 </object>
842@@ -331,87 +491,21 @@
843 </object>
844 <packing>
845 <property name="expand">False</property>
846- <property name="fill">True</property>
847+ <property name="fill">False</property>
848 <property name="position">1</property>
849 </packing>
850 </child>
851- <child>
852- <placeholder/>
853- </child>
854 </object>
855 <packing>
856- <property name="expand">True</property>
857- <property name="fill">True</property>
858+ <property name="expand">False</property>
859+ <property name="fill">False</property>
860 <property name="position">0</property>
861 </packing>
862 </child>
863- <child>
864- <object class="GtkAlignment" id="alignment2">
865- <property name="visible">True</property>
866- <property name="can_focus">False</property>
867- <child>
868- <placeholder/>
869- </child>
870- </object>
871- <packing>
872- <property name="expand">True</property>
873- <property name="fill">True</property>
874- <property name="position">1</property>
875- </packing>
876- </child>
877- <child>
878- <object class="GtkVBox" id="vbox2">
879- <property name="visible">True</property>
880- <property name="can_focus">False</property>
881- <child>
882- <object class="GtkCheckButton" id="clone_checkbox">
883- <property name="label" translatable="yes" comments="Note that mirror is a verb in this string">_Mirror displays</property>
884- <property name="visible">True</property>
885- <property name="can_focus">True</property>
886- <property name="receives_default">False</property>
887- <property name="use_underline">True</property>
888- <property name="xalign">0.5</property>
889- <property name="draw_indicator">True</property>
890- </object>
891- <packing>
892- <property name="expand">False</property>
893- <property name="fill">False</property>
894- <property name="position">0</property>
895- </packing>
896- </child>
897- <child>
898- <object class="GtkLabel" id="clone_resolution_warning_label">
899- <property name="visible">True</property>
900- <property name="can_focus">False</property>
901- <property name="xalign">0</property>
902- <property name="label" translatable="yes">Note: may limit resolution options</property>
903- <attributes>
904- <attribute name="style" value="italic"/>
905- </attributes>
906- </object>
907- <packing>
908- <property name="expand">False</property>
909- <property name="fill">False</property>
910- <property name="position">1</property>
911- </packing>
912- </child>
913- <child>
914- <placeholder/>
915- </child>
916- <child>
917- <placeholder/>
918- </child>
919- </object>
920- <packing>
921- <property name="expand">False</property>
922- <property name="fill">True</property>
923- <property name="position">2</property>
924- </packing>
925- </child>
926 </object>
927 <packing>
928- <property name="expand">True</property>
929- <property name="fill">True</property>
930+ <property name="expand">False</property>
931+ <property name="fill">False</property>
932 <property name="position">1</property>
933 </packing>
934 </child>

Subscribers

People subscribed via source and target branches