summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkotontrion <[email protected]>2024-05-23 17:34:06 +0200
committerkotontrion <[email protected]>2024-05-23 17:34:06 +0200
commit3486989e9191af00248efb4a5a973fac64b1d8c1 (patch)
treebb7afb90da4266a57286ce6754ddb238f0c8b1c5
parent2a148886dcf186afaf8393cccdc39ce4c7ebcbc7 (diff)
add cli tool
-rw-r--r--meson_options.txt3
-rw-r--r--src/cli.vala55
-rw-r--r--src/config.vala.in6
-rw-r--r--src/meson.build27
-rw-r--r--src/trayItem.vala43
5 files changed, 123 insertions, 11 deletions
diff --git a/meson_options.txt b/meson_options.txt
index 87ad515..d157c62 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1 +1,2 @@
-option('typelib', type: 'boolean', value: true, description: 'Needed files for runtime bindings')
+option('typelib', type: 'boolean', value: true, description: 'Needed files for runtime bindings.')
+option('cli', type: 'boolean', value: true, description: 'a simple cli tool for interacting with the tray.')
diff --git a/src/cli.vala b/src/cli.vala
new file mode 100644
index 0000000..c22e096
--- /dev/null
+++ b/src/cli.vala
@@ -0,0 +1,55 @@
+static bool help;
+static bool version;
+static bool daemonize;
+
+const OptionEntry[] options = {
+ { "version", 'v', OptionFlags.NONE, OptionArg.NONE, ref version, "Print version number", null },
+ { "daemon", 'd', OptionFlags.NONE, OptionArg.NONE, ref daemonize, "Monitor the systemtray", null },
+ { null },
+};
+
+int main(string[] argv) {
+ try {
+ var opts = new OptionContext();
+ opts.add_main_entries(options, null);
+ opts.set_help_enabled(true);
+ opts.set_ignore_unknown_options(false);
+ opts.parse(ref argv);
+ } catch (OptionError err) {
+ printerr (err.message);
+ return 1;
+ }
+
+ var loop = new MainLoop();
+ var tray = new AstalTray.Tray();
+
+ if (version) {
+ print(AstalTray.VERSION);
+ return 0;
+ }
+
+ if (daemonize) {
+ tray.item_added.connect((id) => {
+
+ AstalTray.TrayItem item = tray.get_item(id);
+
+ string item_json = item.to_json_string();
+ stdout.printf("{\"event\":\"item_added\",\"id\":\"%s\",\"item\":%s}\n",
+ id, item_json);
+ stdout.flush();
+
+ item.changed.connect(() => {
+ stdout.printf("{\"event\":\"item_changed\",\"id\":\"%s\",\"item\":%s}\n",
+ id, item_json);
+ stdout.flush();
+ });
+ });
+ tray.item_removed.connect((id) => {
+ stdout.printf("{\"event\":\"item_removed\",\"id\":\"%s\"}\n", id);
+ stdout.flush();
+ });
+ }
+
+ loop.run();
+ return 0;
+}
diff --git a/src/config.vala.in b/src/config.vala.in
new file mode 100644
index 0000000..85cca51
--- /dev/null
+++ b/src/config.vala.in
@@ -0,0 +1,6 @@
+namespace AstalTray {
+ const int MAJOR_VERSION = @MAJOR_VERSION@;
+ const int MINOR_VERSION = @MINOR_VERSION@;
+ const int MICRO_VERSION = @MICRO_VERSION@;
+ const string VERSION = "@VERSION@";
+}
diff --git a/src/meson.build b/src/meson.build
index f89f3fc..d5ee6e7 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -4,6 +4,17 @@ tray_gir = 'AstalTray-' + api_version + '.gir'
tray_typelib = 'AstalTray-' + api_version + '.typelib'
tray_so = 'libastal-tray.so.' + meson.project_version()
+config = configure_file(
+ input: 'config.vala.in',
+ output: 'config.vala',
+ configuration: {
+ 'VERSION': meson.project_version(),
+ 'MAJOR_VERSION': version_split[0],
+ 'MINOR_VERSION': version_split[1],
+ 'MICRO_VERSION': version_split[2],
+ },
+)
+
deps = [
dependency('glib-2.0'),
dependency('gobject-2.0'),
@@ -33,11 +44,12 @@ dbusmenu_libs = run_command(
check: true,
).stdout().strip()
-sources = files(
+sources = [
+ config,
'tray.vala',
'watcher.vala',
'trayItem.vala'
-)
+]
libtray = library(
meson.project_name(),
@@ -82,3 +94,14 @@ if get_option('typelib')
)
endif
+if get_option('cli')
+ executable(
+ meson.project_name(),
+ ['cli.vala', sources],
+ dependencies: deps,
+ vala_args: ['--pkg', 'DbusmenuGtk3-0.4', '--pkg', 'Dbusmenu-0.4'],
+ c_args: dbusmenu_cflags.split(' '),
+ link_args: dbusmenu_libs.split(' '),
+ install: true,
+ )
+endif
diff --git a/src/trayItem.vala b/src/trayItem.vala
index 11840d5..8a91fa9 100644
--- a/src/trayItem.vala
+++ b/src/trayItem.vala
@@ -93,7 +93,6 @@ namespace AstalTray {
public string icon_theme_path { owned get { return proxy.IconThemePath ;} }
public bool is_menu { get { return proxy.ItemIsMenu ;} }
- public DbusmenuGtk.Menu? menu { get; private set;}
public string icon_name {
owned get {
if(proxy.Status == Status.NEEDS_ATTENTION)
@@ -103,6 +102,8 @@ namespace AstalTray {
}
public Gdk.Pixbuf icon_pixbuf { owned get { return _get_icon_pixbuf(); } }
+
+ public string item_id { get; private set; }
public signal void changed();
public signal void ready();
@@ -110,6 +111,7 @@ namespace AstalTray {
public TrayItem(string service, string path) {
connection_ids = new List<ulong>();
+ item_id = service + path;
setup_proxy(service, path);
}
@@ -120,13 +122,7 @@ namespace AstalTray {
proxy = yield Bus.get_proxy(
BusType.SESSION,
service,
- path);
-
- if(proxy.Menu != null) {
- menu = new DbusmenuGtk.Menu(
- proxy.get_name_owner(),
- proxy.Menu);
- }
+ path);
connection_ids.append(proxy.NewStatus.connect(() => refresh_all_properties()));
connection_ids.append(proxy.NewToolTip.connect(() => refresh_all_properties()));
@@ -190,6 +186,12 @@ namespace AstalTray {
});
}
+ public DbusmenuGtk.Menu create_menu() {
+ if(proxy.Menu == null) return null;
+ return new DbusmenuGtk.Menu(
+ proxy.get_name_owner(),
+ proxy.Menu);
+ }
public Gdk.Pixbuf? _get_icon_pixbuf() {
Pixmap[] pixmaps = proxy.Status == Status.NEEDS_ATTENTION
@@ -252,6 +254,31 @@ namespace AstalTray {
(int)(pixmap.width * 4)
);
}
+
+ public string to_json_string() {
+ var generator = new Json.Generator();
+ generator.set_root(to_json());
+ return generator.to_data(null);
+ }
+
+ internal Json.Node to_json() {
+ return new Json.Builder()
+ .begin_object()
+ .set_member_name("item_id").add_string_value(item_id)
+ .set_member_name("id").add_string_value(id)
+ .set_member_name("bus_name").add_string_value(proxy.g_name)
+ .set_member_name("object_path").add_string_value(proxy.g_object_path)
+ .set_member_name("title").add_string_value(title)
+ .set_member_name("status").add_string_value(status.to_string())
+ .set_member_name("category").add_string_value(category.to_string())
+ .set_member_name("tooltip").add_string_value(tooltip_markup)
+ .set_member_name("icon_theme_path").add_string_value(proxy.IconThemePath)
+ .set_member_name("icon_name").add_string_value(icon_name)
+ .set_member_name("menu_path").add_string_value(proxy.Menu)
+ .set_member_name("is_menu").add_boolean_value(is_menu)
+ .end_object()
+ .get_root();
+ }
}
}