finish up tray icon

This commit is contained in:
Chris Cromer 2020-08-07 16:17:15 -04:00
parent 130a131214
commit a6e1c031c3
Signed by: cromer
GPG Key ID: 39CC813FF3C8708A
10 changed files with 184 additions and 42 deletions

View File

@ -7,6 +7,17 @@ if build_gui
install: true, install: true,
install_dir: join_paths(get_option('datadir'), 'applications') install_dir: join_paths(get_option('datadir'), 'applications')
) )
if build_tray
i18n.merge_file(
input: 'tuf-tray.desktop.in',
output: 'tuf-tray.desktop',
po_dir: join_paths(meson.source_root(), 'po'),
type: 'desktop',
install: true,
install_dir: join_paths(get_option('sysconfdir'), 'xdg', 'autostart')
)
endif
endif endif
subdir('dbus') subdir('dbus')

View File

@ -2,8 +2,8 @@
Type=Application Type=Application
Name=TUF Manager Name=TUF Manager
GenericName=TUF Manager GenericName=TUF Manager
Comment=Softare to manage the fan mode and rgb keyboard. Comment=Softare to manage the fan mode and rgb keyboard
Icon=tuf-manager Icon=tuf-manager
StartupNotify=true StartupNotify=true
Exec=tuf-gui Exec=tuf-gui
Categories=System; Categories=System;Settings;

10
data/tuf-tray.desktop.in Normal file
View File

@ -0,0 +1,10 @@
[Desktop Entry]
Name=TUF Manager
GenericName=TUF Manager
Comment=Softare to manage the fan mode and rgb keyboard
Icon=tuf-manager
Categories=System;Settings;
Exec=/usr/bin/tuf-tray
Type=Application
StartupNotify=true
Terminal=false

View File

@ -9,6 +9,7 @@ src/server.vala
src/server-interface.vala src/server-interface.vala
src/server-main.vala src/server-main.vala
data/tuf-manager.desktop.in data/tuf-manager.desktop.in
data/tuf-tray.desktop.in
data/gschema/org.tuf.manager.gschema.xml data/gschema/org.tuf.manager.gschema.xml
data/polkit/org.tuf.manager.policy.in data/polkit/org.tuf.manager.policy.in
data/ui/tuf.manager.window.ui data/ui/tuf.manager.window.ui

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: tuf-manager\n" "Project-Id-Version: tuf-manager\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-07 01:13-0400\n" "POT-Creation-Date: 2020-08-07 10:08-0400\n"
"PO-Revision-Date: 2020-08-07 01:14-0400\n" "PO-Revision-Date: 2020-08-07 10:08-0400\n"
"Last-Translator: Chris Cromer <chris@cromer.cl>\n" "Last-Translator: Chris Cromer <chris@cromer.cl>\n"
"Language-Team: none\n" "Language-Team: none\n"
"Language: es\n" "Language: es\n"
@ -219,16 +219,17 @@ msgid "Could not acquire bus name!"
msgstr "¡No se pudo adquirir el bus name!" msgstr "¡No se pudo adquirir el bus name!"
#: data/tuf-manager.desktop.in:4 data/tuf-manager.desktop.in:5 #: data/tuf-manager.desktop.in:4 data/tuf-manager.desktop.in:5
#: data/tuf-tray.desktop.in:3 data/tuf-tray.desktop.in:4
#: data/ui/tuf.manager.window.ui:41 #: data/ui/tuf.manager.window.ui:41
msgid "TUF Manager" msgid "TUF Manager"
msgstr "Administrador TUF" msgstr "Administrador TUF"
#: data/tuf-manager.desktop.in:6 #: data/tuf-manager.desktop.in:6 data/tuf-tray.desktop.in:5
msgid "Softare to manage the fan mode and rgb keyboard." msgid "Softare to manage the fan mode and rgb keyboard"
msgstr "Software para gestionar el modo ventilador y el teclado rgb." msgstr "Software para gestionar el modo ventilador y el teclado rgb"
# Not translatable # Not translatable
#: data/tuf-manager.desktop.in:7 #: data/tuf-manager.desktop.in:7 data/tuf-tray.desktop.in:6
msgid "tuf-manager" msgid "tuf-manager"
msgstr "" msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: tuf-manager\n" "Project-Id-Version: tuf-manager\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-07 01:13-0400\n" "POT-Creation-Date: 2020-08-07 10:08-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -213,15 +213,16 @@ msgid "Could not acquire bus name!"
msgstr "" msgstr ""
#: data/tuf-manager.desktop.in:4 data/tuf-manager.desktop.in:5 #: data/tuf-manager.desktop.in:4 data/tuf-manager.desktop.in:5
#: data/tuf-tray.desktop.in:3 data/tuf-tray.desktop.in:4
#: data/ui/tuf.manager.window.ui:41 #: data/ui/tuf.manager.window.ui:41
msgid "TUF Manager" msgid "TUF Manager"
msgstr "" msgstr ""
#: data/tuf-manager.desktop.in:6 #: data/tuf-manager.desktop.in:6 data/tuf-tray.desktop.in:5
msgid "Softare to manage the fan mode and rgb keyboard." msgid "Softare to manage the fan mode and rgb keyboard"
msgstr "" msgstr ""
#: data/tuf-manager.desktop.in:7 #: data/tuf-manager.desktop.in:7 data/tuf-tray.desktop.in:6
msgid "tuf-manager" msgid "tuf-manager"
msgstr "" msgstr ""

View File

@ -149,7 +149,7 @@ namespace TUFManager {
* Used to restore the previous config from donf * Used to restore the previous config from donf
* TODO: Move this to a status bar app and/or user daemon * TODO: Move this to a status bar app and/or user daemon
*/ */
public void restore () { private void restore () {
var mode = settings.get_int ("fan-mode"); var mode = settings.get_int ("fan-mode");
if (mode >= 0 && mode <= 2) { if (mode >= 0 && mode <= 2) {
if (get_fan_mode () != mode) { if (get_fan_mode () != mode) {

View File

@ -49,7 +49,8 @@ if build_gui
tray_dependencies = [ tray_dependencies = [
appindicator_dep, appindicator_dep,
gtk_dep, gtk_dep,
libnotify_dep libnotify_dep,
meson.get_compiler('vala').find_library('posix')
] ]
endif endif
endif endif
@ -126,7 +127,8 @@ if build_gui
tray_vala_sources = files( tray_vala_sources = files(
'tray.vala', 'tray.vala',
'tray-icon.vala', 'tray-icon.vala',
'server-interface.vala' 'server-interface.vala',
'common.vala'
) )
endif endif
endif endif

View File

@ -20,24 +20,66 @@ namespace TUFManager {
* The tray namespace handles everything related to the system tray * The tray namespace handles everything related to the system tray
*/ */
namespace Tray { namespace Tray {
private TUFManagerApp parent;
private Thread<void>? thread = null;
private bool poll = true;
public class TrayIcon { public class TrayIcon {
private AppIndicator.Indicator indicator; private AppIndicator.Indicator indicator;
private Notify.Notification notification; private Notify.Notification notification;
private Gtk.IconTheme icon_theme; private Gtk.IconTheme icon_theme;
public TrayIcon (TUFManagerApp parent) { /**
* The settings object from gschema/dconf
*/
private Settings settings;
public TrayIcon () {
Process.signal (ProcessSignal.INT, on_exit);
Process.signal (ProcessSignal.TERM, on_exit);
settings = new Settings ("org.tuf.manager");
try {
connect_tuf_server ();
}
catch (TUFError e) {
warning (e.message);
}
icon_theme = Gtk.IconTheme.get_default (); icon_theme = Gtk.IconTheme.get_default ();
icon_theme.changed.connect (on_icon_theme_changed); icon_theme.changed.connect (on_icon_theme_changed);
indicator = new AppIndicator.Indicator (_ ("TUF Manager"), "tuf-manager", AppIndicator.IndicatorCategory.APPLICATION_STATUS); indicator = new AppIndicator.Indicator (_ ("TUF Manager"), "tuf-manager", AppIndicator.IndicatorCategory.APPLICATION_STATUS);
indicator.set_status (AppIndicator.IndicatorStatus.ACTIVE);
var menu = new Gtk.Menu (); var menu = new Gtk.Menu ();
var item = new Gtk.MenuItem.with_label (_ ("TUF Manager")); var item = new Gtk.MenuItem.with_mnemonic (_ ("_TUF Manager"));
item.activate.connect (execute_manager); item.activate.connect (execute_manager);
menu.append (item); menu.append (item);
item = new Gtk.MenuItem.with_mnemonic (_ ("_Quit"));
item.activate.connect (parent.release); // Submenu fan
item = new Gtk.MenuItem.with_mnemonic (_ ("_Fan"));
menu.append (item); menu.append (item);
var submenu = new Gtk.Menu ();
item.set_submenu (submenu);
// Fan modes
var subitem = new Gtk.MenuItem.with_mnemonic (_ ("_Balanced"));
subitem.activate.connect (set_fan_balanced);
submenu.append (subitem);
subitem = new Gtk.MenuItem.with_mnemonic (_ ("_Turbo"));
subitem.activate.connect (set_fan_turbo);
submenu.append (subitem);
subitem = new Gtk.MenuItem.with_mnemonic (_ ("_Silent"));
subitem.activate.connect (set_fan_silent);
submenu.append (subitem);
// Quit
item = new Gtk.MenuItem.with_mnemonic (_ ("_Quit"));
item.activate.connect (quit);
menu.append (item);
menu.show_all (); menu.show_all ();
indicator.set_menu (menu); indicator.set_menu (menu);
@ -48,13 +90,55 @@ namespace TUFManager {
Timeout.add_seconds (30, () => { Timeout.add_seconds (30, () => {
indicator.set_status (AppIndicator.IndicatorStatus.ACTIVE); indicator.set_status (AppIndicator.IndicatorStatus.ACTIVE);
show_notification ("TUF Manager started");
close_notification ();
return false; return false;
}); });
Notify.init (_ ("TUF Manager")); Notify.init (_ ("TUF Manager"));
//show_notification ("test"); restore ();
//update_notification ("test2"); thread = new Thread<void> ("poll_fan", this.poll_fan);
}
private void quit () {
on_exit (ProcessSignal.TERM);
}
private static void on_exit (int signum) {
poll = false;
if (thread != null) {
thread.join ();
}
parent.release () ;
}
private void poll_fan () {
int ret;
Posix.pollfd[] fan_fd = {};
fan_fd += Posix.pollfd ();
fan_fd[0].fd = Posix.open (THERMAL_PATH, Posix.O_RDONLY);
fan_fd[0].events = Posix.POLLERR | Posix.POLLPRI;
Posix.read (fan_fd[0].fd, null, 1);
string content = "";
while (poll) {
ret = Posix.poll (fan_fd, 1000);
if (ret > 0) {
Posix.read (fan_fd[0].fd, content, 1);
Posix.lseek (fan_fd[0].fd, Posix.SEEK_SET, 0);
int mode = int.parse (content);
if (mode == 0) {
show_notification (_ ("Fan set to balanced"));
}
else if (mode == 1) {
show_notification (_ ("Fan set to turbo"));
}
else if (mode == 2) {
show_notification (_ ("Fan set to silent"));
}
}
}
} }
private void execute_manager () { private void execute_manager () {
@ -66,6 +150,54 @@ namespace TUFManager {
} }
} }
private void set_fan_balanced () {
set_fan_mode (0);
//show_notification (_ ("Fan set to balanced"));
settings.set_int ("fan-mode", 0);
}
private void set_fan_turbo () {
set_fan_mode (1);
//show_notification (_ ("Fan set to turbo"));
settings.set_int ("fan-mode", 1);
}
private void set_fan_silent () {
set_fan_mode (2);
//show_notification (_ ("Fan set to silenced"));
settings.set_int ("fan-mode", 2);
}
private void restore () {
var mode = settings.get_int ("fan-mode");
if (mode >= 0 && mode <= 2) {
if (get_fan_mode () != mode) {
set_fan_mode (mode);
}
}
mode = settings.get_int ("keyboard-mode");
if (mode >= 0 && mode <= 3) {
if (get_keyboard_mode () != mode) {
set_keyboard_mode (mode);
}
}
var speed = settings.get_int ("keyboard-speed");
if (speed >= 0 && speed <= 2) {
if (get_keyboard_speed () != speed) {
set_keyboard_speed (speed);
}
}
var color = settings.get_string ("keyboard-color");
var rgba = Gdk.RGBA ();
rgba.parse (color);
if (!get_keyboard_color ().equal (rgba)) {
set_keyboard_color (rgba);
}
}
private void set_icon_visible (bool visible) { private void set_icon_visible (bool visible) {
if (visible) { if (visible) {
indicator.set_status (AppIndicator.IndicatorStatus.ACTIVE); indicator.set_status (AppIndicator.IndicatorStatus.ACTIVE);
@ -75,12 +207,12 @@ namespace TUFManager {
} }
} }
private void show_notification (string info) { private void show_notification (string message) {
try { try {
close_notification (); close_notification ();
notification = new Notify.Notification (_ ("TUF Manager"), info, "tuf-manager"); notification = new Notify.Notification (_ ("TUF Manager"), message, "tuf-manager");
notification.set_timeout (Notify.EXPIRES_DEFAULT); notification.set_timeout (Notify.EXPIRES_DEFAULT);
notification.add_action ("default", _ ("Details"), execute_manager); notification.add_action ("default", _ ("Details"), close_notification);
notification.show (); notification.show ();
} }
catch (Error e) { catch (Error e) {
@ -88,23 +220,6 @@ namespace TUFManager {
} }
} }
private void update_notification (string info) {
try {
if (notification != null) {
if (notification.get_closed_reason () == -1 && notification.body != info) {
notification.update (_ ("TUF Manager"), info, "tuf-manager");
notification.show ();
}
}
else {
show_notification (info);
}
}
catch (Error e) {
warning (e.message);
}
}
private void close_notification () { private void close_notification () {
try { try {
if (notification != null && notification.get_closed_reason () == -1) { if (notification != null && notification.get_closed_reason () == -1) {

View File

@ -26,7 +26,8 @@ namespace TUFManager {
} }
public override void activate () { public override void activate () {
new TrayIcon (this); parent = this;
new TrayIcon ();
} }
public override void startup () { public override void startup () {