Daemon: Implement monitor labels (#1861)

This commit is contained in:
Leonhard 2024-02-20 00:15:24 +01:00 committed by GitHub
parent f9b6ce2058
commit bf4eec88c7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 137 additions and 13 deletions

View File

@ -8,8 +8,17 @@ public interface Gala.WMDBus : GLib.Object {
public abstract void perform_action (Gala.ActionType type) throws DBusError, IOError;
}
public struct Gala.Daemon.MonitorLabelInfo {
public int monitor;
public string label;
public string background_color;
public string text_color;
public int x;
public int y;
}
[DBus (name = "org.pantheon.gala.daemon")]
public class Gala.Daemon.MenuDaemon : GLib.Object {
public class Gala.Daemon.DBus : GLib.Object {
private const string DBUS_NAME = "org.pantheon.gala";
private const string DBUS_OBJECT_PATH = "/org/pantheon/gala";
@ -21,6 +30,8 @@ public class Gala.Daemon.MenuDaemon : GLib.Object {
private WindowMenu? window_menu;
private BackgroundMenu? background_menu;
private List<MonitorLabel> monitor_labels = new List<MonitorLabel> ();
construct {
Bus.watch_name (BusType.SESSION, DBUS_NAME, BusNameWatcherFlags.NONE, gala_appeared, lost_gala);
}
@ -102,4 +113,21 @@ public class Gala.Daemon.MenuDaemon : GLib.Object {
});
}
}
public void show_monitor_labels (MonitorLabelInfo[] label_infos) throws GLib.DBusError, GLib.IOError {
hide_monitor_labels ();
monitor_labels = new List<MonitorLabel> ();
foreach (var info in label_infos) {
var label = new MonitorLabel (info);
monitor_labels.append (label);
label.present ();
}
}
public void hide_monitor_labels () throws GLib.DBusError, GLib.IOError {
foreach (var monitor_label in monitor_labels) {
monitor_label.close ();
}
}
}

View File

@ -19,6 +19,10 @@ public class Gala.Daemon.Application : Gtk.Application {
granite_settings.notify["prefers-color-scheme"].connect (() => {
gtk_settings.gtk_application_prefer_dark_theme = granite_settings.prefers_color_scheme == Granite.Settings.ColorScheme.DARK;
});
var app_provider = new Gtk.CssProvider ();
app_provider.load_from_resource ("io/elementary/desktop/gala-daemon/gala-daemon.css");
Gtk.StyleContext.add_provider_for_screen (Gdk.Screen.get_default (), app_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
}
public override void activate () {
@ -28,7 +32,7 @@ public class Gala.Daemon.Application : Gtk.Application {
public override bool dbus_register (DBusConnection connection, string object_path) throws Error {
base.dbus_register (connection, object_path);
connection.register_object (object_path, new MenuDaemon ());
connection.register_object (object_path, new DBus ());
return true;
}

57
daemon/MonitorLabel.vala Normal file
View File

@ -0,0 +1,57 @@
/*
* Copyright 2024 elementary, Inc. (https://elementary.io)
* SPDX-License-Identifier: LGPL-3.0-or-later
*/
public class Gala.Daemon.MonitorLabel : Hdy.Window {
private const int SPACING = 12;
private const string COLORED_STYLE_CSS = """
@define-color BG_COLOR %s;
@define-color TEXT_COLOR %s;
""";
public MonitorLabelInfo info { get; construct; }
public MonitorLabel (MonitorLabelInfo info) {
Object (info: info);
}
construct {
child = new Gtk.Label (info.label) {
margin = 12
};
title = "LABEL-%i".printf (info.monitor);
input_shape_combine_region (null);
accept_focus = false;
decorated = false;
resizable = false;
deletable = false;
can_focus = false;
skip_taskbar_hint = true;
skip_pager_hint = true;
type_hint = Gdk.WindowTypeHint.TOOLTIP;
set_keep_above (true);
stick ();
var scale_factor = get_style_context ().get_scale ();
move (
(int) (info.x / scale_factor) + SPACING,
(int) (info.y / scale_factor) + SPACING
);
var provider = new Gtk.CssProvider ();
try {
provider.load_from_data (COLORED_STYLE_CSS.printf (info.background_color, info.text_color));
get_style_context ().add_provider (provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
get_style_context ().add_class ("colored");
} catch (Error e) {
warning ("Failed to load CSS: %s", e.message);
}
show_all ();
}
}

View File

@ -6,12 +6,6 @@
*/
public class Gala.Daemon.Window : Gtk.Window {
static construct {
var app_provider = new Gtk.CssProvider ();
app_provider.load_from_resource ("io/elementary/desktop/gala-daemon/gala-daemon.css");
Gtk.StyleContext.add_provider_for_screen (Gdk.Screen.get_default (), app_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
}
public Gtk.Box content { get; construct; }
public Window (int width, int height) {
@ -37,6 +31,7 @@ public class Gala.Daemon.Window : Gtk.Window {
type_hint = Gdk.WindowTypeHint.DOCK;
set_keep_above (true);
title = "MODAL";
child = content = new Gtk.Box (HORIZONTAL, 0) {
hexpand = true,
vexpand = true

View File

@ -1,15 +1,16 @@
gala_daemon_sources = files(
'Main.vala',
'MenuDaemon.vala',
'DBus.vala',
'MonitorLabel.vala',
'Window.vala',
'WindowMenu.vala',
'BackgroundMenu.vala'
'BackgroundMenu.vala',
)
gala_daemon_bin = executable(
'gala-daemon',
gala_daemon_sources,
dependencies: [gala_dep, gala_base_dep],
dependencies: [gala_dep, gala_base_dep, hdy_dep],
include_directories: config_inc_dir,
install: true,
)

View File

@ -6,3 +6,18 @@
daemon-window {
background-color: transparent;
}
/* For better dark style support */
@define-color BG_COLOR_ALPHA alpha(@BG_COLOR, 0.75);
.colored {
background-color: @BG_COLOR_ALPHA;
color: @TEXT_COLOR;
text-shadow: 0 1px 1px alpha(white, 0.1);
-gtk-icon-shadow: 0 1px 1px alpha(white, 0.1);
-gtk-icon-palette: warning white;
}
window.colored {
background-color: alpha (@BG_COLOR, 0.8);
}

View File

@ -94,6 +94,7 @@ gee_dep = dependency('gee-0.8')
granite_dep = dependency('granite', version: '>= 5.4.0')
gnome_desktop_dep = dependency('gnome-desktop-3.0')
gsd_dep = dependency('gnome-settings-daemon', version: '>= @0@'.format(gsd_version_required))
hdy_dep = dependency('libhandy-1')
m_dep = cc.find_library('m', required: false)
posix_dep = vala.find_library('posix', required: false)
sqlite3_dep = dependency('sqlite3')

View File

@ -81,8 +81,31 @@ public class Gala.DaemonManager : GLib.Object {
}
private void handle_daemon_window (Meta.Window window) {
window.move_frame (false, 0, 0);
window.make_above ();
var info = window.title.split ("-");
if (info.length == 0) {
critical ("Couldn't handle daemon window: No title provided");
return;
}
switch (info[0]) {
case "LABEL":
if (info.length < 2) {
return;
}
var index = int.parse (info[1]);
var monitor_geometry = display.get_monitor_geometry (index);
window.move_frame (false, monitor_geometry.x + SPACING, monitor_geometry.y + SPACING);
window.make_above ();
break;
case "MODAL":
window.move_frame (false, 0, 0);
window.make_above ();
break;
}
}
private void lost_daemon () {