Skip to content

Commit

Permalink
Rewrite tray implementation.
Browse files Browse the repository at this point in the history
  • Loading branch information
N0tACyb0rg committed Sep 8, 2024
1 parent 46712a3 commit 70dddf2
Show file tree
Hide file tree
Showing 12 changed files with 255 additions and 124 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@ _build
.flatpak-builder
src/window/__pycache__
src/download/__pycache__
src/__pycache__
src/__pycache__
src-tray/target/
src-tray/Cargo.lock
.zed/
19 changes: 11 additions & 8 deletions meson.build
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
project('varia',
version: 'v2024.5.7',
meson_version: '>= 0.62.0',
default_options: [ 'warning_level=2', 'werror=false', ],
project(
'varia',
version: 'v2024.5.7',
meson_version: '>= 0.62.0',
default_options: [
'warning_level=2',
'werror=false',
],
)

pkgdatadir = get_option('prefix') / get_option('datadir') / meson.project_name()
Expand All @@ -10,16 +14,15 @@ moduledir = pkgdatadir / 'varia'
i18n = import('i18n')
gnome = import('gnome')



subdir('data')
subdir('src')
subdir('src-tray')
subdir('po')

install_subdir('dependencies_information', install_dir: moduledir)

gnome.post_install(
glib_compile_schemas: true,
gtk_update_icon_cache: true,
glib_compile_schemas: true,
gtk_update_icon_cache: true,
update_desktop_database: true,
)
9 changes: 9 additions & 0 deletions src-tray/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[package]
name = "varia-tray"
version = "0.1.0"
edition = "2021"

[dependencies]
dbus = "0.9.7"
gettext-rs = { version = "0.7.1", features = ["gettext-system"] }
ksni = "0.2.2"
16 changes: 16 additions & 0 deletions src-tray/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
pkgdatadir = get_option('prefix') / get_option('datadir') / 'varia'
moduledir = pkgdatadir / 'varia' / 'tray'

buildtype = get_option('buildtype')

bindir = join_paths(join_paths('target', buildtype, 'varia-tray'))

message('Building tray program...')
if buildtype == 'debug'
cargo = [find_program('cargo'), 'build']
elif buildtype == 'release'
cargo = [find_program('cargo'), 'build', '--release']
endif

build = run_command(cargo, check: true)
install_data(bindir, install_dir: moduledir)
20 changes: 20 additions & 0 deletions src-tray/src/comm.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
pub struct DBusManager<'a> {
pub proxy: dbus::blocking::Proxy<'a, &'a dbus::blocking::Connection>,
}

impl<'a> DBusManager<'a> {
pub fn toggle_window(&self) -> Result<bool, Box<dyn std::error::Error>> {
let (new_state,): (bool,) =
self.proxy
.method_call("io.github.giantpinkrobots.varia.tray", "toggle_window", ())?;

Ok(new_state)
}

pub fn exit_varia(&self) -> Result<(), Box<dyn std::error::Error>> {
self.proxy
.method_call("io.github.giantpinkrobots.varia.tray", "exit_varia", ())?;

std::process::exit(0);
}
}
93 changes: 93 additions & 0 deletions src-tray/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
mod comm;

use std::{env, time::Duration};

use comm::DBusManager;
use dbus::blocking::Connection;
use gettextrs::gettext;
use ksni::{self, menu::StandardItem, MenuItem};

pub struct VariaTray<'a> {
visible: bool,
manager: DBusManager<'a>,
}

impl<'a> ksni::Tray for VariaTray<'a> {
fn icon_name(&self) -> String {
"io.github.giantpinkrobots.varia".into()
}
fn title(&self) -> String {
gettext("Varia")
}
fn id(&self) -> String {
env!("CARGO_PKG_NAME").into()
}
fn menu(&self) -> Vec<ksni::MenuItem<Self>> {
vec![
StandardItem {
label: if self.visible {
gettext("Hide Varia")
} else {
gettext("Show Varia")
},
activate: Box::new(|this: &mut Self| {
this.visible = this.manager.toggle_window().unwrap()
}),
..Default::default()
}
.into(),
MenuItem::Separator,
StandardItem {
label: gettextrs::gettext("Exit Varia"),
activate: Box::new(|this: &mut Self| this.manager.exit_varia().unwrap()),
..Default::default()
}
.into(),
]
}
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = env::args().collect();
let localedir = &args[1];

gettextrs::bindtextdomain("varia", localedir)?;
gettextrs::textdomain("varia")?;

let session = Box::leak(Box::new(Connection::new_session()?));

let proxy = session.with_proxy(
"io.github.giantpinkrobots.varia.tray",
"/TrayServer",
Duration::from_millis(5000),
);

let manager = DBusManager { proxy };

let tray = ksni::TrayService::new(VariaTray {
visible: false,
manager,
});

let handle = tray.handle();

handle.update(|tray: &mut VariaTray| {
let (window_state,): (bool,) = session
.with_proxy(
"io.github.giantpinkrobots.varia.tray",
"/TrayServer",
Duration::from_millis(5000),
)
.method_call(
"io.github.giantpinkrobots.varia.tray",
"get_window_state",
(),
)
.unwrap();
tray.visible = window_state;
});

tray.run()?;

Ok(())
}
8 changes: 4 additions & 4 deletions src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ configure_file(
configuration: conf,
install: true,
install_dir: get_option('bindir'),
install_mode: 'r-xr-xr-x'
install_mode: 'r-xr-xr-x',
)

configure_file(
Expand All @@ -26,12 +26,13 @@ configure_file(
configuration: conf,
install: true,
install_dir: get_option('bindir'),
install_mode: 'r-xr-xr-x'
install_mode: 'r-xr-xr-x',
)

varia_sources = [
'variamain.py',
'variamain.py',
'initiate.py',
'tray_server.py',
'icon.ico'
]

Expand All @@ -40,7 +41,6 @@ varia_sources_window = [
'window/sidebar.py',
'window/preferences.py',
'window/scheduler.py',
'window/tray.py'
]

varia_sources_download = [
Expand Down
52 changes: 52 additions & 0 deletions src/tray_server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import dbus
import dbus.mainloop.glib
import dbus.service

from gi.repository import GLib

class TrayServer(dbus.service.Object):
def __init__(self, path, variaapp) -> None:
self.variaapp = variaapp

if self.variaapp.appconf["default_mode"] == "background":
self.visibility = False
else:
self.visibility = True
self.variaapp.show()

dbus.service.Object.__init__(self, dbus.SessionBus(), path)

@dbus.service.method(dbus_interface='io.github.giantpinkrobots.varia.tray', in_signature='', out_signature='b')
def toggle_window(self):
if self.visibility:
self.variaapp.hide()
self.visibility = False
else:
self.variaapp.show()
self.visibility = True

return dbus.Boolean(self.visibility)

@dbus.service.method(dbus_interface='io.github.giantpinkrobots.varia.tray', in_signature='', out_signature='b')
def get_window_state(self):
return dbus.Boolean(self.visibility)

@dbus.service.method(dbus_interface='io.github.giantpinkrobots.varia.tray', in_signature='', out_signature='')
def exit_varia(self):
self.variaapp.exitProgram(self.variaapp, self.variaapp, False)

class TrayServerRunner:
def __init__(self, variaapp) -> None:
self.variaapp = variaapp
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

self.session_bus = dbus.SessionBus()
self.bus_name = dbus.service.BusName("io.github.giantpinkrobots.varia.tray", self.session_bus)
self.tray_server = TrayServer(path='/TrayServer', variaapp=self.variaapp)

def run(self):
self.loop = GLib.MainLoop()
self.loop.run()

def exit(self):
self.loop.quit()
4 changes: 3 additions & 1 deletion src/varia-py.in
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ VERSION = '@VERSION@'
pkgdatadir = '@pkgdatadir@'
localedir = '@localedir@'

trayexec = pkgdatadir + '/varia/tray/varia-tray'

sys.path.insert(1, pkgdatadir)
signal.signal(signal.SIGINT, signal.SIG_DFL)
gettext.install('varia', localedir)
Expand All @@ -33,4 +35,4 @@ if __name__ == '__main__':
mymodule_dir = os.path.join(pkgdatadir, 'varia')
sys.path.append( mymodule_dir )
from variamain import main
sys.exit(main(VERSION, aria2cexec))
sys.exit(main(VERSION, aria2cexec, trayexec, localedir))
Loading

0 comments on commit 70dddf2

Please sign in to comment.