void wxFrame::DoDestroy() { Widget frameShell = (Widget)GetShellWidget(); if( frameShell ) XtRemoveEventHandler( frameShell, StructureNotifyMask, False, (XtEventHandler)wxFrameMapProc, (XtPointer)this ); if( m_clientArea ) { wxDeleteWindowFromTable( (Widget)m_clientArea ); XtDestroyWidget( (Widget)m_clientArea ); } if( m_workArea ) { XtVaSetValues( (Widget)m_mainWidget, XmNworkWindow, (Widget)NULL, NULL ); wxDeleteWindowFromTable( (Widget)m_workArea ); XtDestroyWidget( (Widget)m_workArea ); } if( m_mainWidget ) XtDestroyWidget( (Widget)m_mainWidget ); if( frameShell ) XtDestroyWidget( frameShell ); }
wxFrame::~wxFrame() { m_isBeingDeleted = true; if (m_clientArea) { XtRemoveEventHandler((Widget) m_clientArea, ExposureMask, False, wxUniversalRepaintProc, (XtPointer) this); } if (GetMainWidget()) Show(false); if (m_frameMenuBar) { m_frameMenuBar->DestroyMenuBar(); delete m_frameMenuBar; m_frameMenuBar = NULL; } if (m_frameStatusBar) { delete m_frameStatusBar; m_frameStatusBar = NULL; } PreDestroy(); Widget frameShell = (Widget)GetShellWidget(); if( frameShell ) XtRemoveEventHandler( frameShell, StructureNotifyMask, False, (XtEventHandler)wxFrameMapProc, (XtPointer)this ); if( m_clientArea ) { wxDeleteWindowFromTable( (Widget)m_clientArea ); XtDestroyWidget( (Widget)m_clientArea ); } if( m_workArea ) { XtVaSetValues( (Widget)m_mainWidget, XmNworkWindow, (Widget)NULL, NULL ); wxDeleteWindowFromTable( (Widget)m_workArea ); XtDestroyWidget( (Widget)m_workArea ); } if( m_mainWidget ) XtDestroyWidget( (Widget)m_mainWidget ); if( frameShell ) XtDestroyWidget( frameShell ); }
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 wxFrame::Show( bool show ) { if( !wxWindowBase::Show( show ) ) return false; m_isShown = show; Widget shell = (Widget)GetShellWidget(); if (!shell) return wxWindow::Show(show); SetVisibleStatus(show); if (show) { XtPopup(shell, XtGrabNone); } else { XtPopdown(shell); } return true; }
bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) { SetName(name); m_windowStyle = style; 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 = XmDoCreateTLW( parent, id, title, pos, size, style, name ); if( !retval ) return false; // Intercept CLOSE messages from the window manager Widget shell = (Widget)GetShellWidget(); Atom WM_DELETE_WINDOW = XmInternAtom( XtDisplay( shell ), "WM_DELETE_WINDOW", False ); // Remove and add WM_DELETE_WINDOW so ours is only handler // This only appears to be necessary for wxDialog, but does not hurt // for wxFrame XmRemoveWMProtocols( shell, &WM_DELETE_WINDOW, 1 ); XmAddWMProtocols( shell, &WM_DELETE_WINDOW, 1 ); XmActivateWMProtocol( shell, WM_DELETE_WINDOW ); // Modified Steve Hammes for Motif 2.0 #if (XmREVISION > 1 || XmVERSION > 1) XmAddWMProtocolCallback( shell, WM_DELETE_WINDOW, (XtCallbackProc)wxCloseTLWCallback, (XtPointer)this ); #elif XmREVISION == 1 XmAddWMProtocolCallback( shell, WM_DELETE_WINDOW, (XtCallbackProc)wxCloseTLWCallback, (caddr_t)this ); #else XmAddWMProtocolCallback( shell, WM_DELETE_WINDOW, (void (*)())wxCloseTLWCallback, (caddr_t)this ); #endif // This patch come from Torsten Liermann [email protected] 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 ) decor |= MWM_DECOR_MENU; if( ( m_windowStyle & wxCAPTION ) || ( m_windowStyle & wxTINY_CAPTION_HORIZ ) || ( m_windowStyle & wxTINY_CAPTION_VERT ) ) decor |= MWM_DECOR_TITLE; if( m_windowStyle & wxRESIZE_BORDER ) decor |= MWM_DECOR_BORDER; if( m_windowStyle & wxMINIMIZE_BOX ) decor |= MWM_DECOR_MINIMIZE; if( m_windowStyle & wxMAXIMIZE_BOX ) decor |= MWM_DECOR_MAXIMIZE; XtVaSetValues( shell, XmNmwmDecorations, decor, NULL ); } else { // This allows non-Motif window managers to support at least the // no-decorations case. if( ( m_windowStyle & wxCAPTION ) != wxCAPTION ) XtVaSetValues( shell, XmNoverrideRedirect, True, NULL ); } XtAddEventHandler( (Widget)GetClientWidget(), ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask, False, wxTLWEventHandler, (XtPointer)this ); return retval; }
bool wxTopLevelWindowMotif::SetShape( const wxRegion& region ) { return wxDoSetShape( (Display*)GetXDisplay(), XtWindow( (Widget)GetShellWidget() ), region ); }