]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/toplevel.cpp
add support for alpha in color dialog on OSX, see #14127
[wxWidgets.git] / src / x11 / toplevel.cpp
index 7fcd2b9894ca1036389d8c1d971717e2845e1244..36804b3ae656a5dbeaedfaf6fe52e088979f2179 100644 (file)
@@ -1,12 +1,12 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        x11/toplevel.cpp
+// Name:        src/x11/toplevel.cpp
 // Purpose:     implements wxTopLevelWindow for X11
 // Author:      Julian Smart
 // Modified by:
 // Created:     24.09.01
 // RCS-ID:      $Id$
 // Copyright:   (c) 2002 Julian Smart
-// License:     wxWindows licence
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "toplevel.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
     #pragma hdrstop
 #endif
 
+#include "wx/toplevel.h"
+
 #ifndef WX_PRECOMP
     #include "wx/app.h"
-    #include "wx/toplevel.h"
     #include "wx/string.h"
     #include "wx/log.h"
     #include "wx/intl.h"
     #include "wx/frame.h"
     #include "wx/menu.h"
     #include "wx/statusbr.h"
+    #include "wx/settings.h"
 #endif //WX_PRECOMP
 
-#include "wx/settings.h"
 #include "wx/x11/private.h"
 #include "X11/Xutil.h"
 
@@ -54,20 +51,20 @@ bool wxMWMIsRunning(Window w);
 void wxTopLevelWindowX11::Init()
 {
     m_iconized =
-    m_maximizeOnShow = FALSE;
+    m_maximizeOnShow = false;
 
     // unlike (almost?) all other windows, frames are created hidden
-    m_isShown = FALSE;
+    m_isShown = false;
 
     // Data to save/restore when calling ShowFullScreen
     m_fsStyle = 0;
-    m_fsIsMaximized = FALSE;
-    m_fsIsShowing = FALSE;
-    
-    m_needResizeInIdle = FALSE;
-    
-    m_x = -1;
-    m_y = -1;
+    m_fsIsMaximized = false;
+    m_fsIsShowing = false;
+
+    m_needResizeInIdle = false;
+
+    m_x = wxDefaultCoord;
+    m_y = wxDefaultCoord;
     m_width = 20;
     m_height = 20;
 }
@@ -88,45 +85,45 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent,
 
     SetName(name);
 
-    m_windowId = id == -1 ? NewControlId() : id;
+    m_windowId = id == wxID_ANY ? NewControlId() : id;
 
     if (parent)
         parent->AddChild(this);
 
     wxTopLevelWindows.Append(this);
-    
+
     Display *xdisplay = wxGlobalDisplay();
     int xscreen = DefaultScreen( xdisplay );
     Visual *xvisual = DefaultVisual( xdisplay, xscreen );
     Window xparent = RootWindow( xdisplay, xscreen );
     Colormap cm = DefaultColormap( xdisplay, xscreen );
-    
+
     if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)
         m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
     else
         m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
     m_backgroundColour.CalcPixel( (WXColormap) cm );
-    m_hasBgCol = TRUE;
-       
+    m_hasBgCol = true;
+
     m_x = pos.x;
     if (m_x < -1)
         m_x = 10;
-        
+
     m_y = pos.y;
     if (m_y < 0)
         m_y = 10;
-        
+
     m_width = size.x;
     if (m_width < 0)
         m_width = 500;
-        
+
     m_height = size.y;
     if (m_height < 0)
         m_height = 380;
-    
+
 #if !wxUSE_NANOX
     XSetWindowAttributes xattributes;
-    
+
     long xattributes_mask =
         CWBorderPixel | CWBackPixel;
 
@@ -138,27 +135,27 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent,
         xattributes_mask |= CWOverrideRedirect;
         xattributes.override_redirect = True;
     }
-    
+
     if (!HasFlag( wxFULL_REPAINT_ON_RESIZE ))
     {
         xattributes_mask |= CWBitGravity;
         xattributes.bit_gravity = NorthWestGravity;
     }
-    
+
     xattributes_mask |= CWEventMask;
-    xattributes.event_mask = 
+    xattributes.event_mask =
         ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
         ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask |
         KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask |
         PropertyChangeMask;
-        
+
     Window xwindow = XCreateWindow( xdisplay, xparent, m_x, m_y, m_width, m_height,
                                     0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes );
 #else
     long backColor, foreColor;
     backColor = GR_RGB(m_backgroundColour.Red(), m_backgroundColour.Green(), m_backgroundColour.Blue());
     foreColor = GR_RGB(m_foregroundColour.Red(), m_foregroundColour.Green(), m_foregroundColour.Blue());
-    
+
     Window xwindow = XCreateWindowWithColor( xdisplay, xparent, m_x, m_y, m_width, m_height,
                                     0, 0, InputOutput, xvisual, backColor, foreColor);
 #endif
@@ -201,9 +198,9 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent,
     {
        if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)
        {
-            if (GetParent() && GetParent()->GetMainWindow())
+            if (GetParent() && GetParent()->X11GetMainWindow())
             {
-                Window xparentwindow = (Window) GetParent()->GetMainWindow();
+                Window xparentwindow = (Window) GetParent()->X11GetMainWindow();
                 XSetTransientForHint( xdisplay, xwindow, xparentwindow );
             }
         }
@@ -217,13 +214,13 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent,
     size_hints.height = m_height;
     size_hints.win_gravity = NorthWestGravity;
     XSetWMNormalHints( xdisplay, xwindow, &size_hints);
-    
+
     XWMHints wm_hints;
     wm_hints.flags = InputHint | StateHint;
     if (GetParent())
-    {  
+    {
         wm_hints.flags |= WindowGroupHint;
-        wm_hints.window_group = (Window) GetParent()->GetMainWindow();
+        wm_hints.window_group = (Window) GetParent()->X11GetMainWindow();
     }
     wm_hints.input = True;
     wm_hints.initial_state = NormalState;
@@ -235,12 +232,12 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent,
     XSetWMProtocols( xdisplay, xwindow, wm_protocols, 2);
 
 #endif
-    
+
     wxSetWMDecorations( xwindow, style);
 
     SetTitle(title);
-    
-    return TRUE;
+
+    return true;
 }
 
 wxTopLevelWindowX11::~wxTopLevelWindowX11()
@@ -263,7 +260,7 @@ wxTopLevelWindowX11::~wxTopLevelWindowX11()
 void wxTopLevelWindowX11::OnInternalIdle()
 {
     wxWindow::OnInternalIdle();
-    
+
     // Do this only after the last idle event so that
     // all windows have been updated before a new
     // round of size events is sent
@@ -271,9 +268,9 @@ void wxTopLevelWindowX11::OnInternalIdle()
     {
         wxSizeEvent event( GetClientSize(), GetId() );
         event.SetEventObject( this );
-        GetEventHandler()->ProcessEvent( event );
-        
-        m_needResizeInIdle = FALSE;
+        HandleWindowEvent( event );
+
+        m_needResizeInIdle = false;
     }
 }
 
@@ -286,15 +283,15 @@ bool wxTopLevelWindowX11::Show(bool show)
     if (show)
     {
         wxSizeEvent event(GetSize(), GetId());
-        
+
         event.SetEventObject(this);
-        GetEventHandler()->ProcessEvent(event);
-        
-        m_needResizeInIdle = FALSE;
+        HandleWindowEvent(event);
+
+        m_needResizeInIdle = false;
     }
 
     bool ret = wxWindowX11::Show(show);
-    
+
     return ret;
 }
 
@@ -302,7 +299,7 @@ bool wxTopLevelWindowX11::Show(bool show)
 // wxTopLevelWindowX11 maximize/minimize
 // ----------------------------------------------------------------------------
 
-void wxTopLevelWindowX11::Maximize(bool maximize)
+void wxTopLevelWindowX11::Maximize(bool WXUNUSED(maximize))
 {
     // TODO
 }
@@ -310,16 +307,22 @@ void wxTopLevelWindowX11::Maximize(bool maximize)
 bool wxTopLevelWindowX11::IsMaximized() const
 {
     // TODO
-    return TRUE;
+    return true;
 }
 
 void wxTopLevelWindowX11::Iconize(bool iconize)
 {
-    if (!m_iconized && GetMainWindow())
+    if ( !iconize )
+    {
+        Restore();
+        return;
+    }
+
+    if (!m_iconized && X11GetMainWindow())
     {
         if (XIconifyWindow(wxGlobalDisplay(),
-            (Window) GetMainWindow(), DefaultScreen(wxGlobalDisplay())) != 0)
-            m_iconized = TRUE;
+            (Window) X11GetMainWindow(), DefaultScreen(wxGlobalDisplay())) != 0)
+            m_iconized = true;
     }
 }
 
@@ -331,10 +334,10 @@ bool wxTopLevelWindowX11::IsIconized() const
 void wxTopLevelWindowX11::Restore()
 {
     // This is the way to deiconify the window, according to the X FAQ
-    if (m_iconized && GetMainWindow())
+    if (m_iconized && X11GetMainWindow())
     {
-        XMapWindow(wxGlobalDisplay(), (Window) GetMainWindow());
-        m_iconized = FALSE;
+        XMapWindow(wxGlobalDisplay(), (Window) X11GetMainWindow());
+        m_iconized = false;
     }
 }
 
@@ -347,24 +350,24 @@ bool wxTopLevelWindowX11::ShowFullScreen(bool show, long style)
     if (show)
     {
         if (IsFullScreen())
-            return FALSE;
+            return false;
 
-        m_fsIsShowing = TRUE;
+        m_fsIsShowing = true;
         m_fsStyle = style;
 
         // TODO
 
-        return TRUE;
+        return true;
     }
     else
     {
         if (!IsFullScreen())
-            return FALSE;
+            return false;
 
-        m_fsIsShowing = FALSE;
+        m_fsIsShowing = false;
 
         // TODO
-        return TRUE;
+        return true;
     }
 }
 
@@ -374,10 +377,9 @@ bool wxTopLevelWindowX11::ShowFullScreen(bool show, long style)
 
 void wxTopLevelWindowX11::DoSetIcon(const wxIcon& icon)
 {
-    if (icon.Ok() && GetMainWindow())
+    if (icon.IsOk() && X11GetMainWindow())
     {
-#if wxUSE_NANOX
-#else
+#if !wxUSE_NANOX
         XWMHints *wmHints = XAllocWMHints();
         wmHints->icon_pixmap = (Pixmap) icon.GetPixmap();
 
@@ -389,7 +391,7 @@ void wxTopLevelWindowX11::DoSetIcon(const wxIcon& icon)
             wmHints->icon_mask = (Pixmap) icon.GetMask()->GetBitmap();
         }
 
-        XSetWMHints(wxGlobalDisplay(), (Window) GetMainWindow(), wmHints);
+        XSetWMHints(wxGlobalDisplay(), (Window) X11GetMainWindow(), wmHints);
         XFree(wmHints);
 #endif
     }
@@ -401,32 +403,32 @@ void wxTopLevelWindowX11::SetIcons(const wxIconBundle& icons )
     wxTopLevelWindowBase::SetIcons( icons );
 
     DoSetIcon( icons.GetIcon( -1 ) );
-    wxSetIconsX11( wxGlobalDisplay(), GetMainWindow(), icons );
+    wxSetIconsX11( wxGlobalDisplay(), X11GetMainWindow(), icons );
 }
 
 bool wxTopLevelWindowX11::SetShape(const wxRegion& region)
 {
     return wxDoSetShape( wxGlobalDisplay(),
-                         (Window)GetMainWindow(),
+                         (Window)X11GetMainWindow(),
                          region );
 }
 
 void wxTopLevelWindowX11::SetTitle(const wxString& title)
 {
     m_title = title;
-    
-    if (GetMainWindow())
+
+    if (X11GetMainWindow())
     {
 #if wxUSE_UNICODE
         //  I wonder of e.g. Metacity takes UTF-8 here
-        XStoreName(wxGlobalDisplay(), (Window) GetMainWindow(),
+        XStoreName(wxGlobalDisplay(), (Window) X11GetMainWindow(),
             (const char*) title.ToAscii() );
-        XSetIconName(wxGlobalDisplay(), (Window) GetMainWindow(),
+        XSetIconName(wxGlobalDisplay(), (Window) X11GetMainWindow(),
             (const char*) title.ToAscii() );
 #else
-        XStoreName(wxGlobalDisplay(), (Window) GetMainWindow(),
+        XStoreName(wxGlobalDisplay(), (Window) X11GetMainWindow(),
             (const char*) title);
-        XSetIconName(wxGlobalDisplay(), (Window) GetMainWindow(),
+        XSetIconName(wxGlobalDisplay(), (Window) X11GetMainWindow(),
             (const char*) title);
 #endif
     }
@@ -471,20 +473,20 @@ void wxTopLevelWindowX11::DoSetClientSize(int width, int height)
 
     m_width = width;
     m_height = height;
-    
+
     if (m_width == old_width && m_height == old_height)
         return;
-        
+
     // wxLogDebug("DoSetClientSize: %s (%ld) %dx%d", GetClassInfo()->GetClassName(), GetId(), width, height);
-    
+
 #if !wxUSE_NANOX
     XSizeHints size_hints;
     size_hints.flags = PSize;
     size_hints.width = width;
     size_hints.height = height;
-    XSetWMNormalHints( wxGlobalDisplay(), (Window) GetMainWindow(), &size_hints );
+    XSetWMNormalHints( wxGlobalDisplay(), (Window) X11GetMainWindow(), &size_hints );
 #endif
-    
+
     wxWindowX11::DoSetClientSize(width, height);
 }
 
@@ -495,24 +497,24 @@ void wxTopLevelWindowX11::DoSetSize(int x, int y, int width, int height, int siz
     int old_width = m_width;
     int old_height = m_height;
 
-    if (x != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+    if (x != wxDefaultCoord || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
         m_x = x;
-        
-    if (y != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+
+    if (y != wxDefaultCoord || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
         m_y = y;
-        
-    if (width != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+
+    if (width != wxDefaultCoord || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
         m_width = width;
-        
-    if (height != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+
+    if (height != wxDefaultCoord || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
         m_height = height;
-        
+
     if (m_x == old_x && m_y == old_y && m_width == old_width && m_height == old_height)
         return;
-    
+
     // wxLogDebug("DoSetSize: %s (%ld) %d, %d %dx%d", GetClassInfo()->GetClassName(), GetId(), x, y, width, height);
 
-#if !wxUSE_NANOX    
+#if !wxUSE_NANOX
     XSizeHints size_hints;
     size_hints.flags = 0;
     size_hints.flags |= PPosition;
@@ -521,11 +523,11 @@ void wxTopLevelWindowX11::DoSetSize(int x, int y, int width, int height, int siz
     size_hints.y = m_y;
     size_hints.width = m_width;
     size_hints.height = m_height;
-    XSetWMNormalHints( wxGlobalDisplay(), (Window) GetMainWindow(), &size_hints);
+    XSetWMNormalHints( wxGlobalDisplay(), (Window) X11GetMainWindow(), &size_hints);
 #endif
 
     wxWindowX11::DoSetSize(x, y, width, height, sizeFlags);
-    
+
 #if 0
     Display *display = wxGlobalDisplay();
     Window root = RootWindowOfScreen(DefaultScreenOfDisplay(display));
@@ -555,20 +557,20 @@ void wxTopLevelWindowX11::DoSetSize(int x, int y, int width, int height, int siz
     windowChanges.stack_mode = 0;
     int valueMask = CWX | CWY | CWWidth | CWHeight;
 
-    if (x != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+    if (x != wxDefaultCoord || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
     {
         valueMask |= CWX;
     }
-    if (y != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+    if (y != wxDefaultCoord || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
     {
         valueMask |= CWY;
     }
-    if (width != -1)
+    if (width != wxDefaultCoord)
     {
         windowChanges.width = wxMax(1, width);
         valueMask |= CWWidth;
     }
-    if (height != -1)
+    if (height != wxDefaultCoord)
     {
         windowChanges.height = wxMax(1, height);
         valueMask |= CWHeight;
@@ -655,7 +657,7 @@ void wxTopLevelWindowX11::DoGetPosition(int *x, int *y) const
 #define MWM_INPUT_FULL_APPLICATION_MODAL 3
 #define MWM_INPUT_APPLICATION_MODAL MWM_INPUT_PRIMARY_APPLICATION_MODAL
 
-#define MWM_TEAROFF_WINDOW     (1L<<0)
+#define MWM_TEAROFF_WINDOW (1L<<0)
 
 #endif
 
@@ -669,7 +671,7 @@ struct MwmHints {
 #define PROP_MOTIF_WM_HINTS_ELEMENTS 5
 
 // Set the window manager decorations according to the
-// given wxWindows style
+// given wxWidgets style
 bool wxSetWMDecorations(Window w, long style)
 {
 #if wxUSE_NANOX
@@ -691,8 +693,7 @@ bool wxSetWMDecorations(Window w, long style)
     }
 
     if ((style & wxCAPTION) ||
-        (style & wxTINY_CAPTION_HORIZ) ||
-        (style & wxTINY_CAPTION_VERT))
+        (style & wxTINY_CAPTION))
     {
         wmProp.props |= GR_WM_PROPS_CAPTION ;
         wmProp.flags |= GR_WM_FLAGS_PROPS ;
@@ -700,10 +701,10 @@ bool wxSetWMDecorations(Window w, long style)
         // The default dialog style doesn't include any kind
         // of border, which is a bit odd. Anyway, inclusion
         // of a caption surely implies a border.
-        style |= wxTHICK_FRAME;
+        style |= wxRESIZE_BORDER;
     }
 
-    if (style & wxTHICK_FRAME)
+    if (style & wxRESIZE_BORDER)
     {
         wmProp.props |= GR_WM_PROPS_APPFRAME ;
         wmProp.flags |= GR_WM_FLAGS_PROPS ;
@@ -725,26 +726,25 @@ bool wxSetWMDecorations(Window w, long style)
         wmProp.flags |= GR_WM_FLAGS_PROPS ;
     }
 
-    if (((style & wxBORDER) != wxBORDER) && ((style & wxTHICK_FRAME) != wxTHICK_FRAME)
-        && ((style & wxRESIZE_BORDER) != wxRESIZE_BORDER))
+    if ( !(style & wxBORDER) && !(style & wxRESIZE_BORDER) )
     {
         wmProp.props |= GR_WM_PROPS_NODECORATE ;
         wmProp.flags |= GR_WM_FLAGS_PROPS ;
     }
 
     GrSetWMProperties(w, & wmProp);
-    
+
 #else
 
     Atom mwm_wm_hints = XInternAtom(wxGlobalDisplay(),"_MOTIF_WM_HINTS", False);
     if (mwm_wm_hints == 0)
-       return FALSE;
-    
+       return false;
+
     MwmHints hints;
     hints.flags = MWM_HINTS_DECORATIONS | MWM_HINTS_FUNCTIONS;
     hints.decorations = 0;
     hints.functions = 0;
-    
+
     if ((style & wxSIMPLE_BORDER) || (style & wxNO_BORDER))
     {
         // leave zeros
@@ -756,25 +756,25 @@ bool wxSetWMDecorations(Window w, long style)
 
         if ((style & wxCAPTION) != 0)
             hints.decorations |= MWM_DECOR_TITLE;
-            
+
         if ((style & wxSYSTEM_MENU) != 0)
             hints.decorations |= MWM_DECOR_MENU;
-        
+
         if ((style & wxCLOSE_BOX) != 0)
             hints.functions |= MWM_FUNC_CLOSE;
-        
+
         if ((style & wxMINIMIZE_BOX) != 0)
         {
             hints.functions |= MWM_FUNC_MINIMIZE;
             hints.decorations |= MWM_DECOR_MINIMIZE;
         }
-        
+
         if ((style & wxMAXIMIZE_BOX) != 0)
         {
             hints.functions |= MWM_FUNC_MAXIMIZE;
             hints.decorations |= MWM_DECOR_MAXIMIZE;
         }
-        
+
         if ((style & wxRESIZE_BORDER) != 0)
         {
             hints.functions |= MWM_FUNC_RESIZE;
@@ -783,13 +783,11 @@ bool wxSetWMDecorations(Window w, long style)
     }
 
     XChangeProperty(wxGlobalDisplay(),
-                   w,
-                   mwm_wm_hints, mwm_wm_hints,
-                   32, PropModeReplace,
-                   (unsigned char *) &hints, PROP_MOTIF_WM_HINTS_ELEMENTS);
+                    w,
+                    mwm_wm_hints, mwm_wm_hints,
+                    32, PropModeReplace,
+                    (unsigned char *) &hints, PROP_MOTIF_WM_HINTS_ELEMENTS);
 
 #endif
-    return TRUE;
+    return true;
 }
-
-