]> git.saurik.com Git - wxWidgets.git/commitdiff
Added some XSyncs to help size calculations, but positioning
authorJulian Smart <julian@anthemion.co.uk>
Thu, 14 Feb 2002 18:06:50 +0000 (18:06 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Thu, 14 Feb 2002 18:06:50 +0000 (18:06 +0000)
dialog remains a mystery

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14208 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/motif/private.h
include/wx/x11/privx.h
include/wx/x11/toplevel.h
include/wx/x11/window.h
src/univ/renderer.cpp
src/x11/app.cpp
src/x11/toplevel.cpp
src/x11/utils.cpp
src/x11/window.cpp

index 9f0c237bf3e0d61d0e16ee87e70eddd28440d565..ec1f7efa653a6cac594fb8ede8486cde7a459cfe 100644 (file)
@@ -15,8 +15,7 @@
 #include "wx/defs.h"
 #include "X11/Xlib.h"
 
-class wxMouseEvent;
-class wxKeyEvent;
+#include "wx/x11/privx.h"
 
 // Put any private declarations here: native Motif types may be used because
 // this header is included after Xm/Xm.h
@@ -49,21 +48,12 @@ extern char wxFindMnemonic(const char* s);
 extern char * wxFindAccelerator (const char *s);
 extern XmString wxFindAcceleratorText (const char *s);
 
-extern int wxCharCodeXToWX(KeySym keySym);
-extern KeySym wxCharCodeWXToX(int id);
-
 // ----------------------------------------------------------------------------
 // TranslateXXXEvent() functions - translate Motif event to wxWindow one
 // ----------------------------------------------------------------------------
 extern bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget, XEvent *xevent);
 extern bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Widget widget, XEvent *xevent);
 
-int wxGetBestMatchingPixel(Display *display, XColor *desiredColor, Colormap cmap);
-Pixmap XCreateInsensitivePixmap( Display *display, Pixmap pixmap );
-
-extern XColor g_itemColors[];
-extern int wxComputeColours (Display *display, wxColour * back, wxColour * fore);
-
 extern void wxDoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour);
 extern void wxDoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, bool changeArmColour = FALSE);
 
@@ -117,24 +107,5 @@ private:
 
 extern "C" XtAppContext wxGetAppContext();
 
-#define wxMAX_RGB           0xff
-#define wxMAX_SV            1000
-#define wxSIGN(x)           ((x < 0) ? -x : x)
-#define wxH_WEIGHT          4
-#define wxS_WEIGHT          1
-#define wxV_WEIGHT          2
-
-typedef struct wx_hsv {
-                        int h,s,v;
-                      } wxHSV;
-
-#define wxMax3(x,y,z) ((x > y) ? ((x > z) ? x : z) : ((y > z) ? y : z))
-#define wxMin3(x,y,z) ((x < y) ? ((x < z) ? x : z) : ((y < z) ? y : z))
-
-void wxHSVToXColor(wxHSV *hsv,XColor *xcolor);
-void wxXColorToHSV(wxHSV *hsv,XColor *xcolor);
-void wxAllocNearestColor(Display *display,Colormap colormap,XColor *xcolor);
-void wxAllocColor(Display *display,Colormap colormap,XColor *xcolor);
-
 #endif
 // _WX_PRIVATE_H_
index a55f980277147d819451f624eb0a5a69d8932f31..5314cda202b86b7095a73a9634c54e5d8331bc09 100644 (file)
@@ -38,18 +38,6 @@ extern int wxComputeColours (Display *display, wxColour * back, wxColour * fore)
 // For convenience
 inline Display* wxGlobalDisplay() { return (Display*) wxGetDisplay(); }
 
-#define wxNO_COLORS   0x00
-#define wxBACK_COLORS 0x01
-#define wxFORE_COLORS 0x02
-
-extern XColor itemColors[5] ;
-
-#define wxBACK_INDEX 0
-#define wxFORE_INDEX 1
-#define wxSELE_INDEX 2
-#define wxTOPS_INDEX 3
-#define wxBOTS_INDEX 4
-
 #define wxMAX_RGB           0xff
 #define wxMAX_SV            1000
 #define wxSIGN(x)           ((x < 0) ? -x : x)
@@ -74,5 +62,8 @@ void wxAllocColor(Display *display,Colormap colormap,XColor *xcolor);
 wxString wxGetXEventName(XEvent& event);
 #endif
 
+// Is the window visible?
+bool wxWindowIsVisible(Window win);
+
 #endif
 // _WX_PRIVX_H_
index de89221ca1ab7682712fb450413303ec395ffa55..4f66abbf4b7c29b39c6d6b31c6d6f05e448da557 100644 (file)
@@ -78,6 +78,10 @@ protected:
 
     virtual void DoGetClientSize( int *width, int *height ) const;
     virtual void DoSetClientSize(int width, int height);
+    virtual void DoSetSize(int x, int y,
+        int width, int height,
+        int sizeFlags = wxSIZE_AUTO);
+    virtual void DoGetPosition( int *x, int *y ) const;
     
     // is the frame currently iconized?
     bool m_iconized;
index f79d378d50fb004e0a1a208e8f967ff8a0f8a985..426505a5fdee0a5ba66ba468719299160ee0eff3 100644 (file)
@@ -156,11 +156,10 @@ protected:
     
 protected:
     WXWindow              m_mainWidget;
-    
     wxRegion              m_clearRegion;
     bool                  m_clipPaintRegion;
-    
     bool                  m_winCaptured;  // ????
+    bool                  m_needsInputFocus; // Input focus set in OnIdle
 
     // implement the base class pure virtuals
     virtual void DoClientToScreen( int *x, int *y ) const;
index 16c2c2de0449d19116dad854dcb54d484f690156..4053fbf68feb622a88ae4564b76cb5af90650d7b 100644 (file)
@@ -417,6 +417,7 @@ wxControlRenderer::wxControlRenderer(wxWindow *window,
 void wxControlRenderer::DrawLabel(const wxBitmap& bitmap,
                                   wxCoord marginX, wxCoord marginY)
 {
+    m_dc.SetBackgroundMode(wxTRANSPARENT);
     m_dc.SetFont(m_window->GetFont());
     m_dc.SetTextForeground(m_window->GetForegroundColour());
 
index 232b4ec21cb95f1b6f38525b395d80e1d5546410..4d43a26b1726e7e58dd5dbfa26062c5758afb878 100644 (file)
@@ -66,14 +66,6 @@ BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
     EVT_IDLE(wxApp::OnIdle)
 END_EVENT_TABLE()
 
-static const wxCmdLineEntryDesc g_cmdLineDesc[] =
-{
-    { wxCMD_LINE_SWITCH, "sync", "sync", "synchronize the display" },
-    { wxCMD_LINE_OPTION, "display", "display",  "use the given display", wxCMD_LINE_VAL_STRING },
-
-    { wxCMD_LINE_NONE }
-};
-
 #ifdef __WXDEBUG__
 typedef int (*XErrorHandlerFunc)(Display *, XErrorEvent *);
 
@@ -179,9 +171,7 @@ int wxEntryStart( int& argc, char *argv[] )
 
     /// TODO
 #if 0
-    // Parse the arguments. Is it OK to use the command line
-    // parser before calling Initialize?
-    wxCmdLineParser cmdLine(argv, argv);
+    // Parse the arguments.
 #endif
 
     Display* xdisplay = XOpenDisplay(NULL);
@@ -413,7 +403,10 @@ void wxApp::ProcessXEvent(WXEvent* _event)
             return;
         }
         case ClientMessage:
-        {           
+        {
+            if (win && !win->IsEnabled())
+                return;
+
             Atom wm_delete_window = XInternAtom(wxGlobalDisplay(), "WM_DELETE_WINDOW", True);;
             Atom wm_protocols = XInternAtom(wxGlobalDisplay(), "WM_PROTOCOLS", True);;
 
index 68e4ef5aa3daa18759cc24872422244946787c5b..632a4e48b71a66a29a348d56fb97a575704d0dee 100644 (file)
@@ -457,6 +457,7 @@ void wxTopLevelWindowX11::DoGetClientSize( int *width, int *height ) const
 void wxTopLevelWindowX11::DoSetClientSize(int width, int height)
 {
     wxWindowX11::DoSetClientSize(width, height);
+
 #if 0
     if (!GetMainWindow())
         return;
@@ -478,3 +479,90 @@ void wxTopLevelWindowX11::DoSetClientSize(int width, int height)
         valueMask, & windowChanges);
 #endif
 }
+
+void wxTopLevelWindowX11::DoSetSize(int x, int y, int width, int height, int sizeFlags)
+{
+    wxString msg;
+    msg.Printf("Setting pos: %d, %d", x, y);
+    wxLogDebug(msg);
+    wxWindowX11::DoSetSize(x, y, width, height, sizeFlags);
+
+    wxPoint pt = GetPosition();
+    msg.Printf("After, pos: %d, %d", pt.x, pt.y);
+    wxLogDebug(msg);
+#if 0
+    XSync(wxGlobalDisplay(), False);
+    int w, h;
+    GetSize(& w, & h);
+    wxString msg;
+    msg.Printf("Before setting size: %d, %d", w, h);
+    wxLogDebug(msg);
+    if (!GetMainWindow())
+        return;
+
+    XWindowChanges windowChanges;
+    int valueMask = 0;
+
+    if (x != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+    {
+       int yy = 0;
+        AdjustForParentClientOrigin( x, yy, sizeFlags);
+        windowChanges.x = x;
+        valueMask |= CWX;
+    }
+    if (y != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+    {
+       int xx = 0;
+        AdjustForParentClientOrigin( xx, y, sizeFlags);
+        windowChanges.y = y;
+        valueMask |= CWY;
+    }
+    if (width != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+    {
+        windowChanges.width = width /* - m_borderSize*2 */;
+        valueMask |= CWWidth;
+    }
+    if (height != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+    {
+        windowChanges.height = height /* -m_borderSize*2*/;
+        valueMask |= CWHeight;
+    }
+
+    XConfigureWindow(wxGlobalDisplay(), (Window) GetMainWindow(),
+                    valueMask, & windowChanges);
+    XSync(wxGlobalDisplay(), False);
+    GetSize(& w, & h);
+    msg.Printf("Tried to set to %d, %d. After setting size: %d, %d", width, height, w, h);
+    wxLogDebug(msg);
+#endif
+}
+
+void wxTopLevelWindowX11::DoGetPosition(int *x, int *y) const
+{
+    XSync(wxGlobalDisplay(), False);
+    Window window = (Window) m_mainWidget;
+    if (window)
+    {
+       int offsetX = 0;
+       int offsetY = 0;
+       
+        wxLogDebug("Translating...");
+        Window childWindow;
+        XTranslateCoordinates(wxGlobalDisplay(), window, XDefaultRootWindow(wxGlobalDisplay()),
+                                 0, 0, & offsetX, & offsetY, & childWindow);
+
+       wxString msg;
+       msg.Printf("Offset: %d, %d", offsetX, offsetY);
+       wxLogDebug(msg);
+       
+        XWindowAttributes attr;
+        Status status = XGetWindowAttributes(wxGlobalDisplay(), window, & attr);
+        wxASSERT(status);
+        
+        if (status)
+        {
+            *x = attr.x + offsetX;
+            *y = attr.y + offsetY;
+        }
+    }
+}
index 7d6e1f93ba799ca6e09b29717125c606d85dfc99..c85fcac9ef73f0584c93f761c941729a36246d7e 100644 (file)
@@ -1231,3 +1231,11 @@ void wxDoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, boo
 
 #endif
     // __WXMOTIF__
+
+bool wxWindowIsVisible(Window win)
+{
+    XWindowAttributes wa;
+    XGetWindowAttributes(wxGlobalDisplay(), win, &wa);
+
+    return (wa.map_state == IsViewable);
+}
index 3e2f313bae43587a5a7e8e4f3b2f7fd9fa7b53d0..14e0a315f9932a38f99aa77754b7d77d76aeeb6e 100644 (file)
@@ -93,12 +93,10 @@ void wxWindowX11::Init()
 
     // X11-specific
     m_mainWidget = (WXWindow) 0;
-
     m_winCaptured = FALSE;
-
+    m_needsInputFocus = FALSE;
     m_isShown = TRUE;
     m_isBeingDeleted = FALSE;
-    
     m_lastTS = 0;
     m_lastButton = 0;
 }
@@ -209,8 +207,16 @@ void wxWindowX11::SetFocus()
     Window xwindow = (Window) GetMainWindow();
     
     wxCHECK_RET( xwindow, wxT("invalid window") );
-    
-    XSetInputFocus( wxGlobalDisplay(), xwindow, RevertToParent, CurrentTime );
+
+    if (wxWindowIsVisible(xwindow))
+    {
+        XSetInputFocus( wxGlobalDisplay(), xwindow, RevertToParent, CurrentTime );
+       m_needsInputFocus = FALSE;
+    }
+    else
+    {
+       m_needsInputFocus = TRUE;
+    }
 }
 
 // Get the window with the focus
@@ -651,6 +657,7 @@ void wxWindowX11::DoGetSize(int *x, int *y) const
 
     wxCHECK_RET( xwindow, wxT("invalid window") );
     
+    XSync(wxGlobalDisplay(), False);
     XWindowAttributes attr;
     Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr );
     wxASSERT(status);
@@ -667,6 +674,7 @@ void wxWindowX11::DoGetPosition(int *x, int *y) const
     Window window = (Window) m_mainWidget;
     if (window)
     {
+        XSync(wxGlobalDisplay(), False);
         XWindowAttributes attr;
         Status status = XGetWindowAttributes(wxGlobalDisplay(), window, & attr);
         wxASSERT(status);
@@ -720,6 +728,7 @@ void wxWindowX11::DoGetClientSize(int *x, int *y) const
 
     if (window)
     {
+        XSync(wxGlobalDisplay(), False);
         XWindowAttributes attr;
         Status status = XGetWindowAttributes( wxGlobalDisplay(), window, &attr );
         wxASSERT(status);
@@ -767,6 +776,7 @@ void wxWindowX11::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 
     XConfigureWindow(wxGlobalDisplay(), (Window) GetMainWindow(),
         valueMask, & windowChanges);
+    XSync(wxGlobalDisplay(), False);
 }
 
 void wxWindowX11::DoSetClientSize(int width, int height)
@@ -789,6 +799,7 @@ void wxWindowX11::DoSetClientSize(int width, int height)
     }
     XConfigureWindow(wxGlobalDisplay(), (Window) GetMainWindow(),
         valueMask, & windowChanges);
+    XSync(wxGlobalDisplay(), False);
 }
 
 // For implementation purposes - sometimes decorations make the client area
@@ -1040,6 +1051,10 @@ void wxWindowX11::OnInternalIdle()
     // This calls the UI-update mechanism (querying windows for
     // menu/toolbar/control state information)
     UpdateWindowUI();
+
+    // Set the input focus if couldn't do it before
+    if (m_needsInputFocus)
+       SetFocus();
 }
 
 // ----------------------------------------------------------------------------