#include "../window.h"
#include "../common.h"
gboolean _bw_WindowGtk_closeHandler( GtkWidget* handle, gpointer data );
gboolean _bw_WindowGtk_stateHandler( GtkWidget *widget, GdkEventWindowState *event, gpointer user_data );
bw_WindowImpl bw_WindowImpl_new(
const bw_Window* window,
bw_CStrSlice _title,
int width, int height,
const bw_WindowOptions* options
) {
GtkWidget* gtk_handle = gtk_application_window_new( window->app->impl.handle );
gtk_widget_hide_on_delete( gtk_handle );
if ( window->parent != 0 ) {
gtk_widget_set_parent_window( gtk_handle, GDK_WINDOW( window->parent->impl.handle ) );
gtk_window_set_destroy_with_parent( GTK_WINDOW(gtk_handle), FALSE );
}
gchar* title = bw_string_copyAsNewCstr( _title );
gtk_window_set_title( GTK_WINDOW(gtk_handle), title );
free( title );
gtk_window_resize( GTK_WINDOW(gtk_handle), width, height );
gtk_window_set_resizable( GTK_WINDOW(gtk_handle), options->resizable );
gtk_window_set_type_hint( GTK_WINDOW(gtk_handle), GDK_WINDOW_TYPE_HINT_DIALOG );
g_signal_connect( gtk_handle, "window-state-event", G_CALLBACK( _bw_WindowGtk_stateHandler ), (gpointer)window );
gtk_widget_show_all( gtk_handle );
bw_WindowImpl impl;
impl.handle = gtk_handle;
return impl;
}
void bw_WindowImpl_destroy( bw_Window* window ) {
gdk_window_destroy( GDK_WINDOW(window->impl.handle) );
}
void bw_WindowImpl_hide( bw_Window* window ) {
gdk_window_hide( GDK_WINDOW(window->impl.handle) );
}
gboolean _bw_WindowGtk_stateHandler( GtkWidget *widget, GdkEventWindowState *event, gpointer user_data ) {
UNUSED(user_data);
bw_Window* window = (bw_Window*)user_data;
if ( event->new_window_state & GDK_WINDOW_STATE_ICONIFIED ) {
if ( !window->impl.minimizable ) {
return FALSE;
gtk_window_deiconify( GTK_WINDOW( widget ) );
}
}
return TRUE;
}
gboolean _bw_WindowGtk_closeHandler( GtkWidget* handle, gpointer data ) {
UNUSED(handle);
bw_Window* window = (bw_Window*)data;
bw_WindowImpl_hide( window );
return FALSE;
}