RefreshDialog GTK3

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
matbal
Beiträge: 244
Registriert: 30.03.2011 20:53

RefreshDialog GTK3

Beitrag von matbal »

Bei mir funktioniert RefreshDialog unter GTK3 nicht richtig, wenn verschiedene Schriftarten im Dialog verwendet werden. (PureBasic 6.03 64bit)

Wenn ich RefreshDialog manuell aufrufe, klappt es. Es sieht so aus, als ob RefreshDialog von der Änderung der Schriftart noch nichts mitbekommen hat in der Prozedur, wo ich die Schrift setze.

Umgehen kann ich das Problem, wenn ich RefreshDialog durch Timer verzögert aufrufe. In meinem Demo-Code kann man in der Prozedur SetStringGadgetFont() durch entfernen des Semikolons den Timer aktivieren. (Die Zeile habe ich markiert)

Unter GTK2 und QT gibt es diesen Fehler nicht.

Code: Alles auswählen

EnableExplicit

Structure s_font
   name$
   size.i
   style.i
EndStructure

#RefreshTimer = 0
#StringFont = 0
#RefreshDelay = 100     ; Verzögerung für RefreshDialog

Runtime Enumeration Windows
   #FormMain
EndEnumeration


Runtime Enumeration Gadgets
   #FormMain_Button_Font
   #FormMain_Button_RefreshDialog
   #FormMain_Text_1
   #FormMain_String_1
   #FormMain_Text_2
   #FormMain_String_2
   #FormMain_Text_3
   #FormMain_String_3
EndEnumeration

Global stringfont.s_font



Procedure SetStringGadgetFont()
   ; Setzt die neue Schriftart für die StringGadgets
   Protected fntID
   
   With stringfont
      fntID = LoadFont(#StringFont, \name$, \size, \style)
      SetGadgetFont(#FormMain_String_1, fntID)
      SetGadgetFont(#FormMain_String_2, fntID)
      SetGadgetFont(#FormMain_String_3, fntID)
      RefreshDialog(#FormMain)                                   ; <==== geht nicht ========
      ; AddWindowTimer(#FormMain, #RefreshTimer, #RefreshDelay)   ; <==== Fehlerumgehung durch Verzögerung
   EndWith
EndProcedure



Procedure RefreshTimer()
   ; Verzögerter Aufruf von RefreshDialog
   
   RefreshDialog(#FormMain)
   RemoveWindowTimer(#FormMain, #RefreshTimer)
EndProcedure

Runtime Procedure FormMain_Button_Font()
   ; Schriftart für die StringGadgets ändern
   With stringfont
      If FontRequester(\name$, \size, 0, 0, \style)
         \name$ = SelectedFontName()
         \size  = SelectedFontSize()
         \style = SelectedFontStyle()
         
         SetStringGadgetFont()   
      EndIf
   EndWith
EndProcedure

Runtime Procedure FormMain_Button_RefreshDialog()
   RefreshDialog(#FormMain)
EndProcedure

Procedure Main()
   Protected XML$
   
   XML$ + "<?xml version='1.0' encoding='UTF-16'?>"
   XML$ + ""
   XML$ + "<dialogs><!--Created by Dialog Design0R V1.84 => get it from: https://hex0rs.coderbu.de/en/sdm_downloads/dialogdesign0r/-->"
   XML$ + "  <window flags='#PB_Window_SystemMenu | #PB_Window_SizeGadget' width='400' height='80' name='main' xpos='0' ypos='0' id='#FormMain'>"
   XML$ + "    <vbox align='top' expand='no'>"
   XML$ + "      <hbox align='left' expand='no'>"
   XML$ + "        <button text='Change Font' id='#FormMain_Button_Font' onevent='FormMain_Button_Font()'/>"
   XML$ + "        <button text='Refresh Dialog' id='#FormMain_Button_RefreshDialog' onevent='FormMain_Button_RefreshDialog()'/>"
   XML$ + "      </hbox>"
   XML$ + "      <gridbox colexpand='item:2'>"
   XML$ + "        <text text='Vorname:' id='#FormMain_Text_1'/>"
   XML$ + "        <string text='Paul Peter' id='#FormMain_String_1'/>"
   XML$ + "        <text text='Name:' id='#FormMain_Text_2'/>"
   XML$ + "        <string text='Hans-Müller' id='#FormMain_String_2'/>"
   XML$ + "        <text text='Adresse:' id='#FormMain_Text_3'/>"
   XML$ + "        <string text='Straße des Friedens' id='#FormMain_String_3'/>"
   XML$ + "      </gridbox> "
   XML$ + "    </vbox>"
   XML$ + "  </window>"
   XML$ + "</dialogs><!--DDesign0R Definition: PureBasic|1|1|1|_|with_declares_winnames|1-->"
   
   If ParseXML(0, XML$) And XMLStatus(0) = #PB_XML_Success
      CreateDialog(#FormMain)
      If OpenXMLDialog(#FormMain, 0, "main", 100, 100)
         With stringfont
            \name$ = "Noto Sans"
            \size = 13
            \style = 0
            SetStringGadgetFont()
         EndWith
         
         BindEvent(#PB_Event_Timer, @RefreshTimer(), #FormMain)
         Define event
         
         Repeat
            event = WaitWindowEvent()
         Until event = #PB_Event_CloseWindow
      EndIf
      
      
   EndIf
EndProcedure : Main()