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 ) );
}

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

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

>resize_image

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

ttnl ★★★★★ ()

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

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

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

ttnl ★★★★★ ()

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

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

ShprotX ()
Ответ на: Re: GtkImage resize картинки при ресайзе формы от anonymous

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

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

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

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

ShprotX ()

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

Хех, и по-моему я все-таки использовал GtkScrolledWindow, а не GtkFixed :/

ShprotX ()
Ответ на: Re: GtkImage resize картинки при ресайзе формы от grishkin

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

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

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

ShprotX ()
Ответ на: Re: GtkImage resize картинки при ресайзе формы от ShprotX

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

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

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