Warum sieht ein Gui unter Linux nicht schön aus?(Anfänger)

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von Shardik »

Ich habe mein Programm zur Änderung der Hintergrundfarbe von Linux-Fenstern mit GTK3-Framework so umgeschrieben, dass man es als Prozedur mit der gewünschten RGB-Farbe aufrufen kann:

Code: Alles auswählen

EnableExplicit

ImportC ""
  gtk_css_provider_load_from_data(*CSSProvider, CSSData.P-UTF8, Length.I,
    *Error.GError)
  gtk_css_provider_new()
  gtk_style_context_add_provider(*StyleContext, *StyleProvider, Priority.I)
  gtk_widget_get_style_context(*Widget.GtkWidget)
EndImport

#GTK_STYLE_PROVIDER_PRIORITY_USER = 800

Procedure.I GetGTK3MinorVersion()
  Protected GTK3Version.S
  Protected GTK3MinorVersion.I
  Protected ProgramID.I

  ProgramID = RunProgram("pkg-config", "--modversion gtk+-3.0", "",
    #PB_Program_Open | #PB_Program_Read)

  If ProgramID
    GTK3Version = ReadProgramString(ProgramID)
    GTK3MinorVersion = Val(StringField(GTK3Version, 2, "."))
    CloseProgram(ProgramID)
  EndIf

  ProcedureReturn GTK3MinorVersion
EndProcedure

Procedure SetWindowBackColor(WindowID.I, Color.I)
  Protected ContainerWidget.I
  Protected CSSProvider.I
  Protected CSSColor.S
  Protected CSSData.S
  Protected GTK3MinorVersion.I

  CSSColor = "#" + RSet(Hex(Red(Color)), 2, "0") +
    RSet(Hex(Green(Color)), 2, "0") + RSet(Hex(Blue(Color)), 2, "0")
  GTK3MinorVersion = GetGTK3MinorVersion()

  If GTK3MinorVersion > 15
    CSSData = "window.background {background-color: " + CSSColor + ";}"
    ContainerWidget = WindowID(WindowID)
  Else
    CSSData = "GtkLayout {background-color: " + CSSColor + ";}"
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(WindowID(WindowID)), 0)
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(ContainerWidget), 0)
  EndIf

  CSSProvider = gtk_css_provider_new()
  gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
  gtk_style_context_add_provider(gtk_widget_get_style_context(ContainerWidget),
    CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
  g_object_unref_(CSSProvider)
EndProcedure

OpenWindow(0, 100, 100, 350, 230, "Window with custom background color")
SetWindowBackColor(0, $EAD1B9)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
aixwanderer
Beiträge: 7
Registriert: 09.05.2018 09:47

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von aixwanderer »

Shardik, ich habe Deinen Code probiert. Das hat super funktioniert! :D :allright: Vielen Dank! noch eine Frage:

Ich habe ein GUI implementiert, aber wenn ich die Einstellung der Themen von Linux geändert habe, dann wurde einige Sachen des GUI-Programmes auch geändert, wie z.B. die Höhegröße des ButtonGadget wurde verkleinert, dann wurde die Beschriftung nicht vollständig angezeigt.

Gibt es eine Möglichkeit, die Veränderung zu verhindern, ob man die Themen von Linux geändert hätte?
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von Shardik »

Mit verschiedenen Themen unter Linux ist das leider so eine Sache. Ich benutze zum Testen grundsätzlich immer nur das voreingestellte Standard-Thema einer Distribution. Leider enthalten viele auswählbare Themen noch Fehler und sind teilweise nicht ganz ausgereift. Es gibt im englischen Unterforum "Bugs - Linux" eine ganze Reihe gemeldeter Fehler, die auf fehlerbehaftete Themen zurückzuführen sind und die Fred deshalb nicht beheben kann/will, weil dies Aufgabe der Entwickler des jeweiligen Themas ist. Und in Verbindung mit GTK3, das von seiner Philosophie eigentlich nicht zu PureBasic passt (siehe Blog-Eintrag "Enter GTK3" von Fred), dürften diese Fehler noch gehäuft auftreten. Wenn einem aber ein bestimmtes Thema unheimlich gut gefällt, dann sollte man den Entwicklern dieses Themas helfen, indem man versucht, Fehler in diesem Thema zu finden und Verbesserungsvorschläge/Fehlerbehebungen an die Entwickler senden...
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von mk-soft »

@Shardik,

vielen Dank für den Code und den Ansatz dieses auch für die Gadget umzusetzen.

Ich habe dein Code mit "gtk_style_context_remove_provider" erweitert, damit man auch mehrmals die Hintergrundfarbe ändern kann.

Code: Alles auswählen

EnableExplicit

ImportC ""
  gtk_css_provider_load_from_data(*CSSProvider, CSSData.P-UTF8, Length.I,
    *Error.GError)
  gtk_css_provider_new()
  gtk_style_context_add_provider(*StyleContext, *StyleProvider, Priority.I)
  gtk_style_context_remove_provider(*StyleContext, *StyleProvider)
  gtk_widget_get_style_context(*Widget.GtkWidget)
EndImport

#GTK_STYLE_PROVIDER_PRIORITY_USER = 800

Procedure.I GetGTK3MinorVersion()
  Protected GTK3Version.S
  Protected GTK3MinorVersion.I
  Protected ProgramID.I

  ProgramID = RunProgram("pkg-config", "--modversion gtk+-3.0", "",
    #PB_Program_Open | #PB_Program_Read)

  If ProgramID
    GTK3Version = ReadProgramString(ProgramID)
    GTK3MinorVersion = Val(StringField(GTK3Version, 2, "."))
    CloseProgram(ProgramID)
  EndIf

  ProcedureReturn GTK3MinorVersion
EndProcedure

Procedure SetWindowBackColor(WindowID.I, Color.I)
  Static NewMap CSSProviderMap()
  Protected ContainerWidget.I
  Protected CSSProvider.I
  Protected CSSContext.I
  Protected CSSColor.S
  Protected CSSData.S
  Protected GTK3MinorVersion.I

  CSSColor = "#" + RSet(Hex(Red(Color)), 2, "0") +
    RSet(Hex(Green(Color)), 2, "0") + RSet(Hex(Blue(Color)), 2, "0")
  GTK3MinorVersion = GetGTK3MinorVersion()

  If GTK3MinorVersion > 15
    CSSData = "window.background {background-color: " + CSSColor + ";}"
    ContainerWidget = WindowID(WindowID)
  Else
    CSSData = "GtkLayout {background-color: " + CSSColor + ";}"
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(WindowID(WindowID)), 0)
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(ContainerWidget), 0)
  EndIf
  CSSProvider = gtk_css_provider_new()
  CSSContext = gtk_widget_get_style_context(ContainerWidget)
  If FindMapElement(CSSProviderMap(), Hex(WindowID))
    gtk_style_context_remove_provider(CSSContext, CSSProviderMap())
  EndIf
  CSSProviderMap(Hex(WindowID)) = CSSProvider 
  gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
  gtk_style_context_add_provider(CSSContext,
    CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
  g_object_unref_(CSSProvider)
EndProcedure

OpenWindow(0, 100, 100, 350, 230, "Window with custom background color")
SetWindowBackColor(0, $EAD1B9)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von Sven »

aixwanderer hat geschrieben:warum sieht die GUI nicht schön wie unter Windows aus.
Das muss so! Die Linuxer wollen das so.

Ich ärger mich auch regelmäßig drüber, dass für Linux die Buttons mindestens doppelt so hoch sein müssen, und man doppelt soviel Breite für den gleichen Text einplanen muss, damit er nicht abgeschnitten wird. Und so Kram wie eingefärbte Gadgets fang ich gar nicht mehr an. Dann noch so Feinheiten im Design wie: Editierbare Comboboxen sind eckig, nicht editierbare haben runde Ecken - und eine andere Höhe...

Für Linux eine ansprechende Oberfläche erstellen ist sinnlos, mit dem nächsten OS-Update kann die schon wieder anders aussehen. Oder Du machst alles Owner-Draw.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von ccode_new »

mk-soft hat geschrieben:aixwanderer hat geschrieben:
warum sieht die GUI nicht schön wie unter Windows aus.


Das muss so! Die Linuxer wollen das so.
Jepp! Das muss so!

Ich finde persönlich nicht das die Linux-GUI schlechter als die Windows GUI aussieht.
Eigentlich eher das Gegenteil.

GTK+ pfegt genau wie z.B. JAVA auch die GUI per flexibler Container anzupassen.
Dieses Konzept unterscheidet sich von dem Ur-X-Win-Prinzip und den Win32-GUI-Prinzip.

Aber es ist durchaus fortschrittlich.

Ich versuche auch unter Windows GUIs zu erstellen die sich flexibel zur Größe verhalten können.
Diese "Windows-Text-Label - Ich presse den Text gerade so drauf und wundere mich bei kleinen Themenänderung das der Text nicht mehr vollständg angezeigt wird" - Mentalität mag ich im übrigen nicht.

Unter Windows bekommen schlecht designte GUIs schon mit geringen Themen- und DPI-Änderungen ihr "Fett" weg.

Es ist halt alles eine Gewöhnungs- und Anpassungssache.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten