Merge lp:~unity-team/unity/x-sru3 into lp:unity/7.4

Proposed by Marco Trevisan (Treviño) on 2016-08-01
Status: Merged
Approved by: Andrea Azzarone on 2016-08-01
Approved revision: 4121
Merged at revision: 4111
Proposed branch: lp:~unity-team/unity/x-sru3
Merge into: lp:unity/7.4
Diff against target: 1128 lines (+505/-85)
35 files modified
CMakeLists.txt (+6/-0)
debian/changelog (+35/-0)
debian/control (+1/-0)
debian/libunity-core-6.0-9.install (+1/-1)
debian/unity-services.install (+1/-1)
debian/unity.install (+1/-0)
decorations/CMakeLists.txt (+1/-0)
decorations/DecoratedWindow.cpp (+101/-5)
decorations/DecoratedWindow.h (+1/-0)
decorations/DecorationsManager.cpp (+1/-1)
decorations/DecorationsPriv.h (+8/-0)
decorations/DecorationsShape.cpp (+107/-0)
decorations/DecorationsShape.h (+54/-0)
launcher/DeviceNotificationDisplay.h (+1/-1)
launcher/DeviceNotificationDisplayImp.cpp (+4/-26)
launcher/DeviceNotificationDisplayImp.h (+1/-1)
launcher/FileManagerLauncherIcon.cpp (+4/-2)
launcher/TrashLauncherIcon.cpp (+21/-17)
launcher/VolumeLauncherIcon.cpp (+1/-1)
lockscreen/LockScreenAcceleratorController.cpp (+12/-2)
plugins/unityshell/src/unityshell.cpp (+2/-1)
plugins/unityshell/unityshell.xml.in (+2/-0)
tests/test_mock_devices.h (+1/-1)
tests/test_unity_window_view.cpp (+6/-0)
tests/test_volume_launcher_icon.cpp (+2/-2)
tools/CMakeLists.txt (+22/-0)
tools/unity.cmake (+6/-0)
tools/unity_active_plugins_safety_check.cpp (+83/-0)
unity-shared/CompizUtils.cpp (+3/-4)
unity-shared/CompizUtils.h (+2/-1)
unity-shared/PluginAdapter.cpp (+1/-1)
unity-shared/TextInput.cpp (+4/-15)
unity-shared/TextInput.h (+0/-1)
unity-shared/UnityWindowView.cpp (+6/-1)
unity7.conf.in (+3/-0)
To merge this branch: bzr merge lp:~unity-team/unity/x-sru3
Reviewer Review Type Date Requested Status
Andrea Azzarone 2016-08-01 Approve on 2016-08-01
Review via email: mp+301625@code.launchpad.net

Commit message

Releasing Unity Xenial SRU3.

To post a comment you must log in.
Andrea Azzarone (azzar1) wrote :

+1

review: Approve
lp:~unity-team/unity/x-sru3 updated on 2016-08-01
4122. By Marco Trevisan (Treviño) on 2016-08-01

UnityWindowView: don't try to deference close_button_ if its' null

It could happen when manually triggering a signal

4123. By Marco Trevisan (Treviño) on 2016-08-01

DecoratedWindow: avoid deferencing an invalid shadow texture ptr, and split functions

4124. By Marco Trevisan (Treviño) on 2016-08-01

CompizUtils: add add flag to decoration utils for shaped windows

4125. By Marco Trevisan (Treviño) on 2016-08-01

DecoratedWindow: split shadow quads computation based on shaped window state

And reset textures on change

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2016-05-14 23:01:37 +0000
3+++ CMakeLists.txt 2016-08-01 13:05:54 +0000
4@@ -425,3 +425,9 @@
5 ADDITIONAL_MAKE_CLEAN_FILES api-doc)
6
7 endif (DOXYGEN_FOUND STREQUAL "YES")
8+
9+#
10+# Upstart
11+#
12+configure_file(unity7.conf.in ${CMAKE_CURRENT_BINARY_DIR}/unity7.conf)
13+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/unity7.conf DESTINATION ${CMAKE_INSTALL_DATADIR}/upstart/sessions)
14
15=== modified file 'debian/changelog'
16--- debian/changelog 2016-07-15 10:14:41 +0000
17+++ debian/changelog 2016-08-01 13:05:54 +0000
18@@ -1,3 +1,38 @@
19+unity (7.4.0+16.04.20160715-0ubuntu2) UNRELEASED; urgency=medium
20+
21+ [ Andrea Azzarone ]
22+ * FileManagerLauncherIcon: Don't trust the Quirk::VISIBLE in the ctor.
23+ (LP: #1599133)
24+ * [TrashLauncherIcon] Create GFileMonitor in an idle to avoid blocking
25+ calls. (LP: #1602720)
26+ * [LockSceen] Remove numlock warning. (LP: #1526322)
27+ * Make sure initiate and terminate callbacks are not empty before
28+ calling them. (LP: #1605012)
29+ * Properly destroy close_button_ to properly disconnect lambda. (LP:
30+ #1605010)
31+ * Use the standard notification-device-eject in the "device eject"
32+ notification. This allows us to scale it properly on high-dpi
33+ setups. (LP: #1605231)
34+ * Add tools to enforce unityshell plugin for the current profile and
35+ add "move" and "resize" plugins as requirements. (LP: #1506023, LP:
36+ #1605007, LP: #1604657)
37+
38+ [ Marco Trevisan (Treviño) ]
39+ * Unity script: use result from unity_support_test to check the right
40+ COMPIZ_CONFIG_PROFILE to use (LP: #1602377)
41+ * LockScreenAcceleratorController: ensure callbacks are valid before
42+ calling them (LP: #1605012)
43+
44+ [ Eleni Maria Stea ]
45+ * DecoratedWindow: Added shadows for shaped windows (LP: 1608418)
46+
47+ [ Marco Trevisan (Treviño) ]
48+ * DecoratedWindow: Cleanup shadows for shaped windows, reduce
49+ recomputation (LP: #1608418)
50+ * UnityWindowView: don't try to deference close_button_ if its' null
51+
52+ -- Andrea Azzarone <azzaronea@gmail.com> Mon, 01 Aug 2016 10:34:14 +0200
53+
54 unity (7.4.0+16.04.20160715-0ubuntu1) xenial; urgency=medium
55
56 [ Eleni Maria Stea ]
57
58=== modified file 'debian/control'
59--- debian/control 2016-03-21 15:38:17 +0000
60+++ debian/control 2016-08-01 13:05:54 +0000
61@@ -18,6 +18,7 @@
62 libbamf3-dev (>= 0.5.3~bzr0),
63 libboost-dev,
64 libcairo2-dev,
65+ libcompizconfig0-dev,
66 libdbus-1-dev,
67 libdbusmenu-glib-dev (>= 0.3.91),
68 libdee-dev (>= 1.2.6),
69
70=== modified file 'debian/libunity-core-6.0-9.install'
71--- debian/libunity-core-6.0-9.install 2016-02-09 01:26:22 +0000
72+++ debian/libunity-core-6.0-9.install 2016-08-01 13:05:54 +0000
73@@ -3,7 +3,7 @@
74 usr/share/ccsm
75 usr/share/gnome-control-center/
76 usr/share/unity
77+usr/share/upstart/sessions/unity7.conf
78 debian/unity-crashdb.conf etc/apport/crashdb.conf.d/
79 debian/source_unity.py usr/share/apport/package-hooks
80-debian/unity7.conf usr/share/upstart/sessions
81 tools/convert-files/* usr/lib/compiz/migration/
82
83=== modified file 'debian/unity-services.install'
84--- debian/unity-services.install 2016-02-09 01:26:22 +0000
85+++ debian/unity-services.install 2016-08-01 13:05:54 +0000
86@@ -1,3 +1,3 @@
87 usr/lib/*/unity/*service
88-usr/share/upstart
89+usr/share/upstart/sessions/unity-panel-service*.conf
90 usr/share/man/*/unity-panel-service.1
91
92=== modified file 'debian/unity.install'
93--- debian/unity.install 2016-02-09 01:26:22 +0000
94+++ debian/unity.install 2016-08-01 13:05:54 +0000
95@@ -1,6 +1,7 @@
96 etc/pam.d
97 usr/bin
98 usr/lib/*/compiz/libunity*.so
99+usr/lib/*/unity/unity-active-plugins-safety-check
100 usr/share/man/*/unity.1
101 usr/share/compiz
102 usr/share/locale
103
104=== modified file 'decorations/CMakeLists.txt'
105--- decorations/CMakeLists.txt 2014-03-27 19:32:34 +0000
106+++ decorations/CMakeLists.txt 2016-08-01 13:05:54 +0000
107@@ -35,6 +35,7 @@
108 DecorationsMenuDropdown.cpp
109 DecorationsForceQuitDialog.cpp
110 DecorationsDataPool.cpp
111+ DecorationsShape.cpp
112 )
113
114 add_library (decorations-lib STATIC ${DECORATION_SOURCES})
115
116=== modified file 'decorations/DecoratedWindow.cpp'
117--- decorations/DecoratedWindow.cpp 2016-04-01 00:50:30 +0000
118+++ decorations/DecoratedWindow.cpp 2016-08-01 13:05:54 +0000
119@@ -38,6 +38,7 @@
120 namespace
121 {
122 const std::string MENUS_PANEL_NAME = "WindowLIM";
123+const int SHADOW_BLUR_MARGIN_FACTOR = 2;
124 }
125
126 Window::Impl::Impl(Window* parent, CompWindow* win)
127@@ -492,6 +493,12 @@
128 return deco_elements_ & cu::DecorationElement::SHADOW;
129 }
130
131+bool Window::Impl::ShapedShadowDecorated() const
132+{
133+ return deco_elements_ & cu::DecorationElement::SHADOW &&
134+ deco_elements_ & cu::DecorationElement::SHAPED;
135+}
136+
137 bool Window::Impl::FullyDecorated() const
138 {
139 return deco_elements_ & cu::DecorationElement::BORDER;
140@@ -504,6 +511,14 @@
141
142 GLTexture* Window::Impl::ShadowTexture() const
143 {
144+ if (shaped_shadow_pixmap_)
145+ return shaped_shadow_pixmap_->texture();
146+
147+ return SharedShadowTexture();
148+}
149+
150+GLTexture* Window::Impl::SharedShadowTexture() const
151+{
152 auto const& mi = manager_->impl_;
153 if (active() || parent_->scaled())
154 return mi->active_shadow_pixmap_->texture();
155@@ -569,10 +584,22 @@
156 if (!last_shadow_rect_.isEmpty())
157 last_shadow_rect_.setGeometry(0, 0, 0, 0);
158
159- return;
160- }
161+ shaped_shadow_pixmap_.reset();
162+ }
163+ else if (deco_elements_ & cu::DecorationElement::SHAPED)
164+ {
165+ ComputeShapedShadowQuad();
166+ }
167+ else
168+ {
169+ shaped_shadow_pixmap_.reset();
170+ ComputeGenericShadowQuads();
171+ }
172+}
173
174- const auto* texture = ShadowTexture();
175+void Window::Impl::ComputeGenericShadowQuads()
176+{
177+ const auto* texture = SharedShadowTexture();
178
179 if (!texture || !texture->width() || !texture->height())
180 return;
181@@ -676,6 +703,68 @@
182 }
183 }
184
185+cu::PixmapTexture::Ptr Window::Impl::BuildShapedShadowTexture(nux::Size const& size, unsigned radius, nux::Color const& color, Shape const& shape) {
186+ nux::CairoGraphics img(CAIRO_FORMAT_ARGB32, size.width, size.height);
187+ auto* img_ctx = img.GetInternalContext();
188+
189+ for (auto const& rect : shape.GetRectangles())
190+ {
191+ cairo_rectangle(img_ctx, rect.x + radius * SHADOW_BLUR_MARGIN_FACTOR - shape.XOffset(), rect.y + radius * SHADOW_BLUR_MARGIN_FACTOR - shape.YOffset(), rect.width, rect.height);
192+ cairo_set_source_rgba(img_ctx, color.red, color.green, color.blue, color.alpha);
193+ cairo_fill(img_ctx);
194+ }
195+
196+ img.BlurSurface(radius);
197+
198+ cu::CairoContext shadow_ctx(size.width, size.height);
199+ cairo_set_source_surface(shadow_ctx, img.GetSurface(), 0, 0);
200+ cairo_paint(shadow_ctx);
201+
202+ return shadow_ctx;
203+}
204+
205+void Window::Impl::ComputeShapedShadowQuad()
206+{
207+ nux::Color color = active() ? manager_->active_shadow_color() : manager_->inactive_shadow_color();
208+ unsigned int radius = active() ? manager_->active_shadow_radius() : manager_->inactive_shadow_radius();
209+
210+ Shape shape(win_->id());
211+ auto const& border = win_->borderRect();
212+ auto const& shadow_offset = manager_->shadow_offset();
213+
214+ // Ideally it would be shape.getWidth + radius * 2 but Cairographics::BlurSurface
215+ // isn't bounded by the radius and we need to compensate by using a larger texture.
216+ int width = shape.Width() + radius * 2 * SHADOW_BLUR_MARGIN_FACTOR;
217+ int height = shape.Height() + radius * 2 * SHADOW_BLUR_MARGIN_FACTOR;
218+
219+ if (width != last_shadow_rect_.width() || height != last_shadow_rect_.height())
220+ shaped_shadow_pixmap_ = BuildShapedShadowTexture({width, height}, radius, color, shape);
221+
222+ const auto* texture = shaped_shadow_pixmap_->texture();
223+
224+ if (!texture || !texture->width() || !texture->height())
225+ return;
226+
227+ int x = border.x() + shadow_offset.x - radius * 2 + shape.XOffset();
228+ int y = border.y() + shadow_offset.y - radius * 2 + shape.YOffset();
229+
230+ auto* quad = &shadow_quads_[Quads::Pos(0)];
231+ quad->box.setGeometry(x, y, width, height);
232+ quad->matrix = texture->matrix();
233+ quad->matrix.x0 = -COMP_TEX_COORD_X(quad->matrix, quad->box.x1());
234+ quad->matrix.y0 = -COMP_TEX_COORD_Y(quad->matrix, quad->box.y1());
235+
236+ CompRect shaped_shadow_rect(x, y, width, height);
237+ if (shaped_shadow_rect != last_shadow_rect_)
238+ {
239+ auto const& win_region = win_->region();
240+ quad->region = CompRegion(quad->box) - win_region;
241+
242+ last_shadow_rect_ = shaped_shadow_rect;
243+ win_->updateWindowOutputExtents();
244+ }
245+}
246+
247 void Window::Impl::Paint(GLMatrix const& transformation,
248 GLWindowPaintAttrib const& attrib,
249 CompRegion const& region, unsigned mask)
250@@ -714,14 +803,18 @@
251
252 glwin_->vertexBuffer()->begin();
253
254- for (unsigned i = 0; i < shadow_quads_.size(); ++i)
255+ unsigned int num_quads = ShapedShadowDecorated() ? 1 : shadow_quads_.size();
256+ for (unsigned int i = 0; i < num_quads; ++i)
257 {
258 auto& quad = shadow_quads_[Quads::Pos(i)];
259 glwin_->glAddGeometry(quad.matrices, quad.region, clip_region);
260 }
261
262 if (glwin_->vertexBuffer()->end())
263- glwin_->glDrawTexture(ShadowTexture(), transformation, attrib, mask);
264+ {
265+ if (GLTexture* texture = ShadowTexture())
266+ glwin_->glDrawTexture(texture, transformation, attrib, mask);
267+ }
268
269 for (auto const& dtex : bg_textures_)
270 {
271@@ -746,6 +839,9 @@
272
273 void Window::Impl::RedrawDecorations()
274 {
275+ if (!win_->isMapped())
276+ return;
277+
278 dirty_geo_ = true;
279 cwin_->damageOutputExtents();
280 }
281
282=== modified file 'decorations/DecoratedWindow.h'
283--- decorations/DecoratedWindow.h 2015-08-07 18:54:07 +0000
284+++ decorations/DecoratedWindow.h 2016-08-01 13:05:54 +0000
285@@ -21,6 +21,7 @@
286 #define UNITY_DECORATED_WINDOW
287
288 #include "Introspectable.h"
289+#include <NuxCore/Property.h>
290 #include <memory>
291
292 class CompRegion;
293
294=== modified file 'decorations/DecorationsManager.cpp'
295--- decorations/DecorationsManager.cpp 2016-03-09 17:28:36 +0000
296+++ decorations/DecorationsManager.cpp 2016-08-01 13:05:54 +0000
297@@ -20,9 +20,9 @@
298 #include "DecorationsPriv.h"
299
300 #include <core/atoms.h>
301-#include <NuxGraphics/CairoGraphics.h>
302 #include <UnityCore/DBusIndicators.h>
303 #include <X11/Xatom.h>
304+
305 #include "WindowManager.h"
306
307 namespace unity
308
309=== modified file 'decorations/DecorationsPriv.h'
310--- decorations/DecorationsPriv.h 2016-04-01 00:50:30 +0000
311+++ decorations/DecorationsPriv.h 2016-08-01 13:05:54 +0000
312@@ -23,6 +23,7 @@
313 #include <unordered_map>
314 #include <NuxCore/NuxCore.h>
315 #include <NuxCore/Rect.h>
316+#include <NuxGraphics/CairoGraphics.h>
317 #include <UnityCore/ConnectionManager.h>
318 #include <UnityCore/Indicators.h>
319 #include <core/core.h>
320@@ -30,6 +31,7 @@
321 #include <composite/composite.h>
322 #include <X11/extensions/shape.h>
323
324+#include "DecorationsShape.h"
325 #include "DecorationsDataPool.h"
326 #include "DecorationsManager.h"
327 #include "DecorationsInputMixer.h"
328@@ -88,6 +90,7 @@
329 bool IsMaximized() const;
330 bool FullyDecorated() const;
331 bool ShadowDecorated() const;
332+ bool ShapedShadowDecorated() const;
333 void RedrawDecorations();
334 void Damage();
335 void SetupAppMenu();
336@@ -117,14 +120,18 @@
337 void SyncMenusGeometries() const;
338 bool ShouldBeDecorated() const;
339 GLTexture* ShadowTexture() const;
340+ GLTexture* SharedShadowTexture() const;
341 unsigned ShadowRadius() const;
342 std::string const& GetMenusPanelID() const;
343
344 void ComputeShadowQuads();
345+ void ComputeGenericShadowQuads();
346+ void ComputeShapedShadowQuad();
347 void UpdateDecorationTextures();
348 void UpdateWindowEdgesGeo();
349 void UpdateForceQuitDialogPosition();
350 void RenderDecorationTexture(Side, nux::Geometry const&);
351+ cu::PixmapTexture::Ptr BuildShapedShadowTexture(nux::Size const&, unsigned radius, nux::Color const&, Shape const&);
352 void Paint(GLMatrix const&, GLWindowPaintAttrib const&, CompRegion const&, unsigned mask);
353 void Draw(GLMatrix const&, GLWindowPaintAttrib const&, CompRegion const&, unsigned mask);
354
355@@ -155,6 +162,7 @@
356 std::string last_title_;
357 std::string panel_id_;
358 std::vector<cu::SimpleTextureQuad> bg_textures_;
359+ cu::PixmapTexture::Ptr shaped_shadow_pixmap_;
360 std::shared_ptr<ForceQuitDialog> force_quit_;
361 InputMixer::Ptr input_mixer_;
362 Layout::Ptr top_layout_;
363
364=== added file 'decorations/DecorationsShape.cpp'
365--- decorations/DecorationsShape.cpp 1970-01-01 00:00:00 +0000
366+++ decorations/DecorationsShape.cpp 2016-08-01 13:05:54 +0000
367@@ -0,0 +1,107 @@
368+// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
369+/*
370+ * Copyright (C) 2016 Canonical Ltd
371+ *
372+ * This program is free software: you can redistribute it and/or modify
373+ * it under the terms of the GNU General Public License version 3 as
374+ * published by the Free Software Foundation.
375+ *
376+ * This program is distributed in the hope that it will be useful,
377+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
378+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
379+ * GNU General Public License for more details.
380+ *
381+ * You should have received a copy of the GNU General Public License
382+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
383+ *
384+ * Authored by: Eleni Maria Stea <elenimaria.stea@canonical.com>
385+ */
386+
387+#include "DecorationsShape.h"
388+
389+#include <core/core.h>
390+#include <NuxCore/Logger.h>
391+#include <X11/extensions/shape.h>
392+
393+namespace unity
394+{
395+namespace decoration
396+{
397+namespace
398+{
399+DECLARE_LOGGER(logger, "unity.decoration.shape");
400+}
401+
402+Shape::Shape(Window xid)
403+{
404+ Bool buse, cuse;
405+ int bx, by, cx, cy;
406+ unsigned int bw, bh, cw, ch;
407+ Display *dpy = screen->dpy();
408+
409+ XShapeQueryExtents(dpy, xid, &buse, &bx, &by, &bw, &bh, &cuse, &cx, &cy, &cw, &ch);
410+
411+ int kind;
412+
413+ if (buse)
414+ {
415+ width_ = bw;
416+ height_ = bh;
417+ xoffs_ = bx;
418+ yoffs_ = by;
419+ kind = ShapeBounding;
420+ }
421+ else if (cuse)
422+ {
423+ width_ = cw;
424+ height_ = ch;
425+ xoffs_ = cx;
426+ yoffs_ = cy;
427+ kind = ShapeClip;
428+ }
429+ else
430+ {
431+ LOG_ERROR(logger) << "XShapeQueryExtend returned no extents";
432+ return;
433+ }
434+
435+ int rect_count, rect_order;
436+ std::unique_ptr<XRectangle[], int(*)(void*)> rectangles(XShapeGetRectangles(dpy, xid, kind, &rect_count, &rect_order), XFree);
437+
438+ if (!rectangles)
439+ {
440+ LOG_ERROR(logger) << "Failed to get shape rectangles";
441+ return;
442+ }
443+
444+ for (int i = 0; i < rect_count; ++i)
445+ rectangles_.push_back(rectangles[i]);
446+}
447+
448+std::vector<XRectangle> const& Shape::GetRectangles() const
449+{
450+ return rectangles_;
451+}
452+
453+int Shape::Width() const
454+{
455+ return width_;
456+}
457+
458+int Shape::Height() const
459+{
460+ return height_;
461+}
462+
463+int Shape::XOffset() const
464+{
465+ return xoffs_;
466+}
467+
468+int Shape::YOffset() const
469+{
470+ return yoffs_;
471+}
472+
473+} // decoration namespace
474+} // unity namespace
475
476=== added file 'decorations/DecorationsShape.h'
477--- decorations/DecorationsShape.h 1970-01-01 00:00:00 +0000
478+++ decorations/DecorationsShape.h 2016-08-01 13:05:54 +0000
479@@ -0,0 +1,54 @@
480+// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
481+/*
482+ * Copyright (C) 2016 Canonical Ltd
483+ *
484+ * This program is free software: you can redistribute it and/or modify
485+ * it under the terms of the GNU General Public License version 3 as
486+ * published by the Free Software Foundation.
487+ *
488+ * This program is distributed in the hope that it will be useful,
489+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
490+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
491+ * GNU General Public License for more details.
492+ *
493+ * You should have received a copy of the GNU General Public License
494+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
495+ *
496+ * Authored by: Eleni Maria Stea <elenimaria.stea@canonical.com>
497+ */
498+
499+#ifndef DECORATIONS_SHAPE_H_
500+#define DECORATIONS_SHAPE_H_
501+
502+#include <X11/Xlib.h>
503+#include <vector>
504+
505+namespace unity
506+{
507+namespace decoration
508+{
509+class Shape
510+{
511+public:
512+ Shape(Window);
513+
514+ int Width() const;
515+ int Height() const;
516+ int XOffset() const;
517+ int YOffset() const;
518+
519+ std::vector<XRectangle> const& GetRectangles() const;
520+
521+private:
522+ int width_;
523+ int height_;
524+ int xoffs_;
525+ int yoffs_;
526+
527+ std::vector<XRectangle> rectangles_;
528+};
529+
530+} // decoration namespace
531+} // unity namespace
532+
533+#endif //DECORATIONS_SHAPE_H_
534
535=== modified file 'launcher/DeviceNotificationDisplay.h'
536--- launcher/DeviceNotificationDisplay.h 2012-08-22 09:03:25 +0000
537+++ launcher/DeviceNotificationDisplay.h 2016-08-01 13:05:54 +0000
538@@ -36,7 +36,7 @@
539
540 virtual ~DeviceNotificationDisplay() {}
541
542- virtual void Display(std::string const& icon_name, std::string const& volume_name) = 0;
543+ virtual void Display(std::string const& volume_name) = 0;
544 };
545
546 }
547
548=== modified file 'launcher/DeviceNotificationDisplayImp.cpp'
549--- launcher/DeviceNotificationDisplayImp.cpp 2015-04-22 23:54:26 +0000
550+++ launcher/DeviceNotificationDisplayImp.cpp 2016-08-01 13:05:54 +0000
551@@ -20,49 +20,27 @@
552 #include "config.h"
553 #include <glib/gi18n-lib.h>
554 #include <libnotify/notify.h>
555-#include <sigc++/sigc++.h>
556 #include <UnityCore/GLibWrapper.h>
557
558 #include "DeviceNotificationDisplayImp.h"
559-#include "unity-shared/IconLoader.h"
560
561 namespace unity
562 {
563 namespace launcher
564 {
565
566-namespace
567-{
568-const unsigned icon_size = 48;
569-}
570-
571 //
572 // Start private implementation
573 //
574 class DeviceNotificationDisplayImp::Impl
575 {
576 public:
577- void Show(std::string const& icon_name, std::string const& volume_name)
578- {
579- IconLoader::GetDefault().LoadFromGIconString(icon_name, -1, icon_size,
580- sigc::bind(sigc::mem_fun(this, &Impl::ShowNotificationWhenIconIsReady), volume_name));
581- }
582-
583- void ShowNotificationWhenIconIsReady(std::string const& icon_name,
584- int max_width,
585- int max_height,
586- glib::Object<GdkPixbuf> const& pixbuf,
587- std::string const& volume_name)
588+ void Show(std::string const& volume_name)
589 {
590 glib::Object<NotifyNotification> notification(notify_notification_new(volume_name.c_str(),
591 _("The drive has been successfully ejected"),
592- nullptr));
593-
594+ "notification-device-eject"));
595 notify_notification_set_hint(notification, "x-canonical-private-synchronous", g_variant_new_boolean(TRUE));
596-
597- if (pixbuf)
598- notify_notification_set_image_from_pixbuf(notification, pixbuf);
599-
600 notify_notification_show(notification, nullptr);
601 }
602 };
603@@ -78,9 +56,9 @@
604 DeviceNotificationDisplayImp::~DeviceNotificationDisplayImp()
605 {}
606
607-void DeviceNotificationDisplayImp::Display(std::string const& icon_name, std::string const& volume_name)
608+void DeviceNotificationDisplayImp::Display(std::string const& volume_name)
609 {
610- pimpl->Show(icon_name, volume_name);
611+ pimpl->Show(volume_name);
612 }
613
614 }
615
616=== modified file 'launcher/DeviceNotificationDisplayImp.h'
617--- launcher/DeviceNotificationDisplayImp.h 2012-08-22 09:03:25 +0000
618+++ launcher/DeviceNotificationDisplayImp.h 2016-08-01 13:05:54 +0000
619@@ -33,7 +33,7 @@
620 DeviceNotificationDisplayImp();
621 virtual ~DeviceNotificationDisplayImp();
622
623- virtual void Display(std::string const& icon_name, std::string const& volume_name);
624+ virtual void Display(std::string const& volume_name);
625
626 private:
627 class Impl;
628
629=== modified file 'launcher/FileManagerLauncherIcon.cpp'
630--- launcher/FileManagerLauncherIcon.cpp 2016-07-05 10:21:45 +0000
631+++ launcher/FileManagerLauncherIcon.cpp 2016-08-01 13:05:54 +0000
632@@ -46,6 +46,9 @@
633 // We disconnect from ApplicationLauncherIcon app signals, as we manage them manually
634 signals_conn_.Clear();
635
636+ SetQuirk(Quirk::VISIBLE, false);
637+ SkipQuirkAnimation(Quirk::VISIBLE);
638+
639 signals_conn_.Add(app_->desktop_file.changed.connect([this](std::string const& desktop_file) {
640 LOG_DEBUG(logger) << tooltip_text() << " desktop_file now " << desktop_file;
641 UpdateDesktopFile();
642@@ -74,7 +77,6 @@
643 _source_manager.Remove(ICON_REMOVE_TIMEOUT);
644 }));
645
646-
647 UpdateStorageWindows();
648 }
649
650@@ -120,7 +122,7 @@
651
652 for (auto const& app_win : ApplicationLauncherIcon::GetManagedWindows())
653 {
654- if (IsLocationManaged(file_manager_->LocationForWindow(app_win)))
655+ if (WindowManager::Default().IsWindowMapped(app_win->window_id()) && IsLocationManaged(file_manager_->LocationForWindow(app_win)))
656 fm_windows.push_back(app_win);
657 }
658
659
660=== modified file 'launcher/TrashLauncherIcon.cpp'
661--- launcher/TrashLauncherIcon.cpp 2015-12-11 15:15:47 +0000
662+++ launcher/TrashLauncherIcon.cpp 2016-08-01 13:05:54 +0000
663@@ -55,23 +55,27 @@
664 SkipQuirkAnimation(Quirk::VISIBLE);
665 SetShortcut('t');
666
667- glib::Object<GFile> location(g_file_new_for_uri(TRASH_URI.c_str()));
668-
669- glib::Error err;
670- trash_monitor_ = g_file_monitor_directory(location, G_FILE_MONITOR_NONE, cancellable_, &err);
671- g_file_monitor_set_rate_limit(trash_monitor_, 1000);
672-
673- if (err)
674- {
675- LOG_ERROR(logger) << "Could not create file monitor for trash uri: " << err;
676- }
677- else
678- {
679- glib_signals_.Add<void, GFileMonitor*, GFile*, GFile*, GFileMonitorEvent>(trash_monitor_, "changed",
680- [this] (GFileMonitor*, GFile*, GFile*, GFileMonitorEvent) {
681- UpdateTrashIcon();
682- });
683- }
684+ _source_manager.AddIdle([this]{
685+ glib::Object<GFile> location(g_file_new_for_uri(TRASH_URI.c_str()));
686+
687+ glib::Error err;
688+ trash_monitor_ = g_file_monitor_directory(location, G_FILE_MONITOR_NONE, cancellable_, &err);
689+ g_file_monitor_set_rate_limit(trash_monitor_, 1000);
690+
691+ if (err)
692+ {
693+ LOG_ERROR(logger) << "Could not create file monitor for trash uri: " << err;
694+ }
695+ else
696+ {
697+ glib_signals_.Add<void, GFileMonitor*, GFile*, GFile*, GFileMonitorEvent>(trash_monitor_, "changed",
698+ [this] (GFileMonitor*, GFile*, GFile*, GFileMonitorEvent) {
699+ UpdateTrashIcon();
700+ });
701+ }
702+
703+ return false;
704+ });
705
706 UpdateTrashIcon();
707 UpdateStorageWindows();
708
709=== modified file 'launcher/VolumeLauncherIcon.cpp'
710--- launcher/VolumeLauncherIcon.cpp 2016-02-25 13:42:10 +0000
711+++ launcher/VolumeLauncherIcon.cpp 2016-08-01 13:05:54 +0000
712@@ -108,7 +108,7 @@
713
714 auto conn = std::make_shared<sigc::connection>();
715 *conn = volume_->ejected.connect([this, conn] {
716- notification_->Display(volume_->GetIconName(), volume_->GetName());
717+ notification_->Display(volume_->GetName());
718 conn->disconnect();
719 });
720 connections_.Add(*conn);
721
722=== modified file 'lockscreen/LockScreenAcceleratorController.cpp'
723--- lockscreen/LockScreenAcceleratorController.cpp 2016-07-05 10:22:08 +0000
724+++ lockscreen/LockScreenAcceleratorController.cpp 2016-08-01 13:05:54 +0000
725@@ -194,10 +194,20 @@
726 CompOption::Vector options;
727
728 if (action.state() & CompAction::StateInitKey)
729- action.initiate()(&action, 0, options);
730+ {
731+ auto const& initiate_cb = action.initiate();
732+
733+ if (!initiate_cb.empty())
734+ initiate_cb(&action, 0, options);
735+ }
736
737 if (action.state() & CompAction::StateTermKey)
738- action.terminate()(&action, CompAction::StateTermTapped, options);
739+ {
740+ auto const& terminate_cb = action.terminate();
741+
742+ if (!terminate_cb.empty())
743+ terminate_cb(&action, CompAction::StateTermTapped, options);
744+ }
745 }
746
747 Accelerators::Ptr const& AcceleratorController::GetAccelerators() const
748
749=== modified file 'plugins/unityshell/src/unityshell.cpp'
750--- plugins/unityshell/src/unityshell.cpp 2016-07-05 10:22:42 +0000
751+++ plugins/unityshell/src/unityshell.cpp 2016-08-01 13:05:54 +0000
752@@ -3013,9 +3013,9 @@
753 wAttrib.opacity = 0.0;
754 int old_index = gWindow->glPaintGetCurrentIndex();
755 gWindow->glPaintSetCurrentIndex(MAXSHORT);
756+ deco_win_->Paint(matrix, wAttrib, region, mask);
757 bool ret = gWindow->glPaint(wAttrib, matrix, region, mask);
758 gWindow->glPaintSetCurrentIndex(old_index);
759- deco_win_->Paint(matrix, wAttrib, region, mask);
760 return ret;
761 }
762 }
763@@ -3357,6 +3357,7 @@
764 PluginAdapter::Default().UpdateShowDesktopState();
765 break;
766 case CompWindowNotifyBeforeDestroy:
767+ deco_win_->Undecorate();
768 being_destroyed.emit();
769 break;
770 case CompWindowNotifyMinimize:
771
772=== modified file 'plugins/unityshell/unityshell.xml.in'
773--- plugins/unityshell/unityshell.xml.in 2016-04-05 13:23:27 +0000
774+++ plugins/unityshell/unityshell.xml.in 2016-08-01 13:05:54 +0000
775@@ -39,6 +39,8 @@
776 <plugin>compiztoolbox</plugin>
777 <plugin>scale</plugin>
778 <plugin>expo</plugin>
779+ <plugin>move</plugin>
780+ <plugin>resize</plugin>
781 </requirement>
782 <conflict>
783 <plugin>decor</plugin>
784
785=== modified file 'tests/test_mock_devices.h'
786--- tests/test_mock_devices.h 2016-01-24 14:35:49 +0000
787+++ tests/test_mock_devices.h 2016-08-01 13:05:54 +0000
788@@ -101,7 +101,7 @@
789 typedef std::shared_ptr<MockDeviceNotificationDisplay> Ptr;
790 typedef testing::NiceMock<MockDeviceNotificationDisplay> Nice;
791
792- MOCK_METHOD2(Display, void(std::string const& icon_name, std::string const& volume_name));
793+ MOCK_METHOD1(Display, void(std::string const& volume_name));
794 };
795
796 } // anonymous namespace
797
798=== modified file 'tests/test_unity_window_view.cpp'
799--- tests/test_unity_window_view.cpp 2016-03-31 02:03:55 +0000
800+++ tests/test_unity_window_view.cpp 2016-08-01 13:05:54 +0000
801@@ -82,12 +82,18 @@
802 view.closable = true;
803 ASSERT_NE(view.close_button_, nullptr);
804
805+ auto weak_ptr = nux::ObjectWeakPtr<IconTexture>(view.close_button_);
806+ ASSERT_TRUE(weak_ptr.IsValid());
807+
808 EXPECT_EQ(view.close_button_->texture(), view.style()->GetTexture(view.scale, WindowTextureType::CLOSE_ICON));
809 EXPECT_EQ(view.close_button_->GetParentObject(), &view);
810
811 int padding = view.style()->GetCloseButtonPadding().CP(view.scale);
812 EXPECT_EQ(view.close_button_->GetBaseX(), padding);
813 EXPECT_EQ(view.close_button_->GetBaseY(), padding);
814+
815+ view.closable = false;
816+ ASSERT_FALSE(weak_ptr.IsValid());
817 }
818
819 TEST_F(TestUnityWindowView, CloseButtonStates)
820
821=== modified file 'tests/test_volume_launcher_icon.cpp'
822--- tests/test_volume_launcher_icon.cpp 2016-01-24 14:35:49 +0000
823+++ tests/test_volume_launcher_icon.cpp 2016-08-01 13:05:54 +0000
824@@ -481,7 +481,7 @@
825 auto menuitem = GetMenuItemAtIndex(5);
826
827 EXPECT_CALL(*volume_, Eject());
828- EXPECT_CALL(*notifications_, Display(volume_->GetIconName(), volume_->GetName()));
829+ EXPECT_CALL(*notifications_, Display(volume_->GetName()));
830
831 ASSERT_STREQ(dbusmenu_menuitem_property_get(menuitem, DBUSMENU_MENUITEM_PROP_LABEL), "Eject");
832 EXPECT_TRUE(dbusmenu_menuitem_property_get_bool(menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE));
833@@ -573,7 +573,7 @@
834 .WillRepeatedly(Return(true));
835
836 EXPECT_CALL(*volume_, Eject());
837- EXPECT_CALL(*notifications_, Display(volume_->GetIconName(), volume_->GetName()));
838+ EXPECT_CALL(*notifications_, Display(volume_->GetName()));
839 icon_->EjectAndShowNotification();
840 }
841
842
843=== modified file 'tools/CMakeLists.txt'
844--- tools/CMakeLists.txt 2016-02-09 01:26:22 +0000
845+++ tools/CMakeLists.txt 2016-08-01 13:05:54 +0000
846@@ -6,3 +6,25 @@
847 configure_file (${CMAKE_CURRENT_SOURCE_DIR}/unity.cmake ${CMAKE_BINARY_DIR}/bin/unity)
848 install(FILES ${CMAKE_BINARY_DIR}/bin/unity PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ
849 GROUP_EXECUTE WORLD_READ WORLD_EXECUTE DESTINATION ${CMAKE_INSTALL_BINDIR})
850+
851+#
852+# unity-active-plugins-safety-check
853+#
854+pkg_check_modules(UAPSC_DEPS REQUIRED libcompizconfig)
855+
856+set(CFLAGS
857+ ${UAPSC_DEPS_CFLAGS}
858+ ${UAPSC_DEPS_CFLAGS_OTHER}
859+ )
860+
861+string (REPLACE ";" " " CFLAGS "${CFLAGS}")
862+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CFLAGS}")
863+
864+set(LIBS ${UAPSC_DEPS_LIBRARIES})
865+
866+set(LIB_PATHS ${UAPSC_DEPS_LIBRARY_DIRS})
867+link_directories(${LIB_PATHS})
868+
869+add_executable(unity-active-plugins-safety-check unity_active_plugins_safety_check.cpp)
870+target_link_libraries(unity-active-plugins-safety-check ${LIBS})
871+install(TARGETS unity-active-plugins-safety-check DESTINATION ${CMAKE_INSTALL_LIBDIR}/unity/)
872
873=== modified file 'tools/unity.cmake'
874--- tools/unity.cmake 2016-04-08 18:13:40 +0000
875+++ tools/unity.cmake 2016-08-01 13:05:54 +0000
876@@ -59,6 +59,12 @@
877
878 os.environ['COMPIZ_CONFIG_PROFILE'] = 'ubuntu'
879
880+ try:
881+ if subprocess.call('/usr/lib/nux/unity_support_test -f'.split()) > 0:
882+ os.environ['COMPIZ_CONFIG_PROFILE'] = 'ubuntu-lowgfx'
883+ except:
884+ pass
885+
886 if not 'DISPLAY' in os.environ:
887 # take an optimistic chance and warn about it :)
888 print("WARNING: no DISPLAY variable set, setting it to :0")
889
890=== added file 'tools/unity_active_plugins_safety_check.cpp'
891--- tools/unity_active_plugins_safety_check.cpp 1970-01-01 00:00:00 +0000
892+++ tools/unity_active_plugins_safety_check.cpp 2016-08-01 13:05:54 +0000
893@@ -0,0 +1,83 @@
894+/*
895+ * Copyright (C) 2016 Canonical Ltd
896+ *
897+ * This program is free software: you can redistribute it and/or modify
898+ * it under the terms of the GNU General Public License version 3 as
899+ * published by the Free Software Foundation.
900+ *
901+ * This program is distributed in the hope that it will be useful,
902+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
903+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
904+ * GNU General Public License for more details.
905+ *
906+ * You should have received a copy of the GNU General Public License
907+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
908+ *
909+ * Authored by: Andrea Azzarone <andrea.azzarone@canonical.com>
910+ */
911+
912+#include <ccs.h>
913+#include <gio/gio.h>
914+
915+#include <iostream>
916+#include <string>
917+
918+extern const CCSInterfaceTable ccsDefaultInterfaceTable;
919+
920+void PluginSetActiveWithDeps(CCSContext* context, std::string const& plugin_name)
921+{
922+ if (plugin_name.empty())
923+ return;
924+
925+ auto plugin = ccsFindPlugin(context, plugin_name.c_str());
926+
927+ if (!plugin)
928+ return;
929+
930+ auto reqs = ccsPluginGetRequiresPlugins(plugin);
931+ for (auto req = reqs; req; req = req->next)
932+ {
933+ if (req->data && req->data->value)
934+ {
935+ std::string name = req->data->value;
936+ PluginSetActiveWithDeps(context, name.c_str());
937+ }
938+ }
939+
940+ if (!ccsPluginIsActive(context, plugin_name.c_str())) {
941+ std::cout << "Setting plugin '" << plugin_name << "' to active" << std::endl;
942+ ccsPluginSetActive(plugin, true);
943+ }
944+
945+ auto conflicts = ccsPluginGetConflictPlugins(plugin);
946+ for (auto con = conflicts; con; con = con->next)
947+ {
948+ if (con->data && con->data->value)
949+ {
950+ std::string name = con->data->value;
951+ auto plugin = ccsFindPlugin(context, name.c_str());
952+
953+ if (ccsPluginIsActive(context, name.c_str()))
954+ {
955+ std::cout << "Setting plugin '" << name << "' to non-active" << std::endl;
956+ ccsPluginSetActive(plugin, false);
957+ }
958+ }
959+ }
960+}
961+
962+int main()
963+{
964+ auto context = ccsContextNew (0, &ccsDefaultInterfaceTable);
965+
966+ if (!context)
967+ return -1;
968+
969+ PluginSetActiveWithDeps(context, "unityshell");
970+
971+ ccsWriteChangedSettings(context);
972+ g_settings_sync();
973+ ccsFreeContext(context);
974+
975+ return 0;
976+}
977
978=== modified file 'unity-shared/CompizUtils.cpp'
979--- unity-shared/CompizUtils.cpp 2015-11-02 14:58:01 +0000
980+++ unity-shared/CompizUtils.cpp 2016-08-01 13:05:54 +0000
981@@ -211,11 +211,10 @@
982 }
983 }
984
985- if (region.boundingRect() != win->geometry()) // Shaped windows
986- return elements;
987+ elements |= DecorationElement::SHADOW;
988
989- if (rectangular)
990- elements |= DecorationElement::SHADOW;
991+ if (!rectangular)
992+ elements |= DecorationElement::SHAPED;
993
994 if (!win->overrideRedirect() &&
995 (win->type() & DECORABLE_WINDOW_TYPES) &&
996
997=== modified file 'unity-shared/CompizUtils.h'
998--- unity-shared/CompizUtils.h 2015-11-02 14:58:01 +0000
999+++ unity-shared/CompizUtils.h 2016-08-01 13:05:54 +0000
1000@@ -133,7 +133,8 @@
1001 NONE = 0,
1002 EDGE = (1 << 0),
1003 SHADOW = (1 << 1),
1004- BORDER = (1 << 2),
1005+ SHAPED = (1 << 2),
1006+ BORDER = (1 << 3),
1007 FULL = EDGE|SHADOW|BORDER
1008 };
1009 }
1010
1011=== modified file 'unity-shared/PluginAdapter.cpp'
1012--- unity-shared/PluginAdapter.cpp 2016-03-18 18:58:26 +0000
1013+++ unity-shared/PluginAdapter.cpp 2016-08-01 13:05:54 +0000
1014@@ -630,7 +630,7 @@
1015 CompWindow* window = m_Screen->findWindow(window_id);
1016 if (window)
1017 return window->mapNum () > 0;
1018- return true;
1019+ return false;
1020 }
1021
1022 bool PluginAdapter::IsWindowVisible(Window window_id) const
1023
1024=== modified file 'unity-shared/TextInput.cpp'
1025--- unity-shared/TextInput.cpp 2016-03-31 05:57:11 +0000
1026+++ unity-shared/TextInput.cpp 2016-08-01 13:05:54 +0000
1027@@ -104,7 +104,6 @@
1028 , scale(1.0)
1029 , bg_layer_(new nux::ColorLayer(nux::Color(0xff595853), true))
1030 , caps_lock_on(false)
1031- , num_lock_on(false)
1032 , last_width_(-1)
1033 , last_height_(-1)
1034 {
1035@@ -146,9 +145,8 @@
1036
1037 // Caps lock warning
1038 warning_ = new IconTexture(LoadWarningIcon(DEFAULT_ICON_SIZE.CP(scale)));
1039- warning_->SetVisible(caps_lock_on() || num_lock_on());
1040+ warning_->SetVisible(caps_lock_on());
1041 layout_->AddView(warning_, 0, nux::MINOR_POSITION_CENTER, nux::MINOR_SIZE_FULL);
1042- num_lock_on.changed.connect(sigc::mem_fun(this, &TextInput::OnLockStateChanged));
1043 caps_lock_on.changed.connect(sigc::mem_fun(this, &TextInput::OnLockStateChanged));
1044
1045 show_lock_warnings.changed.connect(sigc::hide(sigc::mem_fun(this, &TextInput::CheckLocks)));
1046@@ -249,7 +247,6 @@
1047 {
1048 GdkKeymap* keymap = gdk_keymap_get_default();
1049 caps_lock_on = gdk_keymap_get_caps_lock_state(keymap) ? true : false;
1050- num_lock_on = gdk_keymap_get_num_lock_state(keymap) ? true : false;
1051 }
1052
1053 void TextInput::OnLockStateChanged(bool)
1054@@ -260,8 +257,8 @@
1055 return;
1056 }
1057
1058- warning_->SetVisible(caps_lock_on() || num_lock_on());
1059- warning_->SetOpacity((num_lock_on() && !caps_lock_on()) ? 0.3 : 1.0);
1060+ warning_->SetVisible(caps_lock_on());
1061+ warning_->SetOpacity(1.0);
1062 warning_tooltip_.Release();
1063 QueueRelayout();
1064 QueueDraw();
1065@@ -345,18 +342,10 @@
1066
1067 pango_layout_set_height(layout, -1); //avoid wrap lines
1068
1069- if (caps_lock_on() && num_lock_on())
1070- {
1071- pango_layout_set_text(layout, _("Caps lock and Num lock are on"), -1);
1072- }
1073- else if (caps_lock_on())
1074+ if (caps_lock_on())
1075 {
1076 pango_layout_set_text(layout, _("Caps lock is on"), -1);
1077 }
1078- else if (num_lock_on())
1079- {
1080- pango_layout_set_text(layout, _("Num lock is on"), -1);
1081- }
1082
1083 nux::Size extents;
1084 pango_layout_get_pixel_size(layout, &extents.width, &extents.height);
1085
1086=== modified file 'unity-shared/TextInput.h'
1087--- unity-shared/TextInput.h 2016-03-31 05:57:11 +0000
1088+++ unity-shared/TextInput.h 2016-08-01 13:05:54 +0000
1089@@ -124,7 +124,6 @@
1090 SearchBarSpinner* spinner_;
1091
1092 nux::Property<bool> caps_lock_on;
1093- nux::Property<bool> num_lock_on;
1094 int last_width_;
1095 int last_height_;
1096
1097
1098=== modified file 'unity-shared/UnityWindowView.cpp'
1099--- unity-shared/UnityWindowView.cpp 2016-07-05 10:22:42 +0000
1100+++ unity-shared/UnityWindowView.cpp 2016-08-01 13:05:54 +0000
1101@@ -145,7 +145,12 @@
1102 {
1103 if (!closable)
1104 {
1105- close_button_ = nullptr;
1106+ if (close_button_)
1107+ {
1108+ close_button_->UnParentObject();
1109+ close_button_ = nullptr;
1110+ }
1111+
1112 return;
1113 }
1114
1115
1116=== renamed file 'debian/unity7.conf' => 'unity7.conf.in'
1117--- debian/unity7.conf 2016-07-05 10:22:49 +0000
1118+++ unity7.conf.in 2016-08-01 13:05:54 +0000
1119@@ -21,6 +21,9 @@
1120
1121 echo "Using compiz profile '$compiz_profile'"
1122 initctl set-env -g COMPIZ_CONFIG_PROFILE="$compiz_profile"
1123+ export COMPIZ_CONFIG_PROFILE="$compiz_profile"
1124+
1125+ ${CMAKE_INSTALL_FULL_LIBDIR}/unity/unity-active-plugins-safety-check
1126 end script
1127
1128 respawn

Subscribers

People subscribed via source and target branches

to all changes: