X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fgtkutil%2Fwindow.cpp;h=11b6efeb21cd043373859011100ac7a7d676efd0;hb=fea0d2e6575b21945c4800805d66e43a2247ded5;hp=05f50e821720f781e0aae91a2cbff87c6ca80e10;hpb=7c4cc2c6fe7ec100c8dfe5c63d68d744742303df;p=xonotic%2Fnetradiant.git diff --git a/libs/gtkutil/window.cpp b/libs/gtkutil/window.cpp index 05f50e82..11b6efeb 100644 --- a/libs/gtkutil/window.cpp +++ b/libs/gtkutil/window.cpp @@ -22,37 +22,36 @@ #include "window.h" #include -#include #include "pointer.h" #include "accelerator.h" inline void CHECK_RESTORE( ui::Widget w ){ if ( gpointer_to_int( g_object_get_data( G_OBJECT( w ), "was_mapped" ) ) != 0 ) { - gtk_widget_show( w ); + w.show(); } } inline void CHECK_MINIMIZE( ui::Widget w ){ g_object_set_data( G_OBJECT( w ), "was_mapped", gint_to_pointer( gtk_widget_get_visible( w ) ) ); - gtk_widget_hide( w ); + w.hide(); } static gboolean main_window_iconified( ui::Widget widget, GdkEventWindowState* event, gpointer data ){ if ( ( event->changed_mask & ( GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_WITHDRAWN ) ) != 0 ) { if ( ( event->new_window_state & ( GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_WITHDRAWN ) ) != 0 ) { - CHECK_MINIMIZE( ui::Widget(GTK_WIDGET( data )) ); + CHECK_MINIMIZE( ui::Widget::from( data ) ); } else { - CHECK_RESTORE( ui::Widget(GTK_WIDGET( data )) ); + CHECK_RESTORE( ui::Widget::from( data ) ); } } return FALSE; } unsigned int connect_floating( ui::Window main_window, ui::Window floating ){ - return g_signal_connect( G_OBJECT( main_window ), "window_state_event", G_CALLBACK( main_window_iconified ), floating ); + return main_window.connect( "window_state_event", G_CALLBACK( main_window_iconified ), floating ); } gboolean destroy_disconnect_floating( ui::Window widget, gpointer data ){ @@ -68,7 +67,7 @@ gboolean floating_window_delete_present( ui::Window floating, GdkEventFocus *eve } guint connect_floating_window_delete_present( ui::Window floating, ui::Window main_window ){ - return g_signal_connect( G_OBJECT( floating ), "delete_event", G_CALLBACK( floating_window_delete_present ), main_window ); + return floating.connect( "delete_event", G_CALLBACK( floating_window_delete_present ), main_window ); } gboolean floating_window_destroy_present( ui::Window floating, ui::Window main_window ){ @@ -79,7 +78,7 @@ gboolean floating_window_destroy_present( ui::Window floating, ui::Window main_w } guint connect_floating_window_destroy_present( ui::Window floating, ui::Window main_window ){ - return g_signal_connect( G_OBJECT( floating ), "destroy", G_CALLBACK( floating_window_destroy_present ), main_window ); + return floating.connect( "destroy", G_CALLBACK( floating_window_destroy_present ), main_window ); } ui::Window create_floating_window( const char* title, ui::Window parent ){ @@ -90,14 +89,14 @@ ui::Window create_floating_window( const char* title, ui::Window parent ){ gtk_window_set_transient_for( window, parent ); connect_floating_window_destroy_present( window, parent ); g_object_set_data( G_OBJECT( window ), "floating_handler", gint_to_pointer( connect_floating( parent, window ) ) ); - g_signal_connect( G_OBJECT( window ), "destroy", G_CALLBACK( destroy_disconnect_floating ), parent ); + window.connect( "destroy", G_CALLBACK( destroy_disconnect_floating ), parent ); } return window; } void destroy_floating_window( ui::Window window ){ - gtk_widget_destroy( GTK_WIDGET( window ) ); + window.destroy(); } gint window_realize_remove_sysmenu( ui::Widget widget, gpointer data ){ @@ -106,21 +105,21 @@ gint window_realize_remove_sysmenu( ui::Widget widget, gpointer data ){ } gboolean persistent_floating_window_delete( ui::Window floating, GdkEvent *event, ui::Window main_window ){ - gtk_widget_hide( GTK_WIDGET( floating ) ); + floating.hide(); return TRUE; } ui::Window create_persistent_floating_window( const char* title, ui::Window main_window ){ - ui::Window window = ui::Window(GTK_WINDOW( create_floating_window( title, main_window ) )); + auto window = create_floating_window( title, main_window ); - gtk_widget_set_events( GTK_WIDGET( window ), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK ); + gtk_widget_set_events( window , GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK ); connect_floating_window_delete_present( window, main_window ); - g_signal_connect( G_OBJECT( window ), "delete_event", G_CALLBACK( persistent_floating_window_delete ), 0 ); + window.connect( "delete_event", G_CALLBACK( persistent_floating_window_delete ), 0 ); #if 0 if ( g_multimon_globals.m_bStartOnPrimMon && g_multimon_globals.m_bNoSysMenuPopups ) { - g_signal_connect( G_OBJECT( window ), "realize", G_CALLBACK( window_realize_remove_sysmenu ), 0 ); + window.connect( "realize", G_CALLBACK( window_realize_remove_sysmenu ), 0 ); } #endif @@ -133,15 +132,106 @@ gint window_realize_remove_minmax( ui::Widget widget, gpointer data ){ } void window_remove_minmax( ui::Window window ){ - g_signal_connect( G_OBJECT( window ), "realize", G_CALLBACK( window_realize_remove_minmax ), 0 ); + window.connect( "realize", G_CALLBACK( window_realize_remove_minmax ), 0 ); } -ui::ScrolledWindow create_scrolled_window( GtkPolicyType hscrollbar_policy, GtkPolicyType vscrollbar_policy, int border ){ - auto scr = ui::ScrolledWindow(); - gtk_widget_show( GTK_WIDGET( scr ) ); - gtk_scrolled_window_set_policy( scr, hscrollbar_policy, vscrollbar_policy ); +ui::ScrolledWindow create_scrolled_window( ui::Policy hscrollbar_policy, ui::Policy vscrollbar_policy, int border ){ + auto scr = ui::ScrolledWindow(ui::New); + scr.show(); + gtk_scrolled_window_set_policy( scr, (GtkPolicyType) hscrollbar_policy, (GtkPolicyType) vscrollbar_policy ); gtk_scrolled_window_set_shadow_type( scr, GTK_SHADOW_IN ); gtk_container_set_border_width( GTK_CONTAINER( scr ), border ); return scr; } + +gboolean window_focus_in_clear_focus_widget(ui::Window widget, GdkEventKey *event, gpointer data) +{ + gtk_window_set_focus( widget, NULL ); + return FALSE; +} + +guint window_connect_focus_in_clear_focus_widget(ui::Window window) +{ + return window.connect( "focus_in_event", G_CALLBACK( window_focus_in_clear_focus_widget ), NULL ); +} + +void window_get_position(ui::Window window, WindowPosition &position) +{ + ASSERT_MESSAGE( window , "error saving window position" ); + + gtk_window_get_position( window, &position.x, &position.y ); + gtk_window_get_size( window, &position.w, &position.h ); +} + +void window_set_position(ui::Window window, const WindowPosition &position) +{ + gtk_window_set_gravity( window, GDK_GRAVITY_STATIC ); + + GdkScreen* screen = gdk_screen_get_default(); + if ( position.x < 0 + || position.y < 0 + || position.x > gdk_screen_get_width( screen ) + || position.y > gdk_screen_get_height( screen ) ) { + gtk_window_set_position( window, GTK_WIN_POS_CENTER_ON_PARENT ); + } + else + { + gtk_window_move( window, position.x, position.y ); + } + + gtk_window_set_default_size( window, position.w, position.h ); +} + +void WindowPosition_String::Import(WindowPosition &position, const char *value) +{ + if ( sscanf( value, "%d %d %d %d", &position.x, &position.y, &position.w, &position.h ) != 4 ) { + position = WindowPosition( c_default_window_pos ); // ensure sane default value for window position + } +} + +void WindowPosition_String::Export(const WindowPosition &self, const Callback &returnz) +{ + char buffer[64]; + sprintf( buffer, "%d %d %d %d", self.x, self.y, self.w, self.h ); + returnz( buffer ); +} + +void WindowPositionTracker_String::Import(WindowPositionTracker &self, const char *value) +{ + WindowPosition position; + WindowPosition_String::Import( position, value ); + self.setPosition( position ); +} + +void WindowPositionTracker_String::Export(const WindowPositionTracker &self, const Callback &returnz) +{ + WindowPosition_String::Export( self.getPosition(), returnz ); +} + +gboolean WindowPositionTracker::configure(ui::Widget widget, GdkEventConfigure *event, WindowPositionTracker *self) +{ + self->m_position = WindowPosition( event->x, event->y, event->width, event->height ); + return FALSE; +} + +void WindowPositionTracker::sync(ui::Window window) +{ + window_set_position( window, m_position ); +} + +void WindowPositionTracker::connect(ui::Window window) +{ + sync( window ); + window.connect( "configure_event", G_CALLBACK( configure ), this ); +} + +const WindowPosition &WindowPositionTracker::getPosition() const +{ + return m_position; +} + +void WindowPositionTracker::setPosition(const WindowPosition &position) +{ + m_position = position; +}