Linux Standardicons in Anwendung nutzen
-
- 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)
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
Michael Springwald
-
- 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
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.
Du musst dir einfach nur die LoadStockPixmap umschreiben, damit diese die ID-Strings als Parameter annimmt.
Womit ich noch eine Frage hätte, weiß jemand wie ich die ermittelte Bitmap verlustfrei in eine TImageList einbauen kann?
bringt jedenfalls ein fürchterliches Ergebnis.
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.
-
- 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
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]
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]
-
- 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
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?
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?
Kommt dann wenn im aktuellen Theme kein entsprechendes Icon gefunden wurde.
Du kannst es vorher abfragen
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.
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.
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.
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;
-
- 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
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?
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?