Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package gtklock for openSUSE:Factory checked 
in at 2026-10-29 16:10:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gtklock (Old)
 and      /work/SRC/openSUSE:Factory/.gtklock.new.1255 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gtklock"

Thu Oct 29 16:10:58 2026 rev:6 rq:1393590 version:5.0.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/gtklock/gtklock.changes  2024-10-22 
14:53:51.918270710 +0200
+++ /work/SRC/openSUSE:Factory/.gtklock.new.1255/gtklock.changes        
2026-10-29 16:12:45.512211266 +0100
@@ -1,0 +2,10 @@
+Thu Oct 29 09:21:01 UTC 2026 - Michael Vetter <[email protected]>
+
+- Update to 5.0.0:
+  * Option to execute command on idle timeout #149
+  * Preview mode #144
+  * Spanish translation #156
+  * French translation #150
+  * Fix use-after-free when the focused monitor is removed #158
+
+-------------------------------------------------------------------

Old:
----
  gtklock-4.0.0.tar.gz

New:
----
  gtklock-5.0.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gtklock.spec ++++++
--- /var/tmp/diff_new_pack.fU3K5k/_old  2026-10-29 16:12:46.205240330 +0100
+++ /var/tmp/diff_new_pack.fU3K5k/_new  2026-10-29 16:12:46.208240456 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package gtklock
 #
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           gtklock
-Version:        4.0.0
+Version:        5.0.0
 Release:        0
 Summary:        GTK-based lockscreen for Wayland
 License:        GPL-3.0-only

++++++ gtklock-4.0.0.tar.gz -> gtklock-5.0.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/README.md new/gtklock-5.0.0/README.md
--- old/gtklock-4.0.0/README.md 2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/README.md 2026-10-27 22:38:57.000000000 +0100
@@ -1,6 +1,9 @@
 # gtklock
 GTK-based lockscreen for Wayland.
 
+> [!WARNING]  
+> gtklock is looking for a new maintainer. If you are interested contact me at 
[email protected]
+
 
![screenshot](https://user-images.githubusercontent.com/21199271/169707623-2ac5f02b-b6ed-461a-b9a3-5d96440843a2.png)
 ## About
 gtklock is a lockscreen based on 
[gtkgreet](https://git.sr.ht/~kennylevinsen/gtkgreet).
@@ -35,6 +38,7 @@
 - [gtk-session-lock](https://github.com/Cu3PO42/gtk-session-lock)
 ### Installing build dependencies
 - Arch: `# pacman -S gcc meson pkgconf scdoc pam wayland gtk3 gtk-session-lock`
+- Debian / Ubuntu: `# apt-get install gcc libaudit-dev meson scdoc 
libpam0g-dev libwayland-dev libgtk-4-dev lib-gtk-session-lock-dev`
 - Fedora: `# dnf install gcc meson pkgconf scdoc pam-devel wayland-devel 
gtk3-devel`, install gtk-session-lock manually
 - Void: `# xbps-install gcc meson pkgconf scdoc pam-devel wayland-devel 
gtk+3-devel gtk-session-lock-devel`
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/include/auth.h 
new/gtklock-5.0.0/include/auth.h
--- old/gtklock-4.0.0/include/auth.h    2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/include/auth.h    2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Jovan Lanik
+// Copyright (c) 2026 Jovan Lanik
 
 // PAM Authentication
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/include/config.h 
new/gtklock-5.0.0/include/config.h
--- old/gtklock-4.0.0/include/config.h  2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/include/config.h  2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Jovan Lanik
+// Copyright (c) 2026 Jovan Lanik
 
 // Configuration
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/include/gtklock.h 
new/gtklock-5.0.0/include/gtklock.h
--- old/gtklock-4.0.0/include/gtklock.h 2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/include/gtklock.h 2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Kenny Levinsen, Jovan Lanik, Bhaskar Khoraja
+// Copyright (c) 2026 Kenny Levinsen, Jovan Lanik, Bhaskar Khoraja
 
 // gtklock application
 
@@ -37,8 +37,11 @@
        char *layout_path;
        char *lock_command;
        char *unlock_command;
+       char *idle_command;
 
        GArray *modules;
+
+       gboolean test_mode;
 };
 
 void gtklock_remove_window(struct GtkLock *gtklock, struct Window *win);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/include/module.h 
new/gtklock-5.0.0/include/module.h
--- old/gtklock-4.0.0/include/module.h  2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/include/module.h  2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Jovan Lanik
+// Copyright (c) 2026 Jovan Lanik
 
 // Module support
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/include/util.h 
new/gtklock-5.0.0/include/util.h
--- old/gtklock-4.0.0/include/util.h    2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/include/util.h    2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Jovan Lanik
+// Copyright (c) 2026 Jovan Lanik
 
 // Utility functions
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/include/window.h 
new/gtklock-5.0.0/include/window.h
--- old/gtklock-4.0.0/include/window.h  2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/include/window.h  2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Kenny Levinsen, Jovan Lanik, Bhaskar Khoraja
+// Copyright (c) 2026 Kenny Levinsen, Jovan Lanik, Bhaskar Khoraja
 
 // Window functions
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/include/xdg.h 
new/gtklock-5.0.0/include/xdg.h
--- old/gtklock-4.0.0/include/xdg.h     2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/include/xdg.h     2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Louis DeLosSantos, Jovan Lanik
+// Copyright (c) 2026 Louis DeLosSantos, Jovan Lanik
 
 // XDG functions
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/man/gtklock.1.scd 
new/gtklock-5.0.0/man/gtklock.1.scd
--- old/gtklock-4.0.0/man/gtklock.1.scd 2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/man/gtklock.1.scd 2026-10-27 22:38:57.000000000 +0100
@@ -25,6 +25,9 @@
        in the following order: $XDG_CONFIG_HOME/gtklock/config.ini and
        gtklock/config.ini under each directory in $XDG_CONFIG_DIRS.
 
+*-p, --preview*
+       Enable preview mode where any password can unlock
+
 # CONFIGURATION
 
 Configuration is stored in glib key file format. Options are specified as
@@ -76,6 +79,9 @@
 *-U, --unlock-command*
        Command to execute after unlocking. Command is executed asynchronously.
 
+*-I, --idle-command*
+       Command to execute after idle timeout. Command is executed 
asynchronously.
+
 *-M, --monitor-priority* <name>
        Set monitor focus priority. Option can be specified multiple times.
 
@@ -100,6 +106,11 @@
 }
 ```
 
+# SIGNALS
+
+*SIGUSR1*
+       Unlock the screen and exit.
+
 # AUTHORS
 
 Maintained by Jovan Lanik <[email protected]>, who is assisted by other
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/man/meson.build 
new/gtklock-5.0.0/man/meson.build
--- old/gtklock-4.0.0/man/meson.build   2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/man/meson.build   2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 # gtklock
-# Copyright (c) 2023 Jianhua Lu, Jovan Lanik
+# Copyright (c) 2026 Jianhua Lu, Jovan Lanik
 
 scdoc = find_program('scdoc', required: get_option('man-pages'))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/meson.build 
new/gtklock-5.0.0/meson.build
--- old/gtklock-4.0.0/meson.build       2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/meson.build       2026-10-27 22:38:57.000000000 +0100
@@ -1,9 +1,9 @@
 # gtklock
-# Copyright (c) 2023 Jianhua Lu, Jovan Lanik, Zephyr Lykos
+# Copyright (c) 2026 Jianhua Lu, Jovan Lanik, Zephyr Lykos
 
 project(
   'gtklock', 'c',
-  version : '4.0.0',
+  version : '5.0.0',
   license : 'GPLv3',
   default_options : ['c_std=c11']
 )
@@ -16,7 +16,7 @@
 gtk = dependency('gtk+-3.0')
 gtk_session_lock = dependency('gtk-session-lock-0')
 gmodule_export = dependency('gmodule-export-2.0')
-pam = dependency('pam')
+pam = meson.get_compiler('c').find_library('pam')
 
 dependencies = [
   gtk,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/po/LINGUAS new/gtklock-5.0.0/po/LINGUAS
--- old/gtklock-4.0.0/po/LINGUAS        2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/po/LINGUAS        2026-10-27 22:38:57.000000000 +0100
@@ -1,4 +1,10 @@
 cs
 de
+es
+ka
+pt_BR
 sr
 sr@latin
+zh_CN
+ru
+ro
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/po/eo.po new/gtklock-5.0.0/po/eo.po
--- old/gtklock-4.0.0/po/eo.po  1970-01-01 01:00:00.000000000 +0100
+++ new/gtklock-5.0.0/po/eo.po  2026-10-27 22:38:57.000000000 +0100
@@ -0,0 +1,35 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the gtklock package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: gtklock\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-07 13:48+0200\n"
+"PO-Revision-Date: 2025-08-06 21:56+0200\n"
+"Last-Translator: Szafranek 13 <[email protected]>\n"
+"Language-Team: Luduko <discord.gg/aArnDCUGbu>\n"
+"Language: eo\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.6\n"
+
+#: src/window.c:129
+msgid "Login failed"
+msgstr "Ensaluto malsukcesis"
+
+#: src/window.c:264
+msgid "Caps Lock is on"
+msgstr "Caps Lock ŝaltita"
+
+#: res/gtklock.ui:35
+msgid "Password:"
+msgstr "Pasvorto:"
+
+#: res/gtklock.ui:86
+msgid "Unlock"
+msgstr "Malŝlosi"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/po/es.po new/gtklock-5.0.0/po/es.po
--- old/gtklock-4.0.0/po/es.po  1970-01-01 01:00:00.000000000 +0100
+++ new/gtklock-5.0.0/po/es.po  2026-10-27 22:38:57.000000000 +0100
@@ -0,0 +1,35 @@
+# Spanish translations for gtklock package
+# Traducciones al español para el paquete gtklock.
+# Copyright (C) 2026 THE gtklock'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the gtklock package.
+# Joel Rico Martínez <joel@debian>, 2026.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gtklock\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-07 13:48+0200\n"
+"PO-Revision-Date: 2026-07-18 13:07+0200\n"
+"Last-Translator: Joel Rico Martínez <joel@debian>\n"
+"Language-Team: Spanish <[email protected]>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/window.c:129
+msgid "Login failed"
+msgstr "Autenticación fallida"
+
+#: src/window.c:264
+msgid "Caps Lock is on"
+msgstr "Bloq Mayús está activado"
+
+#: res/gtklock.ui:35
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: res/gtklock.ui:86
+msgid "Unlock"
+msgstr "Desbloquear"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/po/fr.po new/gtklock-5.0.0/po/fr.po
--- old/gtklock-4.0.0/po/fr.po  1970-01-01 01:00:00.000000000 +0100
+++ new/gtklock-5.0.0/po/fr.po  2026-10-27 22:38:57.000000000 +0100
@@ -0,0 +1,34 @@
+# French translations for gtklock
+# Copyright (C) 2024 gtklocks copyright holder
+# This file is distributed under the same license as the gtklock package.
+# Pierre Thibault <[email protected]>, 2026
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gtklock\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-07 13:48+0200\n"
+"PO-Revision-Date: 2026-05-01 00:00+0200\n"
+"Last-Translator: Pierre Thibault <[email protected]>\n"
+"Language-Team: French\n"
+"Language: fr_FR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.4\n"
+
+#: src/window.c:129
+msgid "Login failed"
+msgstr "La connexion a échoué"
+
+#: src/window.c:264
+msgid "Caps Lock is on"
+msgstr "Verrouillage majuscule activé"
+
+#: res/gtklock.ui:35
+msgid "Password:"
+msgstr "Mot de passe :"
+
+#: res/gtklock.ui:86
+msgid "Unlock"
+msgstr "Déverrouiller"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/po/ka.po new/gtklock-5.0.0/po/ka.po
--- old/gtklock-4.0.0/po/ka.po  1970-01-01 01:00:00.000000000 +0100
+++ new/gtklock-5.0.0/po/ka.po  2026-10-27 22:38:57.000000000 +0100
@@ -0,0 +1,34 @@
+# Georgian translation for gtklock.
+# Copyright (C) 2026 gtklock authors.
+# This file is distributed under the same license as the gtklock package.
+# Ekaterine Papava <[email protected]>, 2026.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gtklock\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-07 13:48+0200\n"
+"PO-Revision-Date: 2026-02-02 20:32+0100\n"
+"Last-Translator: Ekaterine Papava <[email protected]>\n"
+"Language-Team: Georgian <(nothing)>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.8\n"
+
+#: src/window.c:129
+msgid "Login failed"
+msgstr "შესვლა წარუმატებელია"
+
+#: src/window.c:264
+msgid "Caps Lock is on"
+msgstr "CapsLock ჩართულია"
+
+#: res/gtklock.ui:35
+msgid "Password:"
+msgstr "პაროლი:"
+
+#: res/gtklock.ui:86
+msgid "Unlock"
+msgstr "განბლოკვა"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/po/meson.build 
new/gtklock-5.0.0/po/meson.build
--- old/gtklock-4.0.0/po/meson.build    2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/po/meson.build    2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 # gtklock
-# Copyright (c) 2023 Kenny Levinsen, Jovan Lanik
+# Copyright (c) 2026 Kenny Levinsen, Jovan Lanik
 
 if import('fs').is_absolute(get_option('localedir'))
   localedir = get_option('localedir')
@@ -16,6 +16,6 @@
 i18n = import('i18n')
 
 i18n.gettext(meson.project_name(),
-    args: '--directory=' + meson.source_root(),
+    args: '--directory=' + meson.project_source_root(),
     preset: 'glib'
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/po/pt_BR.po 
new/gtklock-5.0.0/po/pt_BR.po
--- old/gtklock-4.0.0/po/pt_BR.po       1970-01-01 01:00:00.000000000 +0100
+++ new/gtklock-5.0.0/po/pt_BR.po       2026-10-27 22:38:57.000000000 +0100
@@ -0,0 +1,34 @@
+# Brazilian Portuguese translations for gtklock
+# Copyright (C) 2025 THE gtklock'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the gtklock package.
+# Arthur Cerqueira <[email protected]>, 2025.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: gtklock\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-07 13:48+0200\n"
+"PO-Revision-Date: 2025-01-30 14:16-0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/window.c:129
+msgid "Login failed"
+msgstr "Autenticação falhou"
+
+#: src/window.c:264
+msgid "Caps Lock is on"
+msgstr "Caps Lock está ativo"
+
+#: res/gtklock.ui:35
+msgid "Password:"
+msgstr "Senha:"
+
+#: res/gtklock.ui:86
+msgid "Unlock"
+msgstr "Desbloquear"
Binary files old/gtklock-4.0.0/po/ro.mo and new/gtklock-5.0.0/po/ro.mo differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/po/ro.po new/gtklock-5.0.0/po/ro.po
--- old/gtklock-4.0.0/po/ro.po  1970-01-01 01:00:00.000000000 +0100
+++ new/gtklock-5.0.0/po/ro.po  2026-10-27 22:38:57.000000000 +0100
@@ -0,0 +1,36 @@
+# Romanian translations for gtklock package.
+# Copyright (C) 2025 THE gtklock'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the gtklock package.
+# Vlad <[email protected]>, 2025.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gtklock\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-07 13:48+0200\n"
+"PO-Revision-Date: 2025-08-03 21:05+0300\n"
+"Last-Translator: Vlad <[email protected]>\n"
+"Language-Team: Romanian <[email protected]>\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2;\n"
+"X-Generator: Poedit 3.6\n"
+
+#: src/window.c:129
+msgid "Login failed"
+msgstr "Autentificare eșuată"
+
+#: src/window.c:264
+msgid "Caps Lock is on"
+msgstr "Majusculele sunt blocate"
+
+#: res/gtklock.ui:35
+msgid "Password:"
+msgstr "Parola:"
+
+#: res/gtklock.ui:86
+msgid "Unlock"
+msgstr "Deblochează"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/po/ru.po new/gtklock-5.0.0/po/ru.po
--- old/gtklock-4.0.0/po/ru.po  1970-01-01 01:00:00.000000000 +0100
+++ new/gtklock-5.0.0/po/ru.po  2026-10-27 22:38:57.000000000 +0100
@@ -0,0 +1,35 @@
+# Russian translations for gtklock package.
+# Copyright (C) 2024 THE gtklock'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the gtklock package.
+# Jovan Lanik <[email protected]>, 2024.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gtklock\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-07 13:48+0200\n"
+"PO-Revision-Date: 2025-02-21 23:33+0200\n"
+"Last-Translator: Eugene Lesnov <[email protected]>\n"
+"Language-Team: Russian <(nothing)>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: src/window.c:129
+msgid "Login failed"
+msgstr "Ошибка входа"
+
+#: src/window.c:264
+msgid "Caps Lock is on"
+msgstr "Включен Caps Lock"
+
+#: res/gtklock.ui:35
+msgid "Password:"
+msgstr "Пароль:"
+
+#: res/gtklock.ui:86
+msgid "Unlock"
+msgstr "Разблокировать"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/po/zh_CN.po 
new/gtklock-5.0.0/po/zh_CN.po
--- old/gtklock-4.0.0/po/zh_CN.po       1970-01-01 01:00:00.000000000 +0100
+++ new/gtklock-5.0.0/po/zh_CN.po       2026-10-27 22:38:57.000000000 +0100
@@ -0,0 +1,34 @@
+# zh_CN translations for gtklock package.
+# Copyright (C) 2024 THE gtklock'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the gtklock package.
+# Automatically generated, 2024.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gtklock\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-07 13:48+0200\n"
+"PO-Revision-Date: 2024-06-27 22:18+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: src/window.c:129
+msgid "Login failed"
+msgstr "登录失败"
+
+#: src/window.c:264
+msgid "Caps Lock is on"
+msgstr "大写已锁定"
+
+#: res/gtklock.ui:35
+msgid "Password:"
+msgstr "密码:"
+
+#: res/gtklock.ui:86
+msgid "Unlock"
+msgstr "解锁"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/res/meson.build 
new/gtklock-5.0.0/res/meson.build
--- old/gtklock-4.0.0/res/meson.build   2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/res/meson.build   2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 # gtklock
-# Copyright (c) 2023 Jianhua Lu, Jovan Lanik
+# Copyright (c) 2026 Jianhua Lu, Jovan Lanik
 
 gnome = import('gnome')
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/src/auth.c new/gtklock-5.0.0/src/auth.c
--- old/gtklock-4.0.0/src/auth.c        2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/src/auth.c        2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Jovan Lanik, Zephyr Lykos
+// Copyright (c) 2026 Jovan Lanik, Zephyr Lykos
 
 // PAM Authentication
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/src/config.c 
new/gtklock-5.0.0/src/config.c
--- old/gtklock-4.0.0/src/config.c      2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/src/config.c      2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Jovan Lanik
+// Copyright (c) 2026 Jovan Lanik
 
 // Configuration
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/src/gtklock.c 
new/gtklock-5.0.0/src/gtklock.c
--- old/gtklock-4.0.0/src/gtklock.c     2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/src/gtklock.c     2026-10-27 22:38:57.000000000 +0100
@@ -1,9 +1,10 @@
 // gtklock
-// Copyright (c) 2022 Kenny Levinsen, Jovan Lanik, Bhaskar Khoraja
+// Copyright (c) 2026 Kenny Levinsen, Jovan Lanik, Bhaskar Khoraja
 
 // gtklock application
 
-#include <signal.h>
+#define _POSIX_C_SOURCE
+#include <glib-unix.h>
 #include <gtk/gtk.h>
 
 #include "util.h"
@@ -15,6 +16,7 @@
        for(guint idx = 0; idx < gtklock->windows->len; idx++) {
                struct Window *ctx = g_array_index(gtklock->windows, struct 
Window *, idx);
                if(ctx == win) {
+                       if(gtklock->focused_window == win) 
gtklock->focused_window = NULL;
                        g_array_remove_index(gtklock->windows, idx);
                        g_free(ctx);
                        return;
@@ -55,21 +57,31 @@
        }
 }
 
-static int gtklock_update_time_handler(gpointer data) {
+static gboolean update_time_handler(gpointer data) {
        struct GtkLock *gtklock = (struct GtkLock *)data;
        gtklock_update_clocks(gtklock);
        gtklock_update_dates(gtklock);
        return G_SOURCE_CONTINUE;
 }
 
-static int gtklock_idle_handler(gpointer data) {
+static void exec_command(const gchar *command) {
+       GError *err = NULL;
+       g_spawn_command_line_async(command, &err);
+       if(err != NULL) {
+               g_warning("Executing `%s` failed: %s", command, err->message);
+               g_error_free(err);
+       }
+}
+
+static gboolean idle_handler(gpointer data) {
        struct GtkLock *gtklock = (struct GtkLock *)data;
-       gtklock_idle_hide(gtklock);
+       if(gtklock->use_idle_hide) gtklock_idle_hide(gtklock);
+       if(gtklock->idle_command) exec_command(gtklock->idle_command);
        return G_SOURCE_CONTINUE;
 }
 
 void gtklock_idle_hide(struct GtkLock *gtklock) {
-       if(!gtklock->use_idle_hide || gtklock->hidden || 
g_application_get_is_busy(G_APPLICATION(gtklock->app)))
+       if(gtklock->hidden || 
g_application_get_is_busy(G_APPLICATION(gtklock->app)))
                return;
        gtklock->hidden = TRUE;
        module_on_idle_hide(gtklock);
@@ -84,31 +96,32 @@
        if(gtklock->hidden) {
                gtklock->hidden = FALSE;
                module_on_idle_show(gtklock);
-       }
 
-       for(guint idx = 0; idx < gtklock->windows->len; idx++) {
-               struct Window *ctx = g_array_index(gtklock->windows, struct 
Window *, idx);
-               window_idle_show(ctx);
+               for(guint idx = 0; idx < gtklock->windows->len; idx++) {
+                       struct Window *ctx = g_array_index(gtklock->windows, 
struct Window *, idx);
+                       window_idle_show(ctx);
+               }
        }
 
-       if(!gtklock->use_idle_hide) return;
-       if(gtklock->idle_hide_source > 0) 
g_source_remove(gtklock->idle_hide_source);
-       gtklock->idle_hide_source = 
g_timeout_add_seconds(gtklock->idle_timeout, 
G_SOURCE_FUNC(gtklock_idle_handler), gtklock);
+       if(gtklock->use_idle_hide || gtklock->idle_command) {
+               if(gtklock->idle_hide_source > 0) 
g_source_remove(gtklock->idle_hide_source);
+               gtklock->idle_hide_source = 
g_timeout_add_seconds(gtklock->idle_timeout, G_SOURCE_FUNC(idle_handler), 
gtklock);
+       }
 }
 
-static void exec_command(const gchar *command) {
-       GError *err = NULL;
-       g_spawn_command_line_async(command, &err);
-       if(err != NULL) {
-               g_warning("Executing `%s` failed: %s", command, err->message);
-               g_error_free(err);
-       }
+static gboolean signal_handler(gpointer data) {
+       struct GtkLock *gtklock = data;
+       g_application_quit(G_APPLICATION(gtklock->app));
+       return FALSE;
 }
 
 static void locked(GtkSessionLockLock *lock, void *data) {
        struct GtkLock *gtklock = (struct GtkLock *)data;
+
+       g_unix_signal_add(SIGUSR1, G_SOURCE_FUNC(signal_handler), gtklock);
+
        module_on_locked(gtklock);
-       if(gtklock->parent > 0) kill(gtklock->parent, SIGUSR1);
+       if(gtklock->parent > 0) kill(gtklock->parent, SIGUSR2);
        if(gtklock->lock_command) exec_command(gtklock->lock_command);
        return;
 }
@@ -131,11 +144,11 @@
        gtk_session_lock_lock_lock(gtklock->lock);
 
 
-       gtklock->draw_time_source = g_timeout_add(1000, 
G_SOURCE_FUNC(gtklock_update_time_handler), gtklock);
+       gtklock->draw_time_source = g_timeout_add(1000, 
G_SOURCE_FUNC(update_time_handler), gtklock);
        gtklock_update_clocks(gtklock);
        gtklock_update_dates(gtklock);
-       if(gtklock->use_idle_hide) gtklock->idle_hide_source =
-               g_timeout_add_seconds(gtklock->idle_timeout, 
G_SOURCE_FUNC(gtklock_idle_handler), gtklock);
+       if(gtklock->use_idle_hide || gtklock->idle_command) 
gtklock->idle_hide_source =
+               g_timeout_add_seconds(gtklock->idle_timeout, 
G_SOURCE_FUNC(idle_handler), gtklock);
 }
 
 void gtklock_shutdown(struct GtkLock *gtklock) {
@@ -151,6 +164,11 @@
        gtk_session_lock_lock_unlock_and_destroy(gtklock->lock);
        gdk_display_sync(gdk_display_get_default());
 
+       for(guint idx = 0; idx < gtklock->windows->len; idx++) {
+               struct Window *ctx = g_array_index(gtklock->windows, struct 
Window *, idx);
+               gtk_widget_destroy(ctx->window);
+       }
+
        if(gtklock->unlock_command) exec_command(gtklock->unlock_command);
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/src/meson.build 
new/gtklock-5.0.0/src/meson.build
--- old/gtklock-4.0.0/src/meson.build   2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/src/meson.build   2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 # gtklock
-# Copyright (c) 2023 Jianhua Lu, Jovan Lanik
+# Copyright (c) 2026 Jianhua Lu, Jovan Lanik
 
 gtklock_sources = files([
   'auth.c',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/src/module.c 
new/gtklock-5.0.0/src/module.c
--- old/gtklock-4.0.0/src/module.c      2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/src/module.c      2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Jovan Lanik, Zephyr Lykos
+// Copyright (c) 2026 Jovan Lanik, Zephyr Lykos
 
 // Module support
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/src/source.c 
new/gtklock-5.0.0/src/source.c
--- old/gtklock-4.0.0/src/source.c      2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/src/source.c      2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Kenny Levinsen, Jovan Lanik, Bhaskar Khoraja
+// Copyright (c) 2026 Kenny Levinsen, Jovan Lanik, Bhaskar Khoraja
 
 #define _POSIX_C_SOURCE 200809L
 
@@ -40,6 +40,7 @@
 static gboolean follow_focus = FALSE;
 static gboolean idle_hide = FALSE;
 static gboolean start_hidden = FALSE;
+static gboolean test_mode = FALSE;
 
 static gint idle_timeout = 15;
 
@@ -53,12 +54,14 @@
 static gchar *date_format = NULL;
 static gchar *lock_command = NULL;
 static gchar *unlock_command = NULL;
+static gchar *idle_command = NULL;
 static gchar **monitor_priority = NULL;
 
 static GOptionEntry main_entries[] = {
        { "version", 'v', 0, G_OPTION_ARG_NONE, &show_version, "Show version", 
NULL },
        { "config", 'c', 0, G_OPTION_ARG_FILENAME, &config_path, "Load config 
file", NULL },
        { "daemonize", 'd', 0, G_OPTION_ARG_NONE, &should_daemonize, "Detach 
from controlling terminal", NULL },
+       { "preview", 'p', 0, G_OPTION_ARG_NONE, &test_mode, "Enable preview 
mode where any password can unlock", NULL },
        { NULL },
 };
 
@@ -76,6 +79,7 @@
        { "start-hidden", 'S', 0, G_OPTION_ARG_NONE, &start_hidden, "Start with 
hidden form", NULL },
        { "lock-command", 'L', 0, G_OPTION_ARG_STRING, &lock_command, "Command 
to execute after locking", NULL },
        { "unlock-command", 'U', 0, G_OPTION_ARG_STRING, &unlock_command, 
"Command to execute after unlocking", NULL },
+       { "idle-command", 'I', 0, G_OPTION_ARG_STRING, &idle_command, "Command 
to execute after idle timeout", NULL },
        { "monitor-priority", 'M', 0, G_OPTION_ARG_STRING_ARRAY, 
&monitor_priority, "Set monitor focus priority", NULL },
        { NULL },
 };
@@ -97,11 +101,17 @@
        struct Window *w = window_by_monitor(monitor);
        if(w != NULL) {
                if(gtklock->focused_window == w) {
-                       struct Window *any_window = 
g_array_index(gtklock->windows, struct Window*, 0);
-                       if(any_window == w) any_window = 
g_array_index(gtklock->windows, struct Window*, 1);
+                       struct Window *any_window = NULL;
+                       for(guint idx = 0; idx < gtklock->windows->len; idx++) {
+                               struct Window *ctx = 
g_array_index(gtklock->windows, struct Window *, idx);
+                               if(ctx != w) {
+                                       any_window = ctx;
+                                       break;
+                               }
+                       }
 
-                       gtklock->focused_window = NULL;
-                       if(any_window) window_swap_focus(any_window, w);
+                       if(any_window) gtklock_focus_window(gtklock, 
any_window);
+                       else gtklock->focused_window = NULL;
                }
                gtk_session_lock_unmap_lock_window(GTK_WINDOW(w->window));
                gtk_widget_destroy(w->window);
@@ -183,11 +193,11 @@
 }
 
 static void shutdown(GtkApplication *app, gpointer user_data) {
+       gtklock_shutdown(gtklock);
        for(guint idx = 0; idx < gtklock->modules->len; idx++) {
                GModule *module = g_array_index(gtklock->modules, GModule *, 
idx);
                g_module_close(module);
        }
-       gtklock_shutdown(gtklock);
 }
 
 static void attach_style(const gchar *format, ...) G_GNUC_PRINTF(1, 2);
@@ -237,10 +247,10 @@
                if(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS) {
                        sigset_t set;
                        sigemptyset(&set);
-                       sigaddset(&set, SIGUSR1);
+                       sigaddset(&set, SIGUSR2);
                        sigprocmask(SIG_BLOCK, &set, NULL);
                        int ret = sigtimedwait(&set, NULL, &(struct timespec){ 
1, 0 });
-                       if(ret == SIGUSR1)
+                       if(ret == SIGUSR2)
                                exit(EXIT_SUCCESS);
                        exit(EXIT_FAILURE);
                }
@@ -270,7 +280,7 @@
        bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
        textdomain(GETTEXT_PACKAGE);
 
-       GOptionContext *option_context = g_option_context_new("- GTK-based 
lockscreen for sway");
+       GOptionContext *option_context = g_option_context_new("- GTK-based 
lockscreen for Wayland");
        g_option_context_add_main_entries(option_context, main_entries, NULL);
        g_option_context_set_help_enabled(option_context, FALSE);
        g_option_context_set_ignore_unknown_options(option_context, TRUE);
@@ -343,6 +353,7 @@
 
        gtklock->hidden = start_hidden;
        gtklock->idle_timeout = (guint)idle_timeout;
+       gtklock->test_mode = test_mode;
 
        gtklock->follow_focus = follow_focus;
        gtklock->use_idle_hide = idle_hide;
@@ -353,6 +364,7 @@
        gtklock->layout_path = layout_path;
        gtklock->lock_command = lock_command;
        gtklock->unlock_command = unlock_command;
+       gtklock->idle_command = idle_command;
 
        gtklock->modules = modules;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/src/util.c new/gtklock-5.0.0/src/util.c
--- old/gtklock-4.0.0/src/util.c        2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/src/util.c        2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Jovan Lanik
+// Copyright (c) 2026 Jovan Lanik
 
 // Utility functions
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/src/window.c 
new/gtklock-5.0.0/src/window.c
--- old/gtklock-4.0.0/src/window.c      2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/src/window.c      2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Kenny Levinsen, Jovan Lanik, Erik Reider, Melih Darcan, 
Bhaskar Khoraja
+// Copyright (c) 2026 Kenny Levinsen, Jovan Lanik, Erik Reider, Melih Darcan, 
Bhaskar Khoraja
 
 // Window functions
 
@@ -143,6 +143,9 @@
 }
 
 static gpointer window_pw_wait(gpointer data) {
+       if (gtklock->test_mode) {
+               g_application_quit(G_APPLICATION(gtklock->app));
+       }
        struct Window *ctx = data;
        const char *password = gtk_entry_get_text((GtkEntry*)ctx->input_field);
        while(TRUE) {
@@ -297,7 +300,7 @@
        g_signal_connect(w->window, "destroy", 
G_CALLBACK(window_destroy_notify), NULL);
        if(gtklock->follow_focus)
                g_signal_connect(w->window, "enter-notify-event", 
G_CALLBACK(window_enter_notify), NULL);
-       if(gtklock->use_idle_hide || gtklock->hidden) {
+       if(gtklock->use_idle_hide || gtklock->hidden || gtklock->idle_command) {
                gtk_widget_add_events(w->window, GDK_POINTER_MOTION_MASK);
                g_signal_connect(w->window, "key-press-event", 
G_CALLBACK(window_idle_key), NULL);
                g_signal_connect(w->window, "motion-notify-event", 
G_CALLBACK(window_idle_motion), NULL);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtklock-4.0.0/src/xdg.c new/gtklock-5.0.0/src/xdg.c
--- old/gtklock-4.0.0/src/xdg.c 2024-10-21 22:29:53.000000000 +0200
+++ new/gtklock-5.0.0/src/xdg.c 2026-10-27 22:38:57.000000000 +0100
@@ -1,5 +1,5 @@
 // gtklock
-// Copyright (c) 2022 Louis DeLosSantos, Jovan Lanik
+// Copyright (c) 2026 Louis DeLosSantos, Jovan Lanik
 
 // XDG funtions
 

Reply via email to