aboutsummaryrefslogtreecommitdiff
path: root/include/swaybar
diff options
context:
space:
mode:
Diffstat (limited to 'include/swaybar')
-rw-r--r--include/swaybar/bar.h14
-rw-r--r--include/swaybar/config.h18
-rw-r--r--include/swaybar/i3bar.h3
-rw-r--r--include/swaybar/input.h12
-rw-r--r--include/swaybar/tray/host.h17
-rw-r--r--include/swaybar/tray/icon.h52
-rw-r--r--include/swaybar/tray/item.h49
-rw-r--r--include/swaybar/tray/sni.h82
-rw-r--r--include/swaybar/tray/tray.h40
-rw-r--r--include/swaybar/tray/watcher.h18
10 files changed, 209 insertions, 96 deletions
diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h
index 95b20510..2d9ba0d9 100644
--- a/include/swaybar/bar.h
+++ b/include/swaybar/bar.h
@@ -1,6 +1,7 @@
#ifndef _SWAYBAR_BAR_H
#define _SWAYBAR_BAR_H
#include <wayland-client.h>
+#include "config.h"
#include "input.h"
#include "pool-buffer.h"
#include "wlr-layer-shell-unstable-v1-client-protocol.h"
@@ -8,6 +9,9 @@
struct swaybar_config;
struct swaybar_output;
+#if HAVE_TRAY
+struct swaybar_tray;
+#endif
struct swaybar_workspace;
struct loop;
@@ -38,6 +42,10 @@ struct swaybar {
int ipc_socketfd;
struct wl_list outputs; // swaybar_output::link
+
+#if HAVE_TRAY
+ struct swaybar_tray *tray;
+#endif
};
struct swaybar_output {
@@ -53,6 +61,7 @@ struct swaybar_output {
struct wl_list hotspots; // swaybar_hotspot::link
char *name;
+ char *identifier;
bool focused;
uint32_t width, height;
@@ -62,12 +71,15 @@ struct swaybar_output {
struct pool_buffer *current_buffer;
bool dirty;
bool frame_scheduled;
+
+ uint32_t output_height, output_width, output_x, output_y;
};
struct swaybar_workspace {
struct wl_list link; // swaybar_output::workspaces
int num;
char *name;
+ char *label;
bool focused;
bool visible;
bool urgent;
@@ -77,6 +89,8 @@ bool bar_setup(struct swaybar *bar, const char *socket_path);
void bar_run(struct swaybar *bar);
void bar_teardown(struct swaybar *bar);
+void set_bar_dirty(struct swaybar *bar);
+
/*
* Determines whether the bar should be visible and changes it to be so.
* If the current visibility of the bar is the different to what it should be,
diff --git a/include/swaybar/config.h b/include/swaybar/config.h
index 5d40790a..add0a1cf 100644
--- a/include/swaybar/config.h
+++ b/include/swaybar/config.h
@@ -3,6 +3,7 @@
#include <stdbool.h>
#include <stdint.h>
#include <wayland-client.h>
+#include "../include/config.h"
#include "list.h"
#include "util.h"
@@ -34,6 +35,7 @@ struct swaybar_config {
char *hidden_state;
char *modifier;
bool strip_workspace_numbers;
+ bool strip_workspace_name;
bool binding_mode_indicator;
bool wrap_scroll;
bool workspace_buttons;
@@ -41,6 +43,14 @@ struct swaybar_config {
struct wl_list outputs; // config_output::link
bool all_outputs;
int height;
+ int status_padding;
+ int status_edge_padding;
+ struct {
+ int top;
+ int right;
+ int bottom;
+ int left;
+ } gaps;
struct {
uint32_t background;
@@ -57,6 +67,14 @@ struct swaybar_config {
struct box_colors urgent_workspace;
struct box_colors binding_mode;
} colors;
+
+#if HAVE_TRAY
+ char *icon_theme;
+ char *tray_bindings[10]; // mouse buttons 0-9
+ bool tray_hidden;
+ list_t *tray_outputs; // char *
+ int tray_padding;
+#endif
};
struct swaybar_config *init_config(void);
diff --git a/include/swaybar/i3bar.h b/include/swaybar/i3bar.h
index 3f1ecc25..aa4415ff 100644
--- a/include/swaybar/i3bar.h
+++ b/include/swaybar/i3bar.h
@@ -27,6 +27,7 @@ struct i3bar_block {
void i3bar_block_unref(struct i3bar_block *block);
bool i3bar_handle_readable(struct status_line *status);
enum hotspot_event_handling i3bar_block_send_click(struct status_line *status,
- struct i3bar_block *block, int x, int y, enum x11_button button);
+ struct i3bar_block *block, int x, int y, int rx, int ry, int w, int h,
+ uint32_t button);
#endif
diff --git a/include/swaybar/input.h b/include/swaybar/input.h
index a552e7ac..4b46b0de 100644
--- a/include/swaybar/input.h
+++ b/include/swaybar/input.h
@@ -4,6 +4,12 @@
#include <wayland-client.h>
#include "list.h"
+#define SWAY_SCROLL_UP KEY_MAX + 1
+#define SWAY_SCROLL_DOWN KEY_MAX + 2
+#define SWAY_SCROLL_LEFT KEY_MAX + 3
+#define SWAY_SCROLL_RIGHT KEY_MAX + 4
+
+struct swaybar;
struct swaybar_output;
struct swaybar_pointer {
@@ -13,6 +19,7 @@ struct swaybar_pointer {
struct wl_surface *cursor_surface;
struct swaybar_output *current;
int x, y;
+ uint32_t serial;
};
enum x11_button {
@@ -37,13 +44,16 @@ struct swaybar_hotspot {
struct wl_list link; // swaybar_output::hotspots
int x, y, width, height;
enum hotspot_event_handling (*callback)(struct swaybar_output *output,
- int x, int y, enum x11_button button, void *data);
+ struct swaybar_hotspot *hotspot, int x, int y, uint32_t button,
+ void *data);
void (*destroy)(void *data);
void *data;
};
extern const struct wl_seat_listener seat_listener;
+void update_cursor(struct swaybar *bar);
+
void free_hotspots(struct wl_list *list);
#endif
diff --git a/include/swaybar/tray/host.h b/include/swaybar/tray/host.h
new file mode 100644
index 00000000..2d4cf82b
--- /dev/null
+++ b/include/swaybar/tray/host.h
@@ -0,0 +1,17 @@
+#ifndef _SWAYBAR_TRAY_HOST_H
+#define _SWAYBAR_TRAY_HOST_H
+
+#include <stdbool.h>
+
+struct swaybar_tray;
+
+struct swaybar_host {
+ struct swaybar_tray *tray;
+ char *service;
+ char *watcher_interface;
+};
+
+bool init_host(struct swaybar_host *host, char *protocol, struct swaybar_tray *tray);
+void finish_host(struct swaybar_host *host);
+
+#endif
diff --git a/include/swaybar/tray/icon.h b/include/swaybar/tray/icon.h
index 1cc6ff9c..7a6c400c 100644
--- a/include/swaybar/tray/icon.h
+++ b/include/swaybar/tray/icon.h
@@ -1,16 +1,44 @@
-#ifndef _SWAYBAR_ICON_H
-#define _SWAYBAR_ICON_H
+#ifndef _SWAYBAR_TRAY_ICON_H
+#define _SWAYBAR_TRAY_ICON_H
-#include <stdint.h>
-#include <stdbool.h>
-#include <client/cairo.h>
+#include "list.h"
-/**
- * Returns the image found by `name` that is closest to `size`
- */
-cairo_surface_t *find_icon(const char *name, int size);
+enum subdir_type {
+ THRESHOLD,
+ SCALABLE,
+ FIXED
+};
+
+struct icon_theme_subdir {
+ char *name;
+ int size;
+ enum subdir_type type;
+ int max_size;
+ int min_size;
+ int threshold;
+};
+
+struct icon_theme {
+ char *name;
+ char *comment;
+ char *inherits;
+ list_t *directories; // char *
-/* Struct used internally only */
-struct subdir;
+ char *dir;
+ list_t *subdirs; // struct icon_theme_subdir *
+};
+
+void init_themes(list_t **themes, list_t **basedirs);
+void finish_themes(list_t *themes, list_t *basedirs);
+
+/*
+ * Finds an icon of a specified size given a list of themes and base directories.
+ * If the icon is found, the pointers min_size & max_size are set to minimum &
+ * maximum size that the icon can be scaled to, respectively.
+ * Returns: path of icon (which should be freed), or NULL if the icon is not found.
+ */
+char *find_icon(list_t *themes, list_t *basedirs, char *name, int size,
+ char *theme, int *min_size, int *max_size);
+char *find_icon_in_dir(char *name, char *dir, int *min_size, int *max_size);
-#endif /* _SWAYBAR_ICON_H */
+#endif
diff --git a/include/swaybar/tray/item.h b/include/swaybar/tray/item.h
new file mode 100644
index 00000000..4238bdb8
--- /dev/null
+++ b/include/swaybar/tray/item.h
@@ -0,0 +1,49 @@
+#ifndef _SWAYBAR_TRAY_ITEM_H
+#define _SWAYBAR_TRAY_ITEM_H
+
+#include <cairo.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include "swaybar/tray/tray.h"
+#include "list.h"
+
+struct swaybar_output;
+
+struct swaybar_pixmap {
+ int size;
+ unsigned char pixels[];
+};
+
+struct swaybar_sni {
+ // icon properties
+ struct swaybar_tray *tray;
+ cairo_surface_t *icon;
+ int min_size;
+ int max_size;
+
+ // dbus properties
+ char *watcher_id;
+ char *service;
+ char *path;
+ char *interface;
+
+ char *status;
+ char *icon_name;
+ list_t *icon_pixmap; // struct swaybar_pixmap *
+ char *attention_icon_name;
+ list_t *attention_icon_pixmap; // struct swaybar_pixmap *
+ bool item_is_menu;
+ char *menu;
+ char *icon_theme_path; // non-standard KDE property
+
+ sd_bus_slot *new_icon_slot;
+ sd_bus_slot *new_attention_icon_slot;
+ sd_bus_slot *new_status_slot;
+};
+
+struct swaybar_sni *create_sni(char *id, struct swaybar_tray *tray);
+void destroy_sni(struct swaybar_sni *sni);
+uint32_t render_sni(cairo_t *cairo, struct swaybar_output *output, double *x,
+ struct swaybar_sni *sni);
+
+#endif
diff --git a/include/swaybar/tray/sni.h b/include/swaybar/tray/sni.h
deleted file mode 100644
index c2544e2a..00000000
--- a/include/swaybar/tray/sni.h
+++ /dev/null
@@ -1,82 +0,0 @@
-#ifndef _SWAYBAR_SNI_H
-#define _SWAYBAR_SNI_H
-
-#include <stdbool.h>
-#include <client/cairo.h>
-
-struct StatusNotifierItem {
- /* Name registered to sni watcher */
- char *name;
- /* Unique bus name, needed for determining signal origins */
- char *unique_name;
- bool kde_special_snowflake;
-
- cairo_surface_t *image;
- bool dirty;
-};
-
-/* Each output holds an sni_icon_ref of each item to render */
-struct sni_icon_ref {
- cairo_surface_t *icon;
- struct StatusNotifierItem *ref;
-};
-
-struct sni_icon_ref *sni_icon_ref_create(struct StatusNotifierItem *item,
- int height);
-
-void sni_icon_ref_free(struct sni_icon_ref *sni_ref);
-
-/**
- * Will return a new item and get its icon. (see warning below)
- * May return `NULL` if `name` is not valid.
- */
-struct StatusNotifierItem *sni_create(const char *name);
-
-/**
- * `item` must be a struct StatusNotifierItem *
- * `str` must be a NUL terminated char *
- *
- * Returns 0 if `item` has a name of `str`
- */
-int sni_str_cmp(const void *item, const void *str);
-
-/**
- * Returns 0 if `item` has a unique name of `str` or if
- * `item->unique_name == NULL`
- */
-int sni_uniq_cmp(const void *item, const void *str);
-
-/**
- * Gets an icon for the given item if found.
- *
- * XXX
- * This function keeps a reference to the item until it gets responses, make
- * sure that the reference and item are valid during this time.
- */
-void get_icon(struct StatusNotifierItem *item);
-
-/**
- * Calls the "activate" method on the given StatusNotifierItem
- *
- * x and y should be where the item was clicked
- */
-void sni_activate(struct StatusNotifierItem *item, uint32_t x, uint32_t y);
-
-/**
- * Asks the item to draw a context menu at the given x and y coords
- */
-void sni_context_menu(struct StatusNotifierItem *item, uint32_t x, uint32_t y);
-
-/**
- * Calls the "secondary activate" method on the given StatusNotifierItem
- *
- * x and y should be where the item was clicked
- */
-void sni_secondary(struct StatusNotifierItem *item, uint32_t x, uint32_t y);
-
-/**
- * Deconstructs `item`
- */
-void sni_free(struct StatusNotifierItem *item);
-
-#endif /* _SWAYBAR_SNI_H */
diff --git a/include/swaybar/tray/tray.h b/include/swaybar/tray/tray.h
new file mode 100644
index 00000000..8958b69a
--- /dev/null
+++ b/include/swaybar/tray/tray.h
@@ -0,0 +1,40 @@
+#ifndef _SWAYBAR_TRAY_TRAY_H
+#define _SWAYBAR_TRAY_TRAY_H
+
+#include "config.h"
+#ifdef HAVE_SYSTEMD
+#include <systemd/sd-bus.h>
+#elif HAVE_ELOGIND
+#include <elogind/sd-bus.h>
+#endif
+#include <cairo.h>
+#include <stdint.h>
+#include "swaybar/tray/host.h"
+#include "list.h"
+
+struct swaybar;
+struct swaybar_output;
+struct swaybar_watcher;
+
+struct swaybar_tray {
+ struct swaybar *bar;
+
+ int fd;
+ sd_bus *bus;
+
+ struct swaybar_host host_xdg;
+ struct swaybar_host host_kde;
+ list_t *items; // struct swaybar_sni *
+ struct swaybar_watcher *watcher_xdg;
+ struct swaybar_watcher *watcher_kde;
+
+ list_t *basedirs; // char *
+ list_t *themes; // struct swaybar_theme *
+};
+
+struct swaybar_tray *create_tray(struct swaybar *bar);
+void destroy_tray(struct swaybar_tray *tray);
+void tray_in(int fd, short mask, void *data);
+uint32_t render_tray(cairo_t *cairo, struct swaybar_output *output, double *x);
+
+#endif
diff --git a/include/swaybar/tray/watcher.h b/include/swaybar/tray/watcher.h
new file mode 100644
index 00000000..8f276da8
--- /dev/null
+++ b/include/swaybar/tray/watcher.h
@@ -0,0 +1,18 @@
+#ifndef _SWAYBAR_TRAY_WATCHER_H
+#define _SWAYBAR_TRAY_WATCHER_H
+
+#include "swaybar/tray/tray.h"
+#include "list.h"
+
+struct swaybar_watcher {
+ char *interface;
+ sd_bus *bus;
+ list_t *hosts;
+ list_t *items;
+ int version;
+};
+
+struct swaybar_watcher *create_watcher(char *protocol, sd_bus *bus);
+void destroy_watcher(struct swaybar_watcher *watcher);
+
+#endif