diff -Nru unity-7.5.0+17.10.20170707/debian/changelog unity-7.5.0+17.10.20170721.1/debian/changelog --- unity-7.5.0+17.10.20170707/debian/changelog 2017-07-28 13:40:21.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/debian/changelog 2017-07-28 13:40:21.000000000 +0000 @@ -1,3 +1,17 @@ +unity (7.5.0+17.10.20170721.1-0ubuntu1) artful; urgency=medium + + * GLibSignal: allow to block, unblock signals + * UnitySettings: use glib::Signal blocking for ignoring setting + changes + * UnitySettings: listen to compiz profile status in order to set + low_gfx value + * Launcher: disable or reduce most icon effects on lowgfx (LP: + #1700859) + * PanelController: ensure we disconnect from signals on destruction + (LP: #1504870) + + -- Marco Trevisan (TreviƱo) Fri, 21 Jul 2017 08:53:17 +0000 + unity (7.5.0+17.10.20170707-0ubuntu1) artful; urgency=medium [ Andrea Azzarone ] diff -Nru unity-7.5.0+17.10.20170707/launcher/Launcher.cpp unity-7.5.0+17.10.20170721.1/launcher/Launcher.cpp --- unity-7.5.0+17.10.20170707/launcher/Launcher.cpp 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/launcher/Launcher.cpp 2017-07-21 08:52:19.000000000 +0000 @@ -138,13 +138,6 @@ , drag_action_(nux::DNDACTION_NONE) , bg_effect_helper_(this) , launcher_position_(unity::Settings::Instance().launcher_position()) - , auto_hide_animation_(Settings::Instance().low_gfx ? 0 : ANIM_DURATION_SHORT) - , hover_animation_(Settings::Instance().low_gfx ? ANIM_DURATION_SHORT_SHORT : ANIM_DURATION) - , drag_over_animation_(Settings::Instance().low_gfx ? 0 : ANIM_DURATION_LONG) - , drag_out_animation_(Settings::Instance().low_gfx ? 0 : ANIM_DURATION_SHORT) - , drag_icon_animation_(Settings::Instance().low_gfx ? 0 : ANIM_DURATION_SHORT) - , dnd_hide_animation_(Settings::Instance().low_gfx ? 0 : ANIM_DURATION * 3) - , dash_showing_animation_(Settings::Instance().low_gfx ? 0 : ANIM_DURATION_DASH_SHOWING) , cv_(Settings::Instance().em(monitor)) { icon_renderer_->monitor = monitor(); @@ -199,17 +192,9 @@ }); Settings::Instance().dpi_changed.connect(sigc::mem_fun(this, &Launcher::OnDPIChanged)); - Settings::Instance().low_gfx.changed.connect(sigc::track_obj([this] (bool low_gfx) { - auto_hide_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION_SHORT); - hover_animation_.SetDuration(low_gfx ? ANIM_DURATION_SHORT_SHORT : ANIM_DURATION); - drag_over_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION_LONG); - drag_out_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION_SHORT); - drag_icon_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION_SHORT); - dnd_hide_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION * 3); - dash_showing_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION_DASH_SHOWING); - QueueDraw(); - }, *this)); + Settings::Instance().low_gfx.changed.connect(sigc::hide(sigc::mem_fun(this, &Launcher::UpdateAnimations))); + UpdateAnimations(); auto_hide_animation_.updated.connect(redraw_cb); hover_animation_.updated.connect(redraw_cb); drag_over_animation_.updated.connect(redraw_cb); @@ -1356,13 +1341,29 @@ SetLauncherMinimizeWindow(options->minimize_window_on_click); OnMonitorChanged(monitor); + UpdateAnimations(); + ConfigureBarrier(); + QueueDraw(); +} + +void Launcher::UpdateAnimations() +{ + bool low_gfx = Settings::Instance().low_gfx(); + + auto_hide_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION_SHORT); + hover_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION); + drag_over_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION_LONG); + drag_out_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION_SHORT); + drag_icon_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION_SHORT); + dnd_hide_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION * 3); + dash_showing_animation_.SetDuration(low_gfx ? 0 : ANIM_DURATION_DASH_SHOWING); + if (model_) { for (auto const& icon : *model_) SetupIconAnimations(icon); } - ConfigureBarrier(); QueueDraw(); } @@ -1739,23 +1740,26 @@ void Launcher::SetupIconAnimations(AbstractLauncherIcon::Ptr const& icon) { - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::VISIBLE, ANIM_DURATION_SHORT, monitor()); - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::RUNNING, ANIM_DURATION_SHORT, monitor()); - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::ACTIVE, ANIM_DURATION_SHORT, monitor()); - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::STARTING, (ANIM_DURATION_LONG * MAX_STARTING_BLINKS * STARTING_BLINK_LAMBDA * 2), monitor()); - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::PULSE_ONCE, (ANIM_DURATION_LONG * PULSE_BLINK_LAMBDA * 2), monitor()); - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::PRESENTED, ANIM_DURATION, monitor()); - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::UNFOLDED, ANIM_DURATION, monitor()); - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::SHIMMER, ANIM_DURATION_LONG, monitor()); - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::CENTER_SAVED, ANIM_DURATION, monitor()); - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::PROGRESS, ANIM_DURATION, monitor()); - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::DESAT, ANIM_DURATION_SHORT_SHORT, monitor()); - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::GLOW, ANIM_DURATION_SHORT, monitor()); + bool display = monitor(); + bool low_gfx = Settings::Instance().low_gfx(); + + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::VISIBLE, low_gfx ? 0 : ANIM_DURATION_SHORT, display); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::RUNNING, low_gfx ? 0 : ANIM_DURATION_SHORT, display); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::ACTIVE, low_gfx ? 0 : ANIM_DURATION_SHORT, display); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::STARTING, (ANIM_DURATION_LONG * MAX_STARTING_BLINKS * STARTING_BLINK_LAMBDA * 2), display); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::PULSE_ONCE, (ANIM_DURATION_LONG * PULSE_BLINK_LAMBDA * 2), display); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::PRESENTED, low_gfx ? 0 : ANIM_DURATION, display); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::UNFOLDED, low_gfx ? 0 : ANIM_DURATION, display); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::SHIMMER, low_gfx ? ANIM_DURATION_SHORT_SHORT : ANIM_DURATION_LONG, display); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::CENTER_SAVED, low_gfx ? ANIM_DURATION_SHORT_SHORT : ANIM_DURATION, display); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::PROGRESS, low_gfx ? ANIM_DURATION_SHORT_SHORT : ANIM_DURATION, display); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::DESAT, low_gfx ? 0 : ANIM_DURATION_SHORT_SHORT, display); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::GLOW, low_gfx ? 0 : ANIM_DURATION_SHORT, display); if (options()->urgent_animation() == URGENT_ANIMATION_WIGGLE) - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::URGENT, (ANIM_DURATION_SHORT * WIGGLE_CYCLES), monitor()); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::URGENT, (ANIM_DURATION_SHORT * WIGGLE_CYCLES), display); else - icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::URGENT, (ANIM_DURATION_LONG * URGENT_BLINKS * 2), monitor()); + icon->SetQuirkDuration(AbstractLauncherIcon::Quirk::URGENT, (ANIM_DURATION_LONG * URGENT_BLINKS * 2), display); } void Launcher::SetModel(LauncherModel::Ptr model) diff -Nru unity-7.5.0+17.10.20170707/launcher/Launcher.h unity-7.5.0+17.10.20170721.1/launcher/Launcher.h --- unity-7.5.0+17.10.20170707/launcher/Launcher.h 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/launcher/Launcher.h 2017-07-21 08:52:19.000000000 +0000 @@ -195,6 +195,7 @@ void OnOptionsChanged(Options::Ptr options); void OnOptionChanged(); void UpdateOptions(Options::Ptr options); + void UpdateAnimations(); #ifdef NUX_GESTURES_SUPPORT void OnDragStart(const nux::GestureEvent &event); diff -Nru unity-7.5.0+17.10.20170707/panel/PanelController.cpp unity-7.5.0+17.10.20170721.1/panel/PanelController.cpp --- unity-7.5.0+17.10.20170707/panel/PanelController.cpp 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/panel/PanelController.cpp 2017-07-21 08:52:29.000000000 +0000 @@ -33,9 +33,8 @@ const char* window_title = "unity-panel"; -class Controller::Impl +struct Controller::Impl : sigc::trackable { -public: Impl(Controller*, menu::Manager::Ptr const&, ui::EdgeBarrierController::Ptr const&); ~Impl(); diff -Nru unity-7.5.0+17.10.20170707/plugins/unityshell/src/unityshell.cpp unity-7.5.0+17.10.20170721.1/plugins/unityshell/src/unityshell.cpp --- unity-7.5.0+17.10.20170707/plugins/unityshell/src/unityshell.cpp 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/plugins/unityshell/src/unityshell.cpp 2017-07-21 08:52:10.000000000 +0000 @@ -293,24 +293,18 @@ } //In case of software rendering then enable lowgfx mode. + std::string lowgfx_env = glib::gchar_to_string(getenv("UNITY_LOW_GFX_MODE")); std::string renderer = ANSI_TO_TCHAR(NUX_REINTERPRET_CAST(const char *, glGetString(GL_RENDERER))); if (renderer.find("Software Rasterizer") != std::string::npos || renderer.find("Mesa X11") != std::string::npos || renderer.find("llvmpipe") != std::string::npos || renderer.find("softpipe") != std::string::npos || - (getenv("UNITY_LOW_GFX_MODE") != NULL && atoi(getenv("UNITY_LOW_GFX_MODE")) == 1)) + atoi(lowgfx_env.c_str()) == 1) { - unity_settings_.low_gfx = true; + if (lowgfx_env.empty() || atoi(lowgfx_env.c_str()) != 0) + unity_settings_.supports_3d = false; } - if (getenv("UNITY_LOW_GFX_MODE") != NULL && atoi(getenv("UNITY_LOW_GFX_MODE")) == 0) - { - unity_settings_.low_gfx = false; - } - - if (unity_settings_.low_gfx()) - BackgroundEffectHelper::blur_type = BLUR_NONE; - Settings::Instance().low_gfx.changed.connect(sigc::track_obj([this] (bool low_gfx) { BackgroundEffectHelper::blur_type = low_gfx ? BLUR_NONE : (unity::BlurType) optionGetDashBlurExperimental(); }, *this)); diff -Nru unity-7.5.0+17.10.20170707/tests/data/external.gschema.xml unity-7.5.0+17.10.20170721.1/tests/data/external.gschema.xml --- unity-7.5.0+17.10.20170707/tests/data/external.gschema.xml 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/tests/data/external.gschema.xml 2017-07-21 08:52:10.000000000 +0000 @@ -8,6 +8,12 @@ + + + 'unity' + + + '<Alt>F10' @@ -18,7 +24,7 @@ '<Alt>' - + diff -Nru unity-7.5.0+17.10.20170707/tests/test_glib_signals.cpp unity-7.5.0+17.10.20170721.1/tests/test_glib_signals.cpp --- unity-7.5.0+17.10.20170707/tests/test_glib_signals.cpp 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/tests/test_glib_signals.cpp 2017-07-21 08:51:46.000000000 +0000 @@ -34,7 +34,8 @@ virtual ~TestGLibSignals() { - g_object_unref(test_signals_); + if (test_signals_) + g_object_unref(test_signals_); } void Signal0Callback(TestSignals* signals) @@ -136,8 +137,8 @@ TEST_F(TestGLibSignals, TestSignal0) { Signal signal; - signal.Connect(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); g_signal_emit_by_name(test_signals_, "signal0"); @@ -148,8 +149,8 @@ TEST_F(TestGLibSignals, TestSignal1) { Signal signal; - signal.Connect(test_signals_, "signal1", - sigc::mem_fun(this, &TestGLibSignals::Signal1Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal1", + sigc::mem_fun(this, &TestGLibSignals::Signal1Callback))); g_signal_emit_by_name(test_signals_, "signal1", "test"); @@ -161,8 +162,8 @@ TEST_F(TestGLibSignals, TestSignal2) { Signal signal; - signal.Connect(test_signals_, "signal2", - sigc::mem_fun(this, &TestGLibSignals::Signal2Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal2", + sigc::mem_fun(this, &TestGLibSignals::Signal2Callback))); g_signal_emit_by_name(test_signals_, "signal2", "test", 100); @@ -175,8 +176,8 @@ TEST_F(TestGLibSignals, TestSignal3) { Signal signal; - signal.Connect(test_signals_, "signal3", - sigc::mem_fun(this, &TestGLibSignals::Signal3Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal3", + sigc::mem_fun(this, &TestGLibSignals::Signal3Callback))); g_signal_emit_by_name(test_signals_, "signal3", "test", 100, 200.0f); @@ -191,8 +192,8 @@ TEST_F(TestGLibSignals, TestSignal4) { Signal signal; - signal.Connect(test_signals_, "signal4", - sigc::mem_fun(this, &TestGLibSignals::Signal4Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal4", + sigc::mem_fun(this, &TestGLibSignals::Signal4Callback))); g_signal_emit_by_name(test_signals_, "signal4", "test", 100, 200.0f, 300.00); @@ -207,8 +208,8 @@ TEST_F(TestGLibSignals, TestSignal5) { Signal signal; - signal.Connect(test_signals_, "signal5", - sigc::mem_fun(this, &TestGLibSignals::Signal5Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal5", + sigc::mem_fun(this, &TestGLibSignals::Signal5Callback))); g_signal_emit_by_name(test_signals_, "signal5", "test", 100, 200.0f, 300.00, TRUE); @@ -226,8 +227,8 @@ TEST_F(TestGLibSignals, TestSignal6) { Signal signal; - signal.Connect(test_signals_, "signal6", - sigc::mem_fun(this, &TestGLibSignals::Signal6Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal6", + sigc::mem_fun(this, &TestGLibSignals::Signal6Callback))); gboolean ret = FALSE; g_signal_emit_by_name(test_signals_, "signal6", "test", 100, 200.0f, 300.00, @@ -243,12 +244,46 @@ EXPECT_EQ(ret, TRUE); } +TEST_F(TestGLibSignals, TestBlock) +{ + Signal signal; + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); + EXPECT_TRUE(signal.Block()); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_FALSE(signal0_received_); + + signal0_received_ = false; + EXPECT_TRUE(signal.Unblock()); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_TRUE(signal0_received_); +} + +TEST_F(TestGLibSignals, TestUnblock) +{ + Signal signal; + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); + EXPECT_TRUE(signal.Unblock()); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_TRUE(signal0_received_); + + signal0_received_ = false; + EXPECT_TRUE(signal.Block()); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_FALSE(signal0_received_); +} + TEST_F(TestGLibSignals, TestDisconnection) { Signal signal; - signal.Connect(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); - signal.Disconnect(); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); + EXPECT_TRUE(signal.Disconnect()); g_signal_emit_by_name(test_signals_, "signal0"); @@ -259,8 +294,8 @@ { { Signal signal; - signal.Connect(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); } g_signal_emit_by_name(test_signals_, "signal0"); @@ -271,8 +306,8 @@ TEST_F(TestGLibSignals, TestCleanDestruction) { Signal signal; - signal.Connect(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); g_clear_object(&test_signals_); EXPECT_EQ(signal.object(), nullptr); } @@ -280,11 +315,11 @@ TEST_F(TestGLibSignals, TestConnectReplacePreviousConnection) { Signal signal; - signal.Connect(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); unsigned signal0_num_cb = 0; - signal.Connect(test_signals_, "signal0", [&] (TestSignals*) {++signal0_num_cb;}); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", [&] (TestSignals*) {++signal0_num_cb;})); g_signal_emit_by_name(test_signals_, "signal0"); @@ -302,27 +337,62 @@ { MockSignalManager manager; - manager.Add(new Signal(test_signals_, - "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); - manager.Add(new Signal(test_signals_, - "signal1", - sigc::mem_fun(this, &TestGLibSignals::Signal1Callback))); - manager.Add(new Signal(test_signals_, - "signal2", - sigc::mem_fun(this, &TestGLibSignals::Signal2Callback))); - manager.Add(new Signal(test_signals_, - "signal3", - sigc::mem_fun(this, &TestGLibSignals::Signal3Callback))); - manager.Add(new Signal(test_signals_, - "signal4", - sigc::mem_fun(this, &TestGLibSignals::Signal4Callback))); - manager.Add(new Signal(test_signals_, - "signal5", - sigc::mem_fun(this, &TestGLibSignals::Signal5Callback))); - manager.Add(new Signal(test_signals_, - "signal6", - sigc::mem_fun(this, &TestGLibSignals::Signal6Callback))); + auto signal0 = \ + std::make_shared>(test_signals_, + "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + auto signal0_added = manager.Add(signal0); + ASSERT_NE(nullptr, signal0_added); + EXPECT_EQ(signal0, signal0_added); + + auto signal1 = \ + std::make_shared>(test_signals_, + "signal1", + sigc::mem_fun(this, &TestGLibSignals::Signal1Callback)); + auto signal1_added = manager.Add(signal1); + ASSERT_NE(nullptr, signal1_added); + EXPECT_EQ(signal1, signal1_added); + + auto signal2 = \ + std::make_shared>(test_signals_, + "signal2", + sigc::mem_fun(this, &TestGLibSignals::Signal2Callback)); + auto signal2_added = manager.Add(signal2); + ASSERT_NE(nullptr, signal2_added); + EXPECT_EQ(signal2, signal2_added); + + auto signal3 = \ + std::make_shared>(test_signals_, + "signal3", + sigc::mem_fun(this, &TestGLibSignals::Signal3Callback)); + auto signal3_added = manager.Add(signal3); + ASSERT_NE(nullptr, signal3_added); + EXPECT_EQ(signal3, signal3_added); + + auto signal4 = \ + std::make_shared>(test_signals_, + "signal4", + sigc::mem_fun(this, &TestGLibSignals::Signal4Callback)); + auto signal4_added = manager.Add(signal4); + ASSERT_NE(nullptr, signal4_added); + EXPECT_EQ(signal4, signal4_added); + + auto signal5 = \ + std::make_shared>(test_signals_, + "signal5", + sigc::mem_fun(this, &TestGLibSignals::Signal5Callback)); + auto signal5_added = manager.Add(signal5); + ASSERT_NE(nullptr, signal5_added); + EXPECT_EQ(signal5, signal5_added); + + auto signal6 = \ + std::make_shared>(test_signals_, + "signal6", + sigc::mem_fun(this, &TestGLibSignals::Signal6Callback)); + auto signal6_added = manager.Add(signal6); + ASSERT_NE(nullptr, signal6_added); + EXPECT_EQ(signal6, signal6_added); + EXPECT_EQ(manager.GetConnections().size(), 7u); } @@ -331,19 +401,20 @@ { MockSignalManager manager; - manager.Add(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); - manager.Add(test_signals_, "signal1", - sigc::mem_fun(this, &TestGLibSignals::Signal1Callback)); - manager.Add(test_signals_, "signal2", - sigc::mem_fun(this, &TestGLibSignals::Signal2Callback)); - manager.Add(test_signals_, "signal3", - sigc::mem_fun(this, &TestGLibSignals::Signal3Callback)); - manager.Add(test_signals_, "signal4", - sigc::mem_fun(this, &TestGLibSignals::Signal4Callback)); - manager.Add(test_signals_, "signal5", - sigc::mem_fun(this, &TestGLibSignals::Signal5Callback)); - manager.Add(test_signals_, "signal6", sigc::mem_fun(this, &TestGLibSignals::Signal6Callback)); + EXPECT_NE(nullptr, (manager.Add(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)))); + EXPECT_NE(nullptr, (manager.Add(test_signals_, "signal1", + sigc::mem_fun(this, &TestGLibSignals::Signal1Callback)))); + EXPECT_NE(nullptr, (manager.Add(test_signals_, "signal2", + sigc::mem_fun(this, &TestGLibSignals::Signal2Callback)))); + EXPECT_NE(nullptr, (manager.Add(test_signals_, "signal3", + sigc::mem_fun(this, &TestGLibSignals::Signal3Callback)))); + EXPECT_NE(nullptr, (manager.Add(test_signals_, "signal4", + sigc::mem_fun(this, &TestGLibSignals::Signal4Callback)))); + EXPECT_NE(nullptr, (manager.Add(test_signals_, "signal5", + sigc::mem_fun(this, &TestGLibSignals::Signal5Callback)))); + EXPECT_NE(nullptr, (manager.Add(test_signals_, "signal6", + sigc::mem_fun(this, &TestGLibSignals::Signal6Callback)))); EXPECT_EQ(manager.GetConnections().size(), 7u); } @@ -399,6 +470,73 @@ EXPECT_FALSE(signal0_received_); } +TEST_F(TestGLibSignals, TestManagerBlock) +{ + SignalManager manager; + + manager.Add(test_signals_, + "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + EXPECT_TRUE(manager.Block(test_signals_, "signal0")); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_FALSE(signal0_received_); + + EXPECT_TRUE(manager.Unblock(test_signals_, "signal0")); + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_TRUE(signal0_received_); +} + +TEST_F(TestGLibSignals, TestManagerBlockAll) +{ + SignalManager manager; + + manager.Add(test_signals_, + "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + manager.Add(test_signals_, + "signal1", + sigc::mem_fun(this, &TestGLibSignals::Signal1Callback)); + EXPECT_TRUE(manager.Block(test_signals_)); + + g_signal_emit_by_name(test_signals_, "signal0"); + g_signal_emit_by_name(test_signals_, "signal1", "blocked"); + EXPECT_FALSE(signal0_received_); + EXPECT_FALSE(signal1_received_); + + EXPECT_TRUE(manager.Unblock(test_signals_)); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_TRUE(signal0_received_); + g_signal_emit_by_name(test_signals_, "signal1", "unblocked"); + EXPECT_TRUE(signal1_received_); +} + +TEST_F(TestGLibSignals, TestManagerBlockAllObjects) +{ + SignalManager manager; + + manager.Add(test_signals_, + "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + manager.Add(test_signals_, + "signal1", + sigc::mem_fun(this, &TestGLibSignals::Signal1Callback)); + EXPECT_TRUE(manager.Block()); + + g_signal_emit_by_name(test_signals_, "signal0"); + g_signal_emit_by_name(test_signals_, "signal1", "blocked"); + EXPECT_FALSE(signal0_received_); + EXPECT_FALSE(signal1_received_); + + EXPECT_TRUE(manager.Unblock()); + + g_signal_emit_by_name(test_signals_, "signal0"); + EXPECT_TRUE(signal0_received_); + g_signal_emit_by_name(test_signals_, "signal1", "unblocked"); + EXPECT_TRUE(signal1_received_); +} + TEST_F(TestGLibSignals, TestManagerObjectDisconnection) { SignalManager manager; diff -Nru unity-7.5.0+17.10.20170707/tools/compiz-profile-selector.in unity-7.5.0+17.10.20170721.1/tools/compiz-profile-selector.in --- unity-7.5.0+17.10.20170707/tools/compiz-profile-selector.in 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/tools/compiz-profile-selector.in 2017-07-21 08:52:10.000000000 +0000 @@ -14,24 +14,36 @@ compiz_profile="ubuntu" settings_profile="unity" +supports_3d=true if ! /usr/lib/nux/unity_support_test -p; then - settings_profile="unity-lowgfx" + supports_3d=false fi -if [ "$(gsettings get com.canonical.Unity lowgfx)" == "true" ]; then - settings_profile="unity-lowgfx" +if [ "$UNITY_LOW_GFX_MODE" != 0 ]; then + if [ "$supports_3d" == false ] || + [ "$(gsettings get com.canonical.Unity lowgfx)" == "true" ]; then + settings_profile="unity-lowgfx" + fi fi echo "Using compiz profile '$compiz_profile:$settings_profile'" +export COMPIZ_CONFIG_PROFILE="$compiz_profile" +export UNITY_HAS_3D_SUPPORT="$supports_3d" +export UNITY_DEFAULT_PROFILE="$settings_profile" + if [ -n "$UPSTART_SESSION" ]; then - initctl set-env -g COMPIZ_CONFIG_PROFILE="$compiz_profile" + initctl set-env -g COMPIZ_CONFIG_PROFILE=$COMPIZ_CONFIG_PROFILE + initctl set-env -g UNITY_HAS_3D_SUPPORT=$UNITY_HAS_3D_SUPPORT + initctl set-env -g UNITY_DEFAULT_PROFILE=$UNITY_DEFAULT_PROFILE +else + update_env_args="--systemd" fi -dbus-update-activation-environment --verbose --systemd COMPIZ_CONFIG_PROFILE="$compiz_profile" - -export COMPIZ_CONFIG_PROFILE="$compiz_profile" +dbus-update-activation-environment $update_env_args --verbose COMPIZ_CONFIG_PROFILE +dbus-update-activation-environment $update_env_args --verbose UNITY_HAS_3D_SUPPORT +dbus-update-activation-environment $update_env_args --verbose UNITY_DEFAULT_PROFILE @UNITY_LIBDIR@/compiz-config-profile-setter $settings_profile @UNITY_LIBDIR@/unity-active-plugins-safety-check diff -Nru unity-7.5.0+17.10.20170707/tools/unity.cmake unity-7.5.0+17.10.20170721.1/tools/unity.cmake --- unity-7.5.0+17.10.20170707/tools/unity.cmake 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/tools/unity.cmake 2017-07-21 08:52:10.000000000 +0000 @@ -30,6 +30,9 @@ import xdg.BaseDirectory DEFAULT_COMMAND = "compiz --replace" +COMPIZ_CONFIG_PROFILE = "ubuntu" +UNITY_DEFAULT_PROFILE = "unity" +UNITY_LOWGFX_PROFILE = UNITY_DEFAULT_PROFILE + "-lowgfx" home_dir = os.path.expanduser("~%s" % os.getenv("SUDO_USER")) supported_prefix = "/usr/local" @@ -58,18 +61,18 @@ def set_unity_env (): '''set variable environnement for unity to run''' - compiz_config_profile = 'unity' - os.environ['COMPIZ_CONFIG_PROFILE'] = 'ubuntu' + compiz_config_profile = UNITY_DEFAULT_PROFILE + os.environ['COMPIZ_CONFIG_PROFILE'] = COMPIZ_CONFIG_PROFILE try: if subprocess.call('/usr/lib/nux/unity_support_test -f'.split()) > 0: - compiz_config_profile += '-lowgfx' + compiz_config_profile = UNITY_LOWGFX_PROFILE except: pass try: if subprocess.check_output('gsettings get com.canonical.Unity lowgfx'.split()) == b'true\n': - compiz_config_profile += '-lowgfx' + compiz_config_profile = UNITY_LOWGFX_PROFILE except: pass diff -Nru unity-7.5.0+17.10.20170707/UnityCore/GLibSignal.cpp unity-7.5.0+17.10.20170721.1/UnityCore/GLibSignal.cpp --- unity-7.5.0+17.10.20170707/UnityCore/GLibSignal.cpp 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/UnityCore/GLibSignal.cpp 2017-07-21 08:51:46.000000000 +0000 @@ -35,16 +35,46 @@ Disconnect(); } -void SignalBase::Disconnect() +bool SignalBase::Disconnect() { + bool disconnected = false; + if (connection_id_ && G_IS_OBJECT(object_)) { g_signal_handler_disconnect(object_, connection_id_); g_object_remove_weak_pointer(object_, reinterpret_cast(&object_)); + disconnected = true; } object_ = nullptr; connection_id_ = 0; + return disconnected; +} + +bool SignalBase::Block() const +{ + bool blocked = false; + + if (connection_id_ && G_IS_OBJECT(object_)) + { + g_signal_handler_block(object_, connection_id_); + blocked = true; + } + + return blocked; +} + +bool SignalBase::Unblock() const +{ + bool unblocked = false; + + if (connection_id_ && G_IS_OBJECT(object_)) + { + g_signal_handler_unblock(object_, connection_id_); + unblocked = true; + } + + return unblocked; } GObject* SignalBase::object() const @@ -75,57 +105,73 @@ // was too messy to try and write a copy constructor/operator that would steal // from "other" and make the new one the owner. Not only did it create // opportunity for random bugs, it also made the API bad. -void SignalManager::Add(SignalBase* signal) +SignalBase::Ptr SignalManager::Add(SignalBase* signal) { - Add(SignalBase::Ptr(signal)); + return Add(SignalBase::Ptr(signal)); } -void SignalManager::Add(SignalBase::Ptr const& signal) +SignalBase::Ptr SignalManager::Add(SignalBase::Ptr const& signal) { connections_.push_back(signal); g_object_weak_ref(signal->object(), (GWeakNotify)&OnObjectDestroyed, this); + return signal; } -void SignalManager::OnObjectDestroyed(SignalManager* self, GObject* old_obj) +// This uses void* to keep in line with the g_signal* functions +// (it allows you to pass in a GObject without casting up). +bool SignalManager::ForeachMatchedSignal(void* object, std::string const& signal_name, std::function action, bool erase_after) { - for (auto it = self->connections_.begin(); it != self->connections_.end();) + bool action_performed = false; + bool all_objects = (object == reinterpret_cast(std::numeric_limits::max())); + bool all_signals = all_objects || signal_name.empty(); + + for (auto it = connections_.begin(); it != connections_.end();) { auto const& signal = *it; - // When an object has been destroyed, the signal member is nullified, - // so at this point we can be sure that removing signal with a null object, - // means removing invalid signals. - if (!signal->object()) + if ((all_objects || signal->object() == object) && (all_signals || signal->name() == signal_name)) { - it = self->connections_.erase(it); + if (action) + { + action_performed = true; + action(signal); + } + + it = erase_after ? connections_.erase(it) : ++it; } else { ++it; } } + + return action_performed; } -// This uses void* to keep in line with the g_signal* functions -// (it allows you to pass in a GObject without casting up). -void SignalManager::Disconnect(void* object, std::string const& signal_name) +void SignalManager::OnObjectDestroyed(SignalManager* self, GObject* old_obj) { - bool all_signals = signal_name.empty(); + self->ForeachMatchedSignal(nullptr, "", nullptr, /*erase_after*/ true); +} - for (auto it = connections_.begin(); it != connections_.end();) - { - auto const& signal = *it; +bool SignalManager::Block(void* object, std::string const& signal_name) +{ + return ForeachMatchedSignal(object, signal_name, [this] (SignalBase::Ptr const& signal) { + signal->Block(); + }); +} - if (signal->object() == object && (all_signals || signal->name() == signal_name)) - { - g_object_weak_unref(signal->object(), (GWeakNotify)&OnObjectDestroyed, this); - it = connections_.erase(it); - } - else - { - ++it; - } - } +bool SignalManager::Unblock(void* object, std::string const& signal_name) +{ + return ForeachMatchedSignal(object, signal_name, [this] (SignalBase::Ptr const& signal) { + signal->Unblock(); + }); +} + +bool SignalManager::Disconnect(void* object, std::string const& signal_name) +{ + return ForeachMatchedSignal(object, signal_name, [this] (SignalBase::Ptr const& signal) { + g_object_weak_unref(signal->object(), (GWeakNotify)&OnObjectDestroyed, this); + }, true); } } diff -Nru unity-7.5.0+17.10.20170707/UnityCore/GLibSignal.h unity-7.5.0+17.10.20170721.1/UnityCore/GLibSignal.h --- unity-7.5.0+17.10.20170707/UnityCore/GLibSignal.h 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/UnityCore/GLibSignal.h 2017-07-21 08:51:46.000000000 +0000 @@ -21,6 +21,7 @@ #ifndef UNITY_GLIB_SIGNAL_H #define UNITY_GLIB_SIGNAL_H +#include #include #include #include @@ -39,7 +40,10 @@ virtual ~SignalBase(); - void Disconnect(); + bool Disconnect(); + + bool Block() const; + bool Unblock() const; GObject* object() const; std::string const& name() const; @@ -71,9 +75,9 @@ #endif inline Signal() {}; - inline Signal(G object, std::string const& signal_name, SignalCallback const& callback); + inline Signal(G object, std::string const& signal_name, SignalCallback const&); - inline void Connect(G Object, std::string const& signal_name, SignalCallback const& callback); + inline bool Connect(G Object, std::string const& signal_name, SignalCallback const&); private: static R Callback(G Object, Ts... vs, Signal* self); @@ -86,17 +90,18 @@ public: SignalManager(); ~SignalManager(); - void Add(SignalBase* signal); - void Add(SignalBase::Ptr const& signal); + SignalBase::Ptr Add(SignalBase* signal); + SignalBase::Ptr Add(SignalBase::Ptr const& signal); template - void Add(G object, std::string const& signal_name, typename Signal::SignalCallback const& callback) - { - Add(std::make_shared>(object, signal_name, callback)); - } + SignalBase::Ptr Add(G object, std::string const& signal_name, typename Signal::SignalCallback const&); + + bool Block(void* object = (void*) std::numeric_limits::max(), std::string const& signal_name = ""); + bool Unblock(void* object = (void*) std::numeric_limits::max(), std::string const& signal_name = ""); - void Disconnect(void* object, std::string const& signal_name = ""); + bool Disconnect(void* object, std::string const& signal_name = ""); private: + bool ForeachMatchedSignal(void* object, std::string const& signal_name, std::function action, bool erase_after = false); static void OnObjectDestroyed(SignalManager* self, GObject* old_obj); protected: diff -Nru unity-7.5.0+17.10.20170707/UnityCore/GLibSignal-inl.h unity-7.5.0+17.10.20170721.1/UnityCore/GLibSignal-inl.h --- unity-7.5.0+17.10.20170707/UnityCore/GLibSignal-inl.h 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/UnityCore/GLibSignal-inl.h 2017-07-21 08:51:46.000000000 +0000 @@ -34,11 +34,11 @@ } template -void Signal::Connect(G object, std::string const& signal_name, +bool Signal::Connect(G object, std::string const& signal_name, SignalCallback const& callback) { if (!callback || !G_IS_OBJECT(object) || signal_name.empty()) - return; + return false; Disconnect(); @@ -47,6 +47,8 @@ callback_ = callback; connection_id_ = g_signal_connect(object_, signal_name.c_str(), G_CALLBACK(Callback), this); g_object_add_weak_pointer(object_, reinterpret_cast(&object_)); + + return true; } template @@ -59,6 +61,12 @@ return R(); } +template +SignalBase::Ptr SignalManager::Add(G object, std::string const& signal_name, typename Signal::SignalCallback const& callback) +{ + return Add(std::make_shared>(object, signal_name, callback)); +} + } } diff -Nru unity-7.5.0+17.10.20170707/unity-shared/UnitySettings.cpp unity-7.5.0+17.10.20170721.1/unity-shared/UnitySettings.cpp --- unity-7.5.0+17.10.20170707/unity-shared/UnitySettings.cpp 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/unity-shared/UnitySettings.cpp 2017-07-21 08:52:10.000000000 +0000 @@ -58,6 +58,9 @@ const std::string APP_SCALE_MONITOR = "app-scale-factor-monitor"; const std::string APP_USE_MAX_SCALE = "app-fallback-to-maximum-scale-factor"; +const std::string COMPIZ_SETTINGS = "org.compiz"; +const std::string COMPIZ_PROFILE = "current-profile"; + const std::string UBUNTU_UI_SETTINGS = "com.ubuntu.user-interface"; const std::string SCALE_FACTOR = "scale-factor"; @@ -96,6 +99,7 @@ Impl(Settings* owner) : parent_(owner) , usettings_(g_settings_new(SETTINGS_NAME.c_str())) + , compiz_settings_(g_settings_new(COMPIZ_SETTINGS.c_str())) , launcher_settings_(g_settings_new(LAUNCHER_SETTINGS.c_str())) , lim_settings_(g_settings_new(LIM_SETTINGS.c_str())) , gestures_settings_(g_settings_new(GESTURES_SETTINGS.c_str())) @@ -108,9 +112,10 @@ , cached_form_factor_(FormFactor::DESKTOP) , cursor_scale_(1.0) , cached_double_click_activate_(true) - , changing_gnome_settings_(false) , remote_content_enabled_(true) { + InitializeLowGfx(); + parent_->form_factor.SetGetterFunction(sigc::mem_fun(this, &Impl::GetFormFactor)); parent_->form_factor.SetSetterFunction(sigc::mem_fun(this, &Impl::SetFormFactor)); parent_->double_click_activate.SetGetterFunction(sigc::mem_fun(this, &Impl::GetDoubleClickActivate)); @@ -119,13 +124,18 @@ parent_->launcher_position.SetSetterFunction(sigc::mem_fun(this, &Impl::SetLauncherPosition)); parent_->desktop_type.SetGetterFunction(sigc::mem_fun(this, &Impl::GetDesktopType)); parent_->pam_check_account_type.SetGetterFunction(sigc::mem_fun(this, &Impl::GetPamCheckAccountType)); + parent_->supports_3d.changed.connect(sigc::mem_fun(this, &Impl::OnSupports3DChanged)); parent_->low_gfx.changed.connect(sigc::mem_fun(this, &Impl::UpdateCompizProfile)); for (unsigned i = 0; i < monitors::MAX; ++i) em_converters_.emplace_back(std::make_shared()); + signals_.Add(compiz_settings_, "changed::" + COMPIZ_PROFILE, [this] (GSettings*, const gchar *) { + parent_->low_gfx = (GetCurrentCompizProfile() == CCS_PROFILE_LOWGFX); + }); + signals_.Add(usettings_, "changed::" + LOWGFX, [this] (GSettings*, const gchar *) { - UpdateLowGfx(); + UpdateCompizProfile(GetLowGfxSetting()); }); signals_.Add(usettings_, "changed::" + FORM_FACTOR, [this] (GSettings*, const gchar*) { @@ -170,11 +180,8 @@ }); signals_.Add(gnome_ui_settings_, "changed::" + GNOME_TEXT_SCALE_FACTOR, [this] (GSettings*, const gchar* t) { - if (!changing_gnome_settings_) - { - double new_scale_factor = g_settings_get_double(gnome_ui_settings_, GNOME_TEXT_SCALE_FACTOR.c_str()); - g_settings_set_double(ui_settings_, TEXT_SCALE_FACTOR.c_str(), new_scale_factor); - } + double new_scale_factor = g_settings_get_double(gnome_ui_settings_, GNOME_TEXT_SCALE_FACTOR.c_str()); + g_settings_set_double(ui_settings_, TEXT_SCALE_FACTOR.c_str(), new_scale_factor); }); signals_.Add(lim_settings_, "changed", [this] (GSettings*, const gchar*) { @@ -191,11 +198,8 @@ UScreen::GetDefault()->changed.connect(sigc::hide(sigc::hide(sigc::mem_fun(this, &Impl::UpdateDPI)))); - UpdateLowGfx(); - UpdateCompizProfile(parent_->low_gfx()); - UpdateLimSetting(); - // The order is important here, DPI is the last thing to be updated + UpdateLimSetting(); UpdateGesturesSetting(); UpdateTextScaleFactor(); UpdateCursorScaleFactor(); @@ -244,14 +248,54 @@ cached_launcher_position_ = static_cast(g_settings_get_enum(launcher_settings_, LAUNCHER_POSITION.c_str())); } - void UpdateLowGfx() + void InitializeLowGfx() + { + parent_->low_gfx = GetLowGfxSetting(); + UpdateCompizProfile(parent_->low_gfx()); + } + + std::string GetCurrentCompizProfile() + { + return glib::String(g_settings_get_string(compiz_settings_, COMPIZ_PROFILE.c_str())).Str(); + } + + glib::Variant GetUserLowGfxSetting() + { + return glib::Variant(g_settings_get_user_value(usettings_, LOWGFX.c_str()), glib::StealRef()); + } + + bool GetLowGfxSetting() { - parent_->low_gfx = g_settings_get_boolean(usettings_, LOWGFX.c_str()) != FALSE; + if (glib::Variant const& user_setting = GetUserLowGfxSetting()) + { + return user_setting.GetBool(); + } + else + { + auto default_profile = glib::gchar_to_string(g_getenv("UNITY_DEFAULT_PROFILE")); + if (!default_profile.empty()) + { + return (default_profile == CCS_PROFILE_LOWGFX); + } + else if (!parent_->supports_3d() || + glib::gchar_to_string(getenv("UNITY_HAS_3D_SUPPORT")) == "false") + { + return true; + } + else + { + return (GetCurrentCompizProfile() == CCS_PROFILE_LOWGFX); + } + } } void UpdateCompizProfile(bool lowgfx) { auto const& profile = lowgfx ? CCS_PROFILE_LOWGFX : CCS_PROFILE_DEFAULT; + + if (GetCurrentCompizProfile() == profile) + return; + auto profile_change_cmd = (std::string(UNITY_LIBDIR G_DIR_SEPARATOR_S) + CCS_PROFILE_CHANGER_TOOL + " " + profile); glib::Error error; @@ -263,6 +307,12 @@ } } + void OnSupports3DChanged(bool supports_3d) + { + if (!GetUserLowGfxSetting()) + parent_->low_gfx = !supports_3d; + } + void UpdateLimSetting() { parent_->lim_movement_thresold = g_settings_get_uint(lim_settings_, CLICK_MOVEMENT_THRESHOLD.c_str()); @@ -418,7 +468,7 @@ if (value > 0) ui_scale = static_cast(value)/DPI_SCALING_STEP; } - else + else { value = FindOptimalScale(uscreen, monitor); ui_scale = static_cast(value)/DPI_SCALING_STEP; @@ -455,8 +505,7 @@ void UpdateAppsScaling(double scale) { - changing_gnome_settings_ = true; - changing_gnome_settings_timeout_.reset(); + signals_.Block(gnome_ui_settings_); unsigned integer_scaling = std::max(1, std::lround(scale)); double point_scaling = scale / static_cast(integer_scaling); double text_scale_factor = parent_->font_scaling() * point_scaling; @@ -467,7 +516,7 @@ g_settings_set_double(gnome_ui_settings_, GNOME_TEXT_SCALE_FACTOR.c_str(), text_scale_factor); changing_gnome_settings_timeout_.reset(new glib::TimeoutSeconds(GNOME_SETTINGS_CHANGED_WAIT_SECONDS, [this] { - changing_gnome_settings_ = false; + signals_.Unblock(gnome_ui_settings_); return false; }, glib::Source::Priority::LOW)); } @@ -491,6 +540,7 @@ Settings* parent_; glib::Object usettings_; + glib::Object compiz_settings_; glib::Object launcher_settings_; glib::Object lim_settings_; glib::Object gestures_settings_; @@ -506,7 +556,6 @@ FormFactor cached_form_factor_; double cursor_scale_; bool cached_double_click_activate_; - bool changing_gnome_settings_; bool remote_content_enabled_; }; @@ -515,7 +564,8 @@ // Settings::Settings() - : is_standalone(false) + : supports_3d(glib::gchar_to_string(getenv("UNITY_HAS_3D_SUPPORT")) != "false") + , is_standalone(false) , pimpl(new Impl(this)) { if (settings_instance) diff -Nru unity-7.5.0+17.10.20170707/unity-shared/UnitySettings.h unity-7.5.0+17.10.20170721.1/unity-shared/UnitySettings.h --- unity-7.5.0+17.10.20170707/unity-shared/UnitySettings.h 2017-07-07 01:03:24.000000000 +0000 +++ unity-7.5.0+17.10.20170721.1/unity-shared/UnitySettings.h 2017-07-21 08:52:10.000000000 +0000 @@ -60,6 +60,7 @@ int LauncherSize(int mointor) const; nux::Property low_gfx; + nux::Property supports_3d; nux::RWProperty form_factor; nux::Property is_standalone; nux::ROProperty desktop_type;