]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/toplevel.cpp
allow the user to press Esc to close preview frame wherever the focus is, not only...
[wxWidgets.git] / src / x11 / toplevel.cpp
index c9babe382597573abed672b42197116ed1b78dc5..0f7e4a9b4d304e5aa6f85f7dfd308842d6e55a1d 100644 (file)
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        x11/toplevel.cpp
+// Name:        src/x11/toplevel.cpp
 // Purpose:     implements wxTopLevelWindow for X11
 // Author:      Julian Smart
 // Modified by:
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
-    #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( wxNO_FULL_REPAINT_ON_RESIZE ))
+
+    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
@@ -217,11 +214,11 @@ 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();
     }
@@ -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()
@@ -248,7 +245,7 @@ wxTopLevelWindowX11::~wxTopLevelWindowX11()
     wxTopLevelWindows.DeleteObject(this);
 
     // If this is the last top-level window, exit.
-    if ( wxTheApp && (wxTopLevelWindows.Number() == 0) )
+    if ( wxTheApp && (wxTopLevelWindows.GetCount() == 0) )
     {
         wxTheApp->SetTopWindow(NULL);
 
@@ -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
@@ -272,8 +269,8 @@ void wxTopLevelWindowX11::OnInternalIdle()
         wxSizeEvent event( GetClientSize(), GetId() );
         event.SetEventObject( this );
         GetEventHandler()->ProcessEvent( event );
-        
-        m_needResizeInIdle = FALSE;
+
+        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;
+
+        m_needResizeInIdle = false;
     }
 
     bool ret = wxWindowX11::Show(show);
-    
+
     return ret;
 }
 
@@ -310,7 +307,7 @@ void wxTopLevelWindowX11::Maximize(bool maximize)
 bool wxTopLevelWindowX11::IsMaximized() const
 {
     // TODO
-    return TRUE;
+    return true;
 }
 
 void wxTopLevelWindowX11::Iconize(bool iconize)
@@ -319,7 +316,7 @@ void wxTopLevelWindowX11::Iconize(bool iconize)
     {
         if (XIconifyWindow(wxGlobalDisplay(),
             (Window) GetMainWindow(), DefaultScreen(wxGlobalDisplay())) != 0)
-            m_iconized = TRUE;
+            m_iconized = true;
     }
 }
 
@@ -334,7 +331,7 @@ void wxTopLevelWindowX11::Restore()
     if (m_iconized && GetMainWindow())
     {
         XMapWindow(wxGlobalDisplay(), (Window) GetMainWindow());
-        m_iconized = FALSE;
+        m_iconized = false;
     }
 }
 
@@ -347,24 +344,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;
     }
 }
 
@@ -376,8 +373,7 @@ void wxTopLevelWindowX11::DoSetIcon(const wxIcon& icon)
 {
     if (icon.Ok() && GetMainWindow())
     {
-#if wxUSE_NANOX
-#else
+#if !wxUSE_NANOX
         XWMHints *wmHints = XAllocWMHints();
         wmHints->icon_pixmap = (Pixmap) icon.GetPixmap();
 
@@ -404,16 +400,31 @@ void wxTopLevelWindowX11::SetIcons(const wxIconBundle& icons )
     wxSetIconsX11( wxGlobalDisplay(), GetMainWindow(), icons );
 }
 
+bool wxTopLevelWindowX11::SetShape(const wxRegion& region)
+{
+    return wxDoSetShape( wxGlobalDisplay(),
+                         (Window)GetMainWindow(),
+                         region );
+}
+
 void wxTopLevelWindowX11::SetTitle(const wxString& title)
 {
     m_title = title;
-    
+
     if (GetMainWindow())
     {
+#if wxUSE_UNICODE
+        //  I wonder of e.g. Metacity takes UTF-8 here
+        XStoreName(wxGlobalDisplay(), (Window) GetMainWindow(),
+            (const char*) title.ToAscii() );
+        XSetIconName(wxGlobalDisplay(), (Window) GetMainWindow(),
+            (const char*) title.ToAscii() );
+#else
         XStoreName(wxGlobalDisplay(), (Window) GetMainWindow(),
             (const char*) title);
         XSetIconName(wxGlobalDisplay(), (Window) GetMainWindow(),
             (const char*) title);
+#endif
     }
 }
 
@@ -456,12 +467,12 @@ 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;
@@ -469,7 +480,7 @@ void wxTopLevelWindowX11::DoSetClientSize(int width, int height)
     size_hints.height = height;
     XSetWMNormalHints( wxGlobalDisplay(), (Window) GetMainWindow(), &size_hints );
 #endif
-    
+
     wxWindowX11::DoSetClientSize(width, height);
 }
 
@@ -480,24 +491,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;
@@ -510,7 +521,7 @@ void wxTopLevelWindowX11::DoSetSize(int x, int y, int width, int height, int siz
 #endif
 
     wxWindowX11::DoSetSize(x, y, width, height, sizeFlags);
-    
+
 #if 0
     Display *display = wxGlobalDisplay();
     Window root = RootWindowOfScreen(DefaultScreenOfDisplay(display));
@@ -540,20 +551,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;
@@ -640,7 +651,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
 
@@ -654,7 +665,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
@@ -669,7 +680,7 @@ bool wxSetWMDecorations(Window w, long style)
         wmProp.flags |= GR_WM_FLAGS_PROPS ;
     }
 
-    if (style & wxSYSTEM_MENU)
+    if (style & wxCLOSE_BOX)
     {
         wmProp.props |= GR_WM_PROPS_CLOSEBOX ;
         wmProp.flags |= GR_WM_FLAGS_PROPS ;
@@ -685,10 +696,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 ;
@@ -710,7 +721,7 @@ bool wxSetWMDecorations(Window w, long style)
         wmProp.flags |= GR_WM_FLAGS_PROPS ;
     }
 
-    if (((style & wxBORDER) != wxBORDER) && ((style & wxTHICK_FRAME) != wxTHICK_FRAME)
+    if (((style & wxBORDER) != wxBORDER) && ((style & wxRESIZE_BORDER) != wxRESIZE_BORDER)
         && ((style & wxRESIZE_BORDER) != wxRESIZE_BORDER))
     {
         wmProp.props |= GR_WM_PROPS_NODECORATE ;
@@ -718,18 +729,18 @@ bool wxSetWMDecorations(Window w, long style)
     }
 
     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
@@ -741,25 +752,25 @@ bool wxSetWMDecorations(Window w, long style)
 
         if ((style & wxCAPTION) != 0)
             hints.decorations |= MWM_DECOR_TITLE;
-            
+
         if ((style & wxSYSTEM_MENU) != 0)
-        {
-            hints.functions |= MWM_FUNC_CLOSE;
             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;
@@ -768,13 +779,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;
 }
-
-