начал практиковаться с gtk
и наконец-то каркас image_viewer готов:
tname=gdirlist
$(tname).exe : $(tname).c
	gcc -Wall -g $(tname).c -o $(tname).exe  `/bin/pkg-config --cflags --libs gtk+-2.0`
.PHONY : clean
clean : 
	rm $(tname).exe 
// перед компиляцией убедитесь, что pkg-config --libs --cflags gtk+-2.0 ссылается на правильный каталог gtk+-2.0
// компиляция под гигвином не требует никаких изменений в коде и майкфайле
#include <gtk/gtk.h>
int ev_num=0;
static gboolean delete_event( GtkWidget *widget,
                              GdkEvent  *event,
                              gpointer   data )
{
    g_print ("delete event occurred\n");
    return FALSE;
}
static void destroy( GtkWidget *widget,
                     gpointer   data )
{
    gtk_main_quit ();
}
    GDir *dir;
    GtkWidget *box;
    GtkWidget *table;
    GtkWidget *entry ;
void dirlist (GDir *pd,int ysize) { 
	int i;
    const gchar *file;
    GtkWidget *label;
	gtk_widget_destroy(box);
   	box = gtk_vbox_new (0,1);
    for ( i =0; i<ysize ; i++)
    {
	file = g_dir_read_name (pd);
	if ( ! file ) break;
        label = gtk_label_new(file);
	gtk_box_pack_start_defaults ( (GtkBox*) box,label);
        gtk_widget_show (label);
    }
    gtk_table_attach_defaults ( (GtkTable *) table,box,1,2,0,2);
    gtk_widget_show(box);
}
gboolean    gev                  (GtkWidget *widget,
                                            GdkEvent *event,
                                            gpointer user_data){
	if (event->type == GDK_KEY_PRESS)
	{
		const gchar *tentry;
		guint i;
		tentry=gtk_entry_get_text((GtkEntry*)entry);
		i=((GdkEventKey*) event)->keyval;
		if ( i == 65293 ) {
			g_print(tentry);
			g_print(" enter pressed \n");
			    dir = g_dir_open ( tentry,0,0);
			    dirlist(dir,10);
			    g_dir_close(dir);
		}
		else 
		{
	       	g_print("gdk_event %d type: %d\n",ev_num,i);
		}
	}
	ev_num++;
	return FALSE;
}
int main( int   argc,
          char *argv[] )
{
	//int ysize=10;
    GtkWidget *window;
    gtk_init (&argc, &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    g_signal_connect (G_OBJECT (window), "delete_event",
		      G_CALLBACK (delete_event), NULL);
    g_signal_connect (G_OBJECT (window), "destroy",
		      G_CALLBACK (destroy), NULL);
    g_signal_connect (G_OBJECT (window), "event",
		      G_CALLBACK (gev), NULL);
    table = gtk_table_new (2,2,1);
    gtk_container_add ( (GtkContainer*) window, table);
    entry = gtk_entry_new();
    gtk_table_attach_defaults ( (GtkTable *) table,entry,0,1,0,1);
    gtk_widget_show (entry);
    GtkWidget *image;
    image = gtk_image_new_from_file("r.png");
    gtk_table_attach_defaults ( (GtkTable*) table,image,0,1,1,2);
    g_print("image size :  %x\n",gtk_image_get_pixel_size((GtkImage*)image));
    
    gtk_widget_show (image);
    gtk_widget_show (table);
    gtk_widget_show (window);
    gtk_main ();
    return 0;
}
соответсвенно возникло много нерешенных вопросов:
- размещение виджетов в коде занимает слишком много времени, есть какие нить библиотеки способные считать из текстового файла расположение элементов и связать их с функциями обрабатывающими сообщения? а также записать изменения в интерфейсе сделаные пользователем в этот же файл?
- чем можно заменить таблицу, чтобы растояние между элементами не менялось при изменении размеров окна?
- как проще сделать листинг списка неопределенного количества  файлов : путем пересоздания бокса каждый раз при скроллинге или есть возможность вывести на экран только часть элементов бокса соотвественно без его пересоздания?
как перемещаться между элементами бокса ( расположены справа, содержат имена файлов ) через нажатия клавишь pgup\down с обработкой с привязкой сигнала о перемещении к заданной функции?
чем лучше подсвечивать имя файла который в данный момент на изображении?
как узнать размеры изображения ? как маштабировать изображение?
какие библиотеки еще имеет смысл использовать для решения данных вопросов кроме gtk?
присматриваюсь к pcre, image magic ....