Как скрыть ресурсы gtk+glade приложения?

Модератор: Модераторы разделов

_edgbla_
Сообщения: 13
ОС: OpenSUSE

Как скрыть ресурсы gtk+glade приложения?

Сообщение _edgbla_ »

Хех, дело в общем не в том что мне действительно нужно спрятать, просто гуи кросплатформенное,
то что картинки в линуксе лежат где им положено меня не напрягает,
ну а вот в винде как-то нехорошо, со своим уставом в чужой огород не лезут,
хочу чтобы всё было в запускном файлике.
Предложения положить картинки рядом или создать каталог отклоняются.
Приходило в голову гимпом сохранять в H файлик и как-то замутить, но
что-то уж больно ручной труд %)
Есть решение?
Спасибо сказали:
Serik
Сообщения: 149
ОС: SuSE Linux

Re: Как скрыть ресурсы gtk+glade приложения?

Сообщение Serik »

В GTK+ для этого есть gdk-pixbuf-csource.
Спасибо сказали:
Serik
Сообщения: 149
ОС: SuSE Linux

Re: Как скрыть ресурсы gtk+glade приложения?

Сообщение Serik »

Для преобразования Glade-файла в массив на С написал маленькую программку на Perl.
Все это вызывается из Makefile.
Спасибо сказали:
_edgbla_
Сообщения: 13
ОС: OpenSUSE

Re: Как скрыть ресурсы gtk+glade приложения?

Сообщение _edgbla_ »

Спасибо, заюзал gdk-pixbuf-csource, немного неудобно что руками много :), ну чтож терь.
Програмкой поделишься? если не жалко конечно. ;)
Спасибо сказали:
Serik
Сообщения: 149
ОС: SuSE Linux

Re: Как скрыть ресурсы gtk+glade приложения?

Сообщение Serik »

bin2hex.pl

Код:

# convert binary file to hex use Getopt::Long; # config variable ######################################## $version = '2007-11-27'; %p = ('file' => '', 'do' => 'help', 'strlen' => 14 ); ################################################################ # run &main(\%p); ################################################################ sub main { my $p = shift; &init_param($p); if (length($p->{'file'}) > 0) {do_file($p); exit(0);} if ($p->{'help'} || $p->{'do'} eq 'help') {do_help($p); exit(0);} } ################################################################ sub init_param { my $p = shift; GetOptions("help" => \($p->{'help'}), "file=s" => \($p->{'file'}), "strlen=i" => \($p->{'strlen'}) ); # Check parametrs } ################################################################ sub do_help { my $p = shift; print("File converter bin -> hex Version:$version\n"); print("Usage: .pl [option]\n"); print("Option are:\n"); print(" --help list help\n"); print(" --do \n"); return (1); } ################################################################ sub do_file { my $p = shift; my ($f, $s, $v, $c, $first); open($f,"<".$p->{'file'}); if (!$f) { return (-1); } binmode($f); # seek ($f,0,2); # $ret = tell($f); $c = 0; $first = 1; while(read($f,$s,1)) { if ($first == 1) {$first = 0;} else {print (",");} $v = unpack("C",$s); printf("0x%02x",$v); # 2 знака в hex if ($p->{'strlen'} > 0 && $c >= $p->{'strlen'}) { printf("\n"); $c = 0; } $c = $c + 1; } # while close($f); return (1); } ################################################################


В Makefile выглядит так

Код:

# resource resource.o: resource.cpp $(CC) resource.cpp -c -o resource.o $(CGTK) resource.cpp: planaris.glade pixmap/secwin.png echo "#include <gtk/gtk.h>" > resource.cpp echo "const char gladexml[] = {" >> resource.cpp perl -w bin2hex.pl --file planaris.glade >> resource.cpp echo "};" >> resource.cpp echo "const char *pgladexml=&gladexml[0];">> resource.cpp echo "unsigned int sgladexml = sizeof(gladexml);" >> resource.cpp gdk-pixbuf-csource --raw --name=secwin pixmap/secwin.png >>resource.cpp echo "const guint8 *psecwin = &secwin[0];" >> resource.cpp
Спасибо сказали:
_edgbla_
Сообщения: 13
ОС: OpenSUSE

Re: Как скрыть ресурсы gtk+glade приложения?

Сообщение _edgbla_ »

Благодарю, всё в лучшем виде, использую xpm в качестве картинок, так как весит меньше,
а для файлика glade переписал твой год на "С", чтобы не надо было его хранить в том же каталоге
или указывать путь, а просто бросить в /home/user/bin/

xpm подключается как "H" файлик и юзается так:

Код: Выделить всё

GtkWidget *widget;
GdkPixbuf *gdkpixbuf;
widget = glade_xml_get_widget( xml, "imageTest" );
gdkpixbuf = gdk_pixbuf_new_from_xpm_data( (const char**)test_xpm );
gtk_image_set_from_pixbuf( GTK_IMAGE(widget), gdkpixbuf );


Переписанный на "C" bin2hex:

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( int argc, char *argv[] )
{
    FILE *binFile, *hexFile;
    unsigned char byte;
    char buf[4096];

    if( argc < 2 )
    {
        printf( "usage: bin2hex file\n" );
        exit( 1 );
    }

    strcpy( buf, argv[1] );

    binFile = fopen( buf, "rb" );
    if( !binFile )
    {
        printf( "File not found ( %s )\n", buf );
        exit( 1 );
    }

    strcat( buf, ".h" );
    hexFile = fopen( buf, "wb" );
    if( !hexFile )
    {
        printf( "File not found ( %s )\n", buf );
        exit( 1 );
    }

    while( fread( &byte, 1, 1, binFile ) > 0 )
    {
        fprintf( hexFile, "0x%.2x,", byte );
    }

    fclose( binFile );
    fclose( hexFile );

    return 0;
}
Спасибо сказали: