Compare commits

..

10 commits

Author SHA1 Message Date
40edf315ea 0.7.9-alt1
- Initial build.
2026-02-21 00:56:59 +02:00
trigg
cd5375bc6e
Cleanup of #371
- Remove --rpc requirement, add version command, fix help behavior and dark mode
- Add controller RPC commands and fix startup order
- Fixed help command, added version command, fixed GTK Dark mode
- Update README.md
- Removed requirement for --rpc
- Revise README for clarity and formatting
- Updated usage instructions and fixed formatting issues in the README.
- added a 'leave' function
- Update README.md
- rename helper functions
- removed unreachable returns
- re-added spaces
- moved constants into helper function
- cleaned up readme

---------
Co-authored-by: Abhilash <pianoabhilash@gmail.com>
Co-authored-by: Abhilash K <81313252+ebilesh@users.noreply.github.com>
2025-12-30 20:39:49 +00:00
trigg
ce4f3320d5
Merge pull request #372 from ebilesh/branch-2
Adding sorting for server and channel names in the text menu of config
2025-12-30 20:37:17 +00:00
Abhilash
d35198c56d Adding sorting for server and channel names in the text menu of config 2025-12-28 17:23:36 -05:00
trigg
02baf04eaa -version bump 2025-09-01 16:47:55 +01:00
trigg
013f9c2090 - Fix hide-on-mouseover for XShape WMs
- Fix hide-on-mouseover in wayfire
- Remove edge cases for Cinnamon as they are no longer required
2025-08-28 21:56:15 +01:00
trigg
36368d94d2 - Fixed broken bottom-align option 2025-07-21 15:34:24 +01:00
trigg
ff1cc22515 - Added toggle for mute & deaf 2025-05-04 14:40:27 +01:00
trigg
4b7d6f6a1c
Merge pull request #363 from Bqleine/master
Update translations and make tray consistent
2025-05-04 14:26:32 +01:00
Noé Lopez
bd704f3d08 Update French translations 2025-05-01 21:12:36 +02:00
14 changed files with 260 additions and 86 deletions

2
.gear/rules Normal file
View file

@ -0,0 +1,2 @@
tar: v@version@:.
diff: v@version@:. . exclude=.gear exclude=*.spec

1
.gear/tags/list Normal file
View file

@ -0,0 +1 @@
02baf04eaa3a5fd546fdf9e507ea515bad973cc3 v0.7.9

3
.gear/upstream/remotes Normal file
View file

@ -0,0 +1,3 @@
[remote "upstream"]
url = https://github.com/trigg/Discover.git
fetch = +refs/heads/*:refs/remotes/upstream/*

View file

@ -27,7 +27,11 @@ This will close out any already running discover overlay for this user
#### Close the overlay
`discover-overlay --close` or `discover-overlay -x`
This closes the process running the overlay, hence any `--rpc` commands sent afterwards will do nothing
This closes the process running the overlay. Any control commands sent afterwards will do nothing
#### Show version
`discover-overlay --version` or `discover-overlay --V`
#### Open configuration window
`discover-overlay --configure` or `discover-overlay -c`
@ -38,40 +42,43 @@ This closes the process running the overlay, hence any `--rpc` commands sent aft
This will redirect all debug to the file `~/.config/discover-overlay/output.txt`
#### Hide the currently shown overlays
`discover-overlay --rpc --hide`
`discover-overlay --hide`
This will not stop the process running the overlay. This means the `--rpc` commands sent afterwards continue working as expected, and the `--show` is much quicker than starting the overlay from the start.
This will not stop the process running the overlay. This means the control commands sent afterwards continue working as expected, and the `--show` is much quicker than starting the overlay from the start.
#### Show the overlays
`discover-overlay --rpc --show`
`discover-overlay --show`
Note that if the process running the overlay has stopped or crashed then this will do nothing
#### Mute yourself in voice chat
`discover-overlay --rpc --mute`
`discover-overlay --mute`
#### Unmute yourself in voice chat
`discover-overlay --rpc --unmute`
`discover-overlay --unmute`
#### Deafen yourself in voice chat
`discover-overlay --rpc --deaf`
`discover-overlay --deaf`
#### Undeafen yourself in voice chat
`discover-overlay --rpc --undeaf`
`discover-overlay --undeaf`
### Attempt to leave the current voice channel
`discover-overlay --leave` or `discover-overlay -l`
#### Attempt to join voice channel by room ID
`discover-overlay --rpc --moveto=X`
`discover-overlay --moveto=X`
Using a Room ID from Discord to replace `X`, this will attempt to join the voice channel.
#### Populate the channel RPC file with a list of guilds
`discover-overlay --rpc --refresh-guilds`
`discover-overlay --refresh-guilds`
Requests a list of guilds. Once collected, it will write them to
`~/.config/discover-overlay/channels.rpc`
as a JSON object
#### Populate the channel RPC file with a list of channels from a guild
`discover-overlay --rpc --guild-request=X`
`discover-overlay --guild-request=X`
Using a Server ID from Discord to replace `X`, this will request a list of channels (text & voice) from the given guild. Once collected, it will write them to
`~/.config/discover-overlay/channels.rpc`
as a JSON object.

68
discover-overlay.spec Normal file
View file

@ -0,0 +1,68 @@
%define pypi_name discover_overlay
Name: discover-overlay
Version: 0.7.9
Release: alt1
Summary: Yet another Discord overlay for Linux written in Python using GTK3
License: GPL-3.0-only
Group: Networking/Other
URL: https://github.com/trigg/Discover
VCS: https://github.com/trigg/Discover
Source: %name-%version.tar
BuildRequires: rpm-build-python3
BuildRequires: python3-module-pygobject3
BuildRequires: python3-module-websocket-client
BuildRequires: python3-module-pyxdg
BuildRequires: python3-module-requests
BuildRequires: python3-module-pillow
BuildRequires: python3-module-xlib
BuildRequires: python3-module-setuptools
BuildRequires: python3-module-pulsectl-asyncio
BuildRequires: bash
%description
Discover-Overlay is a GTK3 overlay written in Python3.
It can be configured to show who is currently talking on discord or
it can be set to display text and images from a preconfigured channel.
It is fully customisable and can be configured to display anywhere
on the screen. We fully support X11 and wlroots based environments.
We felt the need to make this project due to the shortcomings in support
on Linux by the official discord client.
%package -n python3-module-%pypi_name
Summary: Moonraker - API Web Server for Klipper
BuildArch: noarch
Group: Development/Python3
%description -n python3-module-%pypi_name
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
%prep
%setup
%build
export PDM_BUILD_SCM_VERSION=%version
%pyproject_build
%install
%pyproject_install
%files
%_bindir/discover-overlay
%_desktopdir/%{pypi_name}*
#%_iconsdir/*
/usr/share/icons/hicolor/256x256/apps/discover-overlay-default.png
/usr/share/icons/hicolor/256x256/apps/discover-overlay-tray.png
/usr/share/icons/hicolor/256x256/apps/discover-overlay.png
/usr/share/icons/hicolor/scalable/apps/discover-overlay-default.svg
/usr/share/icons/hicolor/scalable/apps/discover-overlay-tray.svg
/usr/share/icons/hicolor/scalable/apps/discover-overlay.svg
%files -n python3-module-%pypi_name
%python3_sitelibdir_noarch/%pypi_name
%python3_sitelibdir_noarch/%pypi_name-%version.dist-info
%changelog
* Fri Feb 20 2026 Tesla Bittgenstein <tesla@altlinux.org> 0.7.9-alt1
- Initial build.

61
discover-overlay.spec~ Normal file
View file

@ -0,0 +1,61 @@
%define pypi_name discover_overlay
Name: discover-overlay
Version: 0.7.9
Release: alt1
Summary: Yet another Discord overlay for Linux written in Python using GTK3
License: GPL-3.0-only
Group: Networking/Other
URL: https://github.com/trigg/Discover
VCS: https://github.com/trigg/Discover
Source: %name-%version.tar
BuildRequires: rpm-build-python3
BuildRequires: python3-module-pygobject3
BuildRequires: python3-module-websocket-client
BuildRequires: python3-module-pyxdg
BuildRequires: python3-module-requests
BuildRequires: python3-module-pillow
BuildRequires: python3-module-xlib
BuildRequires: python3-module-setuptools
BuildRequires: python3-module-pulsectl-asyncio
BuildRequires: bash
%description
Discover-Overlay is a GTK3 overlay written in Python3.
It can be configured to show who is currently talking on discord or
it can be set to display text and images from a preconfigured channel.
It is fully customisable and can be configured to display anywhere
on the screen. We fully support X11 and wlroots based environments.
We felt the need to make this project due to the shortcomings in support
on Linux by the official discord client.
%package -n python3-module-%pypi_name
Summary: Moonraker - API Web Server for Klipper
BuildArch: noarch
Group: Development/Python3
%description -n python3-module-%pypi_name
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
%prep
%setup
%build
export PDM_BUILD_SCM_VERSION=%version
%pyproject_build
%install
%pyproject_install
%files
%_bindir/discover-overlay
%_desktopdir/%{pypi_name}*
#%_iconsdir/*
%files -n python3-module-%pypi_name
%python3_sitelibdir_noarch/%pypi_name
%python3_sitelibdir_noarch/%pypi_name-%version.dist-info
%changelog
* Fri Feb 20 2026 Tesla Bittgenstein <tesla@altlinux.org> 0.7.9-alt1
- Initial build.

View file

@ -61,6 +61,8 @@ class DiscordConnector:
self.text = []
self.authed = False
self.last_rate_limit_send = 0
self.muted = False
self.deafened = False
self.socket_watch = None
@ -458,6 +460,8 @@ class DiscordConnector:
elif j["cmd"] == "SELECT_VOICE_CHANNEL":
return
elif j["cmd"] == "SET_VOICE_SETTINGS":
self.muted = j['data']['mute']
self.deafened = j['data']['deaf']
return
elif j["cmd"] == "GET_VOICE_SETTINGS":
return

View file

@ -97,33 +97,6 @@ class Discover:
"""
Read in arg list from command or RPC and act accordingly
"""
if "--help" in data or "-h" in data:
print(_("Usage") + ": discover-overlay [OPTIONS]... ")
print(_("Show an X11 or wlroots overlay with information"))
print(_("from Discord client"))
print("")
print(" -c, --configure ", _("Open configuration window"))
print(" -x, --close ",
_("Close currently running instance"))
print(" -v, --debug ",
_("Verbose output for aid in debugging"))
print(" -h, --help ", _("This screen"))
print(" --hide ", _("Hide overlay"))
print(" --show ", _("Show overlay"))
print(" --rpc ",
_("Send command, not start new instance."))
print(" --mute ", _("Set own user to mute"))
print(" --unmute ", _("Set unmuted"))
print(" --deaf ", _("Set own user to deafened"))
print(" --undeaf ", _("Unset user deafened state"))
print(" --moveto=XX ",
_("Move the user into voice room, by Room ID"))
print(" --minimized ",
_("If tray icon is enabled, start with only tray icon and no configuration window"))
print("")
print(_("For gamescope compatibility ensure ENV has 'GDK_BACKEND=x11'"))
if normal_close:
sys.exit(0)
if "--close" in data or "-x" in data:
self.exit()
if "--steamos" in data or "-s" in data:
@ -144,9 +117,18 @@ class Discover:
if "--undeaf" in data:
if self.connection:
self.connection.set_deaf(False)
if "--toggle-mute" in data:
if self.connection:
self.connection.set_mute(not self.connection.muted)
if "--toggle-deaf" in data:
if self.connection:
self.connection.set_deaf(not self.connection.deafened)
if "--refresh-guilds" in data:
if self.connection:
self.connection.req_guilds()
if "--leave" in data or "-l" in data:
if self.connection:
self.connection.change_voice_room(None)
pattern = re.compile("--moveto=([0-9]+)")
if any((match := pattern.match(x)) for x in data):
if self.connection:
@ -479,6 +461,60 @@ class Discover:
if deaf is not None:
GLib.idle_add(self.connection.set_deaf, deaf)
def show_help():
print(_("Usage") + ": discover-overlay [OPTIONS]... ")
print(_("Show an X11 or wlroots overlay with information"))
print(_("from Discord client"))
print("")
print(" -c, --configure ", _("Open configuration window"))
print(" -x, --close ",
_("Close currently running instance"))
print(" -v, --debug ",
_("Verbose output for aid in debugging"))
print(" -h, --help ", _("This screen"))
print(" -V, --version ", _("Show version information"))
print(" --hide ", _("Hide overlay"))
print(" --show ", _("Show overlay"))
print(" --mute ", _("Set own user to mute"))
print(" --unmute ", _("Set unmuted"))
print(" --toggle-mute ", _("Toggle muted"))
print(" --deaf ", _("Set own user to deafened"))
print(" --undeaf ", _("Unset user deafened state"))
print(" --toggle-deaf ", _("Toggle deaf"))
print(" --moveto=XX ",
_("Move the user into voice room, by Room ID"))
print(" --leave ", _("Leave the current voice channel"))
print(" --minimized ",
_("If tray icon is enabled, start with only tray icon and no configuration window"))
print("")
print(_("For gamescope compatibility ensure ENV has 'GDK_BACKEND=x11'"))
def show_version():
print(pkg_resources.get_distribution('discover_overlay').version)
def is_a_controller(argv):
actions = {
"-x", "--close",
"--hide", "--show",
"--mute", "--unmute", "--toggle-mute",
"--deaf", "--undeaf", "--toggle-deaf",
"-l", "--leave",
"--refresh-guilds",
}
controls = {
"--moveto=",
"--guild-request=",
}
for arg in argv:
# Match the actions (i.e --mute, --deafen)
if arg in actions:
return True
# Match the controls (i.e --moveto=123456789 and --guild-request=987654321)
for control in controls:
if arg.startswith(control):
return True
return False
def entrypoint():
"""
@ -494,6 +530,12 @@ def entrypoint():
"""
signal.signal(signal.SIGINT, signal.SIG_DFL)
if "--help" in sys.argv or "-h" in sys.argv:
show_help()
return
if "--version" in sys.argv or "-V" in sys.argv:
show_version()
return
# Find Config directory
config_dir = os.path.join(xdg_config_home, "discover_overlay")
os.makedirs(config_dir, exist_ok=True)
@ -504,6 +546,17 @@ def entrypoint():
config_file = os.path.join(config_dir, "config.ini")
debug_file = os.path.join(config_dir, "output.txt")
if "-c" in sys.argv or "--configure" in sys.argv:
_settings = MainSettingsWindow(config_file, rpc_file, channel_file, sys.argv[1:])
Gtk.main()
return
if is_a_controller(sys.argv):
line = " ".join(arg for arg in sys.argv[1:]).strip()
with open(rpc_file, "w", encoding="utf-8") as f:
f.write(line)
return
# Prepare logger
logging.getLogger().setLevel(logging.INFO)
log_format = "%(levelname)s - %(name)s - %(message)s"
@ -520,30 +573,14 @@ def entrypoint():
if 'GAMESCOPE_WAYLAND_DISPLAY' in os.environ:
os.unsetenv("WAYLAND_DISPLAY")
# Catch any errors and log them
try:
if "--rpc" in sys.argv:
# Send command to overlay
line = ""
for arg in sys.argv[1:]:
line = f"{line} {arg}"
with open(rpc_file, "w", encoding="utf-8") as tfile:
tfile.write(line)
log.warning("Sent RPC command")
else:
if "-c" in sys.argv or "--configure" in sys.argv:
# Show config window
_settings = MainSettingsWindow(
config_file, rpc_file, channel_file, sys.argv[1:])
Gtk.main()
else:
# Tell any other running overlay to close
with open(rpc_file, "w", encoding="utf-8") as tfile:
tfile.write("--close")
# Show the overlay
Discover(rpc_file, config_file, channel_file,
debug_file, sys.argv[1:])
return
with open(rpc_file, "w", encoding="utf-8") as tfile:
tfile.write("--close")
# Show the overlay
Discover(rpc_file, config_file, channel_file,
debug_file, sys.argv[1:])
except Exception as ex: # pylint: disable=broad-except
log.error(ex)

View file

@ -1,10 +1,10 @@
# Noé Lopez <noelopez@free.fr>, 2023, 2024.
# Noé Lopez <noelopez@free.fr>, 2023, 2024, 2025.
msgid ""
msgstr ""
"Project-Id-Version: discover 0.7.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-01 20:54+0200\n"
"PO-Revision-Date: 2024-04-03 22:46+0200\n"
"PO-Revision-Date: 2025-05-01 21:05+0200\n"
"Last-Translator: Noé Lopez <noelopez@free.fr>\n"
"Language-Team: Noé Lopez <noelopez@free.fr>\n"
"Language: fr_FR\n"
@ -112,19 +112,19 @@ msgid "Discover Overlay Configuration"
msgstr "Configuration de Discover Overlay"
msgid "Open Configuration"
msgstr ""
msgstr "Ouvrir la configuration"
msgid "Hide Overlay"
msgstr ""
msgstr "Cacher loverlay"
msgid "Quit Overlay"
msgstr ""
msgstr "Quitter loverlay"
msgid "Quit Configuration"
msgstr ""
msgstr "Quitter la configuration"
msgid "Show Overlay"
msgstr ""
msgstr "Montrer loverlay"
msgid "Place Window"
msgstr "Choisir la position de la fenêtre"
@ -193,7 +193,7 @@ msgid "Close overlay"
msgstr "Fermer loverlay"
msgid "About"
msgstr ""
msgstr "À propos"
msgid "Display Horizontally"
msgstr "Afficher horizontalement"

View file

@ -192,10 +192,6 @@ class OverlayWindow(Gtk.Window):
if self.hide_on_mouseover:
# We've mouse-overed
if self.draw_blank:
self.set_untouchable()
context.set_source_rgba(0.0, 0.0, 0.0, 0.0)
context.set_operator(cairo.OPERATOR_SOURCE)
context.paint()
return
else:
(width, height) = self.get_size()
@ -236,10 +232,6 @@ class OverlayWindow(Gtk.Window):
if (self.floating != floating or self.pos_x != pos_x or
self.pos_y != pos_y or self.width != width or self.height != height):
# Special case for Cinnamon desktop : see https://github.com/trigg/Discover/issues/322
if ('XDG_SESSION_DESKTOP' in os.environ and
os.environ['XDG_SESSION_DESKTOP'] == 'cinnamon'):
floating = True
self.floating = floating
self.pos_x = pos_x
@ -487,15 +479,17 @@ class OverlayWindow(Gtk.Window):
"""Callback when mouseover occurs, hides overlay"""
self.draw_blank = True
self.set_needs_redraw()
self.hide()
GLib.timeout_add_seconds(self.timeout_mouse_over, self.mouseout_timed)
return True
def mouseout(self, _a=None, _b=None):
"""Callback when mouseout occurs, sets a timer to show overlay"""
GLib.timeout_add_seconds(self.timeout_mouse_over, self.mouseout_timed)
return True
def mouseout_timed(self, _a=None, _b=None):
"""Callback a short while after mouseout occured, shows overlay"""
self.draw_blank = False
self.show()
self.set_needs_redraw()
return False

View file

@ -325,11 +325,13 @@ class MainSettingsWindow():
self.channel_ids = []
g.remove_all()
c.remove_all()
for guild in data['guild'].values():
guilds = sorted(data['guild'].values(), key=lambda x: x['name'].lower())
for guild in guilds:
g.append_text(guild['name'])
self.guild_ids.append(guild['id'])
if guild['id'] == self.current_guild and 'channels' in guild:
for channel in guild['channels']:
channels = sorted(guild['channels'], key=lambda x: x['name'].lower())
for channel in channels:
c.append_text(channel['name'])
self.channel_ids.append(channel['id'])
except FileNotFoundError:
@ -732,9 +734,6 @@ class MainSettingsWindow():
self.widget['core_settings_min'].set_sensitive(self.show_sys_tray_icon)
if 'XDG_SESSION_DESKTOP' in os.environ and os.environ['XDG_SESSION_DESKTOP'] == 'cinnamon':
self.widget['voice_anchor_float'].set_sensitive(False)
self.widget['core_audio_assist'].set_active(
config.getboolean("general", "audio_assist", fallback=False))
@ -1000,8 +999,6 @@ class MainSettingsWindow():
def update_floating_anchor(self):
floating = self.widget['voice_anchor_float'].get_active() == 0
if 'XDG_SESSION_DESKTOP' in os.environ and os.environ['XDG_SESSION_DESKTOP'] == 'cinnamon':
floating = True
if floating:
self.widget['voice_align_1'].hide()

View file

@ -599,7 +599,7 @@ class VoiceOverlayWindow(OverlayWindow):
current_y = 0 + self.vert_edge_padding
offset_y = avatar_size + self.icon_spacing
if self.align_right: # A lie. Align bottom
current_y = self.height - avatar_size - self.vert_edge_padding
current_y = (height - avatar_size) - self.vert_edge_padding
offset_y = -(avatar_size + self.icon_spacing)
rows_to_draw = []
while len(users_to_draw) > 0:

View file

@ -9,7 +9,7 @@ setup(
name='discover-overlay',
author='trigg',
author_email='',
version='0.7.8',
version='0.7.9',
description='Voice chat overlay',
long_description=readme(),
long_description_content_type='text/markdown',