начал практиковаться с 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 ....