From ea1b0d6ccb7d492f93a4f48f600ae0b6b397cbd7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Fri, 28 Sep 2001 19:18:46 +0000 Subject: [PATCH] proper fullscreen handling git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11725 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/univ/toplevel.h | 81 ++++++++++++++++++++++++---- src/univ/topluniv.cpp | 108 ++++++++++++++++++++++++++++++------- 2 files changed, 158 insertions(+), 31 deletions(-) diff --git a/include/wx/univ/toplevel.h b/include/wx/univ/toplevel.h index 5ec1389c9f..b8b8ebfa7d 100644 --- a/include/wx/univ/toplevel.h +++ b/include/wx/univ/toplevel.h @@ -16,32 +16,68 @@ #endif #include "wx/univ/inpcons.h" +#include "wx/univ/inphand.h" // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- // frame decorations type flags used in wxRenderer and wxColourScheme +// (also used for hit tests) enum { - wxTOPLEVEL_BORDER = 0x00000001, + wxTOPLEVEL_ACTIVE = 0x00000001, wxTOPLEVEL_MAXIMIZED = 0x00000002, wxTOPLEVEL_TITLEBAR = 0x00000004, wxTOPLEVEL_RESIZEABLE = 0x00000008, wxTOPLEVEL_ICON = 0x00000010, - wxTOPLEVEL_CLOSE_BUTTON = 0x00000020, - wxTOPLEVEL_MAXIMIZE_BUTTON = 0x00000040, - wxTOPLEVEL_MINIMIZE_BUTTON = 0x00000080, - wxTOPLEVEL_RESTORE_BUTTON = 0x00000100, - wxTOPLEVEL_HELP_BUTTON = 0x00000200, - wxTOPLEVEL_ACTIVE = 0x00000400 + wxTOPLEVEL_BUTTON_CLOSE = 0x00000020, + wxTOPLEVEL_BUTTON_MAXIMIZE = 0x00000040, + wxTOPLEVEL_BUTTON_MINIMIZE = 0x00000080, + wxTOPLEVEL_BUTTON_RESTORE = 0x00000100, + wxTOPLEVEL_BUTTON_HELP = 0x00000200, + wxTOPLEVEL_BORDER = 0x00000400, }; +// frame hit test return values: +enum +{ + wxHT_TOPLEVEL_NOWHERE = 0, + wxHT_TOPLEVEL_CLIENT_AREA, + wxHT_TOPLEVEL_ICON, + wxHT_TOPLEVEL_TITLEBAR, + wxHT_TOPLEVEL_BUTTON_CLOSE = wxTOPLEVEL_BUTTON_CLOSE, + wxHT_TOPLEVEL_BUTTON_MAXIMIZE = wxTOPLEVEL_BUTTON_MAXIMIZE, + wxHT_TOPLEVEL_BUTTON_MINIMIZE = wxTOPLEVEL_BUTTON_MINIMIZE, + wxHT_TOPLEVEL_BUTTON_RESTORE = wxTOPLEVEL_BUTTON_RESTORE, + wxHT_TOPLEVEL_BUTTON_HELP = wxTOPLEVEL_BUTTON_HELP, + wxHT_TOPLEVEL_BORDER_N, + wxHT_TOPLEVEL_BORDER_S, + wxHT_TOPLEVEL_BORDER_E, + wxHT_TOPLEVEL_BORDER_W, + wxHT_TOPLEVEL_BORDER_NE = wxHT_TOPLEVEL_BORDER_N | wxHT_TOPLEVEL_BORDER_E, + wxHT_TOPLEVEL_BORDER_SE = wxHT_TOPLEVEL_BORDER_S | wxHT_TOPLEVEL_BORDER_E, + wxHT_TOPLEVEL_BORDER_NW = wxHT_TOPLEVEL_BORDER_N | wxHT_TOPLEVEL_BORDER_W, + wxHT_TOPLEVEL_BORDER_SW = wxHT_TOPLEVEL_BORDER_S | wxHT_TOPLEVEL_BORDER_W, +}; + +// ---------------------------------------------------------------------------- +// the actions supported by this control +// ---------------------------------------------------------------------------- + +#define wxACTION_TOPLEVEL_ACTIVATE _T("activate") // (de)activate the frame +#define wxACTION_TOPLEVEL_CLOSE _T("close") // close the frame +#define wxACTION_TOPLEVEL_MAXIMIZE _T("maximize") // maximize the frame +#define wxACTION_TOPLEVEL_MINIMIZE _T("minimize") // minimize the frame +#define wxACTION_TOPLEVEL_RESTORE _T("restore") // undo maximization +#define wxACTION_TOPLEVEL_CONTEXT_HELP _T("contexthelp")// context help mode + //----------------------------------------------------------------------------- // wxTopLevelWindow //----------------------------------------------------------------------------- -class WXDLLEXPORT wxTopLevelWindow : public wxTopLevelWindowNative +class WXDLLEXPORT wxTopLevelWindow : public wxTopLevelWindowNative, + public wxInputConsumer { public: // construction @@ -78,14 +114,17 @@ public: // -------------------------- protected: + virtual bool PerformAction(const wxControlAction& action, + long numArg = -1, + const wxString& strArg = wxEmptyString); + virtual wxWindow *GetInputWindow() const { return (wxWindow*)this; } + // common part of all ctors void Init(); // return wxTOPLEVEL_xxx combination based on current state of the frame long GetDecorationsStyle() const; - DECLARE_DYNAMIC_CLASS(wxTopLevelWindow) - DECLARE_EVENT_TABLE() void OnNcPaint(wxPaintEvent& event); // TRUE if wxTLW should render decorations (aka titlebar) itself @@ -94,7 +133,27 @@ protected: bool m_isActive:1; // version of icon for titlebar (16x16) wxIcon m_titlebarIcon; - + // saved window style in fullscreen mdoe + long m_fsSavedStyle; + + DECLARE_DYNAMIC_CLASS(wxTopLevelWindow) + DECLARE_EVENT_TABLE() + WX_DECLARE_INPUT_CONSUMER() +}; + +// ---------------------------------------------------------------------------- +// wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStdFrameInputHandler : public wxStdInputHandler +{ +public: + wxStdFrameInputHandler(wxInputHandler *inphand); + + virtual bool HandleMouse(wxInputConsumer *consumer, + const wxMouseEvent& event); + virtual bool HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event); + virtual bool HandleActivation(wxInputConsumer *consumer, bool activated); }; #endif // __WX_UNIV_TOPLEVEL_H__ diff --git a/src/univ/topluniv.cpp b/src/univ/topluniv.cpp index 6d2d646db2..d79c39eba3 100644 --- a/src/univ/topluniv.cpp +++ b/src/univ/topluniv.cpp @@ -38,9 +38,12 @@ // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(wxTopLevelWindow, wxTopLevelWindowNative) + WX_EVENT_TABLE_INPUT_CONSUMER(wxTopLevelWindow) EVT_NC_PAINT(wxTopLevelWindow::OnNcPaint) END_EVENT_TABLE() +WX_FORWARD_TO_INPUT_CONSUMER(wxTopLevelWindow) + // ============================================================================ // implementation @@ -51,6 +54,7 @@ int wxTopLevelWindow::ms_drawDecorations = -1; void wxTopLevelWindow::Init() { m_isActive = FALSE; + m_windowStyle = 0; } bool wxTopLevelWindow::Create(wxWindow *parent, @@ -72,14 +76,16 @@ bool wxTopLevelWindow::Create(wxWindow *parent, if ( ms_drawDecorations ) { + CreateInputHandler(wxINP_HANDLER_TOPLEVEL); + styleOrig = style; exstyleOrig = GetExtraStyle(); - style &= ~(wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | - wxSYSTEM_MENU | wxRESIZE_BORDER | wxFRAME_TOOL_WINDOW | - wxTHICK_FRAME); - style = wxSIMPLE_BORDER; - SetExtraStyle(exstyleOrig & - ~(wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP)); +// style &= ~(wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | +// wxSYSTEM_MENU | wxRESIZE_BORDER | wxFRAME_TOOL_WINDOW | +// wxTHICK_FRAME); +// style = wxSIMPLE_BORDER; +// SetExtraStyle(exstyleOrig & +// ~(wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP)); } if ( !wxTopLevelWindowNative::Create(parent, id, title, pos, @@ -97,17 +103,25 @@ bool wxTopLevelWindow::Create(wxWindow *parent, bool wxTopLevelWindow::ShowFullScreen(bool show, long style) { - // VZ: doesn't compile -#if 0 if ( show == IsFullScreen() ) return FALSE; - return wxTopLevelWindowNative::ShowFullScreen(show, style); - - // FIXME_MGL -- must handle caption hiding here if not in - // native decorations mode -#endif // 0 + if ( ms_drawDecorations ) + { + if ( show ) + { + m_fsSavedStyle = m_windowStyle; + if ( style & wxFULLSCREEN_NOBORDER ) + m_windowStyle |= wxSIMPLE_BORDER; + if ( style & wxFULLSCREEN_NOCAPTION ) + m_windowStyle &= ~wxCAPTION; + } + else + { + m_windowStyle = m_fsSavedStyle; + } + } - return FALSE; + return wxTopLevelWindowNative::ShowFullScreen(show, style); } long wxTopLevelWindow::GetDecorationsStyle() const @@ -116,13 +130,13 @@ long wxTopLevelWindow::GetDecorationsStyle() const if ( m_windowStyle & wxCAPTION ) { - style |= wxTOPLEVEL_TITLEBAR | wxTOPLEVEL_CLOSE_BUTTON; + style |= wxTOPLEVEL_TITLEBAR | wxTOPLEVEL_BUTTON_CLOSE; if ( m_windowStyle & wxMINIMIZE_BOX ) - style |= wxTOPLEVEL_MINIMIZE_BUTTON; + style |= wxTOPLEVEL_BUTTON_MINIMIZE; if ( m_windowStyle & wxMAXIMIZE_BOX ) - style |= wxTOPLEVEL_MAXIMIZE_BUTTON; + style |= wxTOPLEVEL_BUTTON_MAXIMIZE; if ( m_exStyle & (wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP)) - style |= wxTOPLEVEL_HELP_BUTTON; + style |= wxTOPLEVEL_BUTTON_HELP; } if ( (m_windowStyle & (wxSIMPLE_BORDER | wxNO_BORDER)) == 0 ) style |= wxTOPLEVEL_BORDER; @@ -133,7 +147,7 @@ long wxTopLevelWindow::GetDecorationsStyle() const style |= wxTOPLEVEL_MAXIMIZED; if ( GetIcon().Ok() ) style |= wxTOPLEVEL_ICON; - if ( /*m_isActive*/ 1 /* FIXME_MGL*/ ) + if ( m_isActive ) style |= wxTOPLEVEL_ACTIVE; return style; @@ -238,7 +252,61 @@ void wxTopLevelWindow::SetIcon(const wxIcon& icon) { wxImage img = bmp1.ConvertToImage(); img.Rescale(size.x, size.y); - m_titlebarIcon.CopyFromBitmap(wxBitmap(img)); + m_titlebarIcon.CopyFromBitmap(wxBitmap(img)); } } } + +// ---------------------------------------------------------------------------- +// actions +// ---------------------------------------------------------------------------- + +bool wxTopLevelWindow::PerformAction(const wxControlAction& action, + long numArg, + const wxString& strArg) +{ + if ( action == wxACTION_TOPLEVEL_ACTIVATE ) + { + if ( m_isActive != (bool)numArg ) + { + Refresh(); + m_isActive = (bool)numArg; + wxNcPaintEvent event(GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + printf("activation: %i\n", m_isActive); + } + return TRUE; + } + else + return FALSE; +} + + +// ============================================================================ +// wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks +// ============================================================================ + +wxStdFrameInputHandler::wxStdFrameInputHandler(wxInputHandler *inphand) + : wxStdInputHandler(inphand) +{ +} + +bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer, + const wxMouseEvent& event) +{ + return wxStdInputHandler::HandleMouse(consumer, event); +} + +bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer, + const wxMouseEvent& event) +{ + return wxStdInputHandler::HandleMouseMove(consumer, event); +} + +bool wxStdFrameInputHandler::HandleActivation(wxInputConsumer *consumer, + bool activated) +{ + consumer->PerformAction(wxACTION_TOPLEVEL_ACTIVATE, activated); + return FALSE; +} -- 2.45.2