Merge lp:~unity-team/unity/unity.blur-but-faster-fbo-disabler into lp:~unity-team/unity/unity.blur-but-faster

Proposed by Sam Spilsbury
Status: Rejected
Rejected by: Gord Allott
Proposed branch: lp:~unity-team/unity/unity.blur-but-faster-fbo-disabler
Merge into: lp:~unity-team/unity/unity.blur-but-faster
Diff against target: 550 lines (+118/-70)
7 files modified
plugins/unityshell/src/BackgroundEffectHelper.cpp (+16/-3)
plugins/unityshell/src/BackgroundEffectHelper.h (+3/-2)
plugins/unityshell/src/DashController.cpp (+2/-0)
plugins/unityshell/src/DashView.cpp (+3/-2)
plugins/unityshell/src/PanelView.cpp (+17/-4)
plugins/unityshell/src/unityshell.cpp (+66/-50)
plugins/unityshell/src/unityshell.h (+11/-9)
To merge this branch: bzr merge lp:~unity-team/unity/unity.blur-but-faster-fbo-disabler
Reviewer Review Type Date Requested Status
Gord Allott (community) Needs Fixing
Review via email: mp+72288@code.launchpad.net

Description of the change

This basically disables painting and binding the fbo when we're not using it.

To post a comment you must log in.
Revision history for this message
Gord Allott (gordallott) wrote :

conflicts with trunk and if this is based on https://code.launchpad.net/~unity-team/unity/unity.blur_fixes_fbo/+merge/72187 then it should be marked as such in the review, there is a box to state this branch depends on another box, it makes launchpad understand the diffs better

review: Needs Fixing

Unmerged revisions

1404. By Sam Spilsbury

Merge in blur fbo branch

1403. By Jason Smith

dramatically improve blur performance

1402. By Jason Smith

fix crash when view window is null

1401. By Jay Taoko

Essential Nux event signals have been renamed. To ease the transition, the former name have been preserved via macros:

#define OnMouseMove mouse_move
#define OnMouseDown mouse_down
#define OnMouseUp mouse_up
#define OnMouseEnter mouse_enter
#define OnMouseLeave mouse_leave
#define OnMouseClick mouse_click
#define OnMouseDoubleClick mouse_double_click
#define OnMouseDrag mouse_drag
#define OnMouseWheel mouse_wheel
#define OnMouseDownOutsideArea mouse_down_outside_pointer_grab_area
#define OnKeyEvent key_down
#define OnKeyReleased key_up
#define OnStartKeyboardReceiver begin_key_focus
#define OnStopKeyboardReceiver end_key_focus

This branch is using the new signals names. Subsequently, the old signals will be removed in Nux.

1400. By Neil J. Patel

Select the current search string when opening the dash to allow for typing straight away

1399. By Andrea Azzarone

Merge awesome work of Anrea Azzarone to make launcher detect contents of DND before DND even enters launcher

1398. By Jason Smith

fix typo

1397. By Andrea Azzarone

[merge] Bug #824831: Fallback window controls shown for maximized windows

1396. By Neil J. Patel

Protect against a null iter.second

1395. By Jason Smith

dont ask nux to process events when the switcher is open, those events are not meant for it.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'plugins/unityshell/src/BackgroundEffectHelper.cpp'
2--- plugins/unityshell/src/BackgroundEffectHelper.cpp 2011-08-20 00:58:03 +0000
3+++ plugins/unityshell/src/BackgroundEffectHelper.cpp 2011-08-20 08:35:23 +0000
4@@ -33,7 +33,8 @@
5 nux::Property<bool> BackgroundEffectHelper::updates_enabled (true);
6
7
8-BackgroundEffectHelper::BackgroundEffectHelper()
9+BackgroundEffectHelper::BackgroundEffectHelper() :
10+ noise_texture_ (nux::CreateTextureFromFile(PKGDATADIR"/dash_noise.png"))
11 {
12 enabled = true;
13 enabled.changed.connect (sigc::mem_fun (this, &BackgroundEffectHelper::OnEnabledChanged));
14@@ -43,8 +44,8 @@
15
16 BackgroundEffectHelper::~BackgroundEffectHelper()
17 {
18+ Unregister (this);
19 noise_texture_->UnReference();
20- Unregister(this);
21 }
22
23 void BackgroundEffectHelper::OnEnabledChanged(bool value)
24@@ -87,6 +88,15 @@
25 }
26 }
27
28+bool BackgroundEffectHelper::EnabledBackgroundHelpers()
29+{
30+ for (BackgroundEffectHelper *bg_effect_helper : registered_list_)
31+ if (bg_effect_helper->enabled)
32+ return true;
33+
34+ return false;
35+}
36+
37 void BackgroundEffectHelper::Register (BackgroundEffectHelper *self)
38 {
39 registered_list_.push_back(self);
40@@ -118,7 +128,10 @@
41
42 blur_geometry_ = nux::Geometry(0, 0, graphics_engine->GetWindowWidth(), graphics_engine->GetWindowHeight()).Intersect(geo);
43
44- if (blur_geometry_.IsNull() || blur_type == BLUR_NONE || !nux::GetGraphicsDisplay()->GetGpuDevice()->backup_texture0_.IsValid())
45+ if (blur_geometry_.IsNull() ||
46+ blur_type == BLUR_NONE ||
47+ !nux::GetGraphicsDisplay()->GetGpuDevice()->backup_texture0_.IsValid() ||
48+ !enabled)
49 {
50 return nux::ObjectPtr<nux::IOpenGLBaseTexture>(NULL);
51 }
52
53=== modified file 'plugins/unityshell/src/BackgroundEffectHelper.h'
54--- plugins/unityshell/src/BackgroundEffectHelper.h 2011-08-20 00:58:03 +0000
55+++ plugins/unityshell/src/BackgroundEffectHelper.h 2011-08-20 08:35:23 +0000
56@@ -54,6 +54,7 @@
57 void DirtyCache ();
58
59 static void QueueDrawOnOwners ();
60+ static bool EnabledBackgroundHelpers ();
61
62 static void SetDamageBounds(nux::Geometry const& damage);
63 static void ResetDamageBounds();
64@@ -64,7 +65,6 @@
65 static nux::Property<float> sigma_low;
66 static nux::Property<bool> updates_enabled;
67
68-protected:
69 static void Register (BackgroundEffectHelper *self);
70 static void Unregister (BackgroundEffectHelper *self);
71
72@@ -79,7 +79,8 @@
73 nux::ObjectPtr<nux::IOpenGLBaseTexture> ds_temp_device_texture1_;
74
75 nux::ObjectPtr<nux::IOpenGLBaseTexture> blur_texture_;
76- nux::Geometry blur_geometry_;
77+ nux::Geometry blur_geometry_;
78+ bool registered_;
79
80 static std::list<BackgroundEffectHelper*> registered_list_;
81 static nux::Geometry damage_bounds_;
82
83=== modified file 'plugins/unityshell/src/DashController.cpp'
84--- plugins/unityshell/src/DashController.cpp 2011-08-20 00:58:03 +0000
85+++ plugins/unityshell/src/DashController.cpp 2011-08-20 08:35:23 +0000
86@@ -209,6 +209,8 @@
87 window_->EnableInputWindow(false, "Dash", true, false);
88 visible_ = false;
89
90+ view_->AboutToHide ();
91+
92 StartShowHideTimeline();
93
94 ubus_manager_.SendMessage(UBUS_PLACE_VIEW_HIDDEN);
95
96=== modified file 'plugins/unityshell/src/DashView.cpp'
97--- plugins/unityshell/src/DashView.cpp 2011-08-20 00:58:03 +0000
98+++ plugins/unityshell/src/DashView.cpp 2011-08-20 08:35:23 +0000
99@@ -62,7 +62,8 @@
100 }
101
102 DashView::~DashView()
103-{}
104+{
105+}
106
107 void DashView::AboutToShow()
108 {
109@@ -209,7 +210,7 @@
110 nux::Geometry blur_geo(geo_absolute.x, geo_absolute.y, content_geo_.width, content_geo_.height);
111 bg_blur_texture_ = bg_effect_helper_.GetBlurRegion(blur_geo);
112
113- if (bg_blur_texture_.IsValid() && paint_blur)
114+ if (bg_blur_texture_.IsValid() && paint_blur)
115 {
116 nux::TexCoordXForm texxform_blur_bg;
117 texxform_blur_bg.flip_v_coord = true;
118
119=== modified file 'plugins/unityshell/src/PanelView.cpp'
120--- plugins/unityshell/src/PanelView.cpp 2011-08-20 00:58:03 +0000
121+++ plugins/unityshell/src/PanelView.cpp 2011-08-20 08:35:23 +0000
122@@ -52,7 +52,8 @@
123 _opacity(1.0f),
124 _is_primary(false),
125 _monitor(0),
126- _dash_is_open(false)
127+ _dash_is_open(false),
128+ bg_blur_texture_ (NULL)
129 {
130 _needs_geo_sync = false;
131 _style = new PanelStyle();
132@@ -101,6 +102,7 @@
133 ubus_server_send_message (ubus, UBUS_BACKGROUND_REQUEST_COLOUR_EMIT, NULL);
134
135 _track_menu_pointer_id = 0;
136+
137 bg_effect_helper_.owner = this;
138 }
139
140@@ -186,12 +188,16 @@
141
142 GfxContext.PushClippingRectangle(GetGeometry());
143
144- if (BackgroundEffectHelper::blur_type != BLUR_NONE && (_dash_is_open || _opacity != 1.0f))
145+ if (BackgroundEffectHelper::blur_type != BLUR_NONE &&
146+ (_dash_is_open || _opacity != 1.0f))
147 {
148 nux::Geometry blur_geo(geo_absolute.x, geo_absolute.y, geo.width, geo.height);
149 bg_blur_texture_ = bg_effect_helper_.GetBlurRegion(blur_geo);
150
151- if (bg_blur_texture_.IsValid() && BackgroundEffectHelper::blur_type != BLUR_NONE && (_dash_is_open || _opacity != 1.0f))
152+ if (!bg_effect_helper_.enabled)
153+ bg_effect_helper_.enabled = true;
154+
155+ if (bg_blur_texture_.IsValid())
156 {
157 nux::TexCoordXForm texxform_blur_bg;
158 texxform_blur_bg.flip_v_coord = true;
159@@ -217,6 +223,11 @@
160 GfxContext.PopClippingRectangle();
161 }
162 }
163+ else
164+ {
165+ if (bg_effect_helper_.enabled)
166+ bg_effect_helper_.enabled = false;
167+ }
168
169 nux::GetPainter().RenderSinglePaintLayer(GfxContext, GetGeometry(), _bg_layer);
170
171@@ -240,7 +251,9 @@
172 GfxContext.GetRenderStates().SetBlend(true);
173 GfxContext.GetRenderStates().SetPremultipliedBlend(nux::SRC_OVER);
174
175- if (bg_blur_texture_.IsValid() && BackgroundEffectHelper::blur_type != BLUR_NONE && (_dash_is_open || _opacity != 1.0f))
176+ if (bg_blur_texture_.IsValid()
177+ && BackgroundEffectHelper::blur_type != BLUR_NONE
178+ && (_dash_is_open || _opacity != 1.0f))
179 {
180 nux::Geometry geo_absolute = GetAbsoluteGeometry ();
181 nux::TexCoordXForm texxform_blur_bg;
182
183=== modified file 'plugins/unityshell/src/unityshell.cpp'
184--- plugins/unityshell/src/unityshell.cpp 2011-08-20 00:58:03 +0000
185+++ plugins/unityshell/src/unityshell.cpp 2011-08-20 08:35:23 +0000
186@@ -111,7 +111,7 @@
187 , _key_nav_mode_requested(false)
188 , _last_output(nullptr)
189 , switcher_desktop_icon(nullptr)
190- , mActiveFbo (0)
191+ , _active_fbo (0)
192 , grab_index_ (0)
193 {
194 Timer timer;
195@@ -162,10 +162,9 @@
196
197 if (GL::fbo)
198 {
199- foreach (CompOutput &o, screen->outputDevs ())
200- uScreen->mFbos[&o] = UnityFBO::Ptr (new UnityFBO (&o));
201-
202- uScreen->mFbos[&(screen->fullscreenOutput ())] = UnityFBO::Ptr (new UnityFBO (&(screen->fullscreenOutput ())));
203+ CompRect geometry = CompRect (0, 0, screen->width (), screen->height ());
204+
205+ uScreen->_fbo = UnityFBO::Ptr (new UnityFBO (geometry));
206 }
207
208 optionSetLauncherHideModeNotify(boost::bind(&UnityScreen::optionChanged, this, _1, _2));
209@@ -305,6 +304,10 @@
210 * drivers (lp:703140). */
211 glDisable(GL_LIGHTING);
212
213+ if (BackgroundEffectHelper::EnabledBackgroundHelpers () &&
214+ _fbo->status ())
215+ _fbo->unbind ();
216+
217 /* reset matrices */
218 glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT |
219 GL_TEXTURE_BIT | GL_COLOR_BUFFER_BIT | GL_SCISSOR_BIT);
220@@ -320,8 +323,6 @@
221
222 void UnityScreen::nuxEpilogue()
223 {
224- (*GL::bindFramebuffer)(GL_FRAMEBUFFER_EXT, mActiveFbo);
225-
226 glMatrixMode(GL_PROJECTION);
227 glLoadIdentity();
228 glMatrixMode(GL_MODELVIEW);
229@@ -343,6 +344,9 @@
230 glPopAttrib();
231
232 glDisable(GL_SCISSOR_TEST);
233+
234+ if (BackgroundEffectHelper::EnabledBackgroundHelpers ())
235+ _fbo->bind ();
236 }
237
238 void UnityScreen::OnLauncherHiddenChanged()
239@@ -353,17 +357,10 @@
240 screen->removeAction(&optionGetLauncherRevealEdge());
241 }
242
243-void UnityScreen::paintPanelShadow(const GLMatrix& matrix)
244+void UnityScreen::paintPanelShadow()
245 {
246- if (relayoutSourceId > 0)
247- return;
248-
249- if (PluginAdapter::Default()->IsExpoActive())
250- return;
251-
252- nuxPrologue();
253-
254 CompOutput* output = _last_output;
255+ GLMatrix sTransform = GLMatrix ();
256 float vc[4];
257 float h = 20.0f;
258 float w = 1.0f;
259@@ -374,6 +371,14 @@
260 float x2 = x1 + output->width();
261 float y2 = y1 + h;
262
263+ if (relayoutSourceId > 0)
264+ return;
265+
266+ if (PluginAdapter::Default()->IsExpoActive())
267+ return;
268+
269+ sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA);
270+
271 vc[0] = x1;
272 vc[1] = x2;
273 vc[2] = y1;
274@@ -411,7 +416,6 @@
275 glDisable(GL_BLEND);
276 }
277 }
278- nuxEpilogue();
279 }
280
281 void
282@@ -430,24 +434,33 @@
283 {
284 CompOutput *output = _last_output;
285
286- mFbos[output]->unbind ();
287-
288- /* Draw the bit of the relevant framebuffer for each output */
289- mFbos[output]->paint ();
290-
291 nuxPrologue();
292- nux::ObjectPtr<nux::IOpenGLTexture2D> device_texture =
293- nux::GetGraphicsDisplay()->GetGpuDevice()->CreateTexture2DFromID(mFbos[output]->texture(),
294- output->width(), output->height(), 1, nux::BITFMT_R8G8B8A8);
295-
296- nux::GetGraphicsDisplay()->GetGpuDevice()->backup_texture0_ = device_texture;
297+
298+ if (BackgroundEffectHelper::EnabledBackgroundHelpers () &&
299+ _fbo->status ())
300+ {
301+ _fbo->paint (output);
302+ nux::ObjectPtr<nux::IOpenGLTexture2D> device_texture =
303+ nux::GetGraphicsDisplay()->GetGpuDevice()->CreateTexture2DFromID(_fbo->texture (),
304+ output->width(),
305+ output->height(),
306+ 1,
307+ nux::BITFMT_R8G8B8A8);
308+
309+ nux::GetGraphicsDisplay()->GetGpuDevice()->backup_texture0_ = device_texture;
310+ }
311
312 nux::Geometry geo = nux::Geometry (output->x (), output->y (), output->width (), output->height ());
313
314 wt->RenderInterfaceFromForeignCmd (&geo);
315 nuxEpilogue();
316
317-if (switcherController->Visible ())
318+ /* We aren't painting the fbo after this so no need to have it bound */
319+ if (BackgroundEffectHelper::EnabledBackgroundHelpers () &&
320+ _fbo->status ())
321+ _fbo->unbind ();
322+
323+ if (switcherController->Visible ())
324 {
325 LayoutWindowList targets = switcherController->ExternalRenderTargets ();
326
327@@ -502,9 +515,6 @@
328 {
329 bool ret;
330
331- /* bind the framebuffer here */
332- mFbos[output]->bind ();
333-
334 doShellRepaint = true;
335 allowWindowPaint = true;
336 _last_output = output;
337@@ -527,8 +537,6 @@
338 CompOutput* output,
339 unsigned int mask)
340 {
341- /* bind the framebuffer here */
342- mFbos[output]->bind ();
343 allowWindowPaint = false;
344 /* urgh */
345 gScreen->glPaintOutput(attrib, transform, region, output, mask);
346@@ -558,6 +566,14 @@
347
348 }
349
350+void UnityScreen::paint (CompOutput::ptrList &outputs,
351+ unsigned int mask)
352+{
353+ if (BackgroundEffectHelper::EnabledBackgroundHelpers ())
354+ _fbo->bind ();
355+
356+ cScreen->paint (outputs, mask);
357+}
358 /* Grab changed nux regions and add damage rects for them */
359 void UnityScreen::damageNuxRegions()
360 {
361@@ -1111,7 +1127,7 @@
362
363 if (window->type() == CompWindowTypeDesktopMask)
364 {
365- uScreen->paintPanelShadow(matrix);
366+ uScreen->paintPanelShadow();
367 }
368
369 return ret;
370@@ -1281,10 +1297,9 @@
371
372 if (GL::fbo)
373 {
374- foreach (CompOutput &o, screen->outputDevs ())
375- uScreen->mFbos[&o] = UnityFBO::Ptr (new UnityFBO (&o));
376-
377- uScreen->mFbos[&(screen->fullscreenOutput ())] = UnityFBO::Ptr (new UnityFBO (&(screen->fullscreenOutput ())));
378+ CompRect geometry = CompRect (0, 0, screen->width (), screen->height ());
379+
380+ uScreen->_fbo = UnityFBO::Ptr (new UnityFBO (geometry));
381 }
382
383 scr = gdk_screen_get_default ();
384@@ -1318,8 +1333,6 @@
385 {
386 UnityScreen* uScr = reinterpret_cast<UnityScreen*>(data);
387
388- uScreen->mFbos.clear ();
389-
390 uScr->NeedsRelayout ();
391 uScr->Relayout();
392 uScr->relayoutSourceId = 0;
393@@ -1350,18 +1363,17 @@
394 ScheduleRelayout(500);
395 }
396
397-void UnityFBO::paint ()
398+void UnityFBO::paint (CompOutput *output)
399 {
400- //CompositeScreen *cScreen = CompositeScreen::get (screen);
401- //unsigned int mask = cScreen->damageMask ();
402 float texx, texy, texwidth, texheight;
403
404 /* Draw the bit of the relevant framebuffer for each output */
405 GLMatrix transform;
406
407- glViewport (output->x (), screen->height () - output->y2 (), output->width (), output->height ());
408+ glPushAttrib (GL_VIEWPORT_BIT);
409+ glViewport (0, 0, screen->width (), screen->height ());
410
411- transform.toScreenSpace (output, -DEFAULT_Z_CAMERA);
412+ transform.toScreenSpace (&screen->fullscreenOutput (), -DEFAULT_Z_CAMERA);
413 glPushMatrix ();
414 glLoadMatrixf (transform.getMatrix ());
415
416@@ -1406,6 +1418,7 @@
417 glDisable (GL_SCISSOR_TEST);
418 glPopAttrib ();
419 }
420+ glPopAttrib ();
421
422 glPopMatrix();
423 }
424@@ -1417,6 +1430,7 @@
425
426 glDrawBuffer (GL_BACK);
427 glReadBuffer (GL_BACK);
428+ glPopAttrib ();
429
430 }
431
432@@ -1436,7 +1450,7 @@
433 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
434 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
435 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
436- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, output->width (), output->height (), 0, GL_BGRA,
437+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, mGeometry.width (), mGeometry.height (), 0, GL_BGRA,
438 #if IMAGE_BYTE_ORDER == MSBFirst
439 GL_UNSIGNED_INT_8_8_8_8_REV,
440 #else
441@@ -1502,21 +1516,23 @@
442 {
443 uScreen->setActiveFbo (mFboHandle);
444
445+ glPushAttrib (GL_VIEWPORT_BIT | GL_CURRENT_BIT);
446+
447 glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT);
448 glReadBuffer (GL_COLOR_ATTACHMENT0_EXT);
449
450 glViewport (0,
451 0,
452- output->width (),
453- output->height ());
454+ mGeometry.width (),
455+ mGeometry.height ());
456
457 }
458 }
459
460-UnityFBO::UnityFBO (CompOutput *o)
461+UnityFBO::UnityFBO (CompRect geometry)
462 : mFboStatus (false)
463 , mFBTexture (0)
464- , output (o)
465+ , mGeometry (geometry)
466 {
467 (*GL::genFramebuffers) (1, &mFboHandle);
468 }
469
470=== modified file 'plugins/unityshell/src/unityshell.h'
471--- plugins/unityshell/src/unityshell.h 2011-08-18 09:45:24 +0000
472+++ plugins/unityshell/src/unityshell.h 2011-08-20 08:35:23 +0000
473@@ -49,7 +49,7 @@
474
475 typedef boost::shared_ptr <UnityFBO> Ptr;
476
477- UnityFBO (CompOutput *o);
478+ UnityFBO (CompRect);
479 ~UnityFBO ();
480
481 public:
482@@ -58,7 +58,7 @@
483 void unbind ();
484
485 bool status ();
486- void paint ();
487+ void paint (CompOutput *);
488
489 GLuint texture () { return mFBTexture; }
490
491@@ -68,7 +68,7 @@
492 GLuint mFboHandle; // actual handle to the framebuffer_ext
493 bool mFboStatus; // did the framebuffer texture bind succeed
494 GLuint mFBTexture;
495- CompOutput *output;
496+ CompRect mGeometry;
497 };
498
499
500@@ -101,6 +101,9 @@
501 CompositeScreen* cScreen;
502 GLScreen* gScreen;
503
504+ /* grab everything into an fbo */
505+ void paint (CompOutput::ptrList &outputs, unsigned int);
506+
507 /* prepares nux for drawing */
508 void nuxPrologue();
509 /* pops nux draw stack */
510@@ -108,10 +111,9 @@
511
512 /* nux draw wrapper */
513 void paintDisplay(const CompRegion& region, const GLMatrix& transform, unsigned int mask);
514- void paintPanelShadow(const GLMatrix& matrix);
515+ void paintPanelShadow();
516
517 void preparePaint (int ms);
518- void paintFboForOutput (CompOutput *output);
519
520 /* paint on top of all windows if we could not find a window
521 * to paint underneath */
522@@ -175,7 +177,7 @@
523 void NeedsRelayout();
524 void ScheduleRelayout(guint timeout);
525
526- void setActiveFbo (GLuint fbo) { mActiveFbo = fbo; }
527+ void setActiveFbo (GLuint fbo) { _active_fbo = fbo; }
528
529 protected:
530 const gchar* GetName();
531@@ -250,8 +252,8 @@
532
533 unity::BGHash _bghash;
534
535- std::map <CompOutput *, UnityFBO::Ptr> mFbos;
536- GLuint mActiveFbo;
537+ UnityFBO::Ptr _fbo;
538+ GLuint _active_fbo;
539
540 bool queryForShader ();
541
542@@ -259,7 +261,7 @@
543 bool dash_is_open_;
544 CompScreen::GrabHandle grab_index_;
545
546- friend class UnityWindow;
547+ friend class UnityWindow;
548 };
549
550 class UnityWindow :

Subscribers

People subscribed via source and target branches

to all changes: