Linux Standardicons in Anwendung nutzen

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Standart Icons sind Standart Icons egal welche. Aber gut wenn du meinst. Mir ist es Egal.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ja und Lampen sind Lampen egal ob Strassenlaternen, Schreibtischlampen, Bühnenlicht ...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ach lassen wir das doch. Das weicht von meiner frage und von der Frage des Thread Erstellers ab. Solange Monta meine Frage nicht löscht kann man sie ruhig beantworten. Oder ich erstelle dafür ein neuen Thread. Was ich aber für überflüssighalte !!! Lampen sind Lampen Das Stimmt. Sie erfüllen nur einen Zweck wie bei den Icons. Die erfüllen auch nur einen Zweck.
MFG
Michael Springwald

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Ich habe jetzt dieses GL Dokument und diese Datei gefunden. Wie kann ich das so in Lazarus umsetzen? Der C-Code ist überhaupt nicht hilfreich und der GLibrary-Artikel nur für C Programmierer interessant.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Für mich sieht es auf wie ein header evlt. hilft das Tool h2pas
(glaube ich hieß das)
MFG
Michael Springwald

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Du musst dir einfach nur die LoadStockPixmap umschreiben, damit diese die ID-Strings als Parameter annimmt.

Code: Alles auswählen

uses
  LCLIntf, LCLType, gtk2, gtkint, gtkdef, gdkpixbuf, gtkproc, gtk, gdk2;
 
function Gtk2LoadStockPixmap(StockName: PChar; IconSize: Cardinal; var Mask: HBitmap): HBitmap;
var
  Pixmap: PGDIObject;
  IconSet: PGtkIconSet;
  Pixbuf: PGDKPixbuf;
begin
  Mask := 0;
  IconSet := gtk_style_lookup_icon_set(GetStyle(lgsWindow), StockName);
  Pixbuf := gtk_icon_set_render_icon(IconSet, GtkStyle(lgsWindow),
    GTK_TEXT_DIR_NONE, GTK_STATE_NORMAL, IconSize,
    GtkStyleWidget(lgsWindow), nil);
  Pixmap := GtkWidgetSet.NewGDIObject(gdiBitmap);
  with Pixmap^ do begin
    GDIBitmapType := gdPixmap;
    visual := gdk_visual_get_system();
    gdk_visual_ref(visual);
    colormap := gdk_colormap_get_system();
    gdk_colormap_ref(colormap);
    gdk_pixbuf_render_pixmap_and_mask(Pixbuf, GDIPixmapObject.Image,
      GDIPixmapObject.Mask, 128);
  end;
  gdk_pixbuf_unref(Pixbuf);
  Result := HBitmap(PtrUInt(Pixmap));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  BH, MH: HBitmap;
begin
  // GTK_STOCK_CANCEL etc. findest du in
  // fpcsrc/packages/extra/gtk2/gtk+/gtk/gtkstock.inc
  // GTK_ICON_SIZE_BUTTON etc. findest du in
  // fpcsrc/packages/extra/gtk2/gtk+/gtk/gtkenums.inc
  BH := Gtk2LoadStockPixmap(GTK_STOCK_CANCEL, GTK_ICON_SIZE_BUTTON, MH);
  if BH <> 0 then begin
    BitBtn1.Glyph.Handle := BH;
    if MH <> 0 then BitBtn1.Glyph.MaskHandle := MH;
  end;
end;


Womit ich noch eine Frage hätte, weiß jemand wie ich die ermittelte Bitmap verlustfrei in eine TImageList einbauen kann?

Code: Alles auswählen

Bitmap.SetHandles(NH, MH);
ImageList1.Add(Bitmap, nil);

bringt jedenfalls ein fürchterliches Ergebnis.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Vielen Dank, ich probiere das mal aus! Ich hatte schon eine eigene Lösung allerdings stürzte da das Programm so ca. jedes 3. mal ohne irgendeine Fehlermeldung ab.
Die Symbole aus der ImageList sehen bei mir (GTK2) auch scheußlich aus, deshalb verzichte ich auch schon seit längerem auf die Liste.

[edit]Irgendwie ist der Code nicht kompilierbar. Z.B. fehlt mir die Funktion GtkStyle() oder GtkStyleWidget() [/edit]

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Tippfehler meinerseits (wenn man es schon mal halb aus dem Kopf schreibt).

GtkStyle() muss GetStyle() und GtkStyleWidget() muss GetStyleWidget() heissen.

falsch
GDIBitmapType := gdPixmap;
richtig
GDIBitmapType := gbPixmap;

Sonst müsste alles stimmen.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Ah! Und ich versuche hier GtkStyle() aus irgendeiner SO-Datei zu importieren! (Das gibt es nämlich auch)
Vielen Dank! Eine Frage hätte ich allerdings noch: Bei folgenden Typen:
GTK_STOCK_GOTO_BOTTOM = 'gtk-goto-bottom';
GTK_STOCK_GOTO_FIRST = 'gtk-goto-first';
GTK_STOCK_GOTO_LAST = 'gtk-goto-last';
GTK_STOCK_GOTO_TOP = 'gtk-goto-top';
GTK_STOCK_GO_BACK = 'gtk-go-back';
GTK_STOCK_GO_DOWN = 'gtk-go-down';
GTK_STOCK_GO_FORWARD = 'gtk-go-forward';
GTK_STOCK_GO_UP = 'gtk-go-up';
wird nur ein leeres Feld mit einem roten X drin angezeigt, wärend ansonsten alle Typen funktionieren. Hat jemand eine Idee, woran das liegt?

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Kommt dann wenn im aktuellen Theme kein entsprechendes Icon gefunden wurde.

Du kannst es vorher abfragen

Code: Alles auswählen

if not gtk_icon_theme_has_icon(gtk_icon_theme_get_default(), StockName) then begin
  ShowMessage(Format('Icon %s nicht gefunden', [StockName])); Exit;
end;


Was mich noch interessiert ist wie man den Namen des aktuellen Theme herausfindet, hierfür habe ich bis jetzt noch keine entspr. API-Funktion gefunden.
Die einzige Info fand ich bisher unter Ubuntu in
~/.gconf/desktop/gnome/interface/%gconf.xml

Ich bin mir allerdings nicht sicher ob dies bei Gnome der Standardeintrag ist.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Hmm... es wird nicht angezeigt, dass das Icon fehlt... Und ich bekomme es z.B. in Nautilus ja zu sehen!
Zu deiner Frage:
~/.gconf/desktop/gnome/interface/%gconf.xml
ist offensichtlich der Standardeintrag. Lösche die Datei mal, dann sollte dein Theme zurückgesetzt werden.

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Hmm... es wird nicht angezeigt, dass das Icon fehlt... Und ich bekomme es z.B. in Nautilus ja zu sehen!


Fehlen tut es nicht, es konnte nur nicht ermittelt werden.
Das gleiche hatte ich bei
GTK_STOCK_UNDO, GTK_STOCK_REDO, GTK_STOCK_JUMP_TO
bei denen kam bei mir auch ein "BrokenImage"-Icon zurück und erst als ich die Dateien entsprechend umbenannt hatte wurden diese auch angezeigt.
gtk-undo.png (etc.)

Wobei die Icons zB von GEdit einwandfrei dargestellt wurden.

Im Moment nehme ich gerade
fpcsrc/packages/extra/gtk2/examples/gtk_demo/stock_browser.inc
auseinander, hier werden nämlich alle Icons einwandfrei ermittelt.

~/.gconf/desktop/gnome/interface/%gconf.xml
ist offensichtlich der Standardeintrag.

Das Problem ist nur, wenn mein Programm als Root ausgeführt wird, kann hierin wiederum der Name nicht durch diesen Eintrag ermittelt werden.

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

So, damit bekomme ich alle Icons die ich will

Code: Alles auswählen

uses
  LCLIntf, LCLType, gtk2, gtkint, gtkdef, gdkpixbuf, gtkproc, gdk2, glib2;
 
function Gtk2LoadStockPixmap(StockId: PChar; IconSize: integer): HBitmap;
var
  StockWindow: PGtkWidget;
  Pixmap: PGDIObject;
  Pixbuf: PGDKPixbuf;
begin
  Result := 0;
  // Wenn kein DefaultIcon dann Stop;
  if gtk_icon_factory_lookup_default(StockId) = NULL then Exit;
  StockWindow := gtk_window_new(GTK_WINDOW_TOPLEVEL);
  Pixbuf := gtk_widget_render_icon(StockWindow, StockId, IconSize, NULL);
  gtk_widget_destroy(StockWindow);
  // Prüfen, ob ein Icon zugewiesen wurde
  if PtrUInt(Pixbuf) = 0 then Exit;
  Pixmap := GtkWidgetSet.NewGDIObject(gdiBitmap);
  with Pixmap^ do begin
    GDIBitmapType := gbPixmap;
    visual := gdk_visual_get_system();
    gdk_visual_ref(visual);
    colormap := gdk_colormap_get_system();
    gdk_colormap_ref(colormap);
    gdk_pixbuf_render_pixmap_and_mask(Pixbuf, GDIPixmapObject.Image,
      GDIPixmapObject.Mask, 128);
  end;
  gdk_pixbuf_unref(Pixbuf);
  Result := HBitmap(PtrUInt(Pixmap));
end;

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Also erstmal findet der Compiler 'NULL' nicht, ich habe daraus 'nil' gemacht. Und dann gibt es noch Meldungen folgendes Typs:
Error: Incompatible types: got "GTK.PGtkWidget" expected "GTK2.PGtkWidget"
Bei dieser Zeile:
StockWindow := gtk_window_new(GTK_WINDOW_TOPLEVEL);
sowie
gtk_widget_destroy(StockWindow);
Fehlt da eine Unit, bzw. muss ich die von dir genannte Inc-Datei noch einbinden?

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Targion hat geschrieben:Fehlt da eine Unit, bzw. muss ich die von dir genannte Inc-Datei noch einbinden?


Ich denke das Beispiel ist für GTK2 gedacht.

Antworten