Commit graph

85 commits

Author SHA1 Message Date
Vladimir Panteleev
a7a7660a49 fix(swaybar/dbusmenu): cache icon lookups to avoid repeated filesystem access
Add caching for icon lookups in menu items. Two new fields are added to
the menu item struct:
- icon_surface: cached icon surface loaded from icon_name
- icon_lookup_done: tracks whether icon lookup has been attempted

The icon is now looked up once and cached, rather than performing
filesystem access every time the menu is drawn. The cached surface is
properly cleaned up when the menu is destroyed.
2026-01-12 19:12:26 +01:00
Vladimir Panteleev
d0242fb6b4 fix(swaybar/dbusmenu): properly destroy cairo surface for icon data
Properly destroy cairo surface for icon data when freeing dbusmenu
items.
2026-01-12 19:12:26 +01:00
Vladimir Panteleev
2508a1d019 fix(swaybar/dbusmenu): fix null pointer dereference when loading icons
This change adds a null check when loading icons in the dbusmenu
code to avoid a segmentation fault when the icon surface fails to load.
2026-01-12 19:12:26 +01:00
blinxen
9e035e0277 Remove unused includes 2025-10-13 22:11:39 +02:00
blinxen
0f7853e074 Rename dbusmenu functions to adhere to the style guide 2025-10-13 21:55:52 +02:00
blinxen
47234b37da Limit recursion depth when trying to find items under dbus menu 2025-10-13 21:47:17 +02:00
blinxen
0289272bd0 Remove comment that should be now obsolete 2025-10-13 21:28:56 +02:00
blinxen
9c1da3a631 Close dbus menu when unregistering sni 2025-10-13 21:28:33 +02:00
blinxen
023e68a673 Initialize surface height with 0 before drawing 2025-10-13 21:26:39 +02:00
blinxen
6523a2379b Replace old usage of background-image.h
See https://github.com/swaywm/sway/pull/8405#discussion_r1817770755 and https://github.com/swaywm/sway/pull/8405#discussion_r1817770817
2025-10-13 01:35:12 +02:00
blinxen
56c4660ebc Remove trailing whitespace 2025-10-13 01:30:03 +02:00
Giancarlo Razzolini
f642064717 Apply suggestions from code review
Co-authored-by: Demi Marie Obenour <demiobenour@gmail.com>
2025-10-13 01:29:07 +02:00
Florian Franzen
42817f2a8e Tray: don't invoke dbus menu when tray is disabled 2025-10-13 01:28:40 +02:00
Felix Weilbach
c3df548647 Tray: Implement dbusmenu
Co-authored-by: Ian Fan <ianfan0@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>

Signed-off-by: Felix Weilbach <felix.weilbach@t-online.de>
2025-10-13 01:28:23 +02:00
Simon Ser
0c60d1581f Use has_prefix() instead of strncmp() throughout
This is safer than hardcoded string lengths.
2025-01-07 16:35:31 +01:00
Joan Bruguera Micó
f23d100747 swaybar: Emit property changes for SNI watcher
Emit property change signals for the IsStatusNotifierHostRegistered and
RegisteredStatusNotifierItems properties in StatusNotifierWatcher,
so code relying on the PropertiesChanged signal, instead of signals
such as StatusNotifierHostRegistered, can work properly.

A library that is affected by this is the libappindicator-gtk3* library
and it can cause tray icons to be missing after starting swaybar due to
a race condition, as follows:
* An application using libappindicator-gtk3 starts, e.g. nm-applet.
* Some time later, swaybar starts.
* swaybar creates the StatusNotifierWatcher.
* libappindicator-gtk3 observes the new watcher, but it sees that
  IsStatusNotifierHostRegistered=false, so it falls back to the
  Freedesktop System tray protocol.
* swaybar creates the StatusNotifierHost.
  At this point, libappindicator-gtk3 should "un-fallback" back to SNI.
  However, since swaybar does not emit the PropertiesChange signal on
  IsStatusNotifierHostRegistered, libappindicator-gtk3 doesn't get
  notified, and stays in fallback state forever.
* As a result, nm-applet will not show in the swaybar tray.

This race can be made reliable by inserting a 1-second long sleep here:
03483ff370/swaybar/tray/tray.c (L57)

(*) Note that the libappindicator-gtk3 library has been mostly replaced
    by libayatana-appindicator, which is not affected by this.
    The affected version is still used by Arch Linux, source code at:
    https://bazaar.launchpad.net/~indicator-applet-developers/libappindicator/trunk/files/298
2024-11-10 20:42:02 +01:00
Furkan Sahin
00e9a94152 swaybar: Fix 100% cpu usage if dbus dies.
Currently, swaybar does not gracefully die if it detects
that the dbus connection was lost. Although it's not recommended
to restart dbus without restarting the compositor, it can very
easily happen. In the case it does, compositor's tray should
not consume 100% cpu until it has to be force killed.

apply suggestions

just setting the bar to not running will call teardown and unref the
dbus.
2024-09-28 16:23:21 +02:00
Simon Ser
fc640d5f6c Define _POSIX_C_SOURCE globally
See discussion in https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4555
2024-02-23 17:43:19 +03:00
Manuel Stoeckl
e633fe0b40 common: move load_image to swaybar
swaynag, swaymsg, and sway do not use this function and are
unlikely to in the future.
2023-11-23 20:42:04 +01:00
Manuel Stoeckl
439122e887 common: rename load_background_image to load_image 2023-11-23 20:42:04 +01:00
Hodong
7fbd9fbf28
swaybar: remove the argument of StatusNotifierHostRegistered
According to
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierWatcher/
there is no argument for the StatusNotifierHostRegistered signal.
2023-06-23 17:54:08 +02:00
Simon Ser
08c1946d71 Use format_str() throughout 2023-04-14 18:34:54 +02:00
Joan Bruguera
94b69acf0d swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).

This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.

E.g., in Sway, without this commit, this config. shows a text on tray clicks:

    bar {
        # ...
        bindsym --release button1 exec swaynag -m I_got_the_release_event.
    }

But the same configuration in i3 (with i3-nagbar) doesn't show the text.

Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
2022-11-26 10:17:53 +01:00
Tobias Bengfort
b4fd4bca0e tray: do not render passive items
https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status
2022-01-19 09:20:27 +01:00
Nathan Schulte
107d15fafd swaybar: fix tray item icon scaling, positioning 2022-01-07 15:06:29 +01:00
Nathan Schulte
bb60381c75 swaybar: fix tray_padding vs min-height re: scale
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
2022-01-07 15:06:29 +01:00
Issam E. Maghni
d45623c2db cairo: Replace <cairo/cairo.h> by <cairo.h>
For full context, read
https://gitlab.freedesktop.org/cairo/cairo/-/issues/479
TL;DR, cairo’s pc file adds `/cairo` to CFLAGS.
So namespace cairo shouldn’t be used.
2021-05-10 10:28:32 +02:00
Pi-Yueh Chuang
6059c744f8
swaybar: silence missing IconThemePath message
IconThemePath is not a standard property in XDG's StatusNotifierItem
specification, so missing this property should not be logged as an error.

This patch changes the log level to SWAY_DEBUG when swaybar queries the
value of IconThemePath so that swaybar won't log the returned message as
an error if IconThemePath does not exist.

Closes: https://github.com/swaywm/sway/issues/6092
2021-03-17 09:49:04 +01:00
Ian Fan
65501f0e46 tray: track SNI callbacks
This removes any pending messages once the item is destroyed.
Furthermore, this installs SNI event calbacks asynchronously
in order to prevent sd-bus from bypassing pending messages.
2020-03-30 17:31:00 +02:00
Ian Fan
68f53cd509 tray: tidy code
This includes some refactoring and fixing a small memory leak.
2020-03-30 17:31:00 +02:00
Ian Fan
3b894c387d tray: allow themes to inherit from multiple themes 2020-03-30 17:31:00 +02:00
Ian Fan
66f0c91bb8 tray: better errors when parsing index.theme 2020-03-30 17:31:00 +02:00
Hristo Venev
7affe5c1bd swaybar: fix i3bar relative coordinates when scaling is used
24e8ba048a did not take scaling into account.
The hotspot size used pixel coordinates, the absolute coordinates were logical,
and the relative coordinates were completely wrong.

This commit makes all coordinates use logical values. If
`"float_event_coords":true` is sent in the handshake message, coordinates are
sent as floating-point values.

The "scale" field is an integer containing the scale value.
2020-02-10 18:58:09 +01:00
Till Hofmann
0f5157668d Avoid calling strcmp on nullptr
The function group_handler may get a nullptr as `new_group`. If that's
the case, return true, as if `new_group` was the empty string.

Also make the conversion to bool explicit when calling `strcmp`.
2020-02-10 13:29:07 +01:00
Jason
939c7b2d52 Amend typos 2019-11-23 11:48:31 +01:00
Konstantin Pospelov
06fcebc542 swaybar: fix typo in the loop over pixmaps
Fixes #4665.
2019-10-23 09:53:16 +02:00
Konstantin Pospelov
fa0abaf7cf swaybar: do not retry search for tray icons
In case a tray icon cannot be found or does not have a desirable size,
swaybar retries the search again and again, which increases load on disk
and CPU. This commit solves it by storing target_size for each icon, so
that swaybar does not search for an icon of some size if it already tried to.

Fixes #3789.
2019-10-21 17:22:25 +02:00
Ben Brown
0ad5e355bd Add icon_theme_path to find_icon() search if set
find_icon() will search in theme appropriate subdirs.
2019-09-04 03:32:45 -04:00
Antonin Décimo
3af52d86f7 Fix memory leaks 2019-08-12 09:42:11 +09:00
Maxime “pep” Buquet
20762ecb3c Validate icon_struct in read_theme_file
The read_theme_file function used to return an invalid icon_struct in
some cases, for example when an empty index.theme file was read.

This makes sure the struct we're returning is always valid as per the
Icon Theme specification.

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2019-04-20 16:41:02 -04:00
Alex Maese
31eeda11b0 Fix a crash in swaybar when an icon dir is not readable 2019-03-30 20:13:34 +02:00
Stephan Hilb
d64e8ba946 swaybar: fix loading of malformed icon theme
If the icon index.theme contained a key-value pair without a preceding
group header, entry_handler() would be called with a zero pointer and
lead to a segfault.
Set the error flag and break on such malformed files.
2019-03-13 22:04:04 -06:00
emersion
bcde298a71 Fix size_t temporary underflow in log_loaded_themes
`len` will underflow but will overflow right after, so it's not as bad as it
may appear. Still better not to under/overflow at all.

Fixes https://github.com/swaywm/sway/issues/3862
2019-03-11 12:12:46 -04:00
Ian Fan
5c8424c074 stringop.c: remove unused functions
The only use of `join_list` in swaybar/tray/icon.c has been rewritten.
2019-03-11 14:42:58 +01:00
Ian Fan
416c6ecb99 tray: fix pixmap colors
by converting from network byte order to host byte order
2019-02-28 18:31:52 +01:00
Ian Fan
f54077dbca tray: fix memory leaks 2019-02-16 21:49:16 +01:00
Ian Fan
26d6360feb tray: when a service is lost, remove all matching items
Before, only the first matching item would be removed, which could leave
stale items.
2019-02-16 21:49:16 +01:00
Ian Fan
d3c527220a tray: use correct parameter to set bus slot to floating
Counter-intuitively, `sd_bus_slot_set_floating` expects 0 to set it to
floating.
2019-02-15 15:15:45 +00:00
Stefan Schick
0952c9f91d Fix #3445: swaybar tray inerited thems not processed 2019-02-01 21:47:28 -05:00
Drew DeVault
8b056cfc82
Merge pull request #3500 from progandy/validate_pixmaps
swaybar: fix crash with some tray icon pixmaps
2019-01-23 09:21:08 -05:00