]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/toplevel.cpp
Fix my last fix. The method is pure virtual in the base class so it
[wxWidgets.git] / src / gtk / toplevel.cpp
index 0c8752c927c7748e888c5620114e2ffffe4d5e6d..7b883348dc14c7bb0be924447f3aadde2a5deccb 100644 (file)
 #include "wx/toplevel.h"
 
 #ifndef WX_PRECOMP
+    #include "wx/frame.h"
+    #include "wx/icon.h"
     #include "wx/log.h"
     #include "wx/app.h"
-    #include "wx/dcclient.h"
-    #include "wx/dialog.h"
-    #include "wx/timer.h"
-    #include "wx/settings.h"
-    #include "wx/control.h"
 #endif
 
 #include "wx/gtk/private.h"
 #include "wx/evtloop.h"
 
-#include <glib.h>
-#include <gdk/gdk.h>
 #include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
 #include <gdk/gdkx.h>
 
 #include "wx/gtk/win_gtk.h"
@@ -117,8 +111,7 @@ static gboolean gtk_frame_focus_in_callback( GtkWidget *widget,
                                          GdkEvent *WXUNUSED(event),
                                          wxTopLevelWindowGTK *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     switch ( g_sendActivateEvent )
     {
@@ -179,8 +172,7 @@ static gboolean gtk_frame_focus_out_callback( GtkWidget *widget,
                                           GdkEventFocus *WXUNUSED(gdk_event),
                                           wxTopLevelWindowGTK *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // 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
@@ -210,13 +202,14 @@ static gboolean gtk_frame_focus_out_callback( GtkWidget *widget,
 //-----------------------------------------------------------------------------
 
 extern "C" {
-static gboolean gtk_frame_focus_callback( GtkWidget *widget, GtkDirectionType WXUNUSED(d), wxWindow *WXUNUSED(win) )
+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
-    g_signal_stop_emission_by_name (widget, "focus");
     return TRUE;
 }
 }
@@ -246,8 +239,13 @@ static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation*
                                 (int)alloc->height );
 */
 
+        // Tell the wxWindow class about the new size
         win->m_width = alloc->width;
         win->m_height = alloc->height;
+        
+        if (win->m_mainWidget)
+            GTK_PIZZA(win->m_mainWidget)->m_width = win->m_width;
+        
         win->GtkUpdateSize();
     }
 }
@@ -263,8 +261,7 @@ gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget),
                            GdkEvent *WXUNUSED(event),
                            wxTopLevelWindowGTK *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (win->IsEnabled() &&
         (g_openDialogs == 0 || (win->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) ||
@@ -286,8 +283,7 @@ gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget),
                               GdkEventConfigure *WXUNUSED(event),
                               wxTopLevelWindowGTK *win )
 {
-    if (g_isIdle)
-        wxapp_install_idle_handler();
+    // don't need to install idle handler, its done from "event" signal
 
     if (!win->m_hasVMT || !win->IsShown())
         return FALSE;
@@ -570,6 +566,8 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
     GTK_WIDGET_UNSET_FLAGS( m_mainWidget, GTK_CAN_FOCUS );
     gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget );
 
+    GTK_PIZZA(m_mainWidget)->m_width = m_width;
+        
     if (m_miniEdge == 0) // wxMiniFrame has its own version.
     {
        // For m_mainWidget themes
@@ -625,10 +623,19 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
                       G_CALLBACK (gtk_frame_focus_out_callback), this);
 
     // decorations
-    if ((m_miniEdge > 0) || (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER))
+    if ((style & wxSIMPLE_BORDER) || (style & wxNO_BORDER))
+    {
+        m_gdkDecor = 0;
+        m_gdkFunc = 0;
+    }
+    else
+    if (m_miniEdge > 0)
     {
         m_gdkDecor = 0;
         m_gdkFunc = 0;
+        
+        if ((style & wxRESIZE_BORDER) != 0)
+           m_gdkFunc |= GDK_FUNC_RESIZE;
     }
     else
     {
@@ -802,7 +809,7 @@ bool wxTopLevelWindowGTK::Show( bool show )
            much ugly flicker or from within the size_allocate
            handler, because GTK 1.1.X forbids that. */
 
-        GtkOnSize( m_x, m_y, m_width, m_height );
+        GtkOnSize();
     }
 
     // This seems no longer to be needed and the call
@@ -854,6 +861,9 @@ void wxTopLevelWindowGTK::DoSetSize( int x, int y, int width, int height, int si
     }
     if (width != -1) m_width = width;
     if (height != -1) m_height = height;
+    
+    if (m_mainWidget)
+        GTK_PIZZA(m_mainWidget)->m_width = m_width;
 
 /*
     if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
@@ -915,15 +925,17 @@ void wxTopLevelWindowGTK::DoGetClientSize( int *width, int *height ) const
 {
     wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
 
-    wxWindow::DoGetClientSize( width, height );
     if (height)
     {
-        // mini edge
-        *height -= m_miniEdge*2 + m_miniTitle;
+        *height = m_height - 2 * m_miniEdge + m_miniTitle;
+        if (*height < 0)
+            *height = 0;
     }
     if (width)
     {
-        *width -= m_miniEdge*2;
+        *width = m_width - 2 * m_miniEdge;
+        if (*width < 0)
+            *width = 0;
     }
 }
 
@@ -935,22 +947,14 @@ void wxTopLevelWindowGTK::DoSetClientSize( int width, int height )
               width + m_miniEdge*2, height  + m_miniEdge*2 + m_miniTitle, 0);
 }
 
-void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
-                                     int width, int height )
+void wxTopLevelWindowGTK::GtkOnSize()
 {
-    // due to a bug in gtk, x,y are always 0
-    // m_x = x;
-    // m_y = y;
-
     // avoid recursions
     if (m_resizing) return;
     m_resizing = true;
 
     if ( m_wxwindow == NULL ) return;
 
-    m_width = width;
-    m_height = height;
-
     /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
        wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
        set in wxFrame::Create so it is used to check what kind of frame we
@@ -1027,7 +1031,12 @@ void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
         int client_y = m_miniEdge + m_miniTitle;
         int client_w = m_width - 2*m_miniEdge;
         int client_h = m_height - 2*m_miniEdge - m_miniTitle;
+        if (client_w < 0)
+            client_w = 0;
+        if (client_h < 0)
+            client_h = 0;
 
+        // Let the parent perform the resize
         gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
                               m_wxwindow,
                               client_x, client_y, client_w, client_h );
@@ -1052,7 +1061,7 @@ void wxTopLevelWindowGTK::OnInternalIdle()
 {
     if (!m_sizeSet && GTK_WIDGET_REALIZED(m_wxwindow))
     {
-        GtkOnSize( m_x, m_y, m_width, m_height );
+        GtkOnSize();
 
         // we'll come back later
         if (g_isIdle)