--- src/wingpanel/wingpanel-interface/Main.vala 2017-10-12 18:58:46.125181484 +0900 +++ /dev/null 2017-10-12 18:36:39.960762875 +0900 @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2011-2015 Wingpanel Developers (http://launchpad.net/wingpanel) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -/* - * This plugin adds a dbus-interface to gala that provides additional information - * about windows and workspaces for the panel. - */ - -public class WingpanelInterface.Main : Gala.Plugin { - private const string DBUS_NAME = "org.pantheon.gala.WingpanelInterface"; - private const string DBUS_PATH = "/org/pantheon/gala/WingpanelInterface"; - - public static Gala.WindowManager wm; - public static Meta.Screen screen; - - private DBusConnection? dbus_connection = null; - - public override void initialize (Gala.WindowManager _wm) { - if (_wm == null) { - return; - } - - wm = _wm; - screen = wm.get_screen (); - - Bus.own_name (BusType.SESSION, - DBUS_NAME, - BusNameOwnerFlags.NONE, - on_bus_aquired, - null, - () => warning ("Aquirering \"%s\" failed.", DBUS_NAME)); - } - - public override void destroy () { - try { - if (dbus_connection != null) { - dbus_connection.close_sync (); - } - } catch (Error e) { - warning ("Closing DBus service failed: %s", e.message); - } - } - - private void on_bus_aquired (DBusConnection connection) { - dbus_connection = connection; - - try { - var server = new DBusServer (); - - dbus_connection.register_object (DBUS_PATH, server); - - debug ("DBus service registered."); - } catch (Error e) { - warning ("Registering DBus service failed: %s", e.message); - } - } -} - -public Gala.PluginInfo register_plugin () { - return { - "wingpanel-interface", - "Wingpanel Developers", - typeof (WingpanelInterface.Main), - Gala.PluginFunction.ADDITION, - Gala.LoadPriority.IMMEDIATE - }; -} --- src/wingpanel/wingpanel-interface/Settings.vala 2017-10-12 18:58:46.125181484 +0900 +++ /dev/null 2017-10-12 18:36:39.960762875 +0900 @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2011-2015 Wingpanel Developers (http://launchpad.net/wingpanel) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -public class WingpanelInterface.AnimationSettings : Granite.Services.Settings { - public bool enable_animations { get; set; } - public int open_duration { get; set; } - public int snap_duration { get; set; } - public int close_duration { get; set; } - public int minimize_duration { get; set; } - public int workspace_switch_duration { get; set; } - public int menu_duration { get; set; } - - static AnimationSettings? instance = null; - - private AnimationSettings () { - base ("org.pantheon.desktop.gala.animations"); - } - - public static unowned AnimationSettings get_default () { - if (instance == null) { - instance = new AnimationSettings (); - } - - return instance; - } -} --- src/wingpanel/wingpanel-interface/FocusManager.vala 2017-10-12 18:58:46.125181484 +0900 +++ /dev/null 2017-10-12 18:36:39.960762875 +0900 @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2011-2015 Wingpanel Developers (http://launchpad.net/wingpanel) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -public class WingpanelInterface.FocusManager : Object { - private static FocusManager? instance = null; - - private Meta.Workspace? current_workspace = null; - private Meta.Window? last_focused_window = null; - - public FocusManager () { - Main.screen.workspace_switched.connect (() => { - update_current_workspace (); - }); - - update_current_workspace (); - } - - public void remember_focused_window () { - var windows = current_workspace.list_windows (); - - foreach (Meta.Window window in windows) { - if (window.has_focus ()) { - last_focused_window = window; - - return; - } - } - } - - public void restore_focused_window () { - if (last_focused_window != null) { - var display = Main.screen.get_display (); - last_focused_window.focus (display.get_current_time ()); - } - } - - private void update_current_workspace () { - var workspace = Main.screen.get_workspace_by_index (Main.screen.get_active_workspace_index ()); - - if (workspace == null) { - warning ("Cannot get active workspace"); - - return; - } - - current_workspace = workspace; - } - - public static FocusManager get_default () { - if (instance == null) { - instance = new FocusManager (); - } - - return instance; - } -} --- src/wingpanel/wingpanel-interface/DBusServer.vala 2017-10-13 03:00:24.840092343 +0900 +++ /dev/null 2017-10-13 01:49:26.502721048 +0900 @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2011-2015 Wingpanel Developers (http://launchpad.net/wingpanel) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -[DBus (name = "org.pantheon.gala.WingpanelInterface")] -public class WingpanelInterface.DBusServer : Object { - private BackgroundManager background_manager; - - public signal void state_changed (BackgroundState state, uint animation_duration); - - public void initialize (int monitor, int panel_height) { - background_manager = new BackgroundManager (monitor, panel_height); - background_manager.state_changed.connect ((state, animation_duration) => { - state_changed (state, animation_duration); - }); - } - - public void remember_focused_window () { - FocusManager.get_default ().remember_focused_window (); - } - - public void restore_focused_window () { - FocusManager.get_default ().restore_focused_window (); - } -} --- src/wingpanel/CMakeLists.txt 2017-10-13 03:25:28.007664080 +0900 +++ src/wingpanel/CMakeLists.txt.new 2017-10-13 03:27:00.135900068 +0900 @@ -121,8 +121,6 @@ set (DEPS_LIBRARIES ${DEPS_LIBRARIES} ${LIB_NAME}) add_subdirectory (src) -add_subdirectory (wingpanel-interface) - if (BUILD_SAMPLE) add_subdirectory (sample) endif () --- src/wingpanel/wingpanel-interface/CMakeLists.txt 2018-03-05 15:53:08.967254520 +0900 +++ /dev/null 2018-03-05 14:42:26.994151215 +0900 @@ -1,90 +0,0 @@ -find_package (PkgConfig) - -pkg_check_modules (PLUGIN REQUIRED gala granite) - -add_definitions (${PLUGIN_CFLAGS}) -link_directories (${PLUGIN_LIBRARY_DIRS}) -set (WINGPANELINTERFACE "wingpanel-interface") - -find_package (Vala REQUIRED) -include (ValaVersion) -ensure_vala_version ("0.12.0" MINIMUM) - -# We need to know which version of the Mutter API is in use -pkg_check_modules(MUTTER320 QUIET libmutter>=3.19) -pkg_check_modules(MUTTER322 QUIET libmutter>=3.21) -pkg_check_modules(MUTTER324 QUIET libmutter-0>=3.23.90) -pkg_check_modules(MUTTER326 QUIET libmutter-1>=3.25.90) -pkg_check_modules(MUTTER328 QUIET libmutter-2>=3.27.91) - -set (EXTRA_VALA_FLAGS "") -set (EXTRA_MUTTER_PKS cogl-1.0 clutter-1.0 libmutter) -set (EXTRA_MUTTER_PACKAGES cogl-1.0 clutter-1.0 libmutter) -if (MUTTER320_FOUND) - set (EXTRA_VALA_FLAGS ${EXTRA_VALA_FLAGS} --define HAS_MUTTER320) -endif () - -if (MUTTER322_FOUND) - set (EXTRA_VALA_FLAGS ${EXTRA_VALA_FLAGS} --define HAS_MUTTER322) - set (EXTRA_MUTTER_PKS mutter-cogl-1.0 mutter-cogl-pango-1.0 mutter-cogl-path-1.0 mutter-clutter-1.0 libmutter) - set (EXTRA_MUTTER_PACKAGES mutter-cogl-1.0 mutter-clutter-1.0) -endif () - -if (MUTTER324_FOUND) - set (EXTRA_VALA_FLAGS ${EXTRA_VALA_FLAGS} --define HAS_MUTTER320 --define HAS_MUTTER322 --define HAS_MUTTER324) - set (EXTRA_MUTTER_PKS mutter-cogl-0 mutter-cogl-pango-0 mutter-cogl-path-0 mutter-clutter-0 libmutter-0) - set (EXTRA_MUTTER_PACKAGES mutter-cogl-0 mutter-clutter-0) -endif () - -if (MUTTER326_FOUND) - set (EXTRA_VALA_FLAGS ${EXTRA_VALA_FLAGS} --define HAS_MUTTER320 --define HAS_MUTTER322 --define HAS_MUTTER324 --define HAS_MUTTER326) - set (EXTRA_MUTTER_PKS mutter-cogl-1 mutter-cogl-pango-1 mutter-cogl-path-1 mutter-clutter-1 libmutter-1) - set (EXTRA_MUTTER_PACKAGES mutter-cogl-1 mutter-clutter-1) -endif () - -if (MUTTER328_FOUND) - set (EXTRA_VALA_FLAGS ${EXTRA_VALA_FLAGS} --define HAS_MUTTER320 --define HAS_MUTTER322 --define HAS_MUTTER324 --define HAS_MUTTER326 --define HAS_MUTTER328) - set (EXTRA_MUTTER_PKS mutter-cogl-2 mutter-cogl-pango-2 mutter-cogl-path-2 mutter-clutter-2 libmutter-2) - set (EXTRA_MUTTER_PACKAGES mutter-cogl-2 mutter-clutter-2) -endif () - -pkg_check_modules (PLUGIN_MUTTER REQUIRED ${EXTRA_MUTTER_PKS}) - -include (ValaPrecompile) -vala_precompile (VALA_C ${WINGPANELINTERFACE} - Main.vala - DBusServer.vala - BackgroundManager.vala - FocusManager.vala - Settings.vala - Utils.vala -PACKAGES - gala - granite - cogl-fixes - ${EXTRA_MUTTER_PACKAGES} -OPTIONS - --thread - --vapidir=${CMAKE_SOURCE_DIR}/vapi - ${EXTRA_VALA_FLAGS} -) - -add_library (${WINGPANELINTERFACE} MODULE ${VALA_C}) -target_link_libraries(${WINGPANELINTERFACE} ${PLUGIN_LIBRARIES} ${PLUGIN_MUTTER_LIBRARIES} m) - -# Add -rpath ldflag if libgala is using mutter >= 3.21 to pick up libmutter-*.so -if (MUTTER328_FOUND) - _pkgconfig_invoke("libmutter-2" MUTTER TYPELIB_DIR "" "--variable=typelibdir") - set_target_properties(${WINGPANELINTERFACE} PROPERTIES LINK_FLAGS -Wl,-rpath,${MUTTER_TYPELIB_DIR}) -elseif (MUTTER326_FOUND) - _pkgconfig_invoke("libmutter-1" MUTTER TYPELIB_DIR "" "--variable=typelibdir") - set_target_properties(${WINGPANELINTERFACE} PROPERTIES LINK_FLAGS -Wl,-rpath,${MUTTER_TYPELIB_DIR}) -elseif (MUTTER324_FOUND) - _pkgconfig_invoke("libmutter-0" MUTTER TYPELIB_DIR "" "--variable=typelibdir") - set_target_properties(${WINGPANELINTERFACE} PROPERTIES LINK_FLAGS -Wl,-rpath,${MUTTER_TYPELIB_DIR}) -elseif (MUTTER322_FOUND) - _pkgconfig_invoke("libmutter" MUTTER TYPELIB_DIR "" "--variable=typelibdir") - set_target_properties(${WINGPANELINTERFACE} PROPERTIES LINK_FLAGS -Wl,-rpath,${MUTTER_TYPELIB_DIR}) -endif () - -install (TARGETS ${WINGPANELINTERFACE} DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/gala/plugins) --- src/wingpanel/wingpanel-interface/Utils.vala 2018-05-13 16:35:27.438070885 +0900 +++ /dev/null 2018-05-12 19:49:31.706719886 +0900 @@ -1,202 +0,0 @@ -/* - * Copyright (c) 2011-2015 Wingpanel Developers (http://launchpad.net/wingpanel) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -/* - * The method for calculating the background information and the classes that are - * related to it are copied from Gala.DBus. - */ - -namespace WingpanelInterface.Utils { - private const double SATURATION_WEIGHT = 1.5; - private const double WEIGHT_THRESHOLD = 1.0; - - private class DummyOffscreenEffect : Clutter.OffscreenEffect { - public signal void done_painting (); - - public override void post_paint () { - base.post_paint (); - Idle.add (() => { - done_painting (); - return false; - }); - } - } - - public struct ColorInformation { - double average_red; - double average_green; - double average_blue; - double mean_luminance; - double luminance_variance; - double mean_acutance; - } - - public async ColorInformation get_background_color_information (Gala.WindowManager wm, int monitor, - int reference_x, int reference_y, int reference_width, int reference_height) throws DBusError { - var background = wm.background_group.get_child_at_index (monitor); - - if (background == null) { - throw new DBusError.INVALID_ARGS ("Invalid monitor requested: %i".printf (monitor)); - } - - var effect = new DummyOffscreenEffect (); - background.add_effect (effect); - - var tex_width = (int)background.width; - var tex_height = (int)background.height; - - int x_start = reference_x; - int y_start = reference_y; - int width = int.min (tex_width - reference_x, reference_width); - int height = int.min (tex_height - reference_y, reference_height); - - if (x_start > tex_width || x_start > tex_height || width <= 0 || height <= 0) { - throw new DBusError.INVALID_ARGS ("Invalid rectangle specified: %i, %i, %i, %i".printf (x_start, y_start, width, height)); - } - - double mean_acutance = 0, variance = 0, mean = 0, rTotal = 0, gTotal = 0, bTotal = 0; - ulong paint_signal_handler = 0; - - paint_signal_handler = effect.done_painting.connect (() => { - SignalHandler.disconnect (effect, paint_signal_handler); - background.remove_effect (effect); - - var texture = (Cogl.Texture)effect.get_texture (); - var pixels = new uint8[texture.get_width () * texture.get_height () * 4]; - var pixel_lums = new double[texture.get_width () * texture.get_height ()]; - - CoglFixes.texture_get_data (texture, Cogl.PixelFormat.BGRA_8888_PRE, 0, pixels); - - int size = width * height; - - double mean_squares = 0; - double pixel = 0; - - double max, min, score, delta, scoreTotal = 0, rTotal2 = 0, gTotal2 = 0, bTotal2 = 0; - - /* - * code to calculate weighted average color is copied from - * plank's lib/Drawing/DrawingService.vala average_color() - * http://bazaar.launchpad.net/~docky-core/plank/trunk/view/head:/lib/Drawing/DrawingService.vala - */ - for (int y = y_start; y < height; y++) { - for (int x = x_start; x < width; x++) { - int i = y * width * 4 + x * 4; - - uint8 r = pixels[i]; - uint8 g = pixels[i + 1]; - uint8 b = pixels[i + 2]; - - pixel = (0.3 * r + 0.59 * g + 0.11 * b) ; - - pixel_lums[y * width + x] = pixel; - - min = uint8.min (r, uint8.min (g, b)); - max = uint8.max (r, uint8.max (g, b)); - - delta = max - min; - - /* prefer colored pixels over shades of grey */ - score = SATURATION_WEIGHT * (delta == 0 ? 0.0 : delta / max); - - rTotal += score * r; - gTotal += score * g; - bTotal += score * b; - scoreTotal += score; - - rTotal += r; - gTotal += g; - bTotal += b; - - mean += pixel; - mean_squares += pixel * pixel; - } - } - - for (int y = y_start + 1; y < height - 1; y++) { - for (int x = x_start + 1; x < width - 1; x++) { - var acutance = - (pixel_lums[y * width + x] * 4) - - ( - pixel_lums[y * width + x - 1] + - pixel_lums[y * width + x + 1] + - pixel_lums[(y - 1) * width + x] + - pixel_lums[(y + 1) * width + x] - ); - - mean_acutance += acutance > 0 ? acutance : -acutance; - } - } - - scoreTotal /= size; - bTotal /= size; - gTotal /= size; - rTotal /= size; - - if (scoreTotal > 0.0) { - bTotal /= scoreTotal; - gTotal /= scoreTotal; - rTotal /= scoreTotal; - } - - bTotal2 /= size * uint8.MAX; - gTotal2 /= size * uint8.MAX; - rTotal2 /= size * uint8.MAX; - - /* - * combine weighted and not weighted sum depending on the average "saturation" - * if saturation isn't reasonable enough - * s = 0.0 -> f = 0.0 ; s = WEIGHT_THRESHOLD -> f = 1.0 - */ - if (scoreTotal <= WEIGHT_THRESHOLD) { - var f = 1.0 / WEIGHT_THRESHOLD * scoreTotal; - var rf = 1.0 - f; - - bTotal = bTotal * f + bTotal2 * rf; - gTotal = gTotal * f + gTotal2 * rf; - rTotal = rTotal * f + rTotal2 * rf; - } - - /* there shouldn't be values larger then 1.0 */ - var max_val = double.max (rTotal, double.max (gTotal, bTotal)); - - if (max_val > 1.0) { - bTotal /= max_val; - gTotal /= max_val; - rTotal /= max_val; - } - - mean /= size; - mean_squares = mean_squares / size; - - variance = (mean_squares - (mean * mean)); - - mean_acutance /= (width - 2) * (height - 2); - - get_background_color_information.callback (); - }); - - background.queue_redraw (); - - yield; - - return { rTotal, gTotal, bTotal, mean, variance, mean_acutance }; - } - -}