Focus auf eigenes Fenster setzen

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
jogo
Beiträge: 64
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Focus auf eigenes Fenster setzen

Beitrag von jogo »

Hi,
habe mir einen kleinen Timer gebaut, der als Minifenster im Sticky-Modus in der Bildschirmecke (oder woanders) sitzt.
Es ist jetzt immer vor allen fremden Fenstern sichbar - also ok. Nun verliert es ja den EingabeFocus, sobald ich mit fremden Programmen aller Art arbeite - auch ok.
Wenn der Timer aber nun Alarm auslöst, möchte ich, das er sich den Eingabefocus auf sein Fenster zurückholt, damit ich den Timer nahtlos mit der Tastatur bedienen kann, ohne ihm vorher mit der Maus den Eingabefocus geben zu müssen.
Soviel ich auch suche und probiere - ich krieg das nicht hin...
Kann jemand helfen?
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Focus auf eigenes Fenster setzen

Beitrag von Kiffi »

Eventuell könnte SetActiveWindow() helfen.
Hygge
jogo
Beiträge: 64
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Re: Focus auf eigenes Fenster setzen

Beitrag von jogo »

Jo - genau dies war auch meine erste Idee^^

Zitat dazu aus der aktuellen Hilfe:
"Der Befehl wird nur den Fokus innerhalb Ihres Programms verändern. Sie können damit nicht das Programm in den Vordergrund bringen, wenn ein anderes Programm den Fokus hat. "
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Focus auf eigenes Fenster setzen

Beitrag von Kiffi »

Schau mal hier: http://www.chabba.de/ -> Linux PureBasic API -> Window -> In den Hintergrund/Vordergrund legen

Vielleicht passt das ja.
Hygge
jogo
Beiträge: 64
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Re: Focus auf eigenes Fenster setzen

Beitrag von jogo »

ahh, ok - fummel mich da mal durch und bau das ein - könnte passen - Danke dir.
Ich geb dann Bescheid...
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
jogo
Beiträge: 64
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Re: Focus auf eigenes Fenster setzen

Beitrag von jogo »

Kiffi hat geschrieben: 09.11.2021 01:45 Schau mal hier: http://www.chabba.de/ -> Linux PureBasic API -> Window -> In den Hintergrund/Vordergrund legen

Vielleicht passt das ja.
kurzes Feedback:
hat keine Wirkung gezeigt. Vermutlich macht dies das gleiche, wie jetzt die aktuelle StickyWindow-Funktion in PB.
Sobals das Fenster einmal den Focus verloren hat, kann es sich ihn damit nicht zurückholen.
Hab das allerdings jetzt nicht mit den sekundären Fenster probiert, sondern direkt mit dem Hauptfenster, welches ja bereits im Vordergrund (Sticky-modus) war.

Grundsätzlich geht das aber unter Linux. Hab ein Programm (kein eigenes), daß nach Fertigstellung der Aufgabe in den Vordergrund poppt und auch gleich den Focus hat - ich kann also mit Enter die Meldung sofort bestätigen.
Die Frage ist, wie der Programmierer das gemacht hat^^
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Num500
Beiträge: 19
Registriert: 23.12.2004 18:50
Wohnort: Buchholz

Re: Focus auf eigenes Fenster setzen

Beitrag von Num500 »

Hallo jogo,

ich habe mir vor ewigen Zeiten mit folgendem beholfen.

Code: Alles auswählen

; Programm: Testprogramm OnTop für Linux
; Datum:       10.11.2021
; Purebasic:    5.73 LTS  (Linux 64bit)
;
;Verweis:   http://forums.purebasic.com/german/viewtopic.php?f=21&t=32529&sid=2dd30ce33b8e458c473a777e96d0dc08
;
EnableExplicit

Global Fenster.s = "Rechner"    ;hier den entsprechenden Fenstertitel eintragen

Enumeration FormWindow
  #Window_Main
EndEnumeration

Enumeration FormGadget
  #TextGadget
EndEnumeration

Enumeration
  #TimerNummerOnTop
EndEnumeration

Procedure FensterOnTop(gWinTitle.s)
  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    Protected.i gProgrammId
    gProgrammId = RunProgram("wmctrl", "-a " + #DQUOTE$ + gWinTitle + #DQUOTE$, "", #PB_Program_Hide)
    If  gProgrammId = 0
      MessageRequester("Linux wmctrl", "wmctrl fehlt, bitte installieren z.B.: apt install wmctrl")
    EndIf
  CompilerEndIf
EndProcedure
;
Procedure Main()
  Protected EventID 
  If OpenWindow(#Window_Main,10,10,300,200,"OnTop-Test")
    AddWindowTimer(#Window_Main, #TimerNummerOnTop, 5000)  ;alle 5.000ms.
    TextGadget(#TextGadget, 20, 20, 260, 100, "Alle 5 Sekunden wird das Fenster '"+Fenster.s+"' in den Vordergrund geholt (wenn es läuft)", #PB_Text_Border) 
    ;
    Repeat ; Start of the event loop
      EventID = WaitWindowEvent() 
      ;
      ;- Timer-Auswertung
      Select EventID
        Case #PB_Event_Timer
          If EventTimer() = #TimerNummerOnTop
            FensterOnTop(Fenster.s)
          EndIf
      EndSelect
      ;
    Until EventID = #PB_Event_CloseWindow ; End of the event loop
  Else
    Debug "Window konnte nicht geöffnet werden"
  EndIf
EndProcedure
;
Main()
Jürgen
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Focus auf eigenes Fenster setzen

Beitrag von mk-soft »

Mit GTK API geht es nicht. Das mit wmctrl habe ich auch gelesen. Muss aber eventuell erst nachinstalliert werden.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
jogo
Beiträge: 64
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Re: Focus auf eigenes Fenster setzen

Beitrag von jogo »

Hi Jürgen,
dein Code tut genau das, was er soll: er holt ein Fenster in den Vordergrund. Sehr nützlich, um ein fremdes (oder auch das eigene) Fenster zu steuern, welches nicht im Vordergrund ist. Vielen Dank.

In meinem Fall jedoch wirkt dies nicht, weil mein Minifenster ja bereits permanent im Vordergrund ist (durch die PB-Funktion StickyWindow(0,#True))-
Das Fenster hat nur nicht den Tastatur- /eingabefokus, so das ich beim Alarm das Fenster erstmal mit der Maus den Fokus geben muß (bzw. mit der Maus bedienen muß).

Mein Fenster, welches ja bereits im Vordergrund ist, soll sich also bei bestimmten Bedingungen selbst den Tastaturfokus holen, so das ich es z.B. mit esc bedienen könnte - auch wenn ich zuvor gerade mit den Browser beschäftigt war und dieser den Fokus hat.
--
Ideen gibt es viele - man muss sie nur haben...
Mint 18.3/19.3/21.x/LMDE5 // PureBasic 5.73 / 6.02
Num500
Beiträge: 19
Registriert: 23.12.2004 18:50
Wohnort: Buchholz

Re: Focus auf eigenes Fenster setzen

Beitrag von Num500 »

Hallo jogo,

dann hatte ich es wohl nicht richtig begriffen.
Nun noch ein Versuch in der Hoffnung es richtig verstanden zu haben.
In diesem Fall verwende ich als Deine Bestimmung den Timer (umschaltbar per Button auf Thread-Bedingung),
das Programm setzt den Focus auf sich selbst (per wmctrl), druck ESC-Taste wird angezeigt.
Bei Programmstart ist Sticky ausgeschaltet (umschaltbar per Button).

Code: Alles auswählen

; Programm: Testprogramm OnTop für Linux, Focus auf sich selbst
; Datum:       11.11.2021
; Purebasic:    5.73 LTS  (Linux 64bit)
;
;Verweis:   http://forums.purebasic.com/german/viewtopic.php?f=21&t=32529&sid=2dd30ce33b8e458c473a777e96d0dc08
;
EnableExplicit

Global Fenster.s = "OnTop-Focus Test"    ;hier den entsprechenden Fenstertitel eintragen
Global ZustandStickyAktiv = #False
Global BedingungTimer = #True
Global ThreadNrTEST = 0
Global FlagThreadBeenden = #False

Enumeration FormWindow
  #Window_Main
EndEnumeration

Enumeration FormGadget
  #ButtonSticky
  #ButtonBedingung
  #TextGadget1
  #TextGadget2
  #TextGadget3
EndEnumeration

Enumeration
  #TimerNummerOnTop
EndEnumeration
;
Procedure FensterOnTop(gWinTitle.s)
  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    Protected.i gProgrammId
    gProgrammId = RunProgram("wmctrl", "-a " + #DQUOTE$ + gWinTitle + #DQUOTE$, "", #PB_Program_Hide)
    If  gProgrammId = 0
      MessageRequester("Linux wmctrl", "wmctrl fehlt, bitte installieren z.B.: apt install wmctrl")
    EndIf
  CompilerEndIf
EndProcedure
;
Procedure ThreadBedingungBearbeiten(z)
  Static BedingungZustand=0
  While FlagThreadBeenden = #False
    BedingungZustand = BedingungZustand +1
    If BedingungTimer = #False
      If BedingungZustand > 5000    ;ca. 5.000ms
        BedingungZustand = 0
        FensterOnTop(Fenster.s)
      EndIf
      Delay(1)
    EndIf
  Wend
  ThreadNrTEST = 0
EndProcedure
;
Procedure ZeigeFensterZustand(Zustand)
  If Zustand = -1
    SetGadgetText(#TextGadget3, "Fenster inaktiv")
    SetGadgetColor(#TextGadget3,  #PB_Gadget_BackColor, RGB(255,0,0))
  Else
    SetGadgetText(#TextGadget3, "Fenster aktiv")
    SetGadgetColor(#TextGadget3,  #PB_Gadget_BackColor, RGB(0,255,0))
  EndIf
EndProcedure
;
Procedure ZeigeStickyZustand(Zustand)
  If Zustand = #True    ;bisher als Sticky
    ZustandStickyAktiv = #False
    StickyWindow(#Window_Main, ZustandStickyAktiv) 
    SetGadgetText(#ButtonSticky, "Sticky is OFF")
  Else    ;bisher ohne Sticky
    ZustandStickyAktiv = #True
    StickyWindow(#Window_Main, ZustandStickyAktiv) 
    SetGadgetText(#ButtonSticky, "Sticky is ON")
  EndIf
EndProcedure
;
Procedure ZeigeBedingungZustand(Zustand)
  If Zustand = #True    ;bisher als Timer
    BedingungTimer = #False
    FlagThreadBeenden = #False
    If IsThread(ThreadNrTEST) = 0
      ThreadNrTEST = CreateThread(@ThreadBedingungBearbeiten(), #False)
    EndIf
    SetGadgetText(#ButtonBedingung, "Bedingung is Thread")
  Else    ;bisher als Thread
    FlagThreadBeenden = #True
    BedingungTimer = #True
    SetGadgetText(#ButtonBedingung, "Bedingung is Timer")
  EndIf
EndProcedure
;
Procedure Main()
  Protected EventID, MenueID, GadgetID
  Protected TasteESC = 27
  Protected ZustandFensterAktiv = -1
  If OpenWindow(#Window_Main,10,10,340,200, Fenster.s)
    AddWindowTimer(#Window_Main, #TimerNummerOnTop, 5000)  ;alle 5.000ms.
    AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, TasteESC)
    TextGadget(#TextGadget1, 20, 20, 300, 30, "Bei Focus erhalten, Taste ESC drücken.", #PB_Text_Border) 
    TextGadget(#TextGadget2, 20, 70, 300, 30, "..warte auf ESC-Taste", #PB_Text_Border) 
    ButtonGadget(#ButtonSticky, 20, 110, 120, 30, "Sticky is OFF")
    ButtonGadget(#ButtonBedingung, 160, 110, 160, 30, "Bedingung is Timer")
    TextGadget(#TextGadget3, 20, 160, 300, 30, "Fenster aktiv", #PB_Text_Border) 
    ;
    Repeat ; Start of the event loop
      EventID = WaitWindowEvent() 
      GadgetID = EventGadget()
      MenueID = EventMenu()
      ;
      If ZustandFensterAktiv <> GetActiveWindow()
        ZustandFensterAktiv = GetActiveWindow()
        ZeigeFensterZustand(ZustandFensterAktiv)
      EndIf
      
      ;-  Event-Auswertung
      Select EventID
        Case #PB_Event_Timer
          If EventTimer() = #TimerNummerOnTop
            If BedingungTimer = #True
                FensterOnTop(Fenster.s)
              EndIf
            EndIf
            ;
        Case #PB_Event_Gadget
          If GadgetID = #ButtonSticky
            ZeigeStickyZustand(ZustandStickyAktiv)
          EndIf
          ;
          If GadgetID = #ButtonBedingung
            ZeigeBedingungZustand(BedingungTimer)
          EndIf
          ;
        Case #PB_Event_Menu
          If MenueID = TasteESC  ;ESC
            SetGadgetText(#TextGadget2, "ESC gedrückt, Zeitpunkt: "+FormatDate("%hh:%ii:%ss", Date()))
          EndIf
      EndSelect
      ;
    Until EventID = #PB_Event_CloseWindow ; End of the event loop
    FlagThreadBeenden = #True
  Else
    Debug "Window konnte nicht geöffnet werden"
  EndIf
EndProcedure
;
Main()
Jürgen
Antworten