]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/window.cpp
added SetDoubleBuffered() (patch 1491093)
[wxWidgets.git] / src / motif / window.cpp
index 63a644d3106571fce353e7fa2b1ba527edca26c6..88508d610ddee15b5951727d689ba6e2048e315c 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        windows.cpp
+// Name:        src/motif/windows.cpp
 // Purpose:     wxWindow
 // Author:      Julian Smart
 // Modified by:
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "window.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #define XtScreen XTSCREEN
 #endif
 
-#include "wx/setup.h"
-#include "wx/menu.h"
-#include "wx/dc.h"
-#include "wx/dcclient.h"
-#include "wx/utils.h"
-#include "wx/app.h"
+#ifndef WX_PRECOMP
+    #include "wx/hash.h"
+    #include "wx/log.h"
+    #include "wx/app.h"
+    #include "wx/utils.h"
+    #include "wx/frame.h"
+    #include "wx/dc.h"
+    #include "wx/dcclient.h"
+    #include "wx/button.h"
+    #include "wx/menu.h"
+    #include "wx/settings.h"
+#endif
+
 #include "wx/layout.h"
-#include "wx/button.h"
-#include "wx/settings.h"
-#include "wx/frame.h"
 #include "wx/scrolwin.h"
 #include "wx/module.h"
 #include "wx/menuitem.h"
-#include "wx/log.h"
 #include "wx/evtloop.h"
-#include "wx/hash.h"
 
 #if  wxUSE_DRAG_AND_DROP
     #include "wx/dnd.h"
 
 #include <string.h>
 
-// ----------------------------------------------------------------------------
-// constants
-// ----------------------------------------------------------------------------
-
-static const int SCROLL_MARGIN = 4;
-
 // ----------------------------------------------------------------------------
 // global variables for this module
 // ----------------------------------------------------------------------------
@@ -210,7 +202,7 @@ void wxWindow::Init()
     m_winCaptured = false;
 
     m_isShown = true;
-    
+
     m_hScrollBar =
     m_vScrollBar =
     m_borderWidget =
@@ -253,7 +245,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     //// drawing area, since otherwise the translations are different.
 
     // New translations for getting mouse motion feedback
-    static const String translations =
+    static const String translations = wxMOTIF_STR(
 "<Btn1Motion>: wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\
 <Btn2Motion>: wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\
 <Btn3Motion>: wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\
@@ -267,10 +259,10 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
 <Motion>: wxCanvasMotionEvent() DrawingAreaInput()\n\
 <EnterWindow>: wxCanvasMotionEvent() DrawingAreaInput()\n\
 <LeaveWindow>: wxCanvasMotionEvent() DrawingAreaInput()\n\
-<Key>: DrawingAreaInput()";
+<Key>: DrawingAreaInput()");
 
     XtActionsRec actions[1];
-    actions[0].string = "wxCanvasMotionEvent";
+    actions[0].string = wxMOTIF_STR("wxCanvasMotionEvent");
     actions[0].proc = (XtActionProc) wxCanvasMotionEvent;
     XtAppAddActions ((XtAppContext) wxTheApp->GetAppContext(), actions, 1);
 
@@ -362,7 +354,7 @@ wxWindow::~wxWindow()
 {
     if (g_captureWindow == this)
         g_captureWindow = NULL;
-    
+
     m_isBeingDeleted = true;
 
     // Motif-specific actions first
@@ -642,17 +634,17 @@ void wxWindow::Lower()
     XLowerWindow(XtDisplay(wTop), window);
 }
 
-void wxWindow::SetTitle(const wxString& title)
+void wxWindow::SetLabel(const wxString& label)
 {
-    XtVaSetValues((Widget)GetMainWidget(), XmNtitle, title.c_str(), NULL);
+    XtVaSetValues((Widget)GetMainWidget(), XmNtitle, label.c_str(), NULL);
 }
 
-wxString wxWindow::GetTitle() const
+wxString wxWindow::GetLabel() const
 {
-    char *title;
-    XtVaGetValues((Widget)GetMainWidget(), XmNtitle, &title, NULL);
+    char *label;
+    XtVaGetValues((Widget)GetMainWidget(), XmNtitle, &label, NULL);
 
-    return wxString(title);
+    return wxString(label);
 }
 
 void wxWindow::DoCaptureMouse()
@@ -704,7 +696,7 @@ bool wxWindow::SetCursor(const wxCursor& cursor)
 
     //    wxASSERT_MSG( m_cursor.Ok(),
     //                  wxT("cursor must be valid after call to the base version"));
-    wxCursor* cursor2 = NULL;
+    const wxCursor* cursor2 = NULL;
     if (m_cursor.Ok())
         cursor2 = & m_cursor;
     else
@@ -757,12 +749,12 @@ int wxWindow::GetScrollPos(int orient) const
 int wxWindow::GetScrollRange(int orient) const
 {
     Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient);
-    // CE scintilla windows don't always have these scrollbars 
+    // CE scintilla windows don't always have these scrollbars
     // and it tends to pile up a whole bunch of asserts
     //wxCHECK_MSG( scrollBar, 0, "no such scrollbar" );
 
     int range = 0;
-    if (scrollBar) 
+    if (scrollBar)
         XtVaGetValues(scrollBar, XmNmaximum, &range, NULL);
     return range;
 }
@@ -862,7 +854,7 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
 
     // Adjusting scrollbars can resize the canvas accidentally
     if (newW != oldW || newH != oldH)
-        SetSize(-1, -1, oldW, oldH);
+        SetSize(wxDefaultCoord, wxDefaultCoord, oldW, oldH);
 }
 
 // Does a physical scroll
@@ -1075,7 +1067,7 @@ void wxWindow::DoSetToolTip(wxToolTip * WXUNUSED(tooltip))
 
 bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
 {
-    if ( x == -1 && y == -1 )
+    if ( x == wxDefaultCoord && y == wxDefaultCoord )
     {
         wxPoint mouse = ScreenToClient(wxGetMousePosition());
         x = mouse.x; y = mouse.y;
@@ -1099,7 +1091,7 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
     }
 
     menu->SetId(1); /* Mark as popped-up */
-    menu->CreateMenu(NULL, widget, menu);
+    menu->CreateMenu(NULL, widget, menu, 0);
     menu->SetInvokingWindow(this);
 
     menu->UpdateUI();
@@ -1185,7 +1177,7 @@ void wxWindow::DoGetSize(int *x, int *y) const
                    XmNwidth, &xx,
                    XmNheight, &yy,
                    NULL );
-    if(x) *x = xx; 
+    if(x) *x = xx;
     if(y) *y = yy;
 }
 
@@ -1193,7 +1185,7 @@ void wxWindow::DoGetPosition(int *x, int *y) const
 {
     Widget widget = (Widget)
         ( m_drawingArea ?
-          ( m_borderWidget ? m_borderWidget : m_scrolledWindow ) : 
+          ( m_borderWidget ? m_borderWidget : m_scrolledWindow ) :
           GetTopWidget() );
 
     Position xx, yy;
@@ -1204,8 +1196,8 @@ void wxWindow::DoGetPosition(int *x, int *y) const
     if (GetParent())
     {
         wxPoint pt(GetParent()->GetClientAreaOrigin());
-        xx -= pt.x;
-        yy -= pt.y;
+        xx = (Position)(xx - pt.x);
+        yy = (Position)(yy - pt.y);
     }
 
     if(x) *x = xx;
@@ -1258,6 +1250,7 @@ void wxWindow::DoSetSizeIntr(int x, int y, int width, int height,
 {
     // A bit of optimization to help sort out the flickers.
     int oldX = -1, oldY = -1, oldW = -1, oldH = -1;
+
     if( !fromCtor )
     {
         GetSize(& oldW, & oldH);
@@ -1272,7 +1265,7 @@ void wxWindow::DoSetSizeIntr(int x, int y, int width, int height,
             y = oldY;
     }
 
-    wxSize size(-1, -1);
+    wxSize size(wxDefaultSize);
     if ( width <= 0 )
     {
         if ( ( sizeFlags & wxSIZE_AUTO_WIDTH ) && !fromCtor )
@@ -1465,7 +1458,7 @@ int wxWindow::GetCharHeight() const
     wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
 
     int height;
-    
+
     wxGetTextExtent (GetXDisplay(), m_font, 1.0,
                      "x", NULL, &height, NULL, NULL);
 
@@ -1477,7 +1470,7 @@ int wxWindow::GetCharWidth() const
     wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
 
     int width;
-    
+
     wxGetTextExtent (GetXDisplay(), m_font, 1.0,
                      "x", &width, NULL, NULL, NULL);
 
@@ -1743,18 +1736,18 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
 
 bool wxAddWindowToTable(Widget w, wxWindow *win)
 {
-    wxWindow *oldItem = NULL;
-    if ((oldItem = (wxWindow *)wxWidgetHashTable->Get ((long) w)))
+    const long key = (long)w;
+    if ( wxWidgetHashTable->Get(key))
     {
         wxLogDebug("Widget table clash: new widget is %ld, %s",
-                   (long)w, win->GetClassInfo()->GetClassName());
+                   key, win->GetClassInfo()->GetClassName());
         return false;
     }
 
-    wxWidgetHashTable->Put((long) w, win);
+    wxWidgetHashTable->Put(key, win);
 
     wxLogTrace("widget", "Widget 0x%p <-> window %p (%s)",
-               (WXWidget)w, win, win->GetClassInfo()->GetClassName());
+               w, win, win->GetClassInfo()->GetClassName());
 
     return true;
 }
@@ -1807,16 +1800,11 @@ bool wxWindow::AttachWidget (wxWindow* WXUNUSED(parent), WXWidget mainWidget,
         XtFree ((char *) ptr);
     }
 
-    SetInitialBestSize(wxSize(width, height));
-
-    if (x != -1 || y != -1)
-    {
-        if (x == -1)
-            x = 0;
-        if (y == -1)
-            y = 0;
-        Move(x, y);
-    }
+    if (x == -1)
+        x = 0;
+    if (y == -1)
+        y = 0;
+    DoSetSize (x, y, width, height, wxSIZE_USE_EXISTING);
 
     return true;
 }
@@ -1909,9 +1897,8 @@ void wxWidgetResizeProc(Widget w, XConfigureEvent *WXUNUSED(event),
 
     if (win->PreResize())
     {
-        int width, height;
-        win->GetSize(&width, &height);
-        wxSizeEvent sizeEvent(wxSize(width, height), win->GetId());
+        wxSize newSize(win->GetSize());
+        wxSizeEvent sizeEvent(newSize, win->GetId());
         sizeEvent.SetEventObject(win);
         win->GetEventHandler()->ProcessEvent(sizeEvent);
     }
@@ -2099,7 +2086,7 @@ static void wxScrollBarCallback(Widget scrollbar,
                                 XmScrollBarCallbackStruct *cbs)
 {
     wxWindow *win = wxGetWindowFromTable(scrollbar);
-    wxOrientation orientation = (wxOrientation)(int)clientData;
+    wxOrientation orientation = (wxOrientation)wxPtrToUInt(clientData);
 
     wxEventType eventType = wxEVT_NULL;
     switch (cbs->reason)
@@ -2162,24 +2149,18 @@ static void wxScrollBarCallback(Widget scrollbar,
 // For repainting arbitrary windows
 void wxUniversalRepaintProc(Widget w, XtPointer WXUNUSED(c_data), XEvent *event, char *)
 {
-    Window window;
-    Display *display;
-
     wxWindow* win = wxGetWindowFromTable(w);
     if (!win)
         return;
 
-    switch(event -> type)
+    switch ( event->type )
     {
-    case Expose:
+        case Expose:
         {
-            window = (Window) win -> GetXWindow();
-            display = (Display *) win -> GetXDisplay();
-
             win->AddUpdateRect(event->xexpose.x, event->xexpose.y,
                                event->xexpose.width, event->xexpose.height);
 
-            if (event -> xexpose.count == 0)
+            if ( event->xexpose.count == 0 )
             {
                 win->DoPaint();
             }
@@ -2336,10 +2317,10 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win,
                 || (event_right_is_down (xevent)
                 && (eventType != wxEVT_RIGHT_UP)));
 
-            wxevent.m_shiftDown = xevent->xbutton.state & ShiftMask;
-            wxevent.m_controlDown = xevent->xbutton.state & ControlMask;
-            wxevent.m_altDown = xevent->xbutton.state & Mod3Mask;
-            wxevent.m_metaDown = xevent->xbutton.state & Mod1Mask;
+            wxevent.m_shiftDown = (xevent->xbutton.state & ShiftMask) == ShiftMask;
+            wxevent.m_controlDown = (xevent->xbutton.state & ControlMask) == ControlMask;
+            wxevent.m_altDown = (xevent->xbutton.state & Mod3Mask) == Mod3Mask;
+            wxevent.m_metaDown = (xevent->xbutton.state & Mod1Mask) == Mod1Mask;
 
             wxevent.SetId(win->GetId());
             wxevent.SetEventObject(win);
@@ -2385,9 +2366,8 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win,
 
             if (id > -1)
                 return true;
-            else
-                return false;
-            break;
+
+            return false;
         }
     default:
         break;
@@ -2401,7 +2381,7 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win,
 
 #define YAllocColor XAllocColor
 XColor g_itemColors[5];
-int wxComputeColours (Display *display, wxColour * back, wxColour * fore)
+int wxComputeColours (Display *display, const wxColour * back, const wxColour * fore)
 {
     int result;
     static XmColorProc colorProc;
@@ -2410,9 +2390,9 @@ int wxComputeColours (Display *display, wxColour * back, wxColour * fore)
 
     if (back)
     {
-        g_itemColors[0].red = (((long) back->Red ()) << 8);
-        g_itemColors[0].green = (((long) back->Green ()) << 8);
-        g_itemColors[0].blue = (((long) back->Blue ()) << 8);
+        g_itemColors[0].red = (unsigned short)(((long) back->Red ()) << 8);
+        g_itemColors[0].green = (unsigned short)(((long) back->Green ()) << 8);
+        g_itemColors[0].blue = (unsigned short)(((long) back->Blue ()) << 8);
         g_itemColors[0].flags = DoRed | DoGreen | DoBlue;
         if (colorProc == (XmColorProc) NULL)
         {
@@ -2430,9 +2410,9 @@ int wxComputeColours (Display *display, wxColour * back, wxColour * fore)
     }
     if (fore)
     {
-        g_itemColors[wxFORE_INDEX].red = (((long) fore->Red ()) << 8);
-        g_itemColors[wxFORE_INDEX].green = (((long) fore->Green ()) << 8);
-        g_itemColors[wxFORE_INDEX].blue = (((long) fore->Blue ()) << 8);
+        g_itemColors[wxFORE_INDEX].red = (unsigned short)(((long) fore->Red ()) << 8);
+        g_itemColors[wxFORE_INDEX].green = (unsigned short)(((long) fore->Green ()) << 8);
+        g_itemColors[wxFORE_INDEX].blue = (unsigned short)(((long) fore->Blue ()) << 8);
         g_itemColors[wxFORE_INDEX].flags = DoRed | DoGreen | DoBlue;
         if (result == wxNO_COLORS)
             result = wxFORE_COLORS;
@@ -2466,6 +2446,8 @@ void wxWindow::ChangeBackgroundColour()
     WXWidget mainWidget = GetMainWidget();
     if ( mainWidget )
         wxDoChangeBackgroundColour(mainWidget, m_backgroundColour);
+    if ( m_scrolledWindow && mainWidget != m_scrolledWindow )
+        wxDoChangeForegroundColour(m_scrolledWindow, m_backgroundColour);
 }
 
 void wxWindow::ChangeForegroundColour()
@@ -2513,7 +2495,7 @@ void wxWindow::ChangeFont(bool keepOriginalSize)
         GetSize(& width1, & height1);
         if (keepOriginalSize && (width != width1 || height != height1))
         {
-            SetSize(-1, -1, width, height);
+            SetSize(wxDefaultCoord, wxDefaultCoord, width, height);
         }
     }
 }
@@ -2540,7 +2522,8 @@ wxWindow *wxWindowBase::GetCapture()
 // position.
 wxWindow* wxFindWindowAtPointer(wxPoint& pt)
 {
-    return wxFindWindowAtPoint(wxGetMousePosition());
+    pt = wxGetMousePosition();
+    return wxFindWindowAtPoint(pt);
 }
 
 // Get the current mouse position.
@@ -2566,4 +2549,3 @@ wxPoint wxGetMousePosition()
 // ----------------------------------------------------------------------------
 
 int wxNoOptimize::ms_count = 0;
-