diff --git a/action_dialog.py b/action_dialog.py index 96eb2fb..511c091 100644 --- a/action_dialog.py +++ b/action_dialog.py @@ -10,10 +10,15 @@ Tastendruck-Erkennung (_KeyCapture): Tasten lassen sich statt per Dropdown auch einfach druecken. Das laeuft ueber ganz normale Tk-Fokus-Events des Dialogfensters -- KEIN globaler WinAPI-Tastaturhook (siehe Domaenenregel "keine Selbstversteck-/Hook-Fenstertricks"). Konsequenz: erkannt wird nur, -was das fokussierte Fenster erreicht, und die HID-Zuordnung ist dieselbe -US-Layout-Naeherung wie bei den Dropdown-Labels (siehe -versapad_data.tk_event_to_hid). Das Dropdown bleibt deshalb daneben stehen, -damit ein falsch erkanntes Zeichen von Hand korrigiert werden kann. +was das fokussierte Fenster erreicht -- Win+L, Strg+Alt+Entf und aehnliche +vom System abgefangene Kombinationen also nicht. + +Welche physische Taste gemeint ist, loest versapad_data.tk_event_to_hid() +ueber den Scan-Code des aktiven Layouts auf (versapad_keylayout), nicht +ueber das erzeugte Zeichen -- sonst landet auf deutschem Layout jedes Y auf +der Z-Taste des Boards und AeOeUe/#/+ sind gar nicht erfassbar. Das Dropdown +daneben zeigt dieselbe Taste unter ihrem Layout-Namen und bleibt als +Korrekturmoeglichkeit stehen. """ import tkinter as tk from tkinter import colorchooser, ttk @@ -192,10 +197,18 @@ class _ModalDialog(tk.Toplevel): # ── Positionierung + Ablauf ─────────────────────────────────────── def _center_on_parent(self): - """Mittig ueber dem Elternfenster, aber immer vollstaendig auf dem - Bildschirm. Ohne das oeffnet Tk jeden Toplevel bei +0+0, also bei - jeder bearbeiteten Taste erneut in der Bildschirmecke -- weit weg - vom Hauptfenster, in dem gerade geklickt wurde.""" + """Mittig ueber dem Elternfenster. Ohne das oeffnet Tk jeden Toplevel + bei +0+0, also bei jeder bearbeiteten Taste erneut in der + Bildschirmecke -- weit weg vom Fenster, in dem gerade geklickt wurde. + + Begrenzt wird bewusst gegen das ELTERNFENSTER, nicht gegen + `winfo_screenwidth()`: Tk meldet dort nur den Hauptbildschirm. Lag + das Hauptfenster auf einem zweiten Monitor, hat genau diese + Begrenzung den Dialog wieder auf den Rand des ersten Monitors + gezogen. Passt der Dialog nicht ins Elternfenster (der + Makro-Schritte-Dialog ist breiter als der Action-Dialog), wird er an + dessen linker oberer Ecke ausgerichtet statt zentriert -- so bleibt + er in jedem Fall auf dem Monitor, auf dem gearbeitet wird.""" parent = self.master width, height = self.winfo_reqwidth(), self.winfo_reqheight() try: @@ -204,10 +217,8 @@ class _ModalDialog(tk.Toplevel): except tk.TclError: px = py = 0 pw, ph = self.winfo_screenwidth(), self.winfo_screenheight() - x = px + (pw - width) // 2 - y = py + (ph - height) // 3 # etwas oberhalb der Mitte wirkt ruhiger - x = max(0, min(x, self.winfo_screenwidth() - width)) - y = max(0, min(y, self.winfo_screenheight() - height)) + x = px + max(0, (pw - width) // 2) + y = py + max(0, (ph - height) // 3) # etwas oberhalb der Mitte wirkt ruhiger self.geometry(f"+{x}+{y}") def run(self):