X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2187eef5bb7a81ee3b2738a312f4ecfceb49bded..f2a18fbec6f74bcb7957392f6e71982c8ca54568:/src/motif/toplevel.cpp diff --git a/src/motif/toplevel.cpp b/src/motif/toplevel.cpp index 031a3c23dd..4f219ee426 100644 --- a/src/motif/toplevel.cpp +++ b/src/motif/toplevel.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: motif/toplevel.cpp +// Name: src/motif/toplevel.cpp // Purpose: wxTopLevelWindow Motif implementation // Author: Mattia Barbon // Modified by: @@ -17,18 +17,18 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(__APPLE__) - #pragma implementation "toplevel.h" -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" #include "wx/toplevel.h" +#include "wx/settings.h" #include "wx/app.h" +#ifndef WX_PRECOMP + #include "wx/app.h" +#endif + #ifdef __VMS__ -#define XtDisplay XTDISPLAY -#define XtParent XTPARENT -#define XtScreen XTSCREEN -#define XtWindow XTWINDOW #pragma message disable nosimpint #endif @@ -66,12 +66,7 @@ static void wxTLWEventHandler( Widget wid, void wxTopLevelWindowMotif::PreDestroy() { - wxTopLevelWindows.DeleteObject(this); - - if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL ) - wxModelessWindows.DeleteObject(this); - - m_icons.m_icons.Empty(); + wxModelessWindows.DeleteObject(this); DestroyChildren(); @@ -81,7 +76,7 @@ void wxTopLevelWindowMotif::PreDestroy() XtRemoveEventHandler( (Widget)GetClientWidget(), ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask, - FALSE, + False, wxTLWEventHandler, (XtPointer)this ); } @@ -90,22 +85,11 @@ void wxTopLevelWindowMotif::PreDestroy() wxTopLevelWindowMotif::~wxTopLevelWindowMotif() { SetMainWidget( (WXWidget)0 ); - - // If this is the last top-level window, exit. - if (wxTheApp && (wxTopLevelWindows.GetCount() == 0)) - { - wxTheApp->SetTopWindow(NULL); - - if (wxTheApp->GetExitOnFrameDelete()) - { - wxTheApp->ExitMainLoop(); - } - } } void wxTopLevelWindowMotif::Init() { - m_isShown = FALSE; + m_isShown = false; } bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id, @@ -120,14 +104,17 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id, if ( parent ) parent->AddChild(this); - + wxTopLevelWindows.Append(this); m_windowId = ( id > -1 ) ? id : NewControlId(); + // MBN: More backward compatible, but uglier + m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + m_inheritFont = true; - bool retval = DoCreate( parent, id, title, pos, size, style, name ); + bool retval = XmDoCreateTLW( parent, id, title, pos, size, style, name ); - if( !retval ) return FALSE; + if( !retval ) return false; // Intercept CLOSE messages from the window manager Widget shell = (Widget)GetShellWidget(); @@ -144,7 +131,7 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id, // Modified Steve Hammes for Motif 2.0 #if (XmREVISION > 1 || XmVERSION > 1) XmAddWMProtocolCallback( shell, WM_DELETE_WINDOW, - (XtCallbackProc)wxCloseTLWCallback, + (XtCallbackProc)wxCloseTLWCallback, (XtPointer)this ); #elif XmREVISION == 1 XmAddWMProtocolCallback( shell, WM_DELETE_WINDOW, @@ -159,6 +146,8 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id, if( XmIsMotifWMRunning( shell ) ) { int decor = 0 ; + if( !(m_windowStyle & wxNO_BORDER) ) + decor |= MWM_DECOR_BORDER; if( m_windowStyle & wxRESIZE_BORDER ) decor |= MWM_DECOR_RESIZEH; if( m_windowStyle & wxSYSTEM_MENU ) @@ -167,7 +156,7 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id, ( m_windowStyle & wxTINY_CAPTION_HORIZ ) || ( m_windowStyle & wxTINY_CAPTION_VERT ) ) decor |= MWM_DECOR_TITLE; - if( m_windowStyle & wxTHICK_FRAME ) + if( m_windowStyle & wxRESIZE_BORDER ) decor |= MWM_DECOR_BORDER; if( m_windowStyle & wxMINIMIZE_BOX ) decor |= MWM_DECOR_MINIMIZE; @@ -184,20 +173,43 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id, // no-decorations case. if( ( m_windowStyle & wxCAPTION ) != wxCAPTION ) XtVaSetValues( shell, - XmNoverrideRedirect, TRUE, + XmNoverrideRedirect, True, NULL ); } XtAddEventHandler( (Widget)GetClientWidget(), - ButtonPressMask | ButtonReleaseMask | + ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask, - FALSE, + False, wxTLWEventHandler, (XtPointer)this ); return retval; } +void wxTopLevelWindowMotif::DoGetPosition(int *x, int *y) const +{ + Widget top = (Widget) GetTopWidget(); + Window parent_window = XtWindow((Widget) top), + next_parent = XtWindow((Widget) top), + root = RootWindowOfScreen(XtScreen((Widget) top)); + + // search for the parent that is child of ROOT, because the WM may + // reparent twice and notify only the next parent (like FVWM) + while (next_parent != root) { + Window *theChildren; unsigned int n; + parent_window = next_parent; + XQueryTree(XtDisplay((Widget) top), parent_window, &root, + &next_parent, &theChildren, &n); + XFree(theChildren); // not needed + } + int xx, yy; unsigned int dummy; + XGetGeometry(XtDisplay((Widget) top), parent_window, &root, + &xx, &yy, &dummy, &dummy, &dummy, &dummy); + if (x) *x = xx; + if (y) *y = yy; +} + void wxTopLevelWindowMotif::Raise() { Widget top = (Widget) GetTopWidget(); @@ -253,17 +265,17 @@ WXWidget wxTopLevelWindowMotif::GetShellWidget() const return (WXWidget) GetShell( this ); } -bool wxTopLevelWindowMotif::ShowFullScreen( bool show, - long style ) +bool wxTopLevelWindowMotif::ShowFullScreen( bool WXUNUSED(show), + long WXUNUSED(style) ) { // TODO, see wxGTK - return FALSE; + return false; } bool wxTopLevelWindowMotif::IsFullScreen() const { // TODO, see wxGTK - return FALSE; + return false; } void wxTopLevelWindowMotif::Restore() @@ -272,7 +284,7 @@ void wxTopLevelWindowMotif::Restore() if( shell ) XtVaSetValues( shell, - XmNiconic, FALSE, + XmNiconic, False, NULL ); } @@ -282,7 +294,7 @@ void wxTopLevelWindowMotif::Iconize( bool iconize ) if( !shell ) return; if( !iconize ) - Show( TRUE ); + Show( true ); XtVaSetValues( shell, XmNiconic, (Boolean)iconize, @@ -294,19 +306,19 @@ bool wxTopLevelWindowMotif::IsIconized() const Widget shell = GetShell( this ); if( !shell ) - return FALSE; + return false; Boolean iconic; XtVaGetValues( shell, XmNiconic, &iconic, NULL ); - return iconic; + return (iconic == True); } void wxTopLevelWindowMotif::Maximize( bool maximize ) { - Show( TRUE ); + Show( true ); if( maximize ) Restore(); @@ -314,7 +326,33 @@ void wxTopLevelWindowMotif::Maximize( bool maximize ) bool wxTopLevelWindowMotif::IsMaximized() const { - return FALSE; + return false; +} + +void wxTopLevelWindowMotif::DoSetSizeHints( int minW, int minH, + int maxW, int maxH, + int incW, int incH ) +{ + wxTopLevelWindowBase::DoSetSizeHints( minW, minH, maxW, maxH, incW, incH ); + + int count = 0; + Arg args[6]; + + if( minW > -1 ) { XtSetArg( args[count], XmNminWidth, minW ); ++count; } + if( minH > -1 ) { XtSetArg( args[count], XmNminHeight, minH ); ++count; } + if( maxW > -1 ) { XtSetArg( args[count], XmNmaxWidth, maxW ); ++count; } + if( maxH > -1 ) { XtSetArg( args[count], XmNmaxHeight, maxH ); ++count; } + if( incW > -1 ) { XtSetArg( args[count], XmNwidthInc, incW ); ++count; } + if( incH > -1 ) { XtSetArg( args[count], XmNheightInc, incH ); ++count; } + + XtSetValues( (Widget)GetShellWidget(), args, count ); +} + +bool wxTopLevelWindowMotif::SetShape( const wxRegion& region ) +{ + return wxDoSetShape( (Display*)GetXDisplay(), + XtWindow( (Widget)GetShellWidget() ), + region ); } // --------------------------------------------------------------------------- @@ -330,7 +368,7 @@ static void wxCloseTLWCallback( Widget WXUNUSED(widget), XtPointer client_data, closeEvent.SetEventObject( tlw ); // May delete the dialog (with delayed deletion) - tlw->GetEventHandler()->ProcessEvent(closeEvent); + tlw->HandleWindowEvent(closeEvent); } void wxTLWEventHandler( Widget wid, @@ -349,12 +387,12 @@ void wxTLWEventHandler( Widget wid, { wxevent.SetEventObject( tlw ); wxevent.SetId( tlw->GetId() ); - tlw->GetEventHandler()->ProcessEvent( wxevent ); + tlw->HandleWindowEvent( wxevent ); } else { // An attempt to implement OnCharHook by calling OnCharHook first; - // if this returns TRUE, set continueToDispatch to False + // if this returns true, set continueToDispatch to False // (don't continue processing). // Otherwise set it to True and call OnChar. wxKeyEvent keyEvent( wxEVT_CHAR ); @@ -363,7 +401,7 @@ void wxTLWEventHandler( Widget wid, keyEvent.SetEventObject( tlw ); keyEvent.SetId( tlw->GetId() ); keyEvent.SetEventType( wxEVT_CHAR_HOOK ); - if( tlw->GetEventHandler()->ProcessEvent( keyEvent ) ) + if( tlw->HandleWindowEvent( keyEvent ) ) { *continueToDispatch = False; return; @@ -375,10 +413,10 @@ void wxTLWEventHandler( Widget wid, keyEvent.SetEventType( wxEVT_KEY_DOWN ); // Only process OnChar if OnKeyDown didn't swallow it - if( !tlw->GetEventHandler()->ProcessEvent( keyEvent ) ) + if( !tlw->HandleWindowEvent( keyEvent ) ) { keyEvent.SetEventType( wxEVT_CHAR ); - tlw->GetEventHandler()->ProcessEvent( keyEvent ); + tlw->HandleWindowEvent( keyEvent ); } } } @@ -387,4 +425,3 @@ void wxTLWEventHandler( Widget wid, *continueToDispatch = True; } -