X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dca92ddfbff8fc0a858ada23c4ece06cdbe229c8..eea4d01c65f9b29baa1193db762b4c6b8144af24:/src/gtk1/toplevel.cpp diff --git a/src/gtk1/toplevel.cpp b/src/gtk1/toplevel.cpp index 6dc85efbf4..22364cdcdc 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,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 @@ -105,17 +101,11 @@ static void wxgtk_window_set_urgency_hint (GtkWindow *win, XFree(wm_hints); } -static gint gtk_frame_urgency_timer_callback( GtkWidget *win ) +static gint gtk_frame_urgency_timer_callback( wxTopLevelWindowGTK *win ) { -#if __WXGTK20__ && GTK_CHECK_VERSION(2,7,0) - if(!gtk_check_version(2,7,0)) - gtk_window_set_urgency_hint(GTK_WINDOW( win ), FALSE); - else -#endif - wxgtk_window_set_urgency_hint(GTK_WINDOW( win ), FALSE); + wxgtk_window_set_urgency_hint(GTK_WINDOW( win->m_widget ), FALSE); - //BCI: argument from GtkWidget* to wxTopLevelWindowGTK* && win->m_urgency_hint = -2; - gtk_object_set_data(GTK_OBJECT(win), "m_urgency_hint", GINT_TO_POINTER(-2)); + win->m_urgency_hint = -2; return FALSE; } } @@ -152,25 +142,15 @@ static gint gtk_frame_focus_in_callback( GtkWidget *widget, // wxPrintf( wxT("active: %s\n"), win->GetTitle().c_str() ); // MR: wxRequestUserAttention related block - //BCI: switch(win->m_urgency_hint) - switch( GPOINTER_TO_INT(gtk_object_get_data( GTK_OBJECT(widget), "m_urgency_hint") ) ) + switch( win->m_urgency_hint ) { default: - //BCI: - gtk_timeout_remove( GPOINTER_TO_INT(gtk_object_get_data( GTK_OBJECT(widget), "m_urgency_hint") ) ); + gtk_timeout_remove( win->m_urgency_hint ); // no break, fallthrough to remove hint too case -1: -#if __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); - //BCI: win->m_urgency_hint = -2; - gtk_object_set_data( GTK_OBJECT(widget), "m_urgency_hint", GINT_TO_POINTER(-2) ); + win->m_urgency_hint = -2; break; case -2: break; @@ -179,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; } @@ -190,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(); @@ -211,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; } @@ -311,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; } @@ -347,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 ); @@ -379,7 +359,7 @@ gtk_frame_unmap_callback( GtkWidget * WXUNUSED(widget), GdkEvent * WXUNUSED(event), wxTopLevelWindow *win ) { - win->SetIconizeState(TRUE); + win->SetIconizeState(true); } } @@ -408,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 ) { @@ -425,8 +403,6 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW } } -#endif // GTK+ 1.x - // ---------------------------------------------------------------------------- // wxTopLevelWindowGTK itself // ---------------------------------------------------------------------------- @@ -479,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; @@ -487,12 +463,7 @@ void wxTopLevelWindowGTK::Init() m_gdkDecor = m_gdkFunc = 0; m_grabbed = false; - //BCI: header wx/gtk/toplevel.h: - // private gtk_timeout_add result for mimicing wxUSER_ATTENTION_INFO and - // wxUSER_ATTENTION_ERROR difference, -2 for no hint, -1 for ERROR hint, rest for GtkTimeout handle. - // int m_urgency_hint; - - //BCI: m_urgency_hint = -2; + m_urgency_hint = -2; } bool wxTopLevelWindowGTK::Create( wxWindow *parent, @@ -530,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,9 +527,6 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, } } - // BCI: - gtk_object_set_data( GTK_OBJECT(m_widget), "m_urgency_hint", GINT_TO_POINTER(-2) ); - wxWindow *topParent = wxGetTopLevelParent(m_parent); if (topParent && (((GTK_IS_WINDOW(topParent->m_widget)) && (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)) || @@ -578,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 ) ); @@ -618,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 @@ -651,10 +587,6 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, gtk_signal_connect( GTK_OBJECT(m_widget), "realize", GTK_SIGNAL_FUNC(gtk_frame_realized_callback), (gpointer) this ); - // the only way to get the window size is to connect to this event - gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event", - GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this ); - // map and unmap for iconized state gtk_signal_connect( GTK_OBJECT(m_widget), "map_event", GTK_SIGNAL_FUNC(gtk_frame_map_callback), (gpointer)this ); @@ -724,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)) @@ -861,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) ) @@ -1062,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 ); @@ -1092,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; } @@ -1115,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()); @@ -1150,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 ) @@ -1165,101 +1092,62 @@ 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; wxIcon icon = icons.GetIcon(-1); - if (icon.Ok()) + if (icon.IsOk()) { 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 @@ -1308,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; } } @@ -1326,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) @@ -1353,17 +1237,10 @@ void wxTopLevelWindowGTK::RequestUserAttention(int flags) // wxYieldIfNeeded ensures the processing of it, but can have unwanted side effects - MR ::wxYieldIfNeeded(); - /*BCI: if(m_urgency_hint >= 0) gtk_timeout_remove(m_urgency_hint); - */ - int urgency_hint = GPOINTER_TO_INT( gtk_object_get_data( GTK_OBJECT(m_widget), "m_urgency_hint") ); - if(urgency_hint >= 0) - gtk_timeout_remove(urgency_hint); - //BCI: END - //BCI: m_urgency_hint = -2; - gtk_object_set_data( GTK_OBJECT(m_widget), "m_urgency_hint", GINT_TO_POINTER(-2)); + m_urgency_hint = -2; if( GTK_WIDGET_REALIZED(m_widget) && !IsActive() ) { @@ -1371,21 +1248,18 @@ void wxTopLevelWindowGTK::RequestUserAttention(int flags) if (flags & wxUSER_ATTENTION_INFO) { - //BCI: m_urgency_hint = gtk_timeout_add(5000, (GtkFunction)gtk_frame_urgency_timer_callback, this); - gtk_object_set_data( GTK_OBJECT(m_widget), "m_urgency_hint", - GINT_TO_POINTER( gtk_timeout_add(5000, - (GtkFunction)gtk_frame_urgency_timer_callback, - m_widget) ) ); + m_urgency_hint = gtk_timeout_add(5000, (GtkFunction)gtk_frame_urgency_timer_callback, this); } else { - //BCI: m_urgency_hint = -1; - gtk_object_set_data( GTK_OBJECT(m_widget), "m_urgency_hint", GINT_TO_POINTER(-1) ); + m_urgency_hint = -1; } } -#if __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); }