Merge lp:~attente/indicator-keyboard/accountsservice into lp:indicator-keyboard
- accountsservice
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Sebastien Bacher |
Approved revision: | 100 |
Merged at revision: | 106 |
Proposed branch: | lp:~attente/indicator-keyboard/accountsservice |
Merge into: | lp:indicator-keyboard |
Diff against target: |
405 lines (+220/-78) 5 files modified
configure.ac (+8/-0) data/Makefile.am (+3/-0) debian/control (+2/-0) lib/Makefile.am (+32/-26) lib/main.vala (+175/-52) |
To merge this branch: | bzr merge lp:~attente/indicator-keyboard/accountsservice |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot (community) | continuous-integration | Approve | |
Sebastien Bacher | Approve | ||
Review via email: mp+179050@code.launchpad.net |
Commit message
Use accountsservice and make work under unity-greeter.
Description of the change
Use accountsservice and make work under unity-greeter.
This branch depends on the debdiff from https:/
PS Jenkins bot (ps-jenkins) wrote : | # |
Sebastien Bacher (seb128) wrote : | # |
seems fine to me and we have the accountsservice patch in now
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Autolanding.
More details in the following jenkins job:
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
- 100. By William Hua
-
Merge trunk.
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:100
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Preview Diff
1 | === modified file 'configure.ac' | |||
2 | --- configure.ac 2013-08-08 18:41:27 +0000 | |||
3 | +++ configure.ac 2013-08-22 10:36:45 +0000 | |||
4 | @@ -70,6 +70,14 @@ | |||
5 | 70 | AC_SUBST([IBUS_CFLAGS]) | 70 | AC_SUBST([IBUS_CFLAGS]) |
6 | 71 | AC_SUBST([IBUS_LIBS]) | 71 | AC_SUBST([IBUS_LIBS]) |
7 | 72 | 72 | ||
8 | 73 | PKG_CHECK_MODULES([ACCOUNTSSERVICE], [accountsservice]) | ||
9 | 74 | AC_SUBST([ACCOUNTSSERVICE_CFLAGS]) | ||
10 | 75 | AC_SUBST([ACCOUNTSSERVICE_LIBS]) | ||
11 | 76 | |||
12 | 77 | PKG_CHECK_MODULES([LIGHTDM], [liblightdm-gobject-1]) | ||
13 | 78 | AC_SUBST([LIGHTDM_CFLAGS]) | ||
14 | 79 | AC_SUBST([LIGHTDM_LIBS]) | ||
15 | 80 | |||
16 | 73 | PKG_CHECK_MODULES([BAMF], [libbamf3]) | 81 | PKG_CHECK_MODULES([BAMF], [libbamf3]) |
17 | 74 | AC_SUBST([BAMF_CFLAGS]) | 82 | AC_SUBST([BAMF_CFLAGS]) |
18 | 75 | AC_SUBST([BAMF_LIBS]) | 83 | AC_SUBST([BAMF_LIBS]) |
19 | 76 | 84 | ||
20 | === modified file 'data/Makefile.am' | |||
21 | --- data/Makefile.am 2013-07-18 22:01:28 +0000 | |||
22 | +++ data/Makefile.am 2013-08-22 10:36:45 +0000 | |||
23 | @@ -48,6 +48,9 @@ | |||
24 | 48 | echo 'ObjectPath=/com/canonical/indicator/keyboard'; \ | 48 | echo 'ObjectPath=/com/canonical/indicator/keyboard'; \ |
25 | 49 | echo ''; \ | 49 | echo ''; \ |
26 | 50 | echo '[desktop]'; \ | 50 | echo '[desktop]'; \ |
27 | 51 | echo 'ObjectPath=/com/canonical/indicator/keyboard/desktop'; \ | ||
28 | 52 | echo ''; \ | ||
29 | 53 | echo '[desktop_greeter]'; \ | ||
30 | 51 | echo 'ObjectPath=/com/canonical/indicator/keyboard/desktop') > $@.tmp && \ | 54 | echo 'ObjectPath=/com/canonical/indicator/keyboard/desktop') > $@.tmp && \ |
31 | 52 | mv $@.tmp $@ | 55 | mv $@.tmp $@ |
32 | 53 | 56 | ||
33 | 54 | 57 | ||
34 | === modified file 'debian/control' | |||
35 | --- debian/control 2013-08-07 15:20:47 +0000 | |||
36 | +++ debian/control 2013-08-22 10:36:45 +0000 | |||
37 | @@ -8,6 +8,7 @@ | |||
38 | 8 | dh-autoreconf, | 8 | dh-autoreconf, |
39 | 9 | dh-translations, | 9 | dh-translations, |
40 | 10 | dbus, | 10 | dbus, |
41 | 11 | libaccountsservice-dev, | ||
42 | 11 | libbamf3-dev, | 12 | libbamf3-dev, |
43 | 12 | libgee-dev, | 13 | libgee-dev, |
44 | 13 | libgirepository1.0-dev, | 14 | libgirepository1.0-dev, |
45 | @@ -15,6 +16,7 @@ | |||
46 | 15 | libgnomekbd-dev, | 16 | libgnomekbd-dev, |
47 | 16 | libgtk-3-dev, | 17 | libgtk-3-dev, |
48 | 17 | libibus-1.0-dev (>= 1.5.0), | 18 | libibus-1.0-dev (>= 1.5.0), |
49 | 19 | liblightdm-gobject-1-dev, | ||
50 | 18 | valac, | 20 | valac, |
51 | 19 | xauth, | 21 | xauth, |
52 | 20 | xvfb, | 22 | xvfb, |
53 | 21 | 23 | ||
54 | === modified file 'lib/Makefile.am' | |||
55 | --- lib/Makefile.am 2013-08-07 19:11:32 +0000 | |||
56 | +++ lib/Makefile.am 2013-08-22 10:36:45 +0000 | |||
57 | @@ -9,32 +9,38 @@ | |||
58 | 9 | indicator_keyboard_service_SOURCES = main.vala \ | 9 | indicator_keyboard_service_SOURCES = main.vala \ |
59 | 10 | source.vala \ | 10 | source.vala \ |
60 | 11 | common.vala | 11 | common.vala |
71 | 12 | indicator_keyboard_service_VALAFLAGS = $(AM_VALAFLAGS) \ | 12 | indicator_keyboard_service_VALAFLAGS = $(AM_VALAFLAGS) \ |
72 | 13 | --pkg gee-1.0 \ | 13 | --pkg gee-1.0 \ |
73 | 14 | --pkg posix \ | 14 | --pkg posix \ |
74 | 15 | --pkg pangocairo \ | 15 | --pkg pangocairo \ |
75 | 16 | --pkg gtk+-3.0 \ | 16 | --pkg gtk+-3.0 \ |
76 | 17 | --pkg GDesktopEnums-3.0 \ | 17 | --pkg GDesktopEnums-3.0 \ |
77 | 18 | --pkg gnome-desktop-3.0 \ | 18 | --pkg gnome-desktop-3.0 \ |
78 | 19 | --pkg Xkl-1.0 \ | 19 | --pkg Xkl-1.0 \ |
79 | 20 | --pkg Gkbd-3.0 \ | 20 | --pkg Gkbd-3.0 \ |
80 | 21 | --pkg ibus-1.0 \ | 21 | --pkg ibus-1.0 \ |
81 | 22 | --pkg accountsservice \ | ||
82 | 23 | --pkg liblightdm-gobject-1 \ | ||
83 | 22 | --pkg libbamf3 | 24 | --pkg libbamf3 |
92 | 23 | indicator_keyboard_service_CFLAGS = $(AM_CFLAGS) \ | 25 | indicator_keyboard_service_CFLAGS = $(AM_CFLAGS) \ |
93 | 24 | $(GEE_CFLAGS) \ | 26 | $(GEE_CFLAGS) \ |
94 | 25 | $(PANGOCAIRO_CFLAGS) \ | 27 | $(PANGOCAIRO_CFLAGS) \ |
95 | 26 | $(GTK_CFLAGS) \ | 28 | $(GTK_CFLAGS) \ |
96 | 27 | $(GNOME_DESKTOP_CFLAGS) \ | 29 | $(GNOME_DESKTOP_CFLAGS) \ |
97 | 28 | $(LIBXKLAVIER_CFLAGS) \ | 30 | $(LIBXKLAVIER_CFLAGS) \ |
98 | 29 | $(LIBGNOMEKBD_CFLAGS) \ | 31 | $(LIBGNOMEKBD_CFLAGS) \ |
99 | 30 | $(IBUS_CFLAGS) \ | 32 | $(IBUS_CFLAGS) \ |
100 | 33 | $(ACCOUNTSSERVICE_CFLAGS) \ | ||
101 | 34 | $(LIGHTDM_CFLAGS) \ | ||
102 | 31 | $(BAMF_CFLAGS) | 35 | $(BAMF_CFLAGS) |
111 | 32 | indicator_keyboard_service_LDFLAGS = $(AM_LDFLAGS) \ | 36 | indicator_keyboard_service_LDFLAGS = $(AM_LDFLAGS) \ |
112 | 33 | $(GEE_LIBS) \ | 37 | $(GEE_LIBS) \ |
113 | 34 | $(PANGOCAIRO_LIBS) \ | 38 | $(PANGOCAIRO_LIBS) \ |
114 | 35 | $(GTK_LIBS) \ | 39 | $(GTK_LIBS) \ |
115 | 36 | $(GNOME_DESKTOP_LIBS) \ | 40 | $(GNOME_DESKTOP_LIBS) \ |
116 | 37 | $(LIBXKLAVIER_LIBS) \ | 41 | $(LIBXKLAVIER_LIBS) \ |
117 | 38 | $(LIBGNOMEKBD_LIBS) \ | 42 | $(LIBGNOMEKBD_LIBS) \ |
118 | 39 | $(IBUS_LIBS) \ | 43 | $(IBUS_LIBS) \ |
119 | 44 | $(ACCOUNTSSERVICE_LIBS) \ | ||
120 | 45 | $(LIGHTDM_LIBS) \ | ||
121 | 40 | $(BAMF_LIBS) | 46 | $(BAMF_LIBS) |
122 | 41 | 47 | ||
123 | === modified file 'lib/main.vala' | |||
124 | --- lib/main.vala 2013-08-12 01:33:27 +0000 | |||
125 | +++ lib/main.vala 2013-08-22 10:36:45 +0000 | |||
126 | @@ -29,6 +29,7 @@ | |||
127 | 29 | private Settings indicator_settings; | 29 | private Settings indicator_settings; |
128 | 30 | private Settings source_settings; | 30 | private Settings source_settings; |
129 | 31 | private Settings per_window_settings; | 31 | private Settings per_window_settings; |
130 | 32 | private SList<Act.User> users; | ||
131 | 32 | private Bamf.Matcher? matcher; | 33 | private Bamf.Matcher? matcher; |
132 | 33 | private Gee.HashMap<string, uint>? window_sources; | 34 | private Gee.HashMap<string, uint>? window_sources; |
133 | 34 | 35 | ||
134 | @@ -67,6 +68,11 @@ | |||
135 | 67 | } | 68 | } |
136 | 68 | 69 | ||
137 | 69 | [DBus (visible = false)] | 70 | [DBus (visible = false)] |
138 | 71 | private static bool is_login_user () { | ||
139 | 72 | return Environment.get_user_name () == "lightdm"; | ||
140 | 73 | } | ||
141 | 74 | |||
142 | 75 | [DBus (visible = false)] | ||
143 | 70 | private static IBus.Bus get_ibus () { | 76 | private static IBus.Bus get_ibus () { |
144 | 71 | if (ibus == null) { | 77 | if (ibus == null) { |
145 | 72 | IBus.init (); | 78 | IBus.init (); |
146 | @@ -91,64 +97,177 @@ | |||
147 | 91 | 97 | ||
148 | 92 | [DBus (visible = false)] | 98 | [DBus (visible = false)] |
149 | 93 | private void migrate_keyboard_layouts () { | 99 | private void migrate_keyboard_layouts () { |
165 | 94 | if (!indicator_settings.get_boolean ("migrated")) { | 100 | if (is_login_user ()) { |
166 | 95 | var builder = new VariantBuilder (new VariantType ("a(ss)")); | 101 | Act.UserManager manager = Act.UserManager.get_default (); |
167 | 96 | var length = 0; | 102 | |
168 | 97 | 103 | if (manager.is_loaded) { | |
169 | 98 | var layout_settings = new Settings ("org.gnome.libgnomekbd.keyboard"); | 104 | users = manager.list_users (); |
170 | 99 | var layouts = layout_settings.get_strv ("layouts"); | 105 | |
171 | 100 | 106 | foreach (var user in users) { | |
172 | 101 | foreach (var layout in layouts) { | 107 | if (user.is_loaded) { |
173 | 102 | var source = layout; | 108 | migrate_input_sources (); |
174 | 103 | 109 | } else { | |
175 | 104 | source = source.replace (" ", "+"); | 110 | user.notify["is-loaded"].connect ((pspec) => { |
176 | 105 | source = source.replace ("\t", "+"); | 111 | if (user.is_loaded) { |
177 | 106 | 112 | migrate_input_sources (); | |
178 | 107 | builder.add ("(ss)", "xkb", source); | 113 | } |
179 | 108 | length++; | 114 | }); |
180 | 115 | } | ||
181 | 116 | } | ||
182 | 117 | } else { | ||
183 | 118 | manager.notify["is-loaded"].connect ((pspec) => { | ||
184 | 119 | if (manager.is_loaded) { | ||
185 | 120 | users = manager.list_users (); | ||
186 | 121 | |||
187 | 122 | foreach (var user in users) { | ||
188 | 123 | if (user.is_loaded) { | ||
189 | 124 | migrate_input_sources (); | ||
190 | 125 | } else { | ||
191 | 126 | user.notify["is-loaded"].connect ((pspec) => { | ||
192 | 127 | if (user.is_loaded) { | ||
193 | 128 | migrate_input_sources (); | ||
194 | 129 | } | ||
195 | 130 | }); | ||
196 | 131 | } | ||
197 | 132 | } | ||
198 | 133 | } | ||
199 | 134 | }); | ||
200 | 109 | } | 135 | } |
223 | 110 | 136 | } else { | |
224 | 111 | var engines = get_ibus ().list_active_engines (); | 137 | if (!indicator_settings.get_boolean ("migrated")) { |
225 | 112 | 138 | var builder = new VariantBuilder (new VariantType ("a(ss)")); | |
226 | 113 | foreach (var engine in engines) { | 139 | var length = 0; |
227 | 114 | if (length == 0 || engine.name.has_prefix ("xkb")) { | 140 | |
228 | 115 | var source = "us"; | 141 | var layout_settings = new Settings ("org.gnome.libgnomekbd.keyboard"); |
229 | 116 | string? layout = engine.get_layout (); | 142 | var layouts = layout_settings.get_strv ("layouts"); |
230 | 117 | string? variant = engine.get_layout_variant (); | 143 | |
231 | 118 | 144 | foreach (var layout in layouts) { | |
232 | 119 | if (layout != null && ((!) layout).length == 0) { | 145 | var source = layout; |
233 | 120 | layout = null; | 146 | source = source.replace (" ", "+"); |
234 | 121 | } | 147 | source = source.replace ("\t", "+"); |
213 | 122 | |||
214 | 123 | if (variant != null && ((!) variant).length == 0) { | ||
215 | 124 | variant = null; | ||
216 | 125 | } | ||
217 | 126 | |||
218 | 127 | if (layout != null && variant != null) { | ||
219 | 128 | source = @"$((!) layout)+$((!) variant)"; | ||
220 | 129 | } else if (layout != null) { | ||
221 | 130 | source = (!) layout; | ||
222 | 131 | } | ||
235 | 132 | 148 | ||
236 | 133 | builder.add ("(ss)", "xkb", source); | 149 | builder.add ("(ss)", "xkb", source); |
237 | 134 | length++; | 150 | length++; |
238 | 135 | } | 151 | } |
239 | 136 | 152 | ||
249 | 137 | if (!engine.name.has_prefix ("xkb")) { | 153 | var engines = get_ibus ().list_active_engines (); |
250 | 138 | builder.add ("(ss)", "ibus", engine.name); | 154 | |
251 | 139 | length++; | 155 | foreach (var engine in engines) { |
252 | 140 | } | 156 | if (length == 0 || engine.name.has_prefix ("xkb")) { |
253 | 141 | } | 157 | var source = "us"; |
254 | 142 | 158 | string? layout = engine.get_layout (); | |
255 | 143 | source_settings.set_value ("sources", builder.end ()); | 159 | string? variant = engine.get_layout_variant (); |
256 | 144 | 160 | ||
257 | 145 | indicator_settings.set_boolean ("migrated", true); | 161 | if (layout != null && ((!) layout).length == 0) { |
258 | 162 | layout = null; | ||
259 | 163 | } | ||
260 | 164 | |||
261 | 165 | if (variant != null && ((!) variant).length == 0) { | ||
262 | 166 | variant = null; | ||
263 | 167 | } | ||
264 | 168 | |||
265 | 169 | if (layout != null && variant != null) { | ||
266 | 170 | source = @"$((!) layout)+$((!) variant)"; | ||
267 | 171 | } else if (layout != null) { | ||
268 | 172 | source = (!) layout; | ||
269 | 173 | } | ||
270 | 174 | |||
271 | 175 | builder.add ("(ss)", "xkb", source); | ||
272 | 176 | length++; | ||
273 | 177 | } | ||
274 | 178 | |||
275 | 179 | if (!engine.name.has_prefix ("xkb")) { | ||
276 | 180 | builder.add ("(ss)", "ibus", engine.name); | ||
277 | 181 | length++; | ||
278 | 182 | } | ||
279 | 183 | } | ||
280 | 184 | |||
281 | 185 | source_settings.set_value ("sources", builder.end ()); | ||
282 | 186 | indicator_settings.set_boolean ("migrated", true); | ||
283 | 187 | } | ||
284 | 188 | } | ||
285 | 189 | } | ||
286 | 190 | |||
287 | 191 | [DBus (visible = false)] | ||
288 | 192 | private void migrate_input_sources () { | ||
289 | 193 | var list = new Gee.LinkedList<string> (); | ||
290 | 194 | var added = new Gee.HashSet<string> (); | ||
291 | 195 | |||
292 | 196 | foreach (var user in users) { | ||
293 | 197 | if (user.is_loaded) { | ||
294 | 198 | var sources = user.input_sources; | ||
295 | 199 | var layouts = user.xkeyboard_layouts; | ||
296 | 200 | |||
297 | 201 | VariantIter outer; | ||
298 | 202 | VariantIter inner; | ||
299 | 203 | |||
300 | 204 | sources.get ("aa{ss}", out outer); | ||
301 | 205 | |||
302 | 206 | while (outer.next ("a{ss}", out inner)) { | ||
303 | 207 | unowned string key; | ||
304 | 208 | unowned string source; | ||
305 | 209 | |||
306 | 210 | while (inner.next ("{&s&s}", out key, out source)) { | ||
307 | 211 | if (key == "xkb") { | ||
308 | 212 | if (!added.contains (source)) { | ||
309 | 213 | list.add (source); | ||
310 | 214 | added.add (source); | ||
311 | 215 | } | ||
312 | 216 | } | ||
313 | 217 | } | ||
314 | 218 | } | ||
315 | 219 | |||
316 | 220 | foreach (var layout in layouts) { | ||
317 | 221 | var source = layout; | ||
318 | 222 | source = source.replace (" ", "+"); | ||
319 | 223 | source = source.replace ("\t", "+"); | ||
320 | 224 | |||
321 | 225 | if (!added.contains (source)) { | ||
322 | 226 | list.add (source); | ||
323 | 227 | added.add (source); | ||
324 | 228 | } | ||
325 | 229 | } | ||
326 | 230 | } | ||
327 | 231 | } | ||
328 | 232 | |||
329 | 233 | var builder = new VariantBuilder (new VariantType ("a(ss)")); | ||
330 | 234 | |||
331 | 235 | foreach (var layout in list) { | ||
332 | 236 | builder.add ("(ss)", "xkb", layout); | ||
333 | 237 | } | ||
334 | 238 | |||
335 | 239 | source_settings.set_value ("sources", builder.end ()); | ||
336 | 240 | } | ||
337 | 241 | |||
338 | 242 | [DBus (visible = false)] | ||
339 | 243 | private void update_login_layout () { | ||
340 | 244 | unowned List<LightDM.Layout> layouts = LightDM.get_layouts (); | ||
341 | 245 | var current = source_settings.get_uint ("current"); | ||
342 | 246 | |||
343 | 247 | if (current < get_sources ().length) { | ||
344 | 248 | var source = get_sources ()[current]; | ||
345 | 249 | string? name = null; | ||
346 | 250 | |||
347 | 251 | if (source.layout != null && source.variant != null) { | ||
348 | 252 | name = @"$((!) source.layout)\t$((!) source.variant)"; | ||
349 | 253 | } else if (source.layout != null) { | ||
350 | 254 | name = source.layout; | ||
351 | 255 | } | ||
352 | 256 | |||
353 | 257 | if (name != null) { | ||
354 | 258 | foreach (var layout in layouts) { | ||
355 | 259 | if (layout.name == (!) name) { | ||
356 | 260 | LightDM.set_layout (layout); | ||
357 | 261 | break; | ||
358 | 262 | } | ||
359 | 263 | } | ||
360 | 264 | } | ||
361 | 146 | } | 265 | } |
362 | 147 | } | 266 | } |
363 | 148 | 267 | ||
364 | 149 | [DBus (visible = false)] | 268 | [DBus (visible = false)] |
365 | 150 | private void update_window_sources () { | 269 | private void update_window_sources () { |
367 | 151 | if (use_bamf) { | 270 | if (use_bamf && !is_login_user ()) { |
368 | 152 | var group_per_window = per_window_settings.get_boolean ("group-per-window"); | 271 | var group_per_window = per_window_settings.get_boolean ("group-per-window"); |
369 | 153 | 272 | ||
370 | 154 | if (group_per_window != (window_sources != null)) { | 273 | if (group_per_window != (window_sources != null)) { |
371 | @@ -324,11 +443,13 @@ | |||
372 | 324 | 443 | ||
373 | 325 | submenu.append_section (null, section_menu); | 444 | submenu.append_section (null, section_menu); |
374 | 326 | 445 | ||
380 | 327 | var section = new Menu (); | 446 | if (!is_login_user ()) { |
381 | 328 | section.append (_ ("Character Map"), "indicator.map"); | 447 | var section = new Menu (); |
382 | 329 | section.append (_ ("Keyboard Layout Chart"), "indicator.chart"); | 448 | section.append (_ ("Character Map"), "indicator.map"); |
383 | 330 | section.append (_ ("Text Entry Settings..."), "indicator.settings"); | 449 | section.append (_ ("Keyboard Layout Chart"), "indicator.chart"); |
384 | 331 | submenu.append_section (null, section); | 450 | section.append (_ ("Text Entry Settings..."), "indicator.settings"); |
385 | 451 | submenu.append_section (null, section); | ||
386 | 452 | } | ||
387 | 332 | 453 | ||
388 | 333 | var indicator = new MenuItem.submenu ("x", submenu); | 454 | var indicator = new MenuItem.submenu ("x", submenu); |
389 | 334 | indicator.set_attribute ("x-canonical-type", "s", "com.canonical.indicator.root"); | 455 | indicator.set_attribute ("x-canonical-type", "s", "com.canonical.indicator.root"); |
390 | @@ -355,6 +476,7 @@ | |||
391 | 355 | [DBus (visible = false)] | 476 | [DBus (visible = false)] |
392 | 356 | private void handle_changed_current (string key) { | 477 | private void handle_changed_current (string key) { |
393 | 357 | update_indicator_action (); | 478 | update_indicator_action (); |
394 | 479 | update_login_layout (); | ||
395 | 358 | } | 480 | } |
396 | 359 | 481 | ||
397 | 360 | [DBus (visible = false)] | 482 | [DBus (visible = false)] |
398 | @@ -363,6 +485,7 @@ | |||
399 | 363 | 485 | ||
400 | 364 | update_sources_menu (); | 486 | update_sources_menu (); |
401 | 365 | update_indicator_action (); | 487 | update_indicator_action (); |
402 | 488 | update_login_layout (); | ||
403 | 366 | } | 489 | } |
404 | 367 | 490 | ||
405 | 368 | [DBus (visible = false)] | 491 | [DBus (visible = false)] |
FAILED: Continuous integration, rev:99 jenkins. qa.ubuntu. com/job/ indicator- keyboard- ci/4/ jenkins. qa.ubuntu. com/job/ indicator- keyboard- saucy-amd64- ci/4/console jenkins. qa.ubuntu. com/job/ indicator- keyboard- saucy-armhf- ci/4/console
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild: s-jenkins: 8080/job/ indicator- keyboard- ci/4/rebuild
http://