mirror of
https://github.com/elementary/gala.git
synced 2024-08-17 02:50:38 +03:00
Remove corner mask in favor of rounded background corners (#1846)
This commit is contained in:
parent
517ba7d0eb
commit
5d2d96d7c7
@ -338,6 +338,7 @@
|
|||||||
<key type="b" name="enable">
|
<key type="b" name="enable">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<summary>Enable rounded corner mask</summary>
|
<summary>Enable rounded corner mask</summary>
|
||||||
|
<description>DEPRECATED: This setting is no longer used</description>
|
||||||
</key>
|
</key>
|
||||||
<key type="i" name="corner-radius">
|
<key type="i" name="corner-radius">
|
||||||
<default>4</default>
|
<default>4</default>
|
||||||
@ -348,11 +349,11 @@
|
|||||||
<key type="b" name="disable-on-fullscreen">
|
<key type="b" name="disable-on-fullscreen">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<summary>Disable corner mask on fullscreen</summary>
|
<summary>Disable corner mask on fullscreen</summary>
|
||||||
<description>If enabled, when an application is fullscreen (fills the monitor), the corner masks will be disabled on that monitor.</description>
|
<description>DEPRECATED: This setting is no longer used</description></key>
|
||||||
</key>
|
|
||||||
<key type="b" name="only-on-primary">
|
<key type="b" name="only-on-primary">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
<summary>Only show corner masks on primary monitor</summary>
|
<summary>Only show corner masks on primary monitor</summary>
|
||||||
|
<description>DEPRECATED: This setting is no longer used</description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
|
@ -184,7 +184,6 @@ subdir('data')
|
|||||||
subdir('lib')
|
subdir('lib')
|
||||||
subdir('src')
|
subdir('src')
|
||||||
subdir('daemon')
|
subdir('daemon')
|
||||||
subdir('plugins/maskcorners')
|
|
||||||
subdir('plugins/pip')
|
subdir('plugins/pip')
|
||||||
subdir('plugins/template')
|
subdir('plugins/template')
|
||||||
if get_option('documentation')
|
if get_option('documentation')
|
||||||
|
@ -1,170 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2021 elementary, Inc (https://elementary.io)
|
|
||||||
* 2015 Rory J Sanderson
|
|
||||||
*
|
|
||||||
* 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class Gala.Plugins.MaskCorners.Main : Gala.Plugin {
|
|
||||||
private const int DEFAULT_CORNER_RADIUS = 6;
|
|
||||||
|
|
||||||
private Gala.WindowManager? wm = null;
|
|
||||||
private GLib.Settings settings;
|
|
||||||
private int[] corner_radii;
|
|
||||||
private List<Clutter.Actor>[] cornermasks;
|
|
||||||
private Meta.Display display;
|
|
||||||
|
|
||||||
public override void initialize (Gala.WindowManager wm) {
|
|
||||||
this.wm = wm;
|
|
||||||
display = wm.get_display ();
|
|
||||||
|
|
||||||
settings = new GLib.Settings (Config.SCHEMA + ".mask-corners");
|
|
||||||
|
|
||||||
setup_cornermasks ();
|
|
||||||
|
|
||||||
settings.changed.connect (resetup_cornermasks);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void destroy () {
|
|
||||||
destroy_cornermasks ();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setup_cornermasks () {
|
|
||||||
if (!settings.get_boolean ("enable")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int n_monitors = display.get_n_monitors ();
|
|
||||||
corner_radii = new int[n_monitors];
|
|
||||||
cornermasks = new List<Clutter.Actor>[n_monitors];
|
|
||||||
|
|
||||||
for (int m = 0; m < n_monitors; m++) {
|
|
||||||
corner_radii[m] = Utils.scale_to_int (DEFAULT_CORNER_RADIUS, display.get_monitor_scale (m));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (settings.get_boolean ("only-on-primary")) {
|
|
||||||
add_cornermasks (display.get_primary_monitor ());
|
|
||||||
} else {
|
|
||||||
for (int m = 0; m < n_monitors; m++)
|
|
||||||
add_cornermasks (m);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (settings.get_boolean ("disable-on-fullscreen")) {
|
|
||||||
display.in_fullscreen_changed.connect (fullscreen_changed);
|
|
||||||
}
|
|
||||||
|
|
||||||
unowned Meta.MonitorManager monitor_manager = display.get_context ().get_backend ().get_monitor_manager ();
|
|
||||||
monitor_manager.monitors_changed.connect (resetup_cornermasks);
|
|
||||||
|
|
||||||
display.gl_video_memory_purged.connect (resetup_cornermasks);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void destroy_cornermasks () {
|
|
||||||
display.gl_video_memory_purged.disconnect (resetup_cornermasks);
|
|
||||||
|
|
||||||
unowned Meta.MonitorManager monitor_manager = display.get_context ().get_backend ().get_monitor_manager ();
|
|
||||||
monitor_manager.monitors_changed.disconnect (resetup_cornermasks);
|
|
||||||
display.in_fullscreen_changed.disconnect (fullscreen_changed);
|
|
||||||
|
|
||||||
foreach (unowned List<Clutter.Actor> list in cornermasks) {
|
|
||||||
foreach (Clutter.Actor actor in list) {
|
|
||||||
actor.destroy ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void resetup_cornermasks () {
|
|
||||||
destroy_cornermasks ();
|
|
||||||
setup_cornermasks ();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void fullscreen_changed () {
|
|
||||||
for (int i = 0; i < display.get_n_monitors (); i++) {
|
|
||||||
foreach (Clutter.Actor actor in cornermasks[i]) {
|
|
||||||
if (display.get_monitor_in_fullscreen (i)) {
|
|
||||||
actor.hide ();
|
|
||||||
} else {
|
|
||||||
actor.show ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void add_cornermasks (int monitor_no) {
|
|
||||||
var monitor_geometry = display.get_monitor_geometry (monitor_no);
|
|
||||||
|
|
||||||
var canvas = new Clutter.Canvas ();
|
|
||||||
canvas.set_size (corner_radii[monitor_no], corner_radii[monitor_no]);
|
|
||||||
canvas.draw.connect ((context) => draw_cornermask (context, monitor_no));
|
|
||||||
canvas.invalidate ();
|
|
||||||
|
|
||||||
var actor = new Clutter.Actor ();
|
|
||||||
actor.set_content (canvas);
|
|
||||||
actor.set_size (corner_radii[monitor_no], corner_radii[monitor_no]);
|
|
||||||
actor.set_position (monitor_geometry.x, monitor_geometry.y);
|
|
||||||
actor.set_pivot_point ((float) 0.5, (float) 0.5);
|
|
||||||
|
|
||||||
cornermasks[monitor_no].append (actor);
|
|
||||||
wm.stage.add_child (actor);
|
|
||||||
|
|
||||||
for (int p = 1; p < 4; p++) {
|
|
||||||
var clone = new Clutter.Clone (actor);
|
|
||||||
clone.rotation_angle_z = p * 90;
|
|
||||||
|
|
||||||
switch (p) {
|
|
||||||
case 1:
|
|
||||||
clone.set_position (monitor_geometry.x + monitor_geometry.width, monitor_geometry.y);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
clone.set_position (monitor_geometry.x + monitor_geometry.width, monitor_geometry.y + monitor_geometry.height);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
clone.set_position (monitor_geometry.x, monitor_geometry.y + monitor_geometry.height);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
cornermasks[monitor_no].append (clone);
|
|
||||||
wm.stage.add_child (clone);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool draw_cornermask (Cairo.Context context, int monitor_no) requires (corner_radii.length > monitor_no) {
|
|
||||||
var buffer = new Drawing.BufferSurface (corner_radii[monitor_no], corner_radii[monitor_no]);
|
|
||||||
var buffer_context = buffer.context;
|
|
||||||
|
|
||||||
buffer_context.arc (corner_radii[monitor_no], corner_radii[monitor_no], corner_radii[monitor_no], Math.PI, 1.5 * Math.PI);
|
|
||||||
buffer_context.line_to (0, 0);
|
|
||||||
buffer_context.line_to (0, corner_radii[monitor_no]);
|
|
||||||
buffer_context.set_source_rgb (0, 0, 0);
|
|
||||||
buffer_context.fill ();
|
|
||||||
|
|
||||||
context.set_operator (Cairo.Operator.CLEAR);
|
|
||||||
context.paint ();
|
|
||||||
context.set_operator (Cairo.Operator.OVER);
|
|
||||||
context.set_source_surface (buffer.surface, 0, 0);
|
|
||||||
context.paint ();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Gala.PluginInfo register_plugin () {
|
|
||||||
return {
|
|
||||||
"Mask Corners",
|
|
||||||
"Gala Developers",
|
|
||||||
typeof (Gala.Plugins.MaskCorners.Main),
|
|
||||||
Gala.PluginFunction.ADDITION,
|
|
||||||
Gala.LoadPriority.IMMEDIATE
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
gala_maskcorners_sources = [
|
|
||||||
'Main.vala'
|
|
||||||
]
|
|
||||||
|
|
||||||
gala_maskcorners_lib = shared_library(
|
|
||||||
'gala-maskcorners',
|
|
||||||
gala_maskcorners_sources,
|
|
||||||
dependencies: [gala_dep, gala_base_dep],
|
|
||||||
include_directories: config_inc_dir,
|
|
||||||
install: true,
|
|
||||||
install_dir: plugins_dir,
|
|
||||||
install_rpath: mutter_typelib_dir,
|
|
||||||
)
|
|
@ -39,6 +39,7 @@ namespace Gala {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
set_black_background (true);
|
||||||
update ();
|
update ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,6 +48,10 @@ namespace Gala {
|
|||||||
monitor_manager.monitors_changed.disconnect (update);
|
monitor_manager.monitors_changed.disconnect (update);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void set_black_background (bool black) {
|
||||||
|
set_background_color (black ? Clutter.Color.from_string ("Black") : null);
|
||||||
|
}
|
||||||
|
|
||||||
private void update () {
|
private void update () {
|
||||||
var reference_child = (get_child_at_index (0) as BackgroundManager);
|
var reference_child = (get_child_at_index (0) as BackgroundManager);
|
||||||
if (reference_child != null)
|
if (reference_child != null)
|
||||||
|
@ -1938,6 +1938,7 @@ namespace Gala {
|
|||||||
wallpaper = new Clutter.Clone (background);
|
wallpaper = new Clutter.Clone (background);
|
||||||
} else {
|
} else {
|
||||||
background_group.hide ();
|
background_group.hide ();
|
||||||
|
((BackgroundContainer) background_group).set_black_background (false);
|
||||||
wallpaper = new Clutter.Clone (background_group);
|
wallpaper = new Clutter.Clone (background_group);
|
||||||
}
|
}
|
||||||
wallpaper.add_effect (new Gala.ShadowEffect (40) { css_class = "workspace" });
|
wallpaper.add_effect (new Gala.ShadowEffect (40) { css_class = "workspace" });
|
||||||
@ -2231,6 +2232,7 @@ namespace Gala {
|
|||||||
unowned var background = background_group.get_child_at_index (primary);
|
unowned var background = background_group.get_child_at_index (primary);
|
||||||
background.show ();
|
background.show ();
|
||||||
} else {
|
} else {
|
||||||
|
((BackgroundContainer) background_group).set_black_background (true);
|
||||||
background_group.show ();
|
background_group.show ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user