]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/toplevel.cpp
Fix best size computation for buttons without image and with empty label.
[wxWidgets.git] / src / gtk1 / toplevel.cpp
index 21f458ae6474eab2675fdae0a3d785bdda03c969..19067668d0cff125bb00ae010c67778bf54758b2 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        src/gtk/toplevel.cpp
+// Name:        src/gtk1/toplevel.cpp
 // Purpose:
 // Author:      Robert Roebling
 // Id:          $Id$
@@ -7,6 +7,9 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
 // ============================================================================
 // declarations
 // ============================================================================
 // headers
 // ----------------------------------------------------------------------------
 
-// For compilers that support precompilation, includes "wx.h".
-#include "wx/wxprec.h"
-
 #ifdef __VMS
 #define XIconifyWindow XICONIFYWINDOW
 #endif
 
-#include "wx/defs.h"
-
 #include "wx/toplevel.h"
-#include "wx/log.h"
-#include "wx/dialog.h"
-#include "wx/control.h"
-#include "wx/app.h"
-#include "wx/dcclient.h"
-#include "wx/gtk/private.h"
-#include "wx/timer.h"
-#include "wx/settings.h"
+
+#ifndef WX_PRECOMP
+    #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/gtk1/private.h"
 #include "wx/evtloop.h"
 
 #include <glib.h>
@@ -41,7 +43,7 @@
 #include <gdk/gdkkeysyms.h>
 #include <gdk/gdkx.h>
 
-#include "wx/gtk/win_gtk.h"
+#include "wx/gtk1/win_gtk.h"
 
 #include "wx/unix/utilsx11.h"
 
@@ -59,15 +61,13 @@ extern bool g_isIdle;
 // data
 // ----------------------------------------------------------------------------
 
-extern wxList           wxPendingDelete;
-
 extern int              g_openDialogs;
 extern wxWindowGTK     *g_delayedFocus;
 
 // the frame that is currently active (i.e. its child has focus). It is
 // used to generate wxActivateEvents
-static wxTopLevelWindowGTK *g_activeFrame = (wxTopLevelWindowGTK*) NULL;
-static wxTopLevelWindowGTK *g_lastActiveFrame = (wxTopLevelWindowGTK*) NULL;
+static wxTopLevelWindowGTK *g_activeFrame = NULL;
+static wxTopLevelWindowGTK *g_lastActiveFrame = NULL;
 
 // if we detect that the app has got/lost the focus, we set this variable to
 // either TRUE or FALSE and an activate event will be sent during the next
@@ -103,12 +103,7 @@ static void wxgtk_window_set_urgency_hint (GtkWindow *win,
 
 static gint gtk_frame_urgency_timer_callback( wxTopLevelWindowGTK *win )
 {
-#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2,7,0)
-    if(!gtk_check_version(2,7,0))
-        gtk_window_set_urgency_hint(GTK_WINDOW( win->m_widget ), FALSE);
-    else
-#endif
-        wxgtk_window_set_urgency_hint(GTK_WINDOW( win->m_widget ), FALSE);
+    wxgtk_window_set_urgency_hint(GTK_WINDOW( win->m_widget ), FALSE);
 
     win->m_urgency_hint = -2;
     return FALSE;
@@ -153,14 +148,7 @@ static gint gtk_frame_focus_in_callback( GtkWidget *widget,
             gtk_timeout_remove( win->m_urgency_hint );
             // no break, fallthrough to remove hint too
         case -1:
-#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2,7,0)
-            if(!gtk_check_version(2,7,0))
-                gtk_window_set_urgency_hint(GTK_WINDOW( widget ), FALSE);
-            else
-#endif
-            {
-                wxgtk_window_set_urgency_hint(GTK_WINDOW( widget ), FALSE);
-            }
+            wxgtk_window_set_urgency_hint(GTK_WINDOW( widget ), FALSE);
 
             win->m_urgency_hint = -2;
             break;
@@ -171,7 +159,7 @@ static gint gtk_frame_focus_in_callback( GtkWidget *widget,
     wxLogTrace(wxT("activate"), wxT("Activating frame %p (from focus_in)"), g_activeFrame);
     wxActivateEvent event(wxEVT_ACTIVATE, true, g_activeFrame->GetId());
     event.SetEventObject(g_activeFrame);
-    g_activeFrame->GetEventHandler()->ProcessEvent(event);
+    g_activeFrame->HandleWindowEvent(event);
 
     return FALSE;
 }
@@ -182,9 +170,9 @@ static gint gtk_frame_focus_in_callback( GtkWidget *widget,
 //-----------------------------------------------------------------------------
 
 extern "C" {
-static gint gtk_frame_focus_out_callback( GtkWidget *widget,
+static gint gtk_frame_focus_out_callback( GtkWidget *WXUNUSED(widget),
                                           GdkEventFocus *WXUNUSED(gdk_event),
-                                          wxTopLevelWindowGTK *win )
+                                          wxTopLevelWindowGTK *WXUNUSED(win) )
 {
     if (g_isIdle)
         wxapp_install_idle_handler();
@@ -203,7 +191,7 @@ static gint gtk_frame_focus_out_callback( GtkWidget *widget,
         wxLogTrace(wxT("activate"), wxT("Activating frame %p (from focus_in)"), g_activeFrame);
         wxActivateEvent event(wxEVT_ACTIVATE, false, g_activeFrame->GetId());
         event.SetEventObject(g_activeFrame);
-        g_activeFrame->GetEventHandler()->ProcessEvent(event);
+        g_activeFrame->HandleWindowEvent(event);
 
         g_activeFrame = NULL;
     }
@@ -303,7 +291,7 @@ gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WX
 
     wxMoveEvent mevent( wxPoint(win->m_x,win->m_y), win->GetId() );
     mevent.SetEventObject( win );
-    win->GetEventHandler()->ProcessEvent( mevent );
+    win->HandleWindowEvent( mevent );
 
     return FALSE;
 }
@@ -339,7 +327,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 );
@@ -400,8 +388,6 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
 // "draw" of m_client
 //-----------------------------------------------------------------------------
 
-#ifndef __WXGTK20__
-
 extern "C" {
 static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxWindow *win )
 {
@@ -417,8 +403,6 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
 }
 }
 
-#endif // GTK+ 1.x
-
 // ----------------------------------------------------------------------------
 // wxTopLevelWindowGTK itself
 // ----------------------------------------------------------------------------
@@ -471,7 +455,7 @@ void wxTopLevelWindowGTK::Init()
     m_sizeSet = false;
     m_miniEdge = 0;
     m_miniTitle = 0;
-    m_mainWidget = (GtkWidget*) NULL;
+    m_mainWidget = NULL;
     m_insertInClientArea = true;
     m_isIconized = false;
     m_fsIsShowing = false;
@@ -517,17 +501,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
     {
         if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)
         {
-#ifdef __WXGTK20__
-            m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-            // Tell WM that this is a dialog window and make it center
-            // on parent by default (this is what GtkDialog ctor does):
-            gtk_window_set_type_hint(GTK_WINDOW(m_widget),
-                                     GDK_WINDOW_TYPE_HINT_DIALOG);
-            gtk_window_set_position(GTK_WINDOW(m_widget),
-                                    GTK_WIN_POS_CENTER_ON_PARENT);
-#else
             m_widget = gtk_window_new(GTK_WINDOW_DIALOG);
-#endif
         }
         else
         {
@@ -562,26 +536,6 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
                                       GTK_WINDOW(topParent->m_widget) );
     }
 
-#if GTK_CHECK_VERSION(2,2,0)
-    if (!gtk_check_version(2,2,0))
-    {
-        if (style & wxFRAME_NO_TASKBAR)
-        {
-            gtk_window_set_skip_taskbar_hint(GTK_WINDOW(m_widget), TRUE);
-        }
-    }
-#endif
-
-#ifdef __WXGTK24__
-    if (!gtk_check_version(2,4,0))
-    {
-        if (style & wxSTAY_ON_TOP)
-        {
-            gtk_window_set_keep_above(GTK_WINDOW(m_widget), TRUE);
-        }
-    }
-#endif
-
     if (!name.empty())
         gtk_window_set_wmclass( GTK_WINDOW(m_widget), wxGTK_CONV( name ), wxGTK_CONV( name ) );
 
@@ -602,10 +556,8 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
        // For m_mainWidget themes
        gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event",
                 GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
-#ifndef __WXGTK20__
        gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw",
                 GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
-#endif
     }
 
     // m_wxwindow only represents the client area without toolbar and menubar
@@ -704,11 +656,11 @@ wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
 {
     if (m_grabbed)
     {
-        wxASSERT_MSG( false, _T("Window still grabbed"));
+        wxASSERT_MSG( false, wxT("Window still grabbed"));
         RemoveGrab();
     }
 
-    m_isBeingDeleted = true;
+    SendDestroyEvent();
 
     // it may also be GtkScrolledWindow in the case of an MDI child
     if (GTK_IS_WINDOW(m_widget))
@@ -841,11 +793,7 @@ bool wxTopLevelWindowGTK::Show( bool show )
 
 void wxTopLevelWindowGTK::Raise()
 {
-#ifdef __WXGTK20__
-    gtk_window_present( GTK_WINDOW( m_widget ) );
-#else
     wxWindow::Raise();
-#endif
 }
 
 void wxTopLevelWindowGTK::DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(width), int WXUNUSED(height) )
@@ -1042,7 +990,7 @@ void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
                             : maxHeight ;
 
         gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
-                                       (GtkWidget*) NULL,
+                                       NULL,
                                        &geom,
                                        (GdkWindowHints) flag );
 
@@ -1072,7 +1020,7 @@ void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
     // send size event to frame
     wxSizeEvent event( wxSize(m_width,m_height), GetId() );
     event.SetEventObject( this );
-    GetEventHandler()->ProcessEvent( event );
+    HandleWindowEvent( event );
 
     m_resizing = false;
 }
@@ -1095,8 +1043,8 @@ void wxTopLevelWindowGTK::OnInternalIdle()
         if ( g_delayedFocus &&
              wxGetTopLevelParent((wxWindow*)g_delayedFocus) == this )
         {
-            wxLogTrace(_T("focus"),
-                       _T("Setting focus from wxTLW::OnIdle() to %s(%s)"),
+            wxLogTrace(wxT("focus"),
+                       wxT("Setting focus from wxTLW::OnIdle() to %s(%s)"),
                        g_delayedFocus->GetClassInfo()->GetClassName(),
                        g_delayedFocus->GetLabel().c_str());
 
@@ -1138,32 +1086,15 @@ 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") );
 
     wxTopLevelWindowBase::SetIcons( icons );
 
-#ifdef __WXGTK20__
-    GList *list = NULL;
-    size_t max = icons.m_icons.GetCount();
-
-    for (size_t i = 0; i < max; i++)
-    {
-        if (icons.m_icons[i].Ok())
-        {
-            list = g_list_prepend(list, icons.m_icons[i].GetPixbuf());
-        }
-    }
-    gtk_window_set_icon_list(GTK_WINDOW(m_widget), list);
-    g_list_free(list);
+    if ( icons.IsEmpty() )
+        return;
 
-#else // !__WXGTK20__
     GdkWindow* window = m_widget->window;
     if (!window)
         return;
@@ -1172,78 +1103,51 @@ void wxTopLevelWindowGTK::SetIcons( const wxIconBundle &icons )
     if (icon.Ok())
     {
         wxMask *mask = icon.GetMask();
-        GdkBitmap *bm = (GdkBitmap *) NULL;
+        GdkBitmap *bm = NULL;
         if (mask) bm = mask->GetBitmap();
 
-        gdk_window_set_icon( m_widget->window, (GdkWindow *) NULL, icon.GetPixmap(), bm );
+        gdk_window_set_icon( m_widget->window, NULL, icon.GetPixmap(), bm );
     }
 
     wxSetIconsX11( (WXDisplay*)GDK_WINDOW_XDISPLAY( window ),
                    (WXWindow)GDK_WINDOW_XWINDOW( window ), icons );
-#endif // !__WXGTK20__
 }
 
 // ----------------------------------------------------------------------------
 // frame state: maximized/iconized/normal
 // ----------------------------------------------------------------------------
 
-void wxTopLevelWindowGTK::Maximize(bool maximize)
+void wxTopLevelWindowGTK::Maximize(bool WXUNUSED(maximize))
 {
-#ifdef __WXGTK20__
-    if (maximize)
-        gtk_window_maximize( GTK_WINDOW( m_widget ) );
-    else
-        gtk_window_unmaximize( GTK_WINDOW( m_widget ) );
-#else
-    wxFAIL_MSG( _T("not implemented") );
-#endif
+    wxFAIL_MSG( wxT("not implemented") );
 }
 
 bool wxTopLevelWindowGTK::IsMaximized() const
 {
-#ifdef __WXGTK20__
-    if(!m_widget->window)
-        return false;
-
-    return gdk_window_get_state(m_widget->window) & GDK_WINDOW_STATE_MAXIMIZED;
-#else
-  //    wxFAIL_MSG( _T("not implemented") );
+  //    wxFAIL_MSG( wxT("not implemented") );
 
     // This is an approximation
     return false;
-#endif
 }
 
 void wxTopLevelWindowGTK::Restore()
 {
-#ifdef __WXGTK20__
-    // "Present" seems similar enough to "restore"
-    gtk_window_present( GTK_WINDOW( m_widget ) );
-#else
-    wxFAIL_MSG( _T("not implemented") );
-#endif
+    wxFAIL_MSG( wxT("not implemented") );
 }
 
 void wxTopLevelWindowGTK::Iconize( bool iconize )
 {
-#ifdef __WXGTK20__
-    if (iconize)
-        gtk_window_iconify( GTK_WINDOW( m_widget ) );
-    else
-        gtk_window_deiconify( GTK_WINDOW( m_widget ) );
-#else
    if (iconize)
    {
        GdkWindow *window = m_widget->window;
 
        // you should do it later, for example from OnCreate() handler
-       wxCHECK_RET( window, _T("frame not created yet - can't iconize") );
+       wxCHECK_RET( window, wxT("frame not created yet - can't iconize") );
 
        XIconifyWindow( GDK_WINDOW_XDISPLAY( window ),
                        GDK_WINDOW_XWINDOW( window ),
                        DefaultScreen( GDK_DISPLAY() ) );
    }
-#endif
 }
 
 bool wxTopLevelWindowGTK::IsIconized() const
@@ -1292,14 +1196,10 @@ static bool do_shape_combine_region(GdkWindow* window, const wxRegion& region)
         }
         else
         {
-#ifdef __WXGTK20__
-            gdk_window_shape_combine_region(window, region.GetRegion(), 0, 0);
-#else
             wxBitmap bmp = region.ConvertToBitmap();
             bmp.SetMask(new wxMask(bmp, *wxBLACK));
             GdkBitmap* mask = bmp.GetMask()->GetBitmap();
             gdk_window_shape_combine_mask(window, mask, 0, 0);
-#endif
             return true;
         }
     }
@@ -1310,7 +1210,7 @@ static bool do_shape_combine_region(GdkWindow* window, const wxRegion& region)
 bool wxTopLevelWindowGTK::SetShape(const wxRegion& region)
 {
     wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false,
-                 _T("Shaped windows must be created with the wxFRAME_SHAPED style."));
+                 wxT("Shaped windows must be created with the wxFRAME_SHAPED style."));
 
     GdkWindow *window = NULL;
     if (m_wxwindow)
@@ -1354,39 +1254,12 @@ void wxTopLevelWindowGTK::RequestUserAttention(int flags)
         }
     }
 
-#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2,7,0)
-    if(!gtk_check_version(2,7,0))
-        gtk_window_set_urgency_hint(GTK_WINDOW( m_widget ), new_hint_value);
-    else
-#endif
-        wxgtk_window_set_urgency_hint(GTK_WINDOW( m_widget ), new_hint_value);
+    wxgtk_window_set_urgency_hint(GTK_WINDOW( m_widget ), new_hint_value);
 }
 
 void wxTopLevelWindowGTK::SetWindowStyleFlag( long style )
 {
-#ifdef __WXGTK20__
-    // Store which styles were changed
-    long styleChanges = style ^ m_windowStyle;
-#endif
-
     // Process wxWindow styles. This also updates the internal variable
     // Therefore m_windowStyle bits carry now the _new_ style values
     wxWindow::SetWindowStyleFlag(style);
-
-#ifdef __WXGTK20__
-    // just return for now if widget does not exist yet
-    if (!m_widget)
-        return;
-
-#ifdef __WXGTK24__
-    if ( (styleChanges & wxSTAY_ON_TOP) && !gtk_check_version(2,4,0) )
-        gtk_window_set_keep_above(GTK_WINDOW(m_widget), m_windowStyle & wxSTAY_ON_TOP);
-#endif // GTK+ 2.4
-#if GTK_CHECK_VERSION(2,2,0)
-    if ( (styleChanges & wxFRAME_NO_TASKBAR) && !gtk_check_version(2,2,0) )
-    {
-        gtk_window_set_skip_taskbar_hint(GTK_WINDOW(m_widget), m_windowStyle & wxFRAME_NO_TASKBAR);
-    }
-#endif // GTK+ 2.2
-#endif // GTK+ 2.0
 }