-
Notifications
You must be signed in to change notification settings - Fork 27
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
46712a3
commit 70dddf2
Showing
12 changed files
with
255 additions
and
124 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.