SYSTRAY-RS IS DEPRECATED AND ARCHIVED

systray-rs is now deprecated

. I had some hopes about working on this, but I really am just not finding any intersection between this project and other projects I'm maintaining, so I think it's best to call it done then having everyone hold out for my updates that will most likely never arrive.

To anyone who wants to fork: You can, but I would really recommend against it. Use this repo as reference if you want to, but most of this code was written in 2016, when I was very new to Rust. It doesn't handle cross-platform GUI needs well at all.

If you're going to build your own version of this: Great! If/when you finish it, get in touch and I'll add a link here. But a word of advice: You really do not want to tackle this from the perspective of "Oh I'll do it on [insert prefered OS here] then other people will contribute other platforms". You need to plan for Win/macOS/Linux at the same time or you will end up with an unworkable mess. There are systray implementations in other languages (some of which are listed in the issues here), I'd definitely recommend cribbing from those, much as I tried to crib this one from Go.

I'm going to leave the issues and PRs up since they may also contain relevant reference info for whoever decides to take this on next.

Good luck.

systray-rs

systray-rs is a Rust library that makes it easy for applications to have minimal UI in a platform specific way. It wraps the platform specific calls required to show an icon in the system tray, as well as add menu entries.

systray-rs is heavily influenced by the systray library for the Go Language.

systray-rs currently supports:

  • Linux GTK
  • Win32

Cocoa core still needed!

License

systray-rs includes some code from winapi-rs, by retep998. This code is covered under the MIT license. This code will be removed once winapi-rs has a 0.3 crate available.

systray-rs is BSD licensed.

Copyright (c) 2016-2020, Nonpolynomial Labs, LLC
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the project nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Issues

Collection of the latest Issues

treeshateorcs

treeshateorcs

0

I need to set a timer and update it every minute so that one of my menu entries says "set timer (60 minutes left)". how should I go about doing that?

Cinimajig

Cinimajig

1

I wanted to use , with an embeded icon from the macro, but i kept getting the Error "Cannot load icon from the buffer: 0". The icon worked fine with , so that wasnt the issue.

After looking at the code I looked up some of the documentaion on the Windows API and discovered a mistake with the use of (https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createiconfromresourceex). The second argument should be the length of the first arguments i bytes, but in the module it was set to 0.

After chaning this (/src/api/win32/mod.rs):

to this:

It worked like a charm! I don't know if anyone else have this issue, but in my case I had to do it.

woubuc

woubuc

1

Right now this library expects the user to call app.wait_for_message() which causes the app to loop indefinitely, locking the thread until the app exits.

However, I want to run some custom logic in my app loop and then update the tray icon based on that logic (change the icon & update some menu items). Is it possible to just call the update function from my own loop, rather than have this library run the loop for me?

shayne

shayne

6

Looking at the example we get a reference to systray::Application which doesn't have set_icon_from_buffer. I see it in mod.rs (on Windows here).

qdot

qdot

help wanted
5

I'm not real sure how to set a tooltip for the systray icon itself on linux/gtk. libappnotifcation had many threads fighting about this in 2010-2011, then silence. I'm not sure if other projects are using a combination of GtkStatusIcon and libappindicator or what. Looked at the Parcellite source code and it wasn't a ton of help.

qdot

qdot

enhancement
10

wait_for_message takes &mut self, which means we can't easily share the Application object between threads and also wait for menu selections. That makes systray less than useful for things like updating the icon without some sort of interaction (see https://github.com/qdot/systray-rs/issues/5#issuecomment-283553657).

Figure out a nice way to deal with sharing a mutable Application object between multiple threads. Maybe returning an Arc+Mutex wrapped object in the first place and passing that to a static equivalent of "wait_for_message" or something?

qdot

qdot

enhancement
3

On windows, we can set an icon via a resource name. On linux, we can use set_icon_from_stock or themes. Not sure what the situation on mac is. Is there a way to unify all of these under the same generic function?

qdot

qdot

enhancement
2

The user should get back a menu id (or even a menu item struct?) they can do whatever with, and should be able to use it as reference to update a menu item if they need to.

Information - Updated Jun 01, 2022

Stars: 164
Forks: 61
Issues: 24

Repositories & Extras

A ZX Spectrum emulator

This project is part of a friendly competition to build an emulator using Rust and WebAssembly

A ZX Spectrum emulator

This project is an attempt to build an implementation of TeX in Rust

The overall goals of this project are to be fully TeX compatible

This project is an attempt to build an implementation of TeX in Rust

The answer to "how do I use Rust on iOS and Android?"

cargo-mobile takes care of generating Xcode and Android Studio project files, building and running on device, generating project boilerplate, and a few other things!

The answer to "how do I use Rust on iOS and Android?"

Bittorrent Infrastructure Project

A collection of crates for building applications using bittorrent technologies

Bittorrent Infrastructure Project

A rust crate for building zones

It is an in-progress project to implement the functionality in the

A rust crate for building zones

shadow-rs:: build-time information stored in your rust project

shadow-rs allows you to recall properties of the build process and environment at runtime, including:

shadow-rs:: build-time information stored in your rust project

This project aims at providing building blocks for netlink (see man 7 netlink)

This project aims at providing building blocks for mio and route protocol

This project aims at providing building blocks for netlink (see man 7 netlink)

This project is NOT the srtool docker image that is actually used to build Substrate...

This project is NOT the srtool docker image that is actually used to build Substrate Wasm Runtime

This project is NOT the srtool docker image that is actually used to build Substrate...

rust-cnb-starter

A template project for libcnb as the language binding for buildpacks

rust-cnb-starter

Cache the dependencies of your Rust project and speed up your Docker builds

You can install cargo-chef from all the available tags on Dockerhub

Cache the dependencies of your Rust project and speed up your Docker builds
Facebook Instagram Twitter GitHub Dribbble
Privacy