Linux Standardicons in Anwendung nutzen

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 »

Hier geht es um GTK2. Daran kann's nicht liegen.

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 »

Ja, bei meinen XINE Versuchen bin ich auch über dieses Problem gestolpert, du hast eine Unit doppelt drin, lösche doch mal alle GTK2 Units, evlt. klappt es dann besser.

edit: Achso, dann lösche mal die Unit GTK oder so. Da wo der angesprochen Daten Typ Defniert wird. Weil es gibt ein Konflikt zwischen zwei gleichen Datentypen. Darauf deutet die Unit hin. Du hast zwei Units eingebunden in den der gleiche Daten Typ defniert wird.
MFG
Michael Springwald

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

Beitrag von DiBo33 »

Genau, das Beispiel läuft natürlich nur unter GTK+,
ich habe auch Lazarus mit GTK2 neu erstellt, weiß aber nicht ob das nötig ist.

Hier habe ich mal eine Unit gebastelt, der Vorteil, du kannst nun auch Icons ausserhalb der StockIcons laden (e.g. help-about etc.)

Code: Alles auswählen

unit gtk2loadpixmap;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  LCLType, LCLIntf, Controls, Graphics, SysUtils, Math,
  gdk2pixbuf, glib2, gdk2, gtk2, gtkdef, gtkint;
 
type
  PStrings = array of PChar;
 
function LoadThemeIcon(Name: PChar; Size: integer): HBitmap;
procedure LoadBitmap(Bitmap: TBitmap; Name: PChar; Size: integer);
procedure LoadImageList(Images: TImageList; Names: PStrings);
 
implementation
 
function Pixbuf2HBitmap(Pixbuf: PGDKPixbuf): HBitmap;
const
  alpha_threshold = 151;
var
  Pixmap: PGDIObject;
begin
  Pixmap := GtkWidgetSet.NewGDIObject(gdiBitmap);
  Pixmap^.GDIBitmapType := gbPixmap;
  gdk_pixbuf_render_pixmap_and_mask(Pixbuf, Pixmap^.GDIPixmapObject.Image,
    Pixmap^.GDIPixmapObject.Mask, alpha_threshold);
  Result := HBitmap(PtrUInt(Pixmap));
end;
 
function LoadThemeIcon(Name: PChar; Size: integer): HBitmap;
const
  Directions: array[0..2] of PChar = ('', '-ltr', '-rtl');
var
  i: integer;
  Pixbuf: PGdkPixbuf;
begin
  Result := 0;
  i := 0;
  repeat
    Pixbuf := gtk_icon_theme_load_icon(gtk_icon_theme_get_default(),
      StrCat(Name,Directions[i]), Size, GTK_ICON_LOOKUP_FORCE_SVG, NULL);
    inc(i);
  until (Pixbuf <> NULL) or (i >= High(Directions));
  if Pixbuf <> NULL then begin
    Result := Pixbuf2HBitmap(Pixbuf);
    gdk_pixbuf_unref(Pixbuf);
  end;
end;
 
procedure LoadBitmap(Bitmap: TBitmap; Name: PChar; Size: integer);
var
  BH: HBitmap;
begin
  BH := LoadThemeIcon(Name, Size);
  if BH <> 0 then Bitmap.Handle := BH;
end;
 
procedure LoadImageList(Images: TImageList; Names: PStrings);
var
  BM: TBitmap;
  BH: HBitmap;
  i, l: integer;
begin
  BM := TBitmap.Create;
  l := Min(pred(Images.Count), High(Names));
  try
    for i := 0 to l do if Names[i] <> '' then begin
      BH := LoadThemeIcon(Names[i], Images.Width);
      if BH <> 0 then begin
        BM.Handle := BH;
        Images.Replace(i, BM, nil);
      end;
    end;
  finally
    BM.Free;
  end;
end;
 
end.


Allerdings bin ich mit der Qualität noch nicht so zufrieden, wenn jemand eine Lösung hätte,
wie ich ich ein Pixbuf verlustfrei in ein HBitmap wandeln kann, immer her damit.
gdk_pixbuf_render_pixmap_and_mask() scheint mir nicht so ideal zu sein.

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 »

geht das mit wenigen Anpassungen auch für GKT1 ?
MFG
Michael Springwald

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

Beitrag von DiBo33 »

Nein, für GTK wird wohl eine grössere Anpassung nötig sein.

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 »

Gut ! Mal ne andere Frage was für Symbole werden eigentlich mit dieser Funktion unterstütz ?
Also auf welche habe ich zugrieff ?
MFG
Michael Springwald

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

Beitrag von DiBo33 »

Alle vorhandenen Theme-Icons, egal ob StockIcon, AppIcon oder Mimetypes.
Wobei sich der Name am Dateinamen ohne Endung orientiert.

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 »

auch auch die Mimetypes. werden geladen ?
Damit meinst du die Datei Formate ?(also z.b. mp3 oder wav) richtig ? Das währe Praktisch für meine Datei Verwaltung Komponenten.

Und das geht für alle Linux Arten ? Also unter Ubuntu, KDE, und wie sie nicht alle heißen ?
MFG
Michael Springwald

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

Beitrag von DiBo33 »

auch auch die Mimetypes. werden geladen ?
Damit meinst du die Datei Formate ?(also z.b. mp3 oder wav) richtig ?

Wenn du als IconName den MimeType angibst also 'audio-mpeg' oder 'audio-x-mpeg', dann wird (sofern vorhanden) das Icon für mp3 geladen.

Und das geht für alle Linux Arten ? Also unter Ubuntu, KDE, und wie sie nicht alle heißen ?

Dazu müssen der GTK+ Bibliotheken installiert sein (ich meine Kubuntu unterstützt GTK+, sollte also laufen).

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 »

DiBo33 hat geschrieben:Hier habe ich mal eine Unit gebastelt, der Vorteil, du kannst nun auch Icons ausserhalb der StockIcons laden (e.g. help-about etc.)

Wow! Klasse! Das Problem von vorhin ist meiner Dämlichkeit zuzuschreiben, jetzt läuft's. (Ich musste nur alle vorkompilierten Units entfernen)
Ich vermerke dich auf jeden Fall mal als Autor der Funktion, ich hätte mich mit meiner pixeligen Lösung bzw. Lösung nr. 3 von dir jetzt zufrieden gegeben.

Antworten