LINUX.ORG.RU

[C/gtk+] FullScreen окна


0

0

Доброго времени суток ЛОР. Нужно сделать окно в gtk+ приложении на весь экран. Пытаюсь сделать с помощью: gtk_window_fullscreen(GtkWindow* Window). Есть функция:

static void
full_screen(MainWin *mw)
{
    gtk_window_fullscreen((GtkWindow*)mw);
}

где MainWin cтруктура вида:

typedef struct _MainWin MainWin; 

typedef struct _MainWin 
{ 
    GtkWindow parent; 
    GtkWidget* scroll; 
    GtkWidget* box; 
    GtkWidget *toolbar; 
    gboolean full_screen; 
};

При попытке вызова функции получаю следующее: Gtk-CRITICAL **: gtk_window_fullscreen: assertion `GTK_IS_WINDOW (window)' failed

Что-то не пойму в чем проблема?

Cпасибо.


а что непонятного-то?

твой MainWin ни разу не struct GtkWindow, вот и все. и никакие приведения типов это не исправят

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

Дополню малость... для наследования не достаточно родительский тип размещать в структуре первым. Нужно зарегистрировать этот тип полноценно.

вот, для подробностей хауту

http://library.gnome.org/devel/gobject/unstable/howto-gobject.html

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

Самое интересное если пытаюсь вызвать gtk_window_fullscreen из какой-либо другой функции, то все работает.

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

Нужно зарегистрировать этот тип полноценно.

Да вроде правильно зарегистрировал:

G_DEFINE_TYPE( MainWin, main_win, GTK_TYPE_WINDOW) 

void 
main_win_class_init( MainWinClass* klass ) 
{ 
    GObjectClass * obj_class; 
    GtkWidgetClass *widget_class; 
    
    obj_class = ( GObjectClass * ) klass; 
    obj_class->finalize = main_win_finalize; 
    
    widget_class = GTK_WIDGET_CLASS ( klass ); 
    widget_class->delete_event = on_delete_event; 
} 

void main_win_finalize( GObject* obj ) 
{ 
    MainWin *mw = (MainWin*)obj; 
    main_win_close(mw); 

    if( G_LIKELY(image_list) ) 
        image_list_free(image_list ); 
    
    gtk_main_quit(); 
} 

GtkWindow* 
main_win_new() 
{ 
    return (GtkWindow*)g_object_new (MAIN_WIN_TYPE, NULL); 
}
shk
() автор топика
Ответ на: комментарий от Gvidon

Ничего не передаю. Вызов функции привязан к кнопке, располагающаяся на тулбаре, который построен с помощью gtkuimanager - G_CALLBACK(full_screen)

shk
() автор топика
Ответ на: комментарий от shk
static void 
full_screen(GtkWidget *button, MainWin *mw) 
{ 
    gtk_window_fullscreen(GTK_WINDOW(mw)); 
}
........................
g_signal_connect(button, "clicked", G_CALLBACK(full_screen), main_window);

Т.е. добавить в функцию один параметр, и передавать через него указатель на окно

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

Да что-то я ступил, Gvidon спасибо огромное, сейчас попробую.

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

>Судя по «g_object_new (MAIN_WIN_TYPE, NULL);» тип он регистрировать пытался. Только где-то ошибся.

это не попытка зарегистрировать тип, а попытка уже создать объект зарегистрированного типа. но ТС уже походу разобрался.

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

это не попытка зарегистрировать тип, а попытка уже создать объект зарегистрированного типа.

Это я знаю, но чтобы пытаться создать объект какого-то типа, этот тип сначала надо зарегистрировать. Ладно, в общем, проехали :)

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

Все таки наверно не прокатит вариант с сигналом:

У меня есть тулбар сооруженый с помощью gtkuimanager. Описание тулбара:

gchar *ui_info =
      "<ui>"
        "<toolbar name = 'ToolBar'>"
           "<toolitem action='Go Back'/>"
           "<toolitem  action='Go Forward'/>"
           "<toolitem  action='FullScreen'/>"
        "</toolbar>"
      "</ui>";

Затем:

static const GtkActionEntry entries[] = {
	{"Go Back",GTK_STOCK_GO_BACK, "Go Back",
	  "<control>b","Go Back", G_CALLBACK(on_prev)
	},
        {"Go Forward",GTK_STOCK_GO_FORWARD,"Go Forward",
	 "<control>g","Go Forward",G_CALLBACK(on_next)
	},
	{"FullScreen",GTK_STOCK_FULLSCREEN, "Full screen",
	 "<control>r","Show the image in FULL SCREEN",G_CALLBACK(full_screen)
	},
};

Если делать с помощью сигнала, то как достучаться до имено этой кнопки, да и где объявлять сигнал не совсем понятно.

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

Добавил:

gtk_action_group_add_actions (mw->actions, entries, n_entries, GTK_WINDOW(mw));

Тот же результат: Gtk-CRITICAL **: gtk_window_fullscreen: assertion `GTK_IS_WINDOW (window)' failed

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

Хз. Если исходники не жутко секретные, запости весь этот файл куда-нибудь на paste.org, например. Так будет проще.

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

Пропустил строчку:

if (!gtk_ui_manager_add_ui_from_string (mw->uimanager, ui_info, -1, &error))
	{
	  g_message ("building menus failed: %s", error->message);
	  g_error_free (error);
	}
shk
() автор топика
Ответ на: комментарий от shk

Так же добавил функцию:

gboolean on_win_state_event( GtkWidget* widget, GdkEventWindowState* state )
{
    MainWin* mw = (MainWin*)widget;
    if( state->new_window_state == GDK_WINDOW_STATE_FULLSCREEN )
    {
        mw->full_screen = TRUE;
    }
    else
    {
        mw->full_screen = FALSE;
    }
    return TRUE;
}

И строчку:

widget_class->window_state_event = on_win_state_event;
в main_win_class_init, но все равно безрезультатно :(

shk
() автор топика
Ответ на: Исходники от shk

вечером гляну исходники. чет ты застрял на какой-то банальной вещице :)

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

Как я так пропустил. Все работает теперь, мужики всем спасибо, особено Gvidon, спасибо тебе большое, будеш в Астане с меня пиво.

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