X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6e264997213eb394e0fc87772f4657abf8fe735a..0cb7e05cd1ffcbb55fea48643fb81e284869ddad:/src/gtk/toplevel.cpp diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index e3e320f77e..cf9cca1cb2 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -33,6 +33,7 @@ #include "wx/gtk/private.h" #include "wx/evtloop.h" +#include "wx/sysopt.h" #include #include @@ -111,8 +112,6 @@ static gboolean gtk_frame_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxTopLevelWindowGTK *win ) { - // don't need to install idle handler, its done from "event" signal - switch ( g_sendActivateEvent ) { case -1: @@ -172,8 +171,6 @@ static gboolean gtk_frame_focus_out_callback( GtkWidget *widget, GdkEventFocus *WXUNUSED(gdk_event), wxTopLevelWindowGTK *win ) { - // don't need to install idle handler, its done from "event" signal - // if the focus goes out of our app alltogether, OnIdle() will send // wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset // g_sendActivateEvent to -1 @@ -197,23 +194,6 @@ static gboolean gtk_frame_focus_out_callback( GtkWidget *widget, } } -//----------------------------------------------------------------------------- -// "focus" from m_window -//----------------------------------------------------------------------------- - -extern "C" { -static gboolean gtk_frame_focus_callback( GtkWidget *WXUNUSED(widget), - GtkDirectionType WXUNUSED(d), - wxWindow *WXUNUSED(win) ) -{ - if (g_isIdle) - wxapp_install_idle_handler(); - - // This disables GTK's tab traversal - return TRUE; -} -} - //----------------------------------------------------------------------------- // "size_allocate" //----------------------------------------------------------------------------- @@ -221,9 +201,6 @@ static gboolean gtk_frame_focus_callback( GtkWidget *WXUNUSED(widget), extern "C" { static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxTopLevelWindowGTK *win ) { - if (g_isIdle) - wxapp_install_idle_handler(); - if (!win->m_hasVMT) return; @@ -276,8 +253,6 @@ gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxTopLevelWindowGTK *win ) { - // don't need to install idle handler, its done from "event" signal - if (win->IsEnabled() && (g_openDialogs == 0 || (win->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) || win->IsGrabbed())) @@ -294,23 +269,19 @@ gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), extern "C" { static gboolean -gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), +gtk_frame_configure_callback( GtkWidget* widget, GdkEventConfigure *WXUNUSED(event), wxTopLevelWindowGTK *win ) { - // don't need to install idle handler, its done from "event" signal - if (!win->m_hasVMT || !win->IsShown()) return FALSE; + wxPoint point; + gtk_window_get_position((GtkWindow*)widget, &point.x, &point.y); - int x = 0; - int y = 0; - gdk_window_get_root_origin( win->m_widget->window, &x, &y ); - win->m_x = x; - win->m_y = y; - - wxMoveEvent mevent( wxPoint(win->m_x,win->m_y), win->GetId() ); + win->m_x = point.x; + win->m_y = point.y; + wxMoveEvent mevent(point, win->GetId()); mevent.SetEventObject( win ); win->GetEventHandler()->ProcessEvent( mevent ); @@ -330,9 +301,6 @@ static void gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK *win ) { - if (g_isIdle) - wxapp_install_idle_handler(); - // All this is for Motif Window Manager "hints" and is supposed to be // recognized by other WM as well. Not tested. gdk_window_set_decorations(win->m_widget->window, @@ -348,7 +316,7 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), // reset the icon wxIconBundle iconsOld = win->GetIcons(); - if ( iconsOld.GetIcon(-1).Ok() ) + if ( !iconsOld.IsEmpty() ) { win->SetIcon( wxNullIcon ); win->SetIcons( iconsOld ); @@ -361,12 +329,13 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), //----------------------------------------------------------------------------- extern "C" { -static void +static gboolean gtk_frame_map_callback( GtkWidget * WXUNUSED(widget), GdkEvent * WXUNUSED(event), wxTopLevelWindow *win ) { win->SetIconizeState(false); + return false; } } @@ -375,12 +344,13 @@ gtk_frame_map_callback( GtkWidget * WXUNUSED(widget), //----------------------------------------------------------------------------- extern "C" { -static void +static gboolean gtk_frame_unmap_callback( GtkWidget * WXUNUSED(widget), GdkEvent * WXUNUSED(event), wxTopLevelWindow *win ) { win->SetIconizeState(true); + return false; } } @@ -430,7 +400,7 @@ static void wxInsertChildInTopLevelWindow( wxTopLevelWindowGTK* parent, wxWindow // these are outside the client area wxTopLevelWindowGTK* frame = (wxTopLevelWindowGTK*) parent; gtk_pizza_put( GTK_PIZZA(frame->m_mainWidget), - GTK_WIDGET(child->m_widget), + child->m_widget, child->m_x, child->m_y, child->m_width, @@ -440,7 +410,7 @@ static void wxInsertChildInTopLevelWindow( wxTopLevelWindowGTK* parent, wxWindow { // these are inside the client area gtk_pizza_put( GTK_PIZZA(parent->m_wxwindow), - GTK_WIDGET(child->m_widget), + child->m_widget, child->m_x, child->m_y, child->m_width, @@ -485,8 +455,6 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, wxTopLevelWindows.Append( this ); - m_needParent = false; - if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name )) { @@ -624,14 +592,10 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, g_signal_connect (m_widget, "unmap_event", G_CALLBACK (gtk_frame_unmap_callback), this); - // the only way to get the window size is to connect to this event + // for wxMoveEvent g_signal_connect (m_widget, "configure_event", G_CALLBACK (gtk_frame_configure_callback), this); - // disable native tab traversal - g_signal_connect (m_widget, "focus", - G_CALLBACK (gtk_frame_focus_callback), this); - // activation g_signal_connect_after (m_widget, "focus_in_event", G_CALLBACK (gtk_frame_focus_in_callback), this); @@ -834,7 +798,7 @@ bool wxTopLevelWindowGTK::Show( bool show ) wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") ); if (show == IsShown()) - return true; + return false; if (show && !m_sizeSet) { @@ -846,13 +810,17 @@ bool wxTopLevelWindowGTK::Show( bool show ) GtkOnSize(); } - // This seems no longer to be needed and the call - // itself is deprecated. - // - //if (show) - // gtk_widget_set_uposition( m_widget, m_x, m_y ); + wxTopLevelWindowBase::Show(show); - return wxWindow::Show( show ); + if (!show) + { + // make sure window has a non-default position, so when it is shown + // again, it won't be repositioned by WM as if it were a new window + // Note that this must be done _after_ the window is hidden. + gtk_window_move((GtkWindow*)m_widget, m_x, m_y); + } + + return true; } void wxTopLevelWindowGTK::Raise() @@ -889,23 +857,7 @@ void wxTopLevelWindowGTK::GTKDoSetSize(int width, int height) if ( height != -1 ) m_height = height; - // GPE's window manager doesn't like size hints at all, esp. when the user - // has to use the virtual keyboard, so don't constrain size there -#ifndef __WXGPE__ - int minWidth = GetMinWidth(), - minHeight = GetMinHeight(), - maxWidth = GetMaxWidth(), - maxHeight = GetMaxHeight(); - - if ( minWidth != -1 && m_width < minWidth ) - m_width = minWidth; - if ( minHeight != -1 && m_height < minHeight ) - m_height = minHeight; - if ( maxWidth != -1 && m_width > maxWidth ) - m_width = maxWidth; - if ( maxHeight != -1 && m_height > maxHeight ) - m_height = maxHeight; -#endif // __WXGPE__ + ConstrainSize(); if ( m_width != old_width || m_height != old_height ) { @@ -1078,25 +1030,7 @@ void wxTopLevelWindowGTK::GtkOnSize() skip the part which handles m_frameMenuBar, m_frameToolBar and (most importantly) m_mainWidget */ - int minWidth = GetMinWidth(), - minHeight = GetMinHeight(), - maxWidth = GetMaxWidth(), - maxHeight = GetMaxHeight(); - -#ifdef __WXGPE__ - // GPE's window manager doesn't like size hints - // at all, esp. when the user has to use the - // virtual keyboard. - minWidth = -1; - minHeight = -1; - maxWidth = -1; - maxHeight = -1; -#endif - - if ((minWidth != -1) && (m_width < minWidth)) m_width = minWidth; - if ((minHeight != -1) && (m_height < minHeight)) m_height = minHeight; - if ((maxWidth != -1) && (m_width > maxWidth)) m_width = maxWidth; - if ((maxHeight != -1) && (m_height > maxHeight)) m_height = maxHeight; + ConstrainSize(); if (m_mainWidget) { @@ -1139,8 +1073,6 @@ void wxTopLevelWindowGTK::OnInternalIdle() GtkOnSize(); // we'll come back later - if (g_isIdle) - wxapp_install_idle_handler(); return; } @@ -1193,11 +1125,6 @@ void wxTopLevelWindowGTK::SetTitle( const wxString &title ) gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( title ) ); } -void wxTopLevelWindowGTK::SetIcon( const wxIcon &icon ) -{ - SetIcons( wxIconBundle( icon ) ); -} - void wxTopLevelWindowGTK::SetIcons( const wxIconBundle &icons ) { wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") ); @@ -1205,15 +1132,13 @@ void wxTopLevelWindowGTK::SetIcons( const wxIconBundle &icons ) wxTopLevelWindowBase::SetIcons( icons ); GList *list = NULL; - size_t max = icons.m_icons.GetCount(); - for (size_t i = 0; i < max; i++) + const size_t numIcons = icons.GetIconCount(); + for ( size_t i = 0; i < numIcons; i++ ) { - if (icons.m_icons[i].Ok()) - { - list = g_list_prepend(list, icons.m_icons[i].GetPixbuf()); - } + list = g_list_prepend(list, icons.GetIconByIndex(i).GetPixbuf()); } + gtk_window_set_icon_list(GTK_WINDOW(m_widget), list); g_list_free(list); } @@ -1436,6 +1361,13 @@ bool wxTopLevelWindowGTK::SetTransparent(wxByte alpha) bool wxTopLevelWindowGTK::CanSetTransparent() { + // allow to override automatic detection as it's far from perfect + static const wxChar *SYSOPT_TRANSPARENT = wxT("gtk.tlw.can-set-transparent"); + if ( wxSystemOptions::HasOption(SYSOPT_TRANSPARENT) ) + { + return wxSystemOptions::GetOptionInt(SYSOPT_TRANSPARENT) != 0; + } + #if GTK_CHECK_VERSION(2,10,0) if (!gtk_check_version(2,10,0)) {