Thread overview
GTKD resources
Aug 11
Mr. Pib
Aug 11
Mr. Pib
Aug 12
Mr. Pib
August 11
How can one include external files such as glade, icons, images that are static in nature in to the binary but not require extraction on program run to be used?

gtk's builder doesn't seem to take an in memory representation of glade files and building a pixbuf seems quite over the top to do such simple things?


August 11
On 2017-08-11 13:00, Mr. Pib wrote:
> How can one include external files such as glade, icons, images that are
> static in nature in to the binary but not require extraction on program
> run to be used?
>
> gtk's builder doesn't seem to take an in memory representation of glade
> files and building a pixbuf seems quite over the top to do such simple
> things?


including the glade UI/XML defs to the executable is simple, compile with -J. switch and:


immutable string UIdefs = import("myuidefs.glade");
...
main(){
	...
	builder.addFromString( UIdefs );
	...
August 11
On Friday, 11 August 2017 at 02:27:21 UTC, captaindet wrote:
> On 2017-08-11 13:00, Mr. Pib wrote:
>> How can one include external files such as glade, icons, images that are
>> static in nature in to the binary but not require extraction on program
>> run to be used?
>>
>> gtk's builder doesn't seem to take an in memory representation of glade
>> files and building a pixbuf seems quite over the top to do such simple
>> things?
>
>
> including the glade UI/XML defs to the executable is simple, compile with -J. switch and:
>
>
> immutable string UIdefs = import("myuidefs.glade");
> ...
> main(){
> 	...
> 	builder.addFromString( UIdefs );
> 	...

Thanks. It one can use pixbuf to do something similar, albeit more complicated.

https://stackoverflow.com/questions/14121166/gdk-pixbuf-load-image-from-memory



August 12
Here is what I came up with

import gdkpixbuf.Pixbuf;
GdkPixbuf*[string] __ImageCache;

void SetImage(string imgName)(gtk.Image T)
{
	import std.path, std.conv, gdkpixbuf.Pixbuf;
	GError* err = null;
	if (imgName !in __ImageCache)
	{
		GdkPixbufLoader* __PixbufLoader;
		writeln("Image not cached, caching: "~imgName);
		enum imgData = cast(ubyte[])(import(baseName(imgName)).ptr);
		
		if (__PixbufLoader == null)		
			__PixbufLoader = gdk_pixbuf_loader_new();
		
		assert(__PixbufLoader, "Error: Cannot create pixbuf loader!");

		if (!gdk_pixbuf_loader_write(__PixbufLoader, cast(char*)imgData.ptr, imgData.length, &err))
			assert(__PixbufLoader, "Error: Cannot load pixbuf loader!");
		if (!gdk_pixbuf_loader_close(__PixbufLoader, &err))
			assert(__PixbufLoader, "Error: Cannot create pixbuf!");

		auto pixbuf = gdk_pixbuf_loader_get_pixbuf(__PixbufLoader);		
		if (pixbuf == null)
			assert("Error: Cannot load pixbuf!");

		__ImageCache[imgName] = pixbuf;				
	}

	import gtk.c.functions;
	gtk_image_set_from_pixbuf(T.getImageStruct(), __ImageCache[imgName]);

}

Maybe that will help someone. Not sure if it is the best way but seems to work.