Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package xdotool for openSUSE:Factory checked in at 2026-09-17 15:23:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xdotool (Old) and /work/SRC/openSUSE:Factory/.xdotool.new.383539 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xdotool" Thu Sep 17 15:23:59 2026 rev:14 rq:1378449 version:4.20260303.1 Changes: -------- --- /work/SRC/openSUSE:Factory/xdotool/xdotool.changes 2025-12-17 18:40:53.889942827 +0100 +++ /work/SRC/openSUSE:Factory/.xdotool.new.383539/xdotool.changes 2026-09-17 15:24:02.799623226 +0200 @@ -1,0 +2,11 @@ +Wed Sep 16 20:25:09 UTC 2026 - Martin Pluskal <[email protected]> + +- Update to 4.20260303.1: + * XSendEvent now correctly sets the modifier mask when sending + key combinations (regression in 4.20251130.1, #495, #505) + * Keystroke delays less than 50ms now work correctly for type + and key commands (regression in 4.20251130.1, #496, #498, #506) +- Use GitHub tag archive as Source (no release tarball) +- Spec cleanup + +------------------------------------------------------------------- Old: ---- xdotool-4.20251130.1.tar.gz New: ---- xdotool-4.20260303.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xdotool.spec ++++++ --- /var/tmp/diff_new_pack.b06k9M/_old 2026-09-17 15:24:04.199681994 +0200 +++ /var/tmp/diff_new_pack.b06k9M/_new 2026-09-17 15:24:04.201682078 +0200 @@ -1,7 +1,7 @@ # # spec file for package xdotool # -# Copyright (c) 2025 SUSE LLC and contributors +# 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,14 +17,13 @@ Name: xdotool -Version: 4.20251130.1 +Version: 4.20260303.1 Release: 0 Summary: Fake keyboard/mouse input License: BSD-3-Clause -Group: System/X11/Utilities URL: https://www.semicomplete.com/projects/xdotool/ -Source: https://github.com/jordansissel/xdotool/releases/download/v%{version}/%{name}-%{version}.tar.gz -BuildRequires: gcc-c++ +Source: https://github.com/jordansissel/xdotool/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz +BuildRequires: gcc BuildRequires: make BuildRequires: pkgconfig BuildRequires: pkgconfig(x11) @@ -39,7 +38,6 @@ %package devel Summary: Development and Library files -Group: Development/Libraries/X11 Requires: %{name} = %{version} Requires: pkgconfig(x11) @@ -57,7 +55,7 @@ # Fix file permissions chmod 0644 examples/ffsp.sh export WARNFLAGS="%{optflags}" -make %{?_smp_mflags} +%make_build %install %make_install \ @@ -74,9 +72,10 @@ %files %{_bindir}/%{name} -%doc CHANGELIST COPYRIGHT README.md +%license COPYRIGHT +%doc CHANGELIST README.md %doc examples -%{_mandir}/man1/%{name}.1%{ext_man} +%{_mandir}/man1/%{name}.1%{?ext_man} %{_libdir}/libxdo.so.* %files devel ++++++ xdotool-4.20251130.1.tar.gz -> xdotool-4.20260303.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xdotool-4.20251130.1/CHANGELIST new/xdotool-4.20260303.1/CHANGELIST --- old/xdotool-4.20251130.1/CHANGELIST 2025-11-30 20:45:42.000000000 +0100 +++ new/xdotool-4.20260303.1/CHANGELIST 2026-03-03 18:03:35.000000000 +0100 @@ -9,6 +9,14 @@ Unfortunately, there seem to be no common and stable way to do what xdotool does *on* Wayland, so xdotool does not work correctly under Wayland. +4.20260303.1 + - XSendEvent now correctly sets the modifier mask when sending key + combinations. This was a regression introduced in the previous release + (#495, #505) + - Keystroke delays less than 50ms should work now correctly; type and key + commands were affected. This was a regression introduced in the previous + release. (#496, #498, #506) + 4.20251130.1 - Fix bug in typing/keyboard causing xdotool to send extra modifier keys in certain cases. When xkeyboard-config 2.46 is installed, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xdotool-4.20251130.1/VERSION new/xdotool-4.20260303.1/VERSION --- old/xdotool-4.20251130.1/VERSION 2025-11-30 20:45:42.000000000 +0100 +++ new/xdotool-4.20260303.1/VERSION 2026-03-03 18:03:35.000000000 +0100 @@ -1,3 +1,3 @@ MAJOR="4" -RELEASE="20251130" +RELEASE="20260303" REVISION="1" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xdotool-4.20251130.1/t/test_typing.rb new/xdotool-4.20260303.1/t/test_typing.rb --- old/xdotool-4.20251130.1/t/test_typing.rb 2025-11-30 20:45:42.000000000 +0100 +++ new/xdotool-4.20260303.1/t/test_typing.rb 2026-03-03 18:03:35.000000000 +0100 @@ -45,8 +45,8 @@ def type(input) #status, lines = xdotool "type --window #{@wid} --clearmodifiers '#{input}'" #_xdotool "key ctrl+s ctrl+q" - status, lines = xdotool("type","--clearmodifiers", "--delay", "0", input) - xdotool "key --delay 0 ctrl+d ctrl+d" + status, lines = xdotool("type","--clearmodifiers", "--delay", "20", input) + xdotool "key --delay 20 ctrl+d ctrl+d" Process.wait(@launchpid) rescue nil return readfile end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xdotool-4.20251130.1/xdo.c new/xdotool-4.20260303.1/xdo.c --- old/xdotool-4.20251130.1/xdo.c 2025-11-30 20:45:42.000000000 +0100 +++ new/xdotool-4.20260303.1/xdo.c 2026-03-03 18:03:35.000000000 +0100 @@ -66,6 +66,7 @@ int modstate, int is_press, useconds_t delay); static void _xdo_send_modifier(const xdo_t *xdo, int modmask, int is_press); +static int _xdo_query_keycode_to_modifier(XModifierKeymap *modmap, KeyCode keycode); static int _xdo_mousebutton(const xdo_t *xdo, Window window, int button, int is_press); static int _is_success(const char *funcname, int code, const xdo_t *xdo); @@ -983,8 +984,13 @@ /* XXX: Return proper code if errors found */ int xdo_enter_text_window(const xdo_t *xdo, Window window, const char *string, useconds_t delay) { - /* Keep the original delay for key up events, but use 50000 microseconds (50ms) for key down */ - useconds_t down_delay = 50000; + /* Split delay into keyup and keydown, not letting keydown exceed 50000 (50ms) */ + useconds_t down_delay, up_delay; + down_delay = up_delay = delay / 2; + if (down_delay > 50000) { + down_delay = 50000; + up_delay = delay - down_delay; + } charcodemap_t key; setlocale(LC_CTYPE,""); @@ -1002,11 +1008,11 @@ continue; } - /* Send the key press event with the fixed 50ms delay */ + /* Send the key press event */ xdo_send_keysequence_window_list_do(xdo, window, &key, 1, True, NULL, down_delay); key.needs_binding = 0; - /* Send the key release event with the user-specified delay */ - xdo_send_keysequence_window_list_do(xdo, window, &key, 1, False, NULL, delay); + /* Send the key release event */ + xdo_send_keysequence_window_list_do(xdo, window, &key, 1, False, NULL, up_delay); } return XDO_SUCCESS; @@ -1320,6 +1326,7 @@ static void _xdo_populate_charcode_map(xdo_t *xdo) { size_t idx = 0; XkbDescPtr desc = XkbGetMap(xdo->xdpy, XkbAllClientInfoMask, XkbUseCoreKbd); + XModifierKeymap *modmap = XGetModifierMapping(xdo->xdpy); xdo->keycode_low = desc->min_key_code; xdo->keycode_high = desc->max_key_code; @@ -1444,7 +1451,8 @@ // shall be valid. (!map.active && li == 0) ? " [IMPLICIT] " : ""); - AddCharcodeEntry(idx, xdo, keysym, keycode, group, map.mods.mask); + unsigned char mask = map.mods.mask | _xdo_query_keycode_to_modifier(modmap, keycode); + AddCharcodeEntry(idx, xdo, keysym, keycode, group, mask); } } } @@ -1671,6 +1679,31 @@ usleep(delay); } } +int _xdo_query_keycode_to_modifier(XModifierKeymap *modmap, KeyCode keycode) { + int i = 0, j = 0; + int max = modmap->max_keypermod; + + for (i = 0; i < 8; i++) { /* 8 modifier types, per XGetModifierMapping(3X) */ + for (j = 0; j < max && modmap->modifiermap[(i * max) + j]; j++) { + if (keycode == modmap->modifiermap[(i * max) + j]) { + switch (i) { + case ShiftMapIndex: return ShiftMask; break; + case LockMapIndex: return LockMask; break; + case ControlMapIndex: return ControlMask; break; + case Mod1MapIndex: return Mod1Mask; break; + case Mod2MapIndex: return Mod2Mask; break; + case Mod3MapIndex: return Mod3Mask; break; + case Mod4MapIndex: return Mod4Mask; break; + case Mod5MapIndex: return Mod5Mask; break; + } + } /* end if */ + } /* end loop j */ + } /* end loop i */ + + /* No modifier found for this keycode, return no mask */ + return 0; +} + void _xdo_send_modifier(const xdo_t *xdo, int modmask, int is_press) { XModifierKeymap *modifiers = XGetModifierMapping(xdo->xdpy); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xdotool-4.20251130.1/xdo_version.h new/xdotool-4.20260303.1/xdo_version.h --- old/xdotool-4.20251130.1/xdo_version.h 2025-11-30 20:45:42.000000000 +0100 +++ new/xdotool-4.20260303.1/xdo_version.h 2026-03-03 18:03:35.000000000 +0100 @@ -1,4 +1,4 @@ #ifndef _VERSION_H_ #define _VERSION_H_ -static const char *XDO_VERSION = "4.20251130.1"; +static const char *XDO_VERSION = "4.20260303.1"; #endif /* ifndef _VERSION_H */
