]> git.saurik.com Git - wxWidgets.git/commitdiff
proper fullscreen handling
authorVáclav Slavík <vslavik@fastmail.fm>
Fri, 28 Sep 2001 19:18:46 +0000 (19:18 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Fri, 28 Sep 2001 19:18:46 +0000 (19:18 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11725 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/univ/toplevel.h
src/univ/topluniv.cpp

index 5ec1389c9f36d0f8becee27b1fd311e4f591f6a9..b8b8ebfa7d2bc4edcee0a51851edeba474edb303 100644 (file)
 #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__
index 6d2d646db2d9f9c32ed8738b679fbc9f13ae7d38..d79c39eba32ba3f0d92d534643230f4170308731 100644 (file)
 // ----------------------------------------------------------------------------
 
 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;
+}