#pragma implementation "frame.h"
#endif
+#ifdef __VMS
+#define XIconifyWindow XICONIFYWINDOW
+#endif
+
#include "wx/frame.h"
#include "wx/dialog.h"
#include "wx/control.h"
win->m_width = alloc->width;
win->m_height = alloc->height;
- win->UpdateSize();
+ win->m_queuedFullRedraw = TRUE;
+ win->GtkUpdateSize();
}
}
if (g_isIdle)
wxapp_install_idle_handler();
- if (g_openDialogs == 0)
+ if ((g_openDialogs == 0) && (win->IsEnabled()))
win->Close();
return TRUE;
if (!win->m_hasVMT) return;
win->m_menuBarDetached = FALSE;
- win->UpdateSize();
+ win->GtkUpdateSize();
}
//-----------------------------------------------------------------------------
if (!win->m_hasVMT) return;
win->m_menuBarDetached = TRUE;
- win->UpdateSize();
+ win->GtkUpdateSize();
}
#if wxUSE_TOOLBAR
win->m_toolBarDetached = FALSE;
- win->UpdateSize();
+ win->GtkUpdateSize();
}
//-----------------------------------------------------------------------------
if (!win->m_hasVMT) return;
win->m_toolBarDetached = TRUE;
- win->UpdateSize();
+ win->GtkUpdateSize();
}
#endif // wxUSE_TOOLBAR
/* we cannot MWM hints and icons before the widget has been realized,
so we do this directly after realization */
-static gint
-gtk_frame_realized_callback( GtkWidget *widget, wxFrame *win )
+static void
+gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxFrame *win )
{
if (g_isIdle)
wxapp_install_idle_handler();
- /* I haven't been able to set the position of
- the dialog before it is shown, so I set the
- position in "realize" */
- gtk_widget_set_uposition( widget, win->m_x, win->m_y );
-
- /* all this is for Motif Window Manager "hints" and is supposed to be
- recognized by other WM as well. not tested. */
- long decor = (long) GDK_DECOR_BORDER;
- long func = (long) GDK_FUNC_MOVE;
-
- if ((win->GetWindowStyle() & wxCAPTION) != 0)
- decor |= GDK_DECOR_TITLE;
- if ((win->GetWindowStyle() & wxSYSTEM_MENU) != 0)
- {
- decor |= GDK_DECOR_MENU;
- func |= GDK_FUNC_CLOSE;
- }
- if ((win->GetWindowStyle() & wxMINIMIZE_BOX) != 0)
- {
- func |= GDK_FUNC_MINIMIZE;
- decor |= GDK_DECOR_MINIMIZE;
- }
- if ((win->GetWindowStyle() & wxMAXIMIZE_BOX) != 0)
+ if ((win->m_miniEdge > 0) || (win->HasFlag(wxSIMPLE_BORDER)) || (win->HasFlag(wxNO_BORDER)))
{
- func |= GDK_FUNC_MAXIMIZE;
- decor |= GDK_DECOR_MAXIMIZE;
+ /* This is a mini-frame or a borderless frame. */
+ gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)0 );
+ gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)0 );
}
- if ((win->GetWindowStyle() & wxRESIZE_BORDER) != 0)
+ else
{
- func |= GDK_FUNC_RESIZE;
- decor |= GDK_DECOR_RESIZEH;
- }
+ /* All this is for Motif Window Manager "hints" and is supposed to be
+ recognized by other WM as well. Not tested. */
+ long decor = (long) GDK_DECOR_BORDER;
+ long func = (long) GDK_FUNC_MOVE;
+
+ if ((win->GetWindowStyle() & wxCAPTION) != 0)
+ decor |= GDK_DECOR_TITLE;
+ if ((win->GetWindowStyle() & wxSYSTEM_MENU) != 0)
+ {
+ decor |= GDK_DECOR_MENU;
+ func |= GDK_FUNC_CLOSE;
+ }
+ if ((win->GetWindowStyle() & wxMINIMIZE_BOX) != 0)
+ {
+ func |= GDK_FUNC_MINIMIZE;
+ decor |= GDK_DECOR_MINIMIZE;
+ }
+ if ((win->GetWindowStyle() & wxMAXIMIZE_BOX) != 0)
+ {
+ func |= GDK_FUNC_MAXIMIZE;
+ decor |= GDK_DECOR_MAXIMIZE;
+ }
+ if ((win->GetWindowStyle() & wxRESIZE_BORDER) != 0)
+ {
+ func |= GDK_FUNC_RESIZE;
+ decor |= GDK_DECOR_RESIZEH;
+ }
- gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
- gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
+ gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
+ gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
+ }
/* GTK's shrinking/growing policy */
if ((win->GetWindowStyle() & wxRESIZE_BORDER) == 0)
else
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
- /* set size hints */
- gint flag = 0; // GDK_HINT_POS;
- if ((win->GetMinWidth() != -1) || (win->GetMinHeight() != -1)) flag |= GDK_HINT_MIN_SIZE;
- if ((win->GetMaxWidth() != -1) || (win->GetMaxHeight() != -1)) flag |= GDK_HINT_MAX_SIZE;
- if (flag)
- {
- gdk_window_set_hints( win->m_widget->window,
- win->m_x, win->m_y,
- win->GetMinWidth(), win->GetMinHeight(),
- win->GetMaxWidth(), win->GetMaxHeight(),
- flag );
- }
-
/* reset the icon */
wxIcon iconOld = win->GetIcon();
if ( iconOld != wxNullIcon )
node = node->GetNext();
}
+}
- return FALSE;
+//-----------------------------------------------------------------------------
+// "map_event" from m_widget
+//-----------------------------------------------------------------------------
+
+static void
+gtk_frame_map_callback( GtkWidget * WXUNUSED(widget),
+ GdkEvent * WXUNUSED(event),
+ wxFrame *win )
+{
+ win->m_isIconized = FALSE;
+}
+
+//-----------------------------------------------------------------------------
+// "unmap_event" from m_widget
+//-----------------------------------------------------------------------------
+
+static void
+gtk_frame_unmap_callback( GtkWidget * WXUNUSED(widget),
+ GdkEvent * WXUNUSED(event),
+ wxFrame *win )
+{
+ win->m_isIconized = TRUE;
}
// ----------------------------------------------------------------------------
}
/* resize on OnInternalIdle */
- parent->UpdateSize();
+ parent->GtkUpdateSize();
}
// ----------------------------------------------------------------------------
m_menuBarDetached = FALSE;
m_toolBarDetached = FALSE;
m_insertInClientArea = TRUE;
- m_isFrame = TRUE;
+ m_isIconized = FALSE;
+ m_fsIsShowing = FALSE;
}
bool wxFrame::Create( wxWindow *parent,
m_insertCallback = (wxInsertChildFunction) wxInsertChildInFrame;
GtkWindowType win_type = GTK_WINDOW_TOPLEVEL;
- if (style & wxSIMPLE_BORDER) win_type = GTK_WINDOW_POPUP;
+
+ if (style & wxFRAME_TOOL_WINDOW)
+ win_type = GTK_WINDOW_POPUP;
m_widget = gtk_window_new( win_type );
+ if ((m_parent) && (HasFlag(wxFRAME_FLOAT_ON_PARENT)) && (GTK_IS_WINDOW(m_parent->m_widget)))
+ gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(m_parent->m_widget) );
+
if (!name.IsEmpty())
gtk_window_set_wmclass( GTK_WINDOW(m_widget), name.mb_str(), name.mb_str() );
PostCreation();
+ if ((m_x != -1) || (m_y != -1))
+ gtk_widget_set_uposition( m_widget, m_x, m_y );
+ gtk_widget_set_usize( m_widget, m_width, m_height );
+
/* we cannot set MWM hints and icons before the widget has
been realized, so we do this directly after realization */
gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
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 );
+ gtk_signal_connect( GTK_OBJECT(m_widget), "unmap_event",
+ GTK_SIGNAL_FUNC(gtk_frame_unmap_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 );
+
/* disable native tab traversal */
gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
GTK_SIGNAL_FUNC(gtk_frame_focus_callback), (gpointer)this );
}
}
+bool wxFrame::ShowFullScreen(bool show, long style )
+{
+ if (show == m_fsIsShowing) return FALSE; // return what?
+
+ m_fsIsShowing = show;
+
+ if (show)
+ {
+ m_fsSaveStyle = m_windowStyle;
+ m_fsSaveFlag = style;
+ GetPosition( &m_fsSaveFrame.x, &m_fsSaveFrame.y );
+ GetSize( &m_fsSaveFrame.width, &m_fsSaveFrame.height );
+
+ gtk_widget_hide( m_widget );
+ gtk_widget_unrealize( m_widget );
+
+ m_windowStyle = wxSIMPLE_BORDER;
+
+ int x;
+ int y;
+ wxDisplaySize( &x, &y );
+ SetSize( 0, 0, x, y );
+
+ gtk_widget_realize( m_widget );
+ gtk_widget_show( m_widget );
+ }
+ else
+ {
+ gtk_widget_hide( m_widget );
+ gtk_widget_unrealize( m_widget );
+
+ m_windowStyle = m_fsSaveStyle;
+
+ SetSize( m_fsSaveFrame.x, m_fsSaveFrame.y, m_fsSaveFrame.width, m_fsSaveFrame.height );
+
+ gtk_widget_realize( m_widget );
+ gtk_widget_show( m_widget );
+ }
+
+ return TRUE;
+}
+
// ----------------------------------------------------------------------------
// overridden wxWindow methods
// ----------------------------------------------------------------------------
{
wxFAIL_MSG( wxT("DoMoveWindow called for wxFrame") );
}
-
+
void wxFrame::DoSetSize( int x, int y, int width, int height, int sizeFlags )
{
wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
if ((m_width != old_width) || (m_height != old_height))
{
+ gtk_widget_set_usize( m_widget, m_width, m_height );
+
/* we set the size in GtkOnSize, i.e. mostly the actual resizing is
done either directly before the frame is shown or in idle time
so that different calls to SetSize() don't lead to flicker. */
#if wxUSE_STATUSBAR
/* status bar */
- if (m_frameStatusBar) (*height) -= wxSTATUS_HEIGHT;
+ if (m_frameStatusBar && m_frameStatusBar->IsShown()) (*height) -= wxSTATUS_HEIGHT;
#endif // wxUSE_STATUSBAR
#if wxUSE_TOOLBAR
/* tool bar */
- if (m_frameToolBar)
+ if (m_frameToolBar && m_frameToolBar->IsShown())
{
if (m_toolBarDetached)
{
#if wxUSE_STATUSBAR
/* status bar */
- if (m_frameStatusBar) height += wxSTATUS_HEIGHT;
+ if (m_frameStatusBar && m_frameStatusBar->IsShown()) height += wxSTATUS_HEIGHT;
#endif
#if wxUSE_TOOLBAR
/* tool bar */
- if (m_frameToolBar)
+ if (m_frameToolBar && m_frameToolBar->IsShown())
{
if (m_toolBarDetached)
{
skip the part which handles m_frameMenuBar, m_frameToolBar and (most
importantly) m_mainWidget */
+ if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
+ if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
+ if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
+ if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
+
if (m_mainWidget)
{
- /* check if size is in legal range */
- if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
- if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
- if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
- if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
+ /* set size hints */
+ gint flag = 0; // GDK_HINT_POS;
+ if ((m_minWidth != -1) || (m_minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
+ if ((m_maxWidth != -1) || (m_maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
+ GdkGeometry geom;
+ geom.min_width = m_minWidth;
+ geom.min_height = m_minHeight;
+ geom.max_width = m_maxWidth;
+ geom.max_height = m_maxHeight;
+ gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
+ (GtkWidget*) NULL,
+ &geom,
+ (GdkWindowHints) flag );
/* I revert back to wxGTK's original behaviour. m_mainWidget holds the
* menubar, the toolbar and the client area, which is represented by
}
#if wxUSE_TOOLBAR
- if ((m_frameToolBar) &&
+ if ((m_frameToolBar) && m_frameToolBar->IsShown() &&
(m_frameToolBar->m_widget->parent == m_mainWidget))
{
int xx = m_miniEdge;
}
#if wxUSE_STATUSBAR
- if (m_frameStatusBar)
+ if (m_frameStatusBar && m_frameStatusBar->IsShown())
{
int xx = 0 + m_miniEdge;
int yy = m_height - wxSTATUS_HEIGHT - m_miniEdge - client_area_y_offset;
gtk_pizza_set_size( GTK_PIZZA(m_wxwindow),
m_frameStatusBar->m_widget,
xx, yy, ww, hh );
+ gtk_widget_draw( m_frameStatusBar->m_widget, (GdkRectangle*) NULL );
}
#endif
- /* we actually set the size of a frame here and no-where else */
- gtk_widget_set_usize( m_widget, m_width, m_height );
-
m_sizeSet = TRUE;
// send size event to frame
wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid frame") );
+ if (menuBar == m_frameMenuBar)
+ return;
+
+ if (m_frameMenuBar)
+ {
+ m_frameMenuBar->UnsetInvokingWindow( this );
+
+ if (m_frameMenuBar->GetWindowStyle() & wxMB_DOCKABLE)
+ {
+ gtk_signal_disconnect_by_func( GTK_OBJECT(m_frameMenuBar->m_widget),
+ GTK_SIGNAL_FUNC(gtk_menu_attached_callback), (gpointer)this );
+
+ gtk_signal_disconnect_by_func( GTK_OBJECT(m_frameMenuBar->m_widget),
+ GTK_SIGNAL_FUNC(gtk_menu_detached_callback), (gpointer)this );
+ }
+
+ gtk_container_remove( GTK_CONTAINER(m_mainWidget), m_frameMenuBar->m_widget );
+ gtk_widget_ref( m_frameMenuBar->m_widget );
+ gtk_widget_unparent( m_frameMenuBar->m_widget );
+ }
+
m_frameMenuBar = menuBar;
if (m_frameMenuBar)
{
m_frameMenuBar->SetInvokingWindow( this );
- if (m_frameMenuBar->GetParent() != this)
- {
- m_frameMenuBar->SetParent(this);
- gtk_pizza_put( GTK_PIZZA(m_mainWidget),
+ m_frameMenuBar->SetParent(this);
+ gtk_pizza_put( GTK_PIZZA(m_mainWidget),
m_frameMenuBar->m_widget,
m_frameMenuBar->m_x,
m_frameMenuBar->m_y,
m_frameMenuBar->m_width,
m_frameMenuBar->m_height );
- if (menuBar->GetWindowStyle() & wxMB_DOCKABLE)
- {
- gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_attached",
- GTK_SIGNAL_FUNC(gtk_menu_attached_callback), (gpointer)this );
-
- gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_detached",
- GTK_SIGNAL_FUNC(gtk_menu_detached_callback), (gpointer)this );
- }
+ if (menuBar->GetWindowStyle() & wxMB_DOCKABLE)
+ {
+ gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_attached",
+ GTK_SIGNAL_FUNC(gtk_menu_attached_callback), (gpointer)this );
- m_frameMenuBar->Show( TRUE );
+ gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_detached",
+ GTK_SIGNAL_FUNC(gtk_menu_detached_callback), (gpointer)this );
}
+
+ m_frameMenuBar->Show( TRUE );
}
/* resize window in OnInternalIdle */
m_frameToolBar = wxFrameBase::CreateToolBar( style, id, name );
- if (m_frameToolBar)
- GetChildren().DeleteObject( m_frameToolBar );
-
m_insertInClientArea = TRUE;
m_sizeSet = FALSE;
GetChildren().DeleteObject( m_frameToolBar );
gtk_widget_reparent( m_frameToolBar->m_widget, m_mainWidget );
- UpdateSize();
+ GtkUpdateSize();
}
}
}
return wxFrameBase::CreateStatusBar( number, style, id, name );
}
+void wxFrame::PositionStatusBar()
+{
+ if ( !m_frameStatusBar )
+ return;
+
+ m_sizeSet = FALSE;
+}
#endif // wxUSE_STATUSBAR
// ----------------------------------------------------------------------------
}
// ----------------------------------------------------------------------------
-// frame state: maximized/iconized/normal (TODO)
+// frame state: maximized/iconized/normal
// ----------------------------------------------------------------------------
void wxFrame::Maximize(bool WXUNUSED(maximize))
{
+ wxFAIL_MSG( _T("not implemented") );
}
bool wxFrame::IsMaximized() const
{
+ wxFAIL_MSG( _T("not implemented") );
+
return FALSE;
}
void wxFrame::Restore()
{
+ wxFAIL_MSG( _T("not implemented") );
}
void wxFrame::Iconize( bool iconize )
bool wxFrame::IsIconized() const
{
- return FALSE;
+ return m_isIconized;
}