X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f9204363853f23d27792e9bb061505f970aed0c7..2ea6c1f77a260bef70d4a699df6c1d5ad1487f6a:/src/motif/window.cpp diff --git a/src/motif/window.cpp b/src/motif/window.cpp index afcd0cd4f7..d5b4b71854 100644 --- a/src/motif/window.cpp +++ b/src/motif/window.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: windows.cpp +// Name: src/motif/window.cpp // Purpose: wxWindow // Author: Julian Smart // Modified by: @@ -17,10 +17,6 @@ // 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" @@ -30,22 +26,24 @@ #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" -#include "wx/layout.h" -#include "wx/button.h" -#include "wx/settings.h" -#include "wx/frame.h" -#include "wx/scrolwin.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" + #include "wx/scrolwin.h" + #include "wx/layout.h" + #include "wx/menuitem.h" +#endif + #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" @@ -85,12 +83,6 @@ #include -// ---------------------------------------------------------------------------- -// 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( ": wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\ : wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\ : wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\ @@ -267,10 +259,10 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, : wxCanvasMotionEvent() DrawingAreaInput()\n\ : wxCanvasMotionEvent() DrawingAreaInput()\n\ : wxCanvasMotionEvent() DrawingAreaInput()\n\ -: DrawingAreaInput()"; +: 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 ) @@ -1464,29 +1457,24 @@ int wxWindow::GetCharHeight() const { wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" ); - WXFontStructPtr pFontStruct = m_font.GetFontStruct(1.0, GetXDisplay()); + int height; - int direction, ascent, descent; - XCharStruct overall; - XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent, - &descent, &overall); + wxGetTextExtent (GetXDisplay(), m_font, 1.0, + "x", NULL, &height, NULL, NULL); - // return (overall.ascent + overall.descent); - return (ascent + descent); + return height; } int wxWindow::GetCharWidth() const { wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" ); - WXFontStructPtr pFontStruct = m_font.GetFontStruct(1.0, GetXDisplay()); + int width; - int direction, ascent, descent; - XCharStruct overall; - XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent, - &descent, &overall); + wxGetTextExtent (GetXDisplay(), m_font, 1.0, + "x", &width, NULL, NULL, NULL); - return overall.width; + return width; } void wxWindow::GetTextExtent(const wxString& string, @@ -1494,36 +1482,14 @@ void wxWindow::GetTextExtent(const wxString& string, int *descent, int *externalLeading, const wxFont *theFont) const { - wxFont *fontToUse = (wxFont *)theFont; - if (!fontToUse) - fontToUse = (wxFont *) & m_font; + const wxFont *fontToUse = theFont ? theFont : &m_font; wxCHECK_RET( fontToUse->Ok(), "valid window font needed" ); - - WXFontStructPtr pFontStruct = fontToUse->GetFontStruct(1.0, GetXDisplay()); - int direction, ascent, descent2; - XCharStruct overall; - int slen = string.Len(); - -#if 0 - if (use16) - XTextExtents16((XFontStruct*) pFontStruct, (XChar2b *) (char*) (const char*) string, slen, &direction, - &ascent, &descent2, &overall); -#endif - - XTextExtents((XFontStruct*) pFontStruct, string, slen, - &direction, &ascent, &descent2, &overall); - - if ( x ) - *x = (overall.width); - if ( y ) - *y = (ascent + descent2); - if (descent) - *descent = descent2; if (externalLeading) *externalLeading = 0; - + wxGetTextExtent (GetXDisplay(), *fontToUse, 1.0, + string, x, y, NULL, descent); } // ---------------------------------------------------------------------------- @@ -1770,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; } @@ -1834,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; } @@ -1936,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); } @@ -2126,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) @@ -2189,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(); } @@ -2363,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); @@ -2412,9 +2366,8 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, if (id > -1) return true; - else - return false; - break; + + return false; } default: break; @@ -2428,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; @@ -2437,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) { @@ -2457,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; @@ -2493,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() @@ -2540,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); } } } @@ -2567,24 +2522,55 @@ wxWindow *wxWindowBase::GetCapture() // position. wxWindow* wxFindWindowAtPointer(wxPoint& pt) { - return wxFindWindowAtPoint(wxGetMousePosition()); + pt = wxGetMousePosition(); + return wxFindWindowAtPoint(pt); } -// Get the current mouse position. -wxPoint wxGetMousePosition() +void wxGetMouseState(int& rootX, int& rootY, unsigned& maskReturn) { Display *display = wxGlobalDisplay(); Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display)); Window rootReturn, childReturn; - int rootX, rootY, winX, winY; - unsigned int maskReturn; + int winX, winY; XQueryPointer (display, rootWindow, &rootReturn, &childReturn, &rootX, &rootY, &winX, &winY, &maskReturn); - return wxPoint(rootX, rootY); +} + +// Get the current mouse position. +wxPoint wxGetMousePosition() +{ + int x, y; + unsigned mask; + + wxGetMouseState(x, y, mask); + return wxPoint(x, y); +} + +wxMouseState wxGetMouseState() +{ + wxMouseState ms; + int x, y; + unsigned mask; + + wxGetMouseState(x, y, mask); + + ms.SetX(x); + ms.SetY(y); + + ms.SetLeftDown(mask & Button1Mask); + ms.SetMiddleDown(mask & Button2Mask); + ms.SetRightDown(mask & Button3Mask); + + ms.SetControlDown(mask & ControlMask); + ms.SetShiftDown(mask & ShiftMask); + ms.SetAltDown(mask & Mod3Mask); + ms.SetMetaDown(mask & Mod1Mask); + + return ms; } @@ -2593,4 +2579,3 @@ wxPoint wxGetMousePosition() // ---------------------------------------------------------------------------- int wxNoOptimize::ms_count = 0; -