Hi Keya,
congratulations! Your load-version runs fine.
I got it running yesterday evening too. And yes, you're right:
gdk_pixbuf_loader_close() is the starting shot for the previous command!
You posted one of the best links the last time. It opens graphical doors to PureBasic-Linux.
Here's my
quick&dirty pics-embedded version (i hope it doesn't make you angry, but it's the best thread to place):
- The bad thing: This version doesn't care about timing ("prepared" und "updatet" signal) as recommended in doku.
- but it is shorter then my solid version, easier to handle and seem to run too (had no problem till now)
- no need for any PureBasic ImageDecoder
- images can be embedded in the exe when compiling (no pics must be included to published Apps, no search, load, memory-handling of pics necessary)
- you can use it for API commands like Window- or Application-icons, images on Buttons
- AND you can use it for all PureBasic-Gadgets or GadgetItems with images
- no limitation to PB-ImageDecoder-Formats (
gif, vector graphics (svg) are possible (and tested) too). Just load the pic to the data-section:
Xubuntu 14.04 lists as supported formats on console: "gdk-pixbuf-query-loaders" or gdk_pixbuf_get_formats ():
-- ani
-- bmp
-- PNM/PBM/PGM/PPM
-- jpeg2000/jp2/jpc/jpx/j2k/jpf
-- tga/targa
-- png
-- ico/cur
-- gif
-- jpeg/jpe/jpg
-- icns
-- tiff/tif
-- pcx
-- wbmp
-- xbm
-- xpm
-- ras
-- qtif/qif
-- svgCode: Select all
EnableExplicit
; UsePNGImageDecoder(); NOT :-)
ImportC ""
gtk_button_set_image(*button.GtkButton, *image.GtkWidget)
gtk_button_set_image_position(*button.GtkButton, position)
gtk_button_set_label(*button.GtkButton, label.p-utf8)
gtk_image_clear(*image.GtkWidget)
gtk_button_set_alignment(*button.GtkButton, xalign.f, yalign.f)
g_object_set(*object.GObject, property_name.p-utf8, *data, v= 0)
gdk_pixbuf_loader_write(*loader, *buf, count, *error)
gdk_pixbuf_loader_get_pixbuf(*loader)
gdk_pixbuf_loader_new()
gdk_pixbuf_loader_close(*loader, *error)
g_signal_connect(*instance, detailed_signal.p-ascii, *c_handler, *pdata, destroy= 0, flags= 0) As "g_signal_connect_data"
EndImport
#Win_Main= 0
Enumeration
#But1
#But2
#Dummy
#ImG1
#BIG1
#Txt1
#LIG
EndEnumeration
Global.i gEvent, gQuit
Global *gPixbuf
Global *gImage1, *gImage2
;Declare ButtonGadget_AddImage(Gadget, *Pic, Label.s, Alignment)
Procedure GetGadgetPixbuf(mem, size)
Protected loader = gdk_pixbuf_loader_new()
Protected *pixbuf, *err.GError
*err= 0 : gdk_pixbuf_loader_write(loader, mem, size, @*err)
If *err : Debug "Error: " + PeekS(*err\message, -1, #PB_UTF8) : EndIf
*err= 0 : gdk_pixbuf_loader_close(loader, @*err); Important to get the things going, else: Do you know 'Sankt Nimmerleinstag'?!
If *err : Debug "Error: " + PeekS(*err\message, -1, #PB_UTF8) : EndIf
*pixbuf = gdk_pixbuf_loader_get_pixbuf(loader)
ProcedureReturn *pixbuf
EndProcedure
; -----
Procedure ButtonImages_Activate(Show)
g_object_set(gtk_settings_get_default_(), "gtk-button-images", Show, #Null)
EndProcedure
Procedure ButtonGadget_AddImage(Gadget, *Pic, Label.s, Alignment)
gtk_button_set_image(GadgetID(Gadget), *Pic)
gtk_button_set_label(GadgetID(Gadget), Label)
gtk_button_set_image_position(GadgetID(Gadget), Alignment)
EndProcedure
gtk_window_set_default_icon_(GetGadgetPixbuf(?Img3, ?Img4-?Img3)); If gtk_window_set_default_icon_() is used, comment gtk_window_set_icon_() call below.
If OpenWindow(#Win_Main, #PB_Ignore, #PB_Ignore, 500, 300, "Use exe embedded images w/o ImageDecoder", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
;if icons are not shown, uncomment the following line ...
ButtonImages_Activate(#True)
ButtonGadget(#But1, 5, 5, 290, 30, " ", #PB_Button_Toggle)
ButtonGadget(#But2, 5, 40, 290, 30, " ", #PB_Button_Toggle)
TextGadget (#Txt1, 5, 80, 240, 30, "Look at window-/taskbar-/dock- icon")
TextGadget (#PB_Any, 5, 115, 190, 22, "A PB ImageGadget()")
TextGadget (#PB_Any, 5, 145, 190, 22, "A PB ButtonImageGadget()")
ListIconGadget(#LIG, 5, 175, 490, 120, "Col1 with embedded pixbufs w/o ImageDecoder", 350, #PB_ListIcon_GridLines)
AddGadgetColumn(#LIG, 1, "Col 2", 90)
;Further Gadgets with embedded, decoderless images are created here ...
*gImage1= gtk_image_new_from_pixbuf_(GetGadgetPixbuf(?Img1, ?Img2-?Img1)); Needs Ptr to free it
ButtonGadget_AddImage(#But1, *gImage1, "1. ButtonGadget with left image", #GTK_POS_LEFT); add pixbuf to #But1
*gImage2= gtk_image_new_from_pixbuf_(GetGadgetPixbuf(?Img2, ?Img3-?Img2))
ButtonGadget_AddImage(#But2, *gImage2, "2. ButtonGadget with right image", #GTK_POS_RIGHT); add pixbuf to #But2
ImageGadget(#ImG1, 200, 110, 16, 16, GetGadgetPixbuf(?Img4, ?Img5-?Img4))
ButtonImageGadget(#BIG1, 200, 140, 28, 28, GetGadgetPixbuf(?Img5, ?Img6-?Img5))
AddGadgetItem(#LIG, -1, "1-1" + #LF$ + "1-2", GetGadgetPixbuf(?Img4, ?Img5-?Img4))
AddGadgetItem(#LIG, -1, "2-1" + #LF$ + "2-2", GetGadgetPixbuf(?Img5, ?Img6-?Img5))
; gtk_window_set_icon_(WindowID(#Win_Main), GetGadgetPixbuf(?Img3, ?Img4-?Img3)); if used, comment gtk_window_set_default_icon_() above
Else
End
EndIf
Repeat
gEvent= WaitWindowEvent()
If EventWindow() = #Win_Main
Select gEvent
Case #PB_Event_CloseWindow
gQuit= #True
EndSelect
EndIf
Until gQuit
;free global image-memory...
gtk_image_clear(*gImage1)
gtk_image_clear(*gImage2)
DataSection
;Choose your pathes and pics here ...
Img1: : IncludeBinary "/usr/share/icons/default.kde4/16x16/actions/arrow-left.png"
Img2: : IncludeBinary "/usr/share/icons/default.kde4/16x16/actions/arrow-right.png"
Img3: : IncludeBinary "/usr/share/icons/default.kde4/48x48/apps/preferences-desktop-screensaver.png"
Img4: : IncludeBinary "/usr/share/icons/default.kde4/16x16/actions/arrow-down.png"
Img5: : IncludeBinary "/usr/share/icons/default.kde4/16x16/actions/arrow-up.png"
Img6: : ; MUST! End of Img5-Mem:
EndDataSection
A good Sunday and cheers
Charly