LINUX.ORG.RU

GtkImage resize картинки при ресайзе формы


0

0

На какой сигнал нужно повесить обработчик ресайза GtkImage при ресайзе формы?
Сейчас делаю так:
...
g_signal_connect( img_src, "size-request", GTK_SIGNAL_FUNC( resize_image ), NULL );
...

...
if ( gtk_dialog_run( GTK_DIALOG( dialog ) ) == GTK_RESPONSE_ACCEPT ) {
char *filename;

filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( dialog ) );
pixbuf = gdk_pixbuf_new_from_file( filename, NULL );

gtk_widget_get_size_request( img_src, &w, &h );
gtk_image_set_from_pixbuf( GTK_IMAGE( img_src ),
gdk_pixbuf_scale_simple( pixbuf, w, h, GDK_INTERP_BILINEAR ) );
gtk_widget_show( img_src );
g_free( filename );
}
...


static void resize_image( GtkWidget *widget, GtkRequisition *allocation, gpointer data )
{
GdkPixbuf *pixbuf = gtk_image_get_pixbuf( GTK_IMAGE( widget ) );

printf("Width: %i\tHeight: %i\n", allocation->width, allocation->height);

gtk_image_set_from_pixbuf( GTK_IMAGE( widget ),
gdk_pixbuf_scale_simple( pixbuf, allocation->width, allocation->height, GDK_INTERP_BILINEAR ) );
}

Когда открываю картинку, прогу циклит в обработчике.

>resize_image

ЕМНИП, это связано с особенностью GtkDialog, как виджета. В gtk_dialog_run запускается g_main_loop, т.е. не возвращается в основной цикл. Посмотри инфу на эту тему.

ttnl ★★★★★
()

GdkPixbuf *pixbuf = gtk_image_get_pixbuf( GTK_IMAGE( widget ) );
gdk_pixbuf_scale_simple( pixbuf, allocation->width, allocation->height, GDK_INTERP_BILINEAR ) );

Тут ты случайно не запускаешь ещё раз обработчик?

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

Не знаю, что такое gdk_pixbuf_scale_simple, но похоже перед его вызовом тебе надо заблокировать/отсоединить сигнал

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

> но похоже перед его вызовом тебе надо заблокировать/отсоединить сигнал

Заблокировать, отсоединять не надо

anonymous
()

Убрать влияние размера картинки на размер окна через GtkFixed (window->fixed->image), поцепить size-request на GtkFixed.

ShprotX
()
Ответ на: комментарий от anonymous

>> но похоже перед его вызовом тебе надо заблокировать/отсоединить сигнал

> Заблокировать, отсоединять не надо

Уменьшить размер не получится. Видел такие грабли в текстом поле с "гибкими" переносами.
Затем изменить любой padding и изменять размер получившегося чуда до окончательного осознания глупости использования блокировки данного сигнала.

ShprotX
()
Ответ на: комментарий от grishkin

> Так тоже не получается. Всёравно идёт зацикливание

А вот теперь нужно блокировать :)

ShprotX
()
Ответ на: комментарий от ShprotX

Не получается даже с GtkLayout. Циклит и всё. Мож у меня какие настроики для виджетов не те? Если не трудно приведите код

grishkin
() автор топика
Ответ на: комментарий от grishkin

> Не получается даже с GtkLayout. Циклит и всё. Мож у меня какие настроики для виджетов не те? Если не трудно приведите код

Во-первых, есть gdb, во-вторых, как его может циклить после блокировки, в третьих, делать мне больше нечего, кроме как код приводить.

ShprotX
()
Ответ на: комментарий от ShprotX

Проблему я решил. Использую блокировки и gtk_main_iteration, чтобы пробросить 1 событие в очереди. Насчёт gdb, он честно показывает что возникает ещё 1 событие.

grishkin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.