X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ef1a9be407b4aed45f385adcb6cad04bfe4b5664..a4761b4c08e6272c69bd242b3323ab47dbbc8902:/src/gtk1/toplevel.cpp diff --git a/src/gtk1/toplevel.cpp b/src/gtk1/toplevel.cpp index 03ce87246a..0a690c2e07 100644 --- a/src/gtk1/toplevel.cpp +++ b/src/gtk1/toplevel.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: 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 // ============================================================================ @@ -15,28 +18,23 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "toplevel.h" -#endif - -// 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 @@ -45,7 +43,7 @@ #include #include -#include "wx/gtk/win_gtk.h" +#include "wx/gtk1/win_gtk.h" #include "wx/unix/utilsx11.h" @@ -63,8 +61,6 @@ extern bool g_isIdle; // data // ---------------------------------------------------------------------------- -extern wxList wxPendingDelete; - extern int g_openDialogs; extern wxWindowGTK *g_delayedFocus; @@ -107,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; @@ -157,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; @@ -175,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; } @@ -186,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(); @@ -207,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; } @@ -307,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; } @@ -343,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 ); @@ -375,7 +359,7 @@ gtk_frame_unmap_callback( GtkWidget * WXUNUSED(widget), GdkEvent * WXUNUSED(event), wxTopLevelWindow *win ) { - win->SetIconizeState(TRUE); + win->SetIconizeState(true); } } @@ -404,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 ) { @@ -421,8 +403,6 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW } } -#endif // GTK+ 1.x - // ---------------------------------------------------------------------------- // wxTopLevelWindowGTK itself // ---------------------------------------------------------------------------- @@ -521,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 { @@ -566,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 - -#if GTK_CHECK_VERSION(2,4,0) - 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 ) ); @@ -606,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 @@ -708,7 +656,7 @@ wxTopLevelWindowGTK::~wxTopLevelWindowGTK() { if (m_grabbed) { - wxASSERT_MSG( FALSE, _T("Window still grabbed")); + wxASSERT_MSG( false, _T("Window still grabbed")); RemoveGrab(); } @@ -845,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) ) @@ -1076,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; } @@ -1134,13 +1078,12 @@ void wxTopLevelWindowGTK::SetTitle( const wxString &title ) { wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") ); + if ( title == m_title ) + return; + m_title = title; - gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( title ) ); -} -void wxTopLevelWindowGTK::SetIcon( const wxIcon &icon ) -{ - SetIcons( wxIconBundle( icon ) ); + gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( title ) ); } void wxTopLevelWindowGTK::SetIcons( const wxIconBundle &icons ) @@ -1149,21 +1092,9 @@ void wxTopLevelWindowGTK::SetIcons( const wxIconBundle &icons ) 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; @@ -1180,58 +1111,32 @@ void wxTopLevelWindowGTK::SetIcons( const wxIconBundle &icons ) 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 } 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") ); // 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 } 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; @@ -1243,7 +1148,6 @@ void wxTopLevelWindowGTK::Iconize( bool iconize ) 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; } } @@ -1354,10 +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 ) +{ + // Process wxWindow styles. This also updates the internal variable + // Therefore m_windowStyle bits carry now the _new_ style values + wxWindow::SetWindowStyleFlag(style); }