Seite 1 von 1

Systray-Icon doppelt ab Mint 19.x

Verfasst: 26.01.2022 23:02
von jogo
moin moin,
meine kleinen Systray-Icons werden komischer Weise ab Mint 19.x Mate/xfce im Systray doppelt nebeneinander dargestellt.
Finde auch keinen Ansatz, in welche Richtung ich da forschen müßte.

Ich baue und compiliere meine Programme aktuell mit PB 5.73 LTS ohne spezielles Subsystem // CPU dynamisch
Hab ich auf verschiedenen Rechnern ausprobiert - immer das gleiche Muster:
Bis Mint 18.3 werden die Icons so dargestellt, wie ich das auch programmiert habe - ab 19.x wirds komisch..

Hier mal ein komplett lauffähiger Beispielcode, der das demonstriert.

Code: Alles auswählen

;demo systray-icon

EnableExplicit      ;deklarierungs-zwang
Global.i ev

Procedure bau_img()
  ;erzeugt ein image für das systrayicon  
  CreateImage(1, 16, 16,32)        ; leeres bild #1 mit schwarzen hintergrund erzeugen  
  StartDrawing(ImageOutput(1))     ; alle folgenden zeichen operationen auf das image #1  
    Circle(8,8,8,$00FF00)          ; großer hellgrüner kreis
  StopDrawing()                    ; ende zeichenmodus in #1
EndProcedure 

Procedure bau_popmenu()
  ;erstellt ein popmenü (aber noch nicht sichtbar) für trayicon,
  If CreatePopupMenu(50)        ; Popup-Menüs beginnen    
    MenuItem(51, "Beenden")
    MenuBar()                   ;trenner
    MenuItem(52, "- - - -")
  EndIf                         ;erstellung popmenü  
EndProcedure

Procedure tray_an()
  ;erzeugt ein systrayicon  
  AddSysTrayIcon(1, WindowID(0),ImageID(1)) ;systrayicon das image #1 zuweisen
  SysTrayIconToolTip(1,"Demo")  ;tooltip für das sysicon zuweisen   
EndProcedure
; ----------------------

 OpenWindow(0, 350, 250 , 225, 95,"Demo-SysIcon",#PB_Window_MinimizeGadget)
 StickyWindow(0,#True)    ;fenster fest im vordergrund
 bau_img()                ;image für trayicon bauen
 bau_popmenu()            ;popmenü bauen
 tray_an()                ;trayicon platzieren

Repeat ;ereignisschleife
  ev = WaitWindowEvent()    ;auf ereignis warten und ggf. ereignis in ev speichern
  Select ev                 ;fensterereignis auswählen  
    Case #PB_Event_CloseWindow      
      Break                 ;aus schleife hüpfen und komplett beenden 
      
    Case  #PB_Event_SysTray       ;wenn systray-ereignis angeklickt wurde / egal links,rechts usw.        
      DisplayPopupMenu(50, WindowID(0))  ; zeigt das Popup-Menü an           

    Case  #PB_Event_Menu       ;wenn menü
        Select EventMenu()       ;auswahl, welches item 
          Case 51                ;wenn Beenden gedrückt
            Break                ;aus schleife hüpfen und komplett beenden
        EndSelect
  EndSelect ;fensterereignis
  
ForEver

End

Re: Systray-Icon doppelt ab Mint 19.x

Verfasst: 28.01.2022 17:20
von ccode_new
Bestätigt!

Dieser Bug ist Linux-Distributionsabhängig und hat rein gar nichts mit PureBasic zu tun.

Es ist ein Bug einer Systemkomponente in Linux-Mint 19.

Re: Systray-Icon doppelt ab Mint 19.x

Verfasst: 29.01.2022 00:26
von jogo
Ok, Danke fürs Testen - dachte ich mir schon...
lässt sich dieser LinuxBug vllt. mit PureBasic irgendwie umschiffen/kompensieren?
Also das Icon irgendwie anders erstellen oder auflösen.
Hab verschiedene Größen getestet. Damit allein komme ich nicht weiter.
Aber gibt ja auch Programme, deren Icon normal angezeigt wird.
Die Frage ist, wie machen die das...?

Re: Systray-Icon doppelt ab Mint 19.x

Verfasst: 01.02.2022 13:06
von Shardik
Das Problem mit den doppelten Systray-Icons hängt wohl mit der Höhe des Systray und der Höhe und Breite des Icon zusammen. Bei meinem Linux Mint 19.3 x64 'Tricia' mit Cinnamon und PB 5.73 x64 kann ich das Problem mit jogos Beispiel bestätigen:

Bild


Wenn ich aber die Maße und die Position des Icon von

Code: Alles auswählen

  CreateImage(1,16,16,32)          ; Leeres Bild #1 mit schwarzem Hintergrund erzeugen  
  StartDrawing(ImageOutput(1))     ; Alle folgenden Zeichen-Operationen auf das Image #1  
    Circle(8,8,8,$00FF00)          ; Großer hellgrüner Kreis
in

Code: Alles auswählen

  CreateImage(1,32,32,32)          ; Leeres Bild #1 mit schwarzem Hintergrund erzeugen  
  StartDrawing(ImageOutput(1))     ; Alle folgenden Zeichen-Operationen auf das Image #1  
    Circle(16,16,8,$00FF00)        ; Großer hellgrüner Kreis
abändere, dann ist das Problem behoben:

Bild

Re: Systray-Icon doppelt ab Mint 19.x

Verfasst: 01.02.2022 22:44
von jogo
Das ist interessant.
und wie es aussieht, muß nur das Image, auf dem ich letztlich den Kreis zeichne, vergrößert werden.
Das ist auf jeden Fall ein super Ansatz, wo ich jetzt ein wenig kombinieren und rumspielen kann - Danke Shardik :-)

was ich bis jetzt auch noch nicht hingekriegt habe ist, das z.Zt. schwarze Image transparent zu machen (falls mal gewünscht).

Code: Alles auswählen

CreateImage(1, 32, 32,32,#PB_Image_Transparent)
wenn ich das so mache, dann ist das Image zwar wirklich transparent, aber der grüne Kreis auch.
Aber der soll natürlich grün bleiben

Re: Systray-Icon doppelt ab Mint 19.x

Verfasst: 02.02.2022 11:59
von Shardik
jogo hat geschrieben: 01.02.2022 22:44 was ich bis jetzt auch noch nicht hingekriegt habe ist, das z.Zt. schwarze Image transparent zu machen (falls mal gewünscht).
Wenn Du Deine Prozedur bau_img() wie folgt abänderst, dann ist der Hintergrund im Systray transparent:

Code: Alles auswählen

Procedure bau_img()
  ; Erzeugt ein Image für das Systray-Icon  
  CreateImage(1,32,32,32,#PB_Image_Transparent) ; Leeres Bild #1 mit transparentem Hintergrund erzeugen  
  StartDrawing(ImageOutput(1))     ; Alle folgenden Zeichen-Operationen auf das Image #1  
    DrawingMode(#PB_2DDrawing_AllChannels)
    Circle(16,16,8,RGBA(0,255,0,255)) ; Großer hellgrüner Kreis
  StopDrawing()                    ; Ende Zeichenmodus in #1
EndProcedure 

Re: Systray-Icon doppelt ab Mint 19.x

Verfasst: 02.02.2022 18:02
von jogo
funktioniert wie verrückt ^^
Das Kapitel 'DrawingMode' hab ich mir schon paar mal durchgelesen.
Ich versteh jedoch den ganzen Zusammenhang nicht & wie man das dann alles kombinieren kann.
Durch dein Beispiel hab ich mal gezielt versucht, den Zusammenhang im diesem Beispiel zu verstehen.

Also bewirkt DrawingMode(#PB_2DDrawing_AllChannels) , das Vorder- & Hintergrund nicht vermischt werden und zusätzlich der Alphakanal berücksichtigt werden soll.
Und RGBA(0,255,0,255) bewirkt durch 255 als Parameter 4 in RGBA(), dass der Kreis NICHT transparent gezeichnet wird. 125 wäre dann halbtransparent..

OK - da öffnet sich für mich bereits einen breite Palette an Möglichkeiten.
Wär ich aber ohne dein Beispiel nicht drauf gekommen - Vielen Dank