X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/34636400a0018eba4a1f63dda18cf32e944b959e..7b9da2077d0975db6c965a85c91d5aca671ab5e3:/src/motif/window.cpp diff --git a/src/motif/window.cpp b/src/motif/window.cpp index d4da1486be..3dd230e4e3 100644 --- a/src/motif/window.cpp +++ b/src/motif/window.cpp @@ -36,7 +36,7 @@ #include "wx/msgdlg.h" #include "wx/frame.h" #include "wx/scrolwin.h" - +#include "wx/module.h" #include "wx/menuitem.h" #include "wx/log.h" @@ -51,6 +51,7 @@ #include #include #include +#include // for XmMenuPosition #include "wx/motif/private.h" @@ -66,7 +67,7 @@ static const int SCROLL_MARGIN = 4; // global variables for this module // ---------------------------------------------------------------------------- -static wxHashTable *gs_wxWidgetHashTable; +extern wxHashTable *wxWidgetHashTable; // ---------------------------------------------------------------------------- // private functions @@ -77,7 +78,7 @@ static void wxCanvasInputEvent(Widget drawingArea, XtPointer data, XmDrawingArea static void wxCanvasMotionEvent(Widget, XButtonEvent * event); static void wxCanvasEnterLeave(Widget drawingArea, XtPointer clientData, XCrossingEvent * event); static void wxScrollBarCallback(Widget widget, XtPointer clientData, - XmScaleCallbackStruct *cbs); + XmScrollBarCallbackStruct *cbs); static void wxPanelItemEventHandler(Widget wid, XtPointer client_data, XEvent* event, @@ -114,9 +115,9 @@ static int str16len(const char *s) // ---------------------------------------------------------------------------- #if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler) + IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase) - BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler) + BEGIN_EVENT_TABLE(wxWindow, wxWindowBase) EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged) EVT_IDLE(wxWindow::OnIdle) END_EVENT_TABLE() @@ -174,7 +175,8 @@ void wxWindow::Init() m_winCaptured = FALSE; m_isShown = TRUE; - + m_isBeingDeleted = FALSE; + m_hScrollBar = m_vScrollBar = m_borderWidget = @@ -208,7 +210,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, { wxCHECK_MSG( parent, FALSE, "can't create wxWindow without parent" ); - CreateBase(parent, id, pos, size, style, name); + CreateBase(parent, id, pos, size, style, wxDefaultValidator, name); parent->AddChild(this); @@ -243,7 +245,18 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, XtAppAddActions ((XtAppContext) wxTheApp->GetAppContext(), actions, 1); Widget parentWidget = (Widget) parent->GetClientWidget(); - if (style & wxBORDER) + + if (style & wxSIMPLE_BORDER) + { + m_borderWidget = (WXWidget)XtVaCreateManagedWidget + ( + "canvasBorder", + xmFrameWidgetClass, parentWidget, + XmNshadowType, XmSHADOW_IN, + XmNshadowThickness, 1, + NULL + ); + } else if (style & wxSUNKEN_BORDER) { m_borderWidget = (WXWidget)XtVaCreateManagedWidget ( @@ -252,6 +265,15 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, XmNshadowType, XmSHADOW_IN, NULL ); + } else if (style & wxRAISED_BORDER) + { + m_borderWidget = (WXWidget)XtVaCreateManagedWidget + ( + "canvasBorder", + xmFrameWidgetClass, parentWidget, + XmNshadowType, XmSHADOW_OUT, + NULL + ); } m_scrolledWindow = (WXWidget)XtVaCreateManagedWidget @@ -351,6 +373,8 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, // Destructor wxWindow::~wxWindow() { + m_isBeingDeleted = TRUE; + // Motif-specific actions first WXWidget wMain = GetMainWidget(); if ( wMain ) @@ -361,6 +385,9 @@ wxWindow::~wxWindow() ClearUpdateRects(); + if ( m_parent ) + m_parent->RemoveChild( this ); + // If m_drawingArea, we're a fully-fledged window with drawing area, // scrollbars etc. (what wxCanvas used to be) if ( m_drawingArea ) @@ -387,6 +414,15 @@ wxWindow::~wxWindow() wxDeleteWindowFromTable((Widget) m_scrolledWindow); } + if (m_hScrollBar) + { + wxDeleteWindowFromTable((Widget) m_hScrollBar); + } + if (m_vScrollBar) + { + wxDeleteWindowFromTable((Widget) m_vScrollBar); + } + UnmanageAndDestroy(m_hScrollBar); UnmanageAndDestroy(m_vScrollBar); UnmanageAndDestroy(m_scrolledWindow); @@ -416,7 +452,7 @@ wxWindow::~wxWindow() // ---------------------------------------------------------------------------- // Helper function -void wxWindow::CreateScrollbar(int orientation) +void wxWindow::CreateScrollbar(wxOrientation orientation) { wxCHECK_RET( m_drawingArea, "this window can't have scrollbars" ); @@ -455,6 +491,8 @@ void wxWindow::CreateScrollbar(int orientation) NULL); m_hScroll = TRUE; + + wxAddWindowToTable( hScrollBar, this ); } if (orientation == wxVERTICAL) @@ -488,12 +526,14 @@ void wxWindow::CreateScrollbar(int orientation) NULL); m_vScroll = TRUE; + + wxAddWindowToTable( vScrollBar, this ); } XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_ANY, NULL); } -void wxWindow::DestroyScrollbar(int orientation) +void wxWindow::DestroyScrollbar(wxOrientation orientation) { wxCHECK_RET( m_drawingArea, "this window can't have scrollbars" ); @@ -503,6 +543,7 @@ void wxWindow::DestroyScrollbar(int orientation) { if (m_hScrollBar) { + wxDeleteWindowFromTable((Widget)m_hScrollBar); XtDestroyWidget((Widget) m_hScrollBar); } m_hScrollBar = (WXWidget) 0; @@ -518,6 +559,7 @@ void wxWindow::DestroyScrollbar(int orientation) { if (m_vScrollBar) { + wxDeleteWindowFromTable((Widget)m_vScrollBar); XtDestroyWidget((Widget) m_vScrollBar); } m_vScrollBar = (WXWidget) 0; @@ -543,7 +585,7 @@ void wxWindow::SetFocus() } // Get the window with the focus -wxWindow *wxWindow::FindFocus() +wxWindow *wxWindowBase::FindFocus() { // TODO Problems: // (1) Can there be multiple focussed widgets in an application? @@ -571,12 +613,12 @@ wxWindow *wxWindow::FindFocus() return winFocus; } -void wxWindow::Enable(bool enable) +bool wxWindow::Enable(bool enable) { if ( !wxWindowBase::Enable(enable) ) return FALSE; - Widget wMain = GetMainWidget(); + Widget wMain = (Widget)GetMainWidget(); if ( wMain ) { XtSetSensitive(wMain, enable); @@ -630,14 +672,17 @@ void wxWindow::Lower() XLowerWindow(XtDisplay(wTop), window); } -void wxWindow::SetTitle( const wxString& title) +void wxWindow::SetTitle(const wxString& title) { - SetWindowText(GetHwnd(), title.c_str()); + XtVaSetValues((Widget)GetMainWidget(), XmNtitle, title.c_str(), NULL); } wxString wxWindow::GetTitle() const { - return wxGetWindowText(GetHWND()); + char *title; + XtVaGetValues((Widget)GetMainWidget(), XmNtitle, &title, NULL); + + return wxString(title); } void wxWindow::CaptureMouse() @@ -645,7 +690,7 @@ void wxWindow::CaptureMouse() if ( m_winCaptured ) return; - Widget wMain = GetMainWidget(); + Widget wMain = (Widget)GetMainWidget(); if ( wMain ) XtAddGrab(wMain, TRUE, FALSE); @@ -657,7 +702,7 @@ void wxWindow::ReleaseMouse() if ( !m_winCaptured ) return; - Widget wMain = GetMainWidget(); + Widget wMain = (Widget)GetMainWidget(); if ( wMain ) XtRemoveGrab(wMain); @@ -686,7 +731,7 @@ bool wxWindow::SetCursor(const wxCursor& cursor) } wxASSERT_MSG( m_cursor.Ok(), - _T("cursor must be valid after call to the base version")); + wxT("cursor must be valid after call to the base version")); WXDisplay *dpy = GetXDisplay(); WXCursor x_cursor = m_cursor.GetXCursor(dpy); @@ -694,6 +739,8 @@ bool wxWindow::SetCursor(const wxCursor& cursor) Widget w = (Widget) GetMainWidget(); Window win = XtWindow(w); XDefineCursor((Display*) dpy, win, (Cursor) x_cursor); + + return TRUE; } // Coordinates relative to the window @@ -732,7 +779,7 @@ int wxWindow::GetScrollPos(int orient) const // can scroll. int wxWindow::GetScrollRange(int orient) const { - Widget scrollBar = (Widget)GetScrollbar(orient); + Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient); wxCHECK_MSG( scrollBar, 0, "no such scrollbar" ); int range; @@ -742,7 +789,7 @@ int wxWindow::GetScrollRange(int orient) const int wxWindow::GetScrollThumb(int orient) const { - Widget scrollBar = (Widget)GetScrollbar(orient); + Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient); wxCHECK_MSG( scrollBar, 0, "no such scrollbar" ); int thumb; @@ -752,14 +799,14 @@ int wxWindow::GetScrollThumb(int orient) const void wxWindow::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh)) { - Widget scrollBar = (Widget)GetScrollbar(orient); + Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient); if ( scrollBar ) { XtVaSetValues (scrollBar, XmNvalue, pos, NULL); } - SetInternalScrollPos(orient, pos); + SetInternalScrollPos((wxOrientation)orient, pos); } // New function that will replace some of the above. @@ -778,7 +825,7 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible, thumbVisible = range; // Save the old state to see if it changed - WXWidget oldScrollBar = GetScrollbar(orient); + WXWidget oldScrollBar = GetScrollbar((wxOrientation)orient); if (orient == wxHORIZONTAL) { @@ -806,7 +853,7 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible, CreateScrollbar(wxVERTICAL); } } - WXWidget newScrollBar = GetScrollbar(orient); + WXWidget newScrollBar = GetScrollbar((wxOrientation)orient); if (oldScrollBar != newScrollBar) { @@ -827,7 +874,7 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible, NULL); } - SetInternalScrollPos(orient, pos); + SetInternalScrollPos((wxOrientation)orient, pos); int newW, newH; GetSize(& newW, & newH); @@ -853,6 +900,18 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect) GetClientSize(& w, & h); } + wxNode *cnode = m_children.First(); + while (cnode) + { + wxWindow *child = (wxWindow*) cnode->Data(); + int sx = 0; + int sy = 0; + child->GetSize( &sx, &sy ); + wxPoint pos( child->GetPosition() ); + child->SetSize( pos.x + dx, pos.y + dy, sx, sy, wxSIZE_ALLOW_MINUS_ONE ); + cnode = cnode->Next(); + } + int x1 = (dx >= 0) ? x : x - dx; int y1 = (dy >= 0) ? y : y - dy; int w1 = w - abs(dx); @@ -1027,6 +1086,76 @@ void wxWindow::DoSetToolTip(wxToolTip * WXUNUSED(tooltip)) #endif // wxUSE_TOOLTIPS +// ---------------------------------------------------------------------------- +// popup menus +// ---------------------------------------------------------------------------- + +bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y) +{ + Widget widget = (Widget) GetMainWidget(); + + /* The menuId field seems to be usused, so we'll use it to + indicate whether a menu is popped up or not: + 0: Not currently created as a popup + -1: Created as a popup, but not active + 1: Active popup. + */ + + if (menu->GetParent() && (menu->GetId() != -1)) + return FALSE; + + if (menu->GetMainWidget()) { + menu->DestroyMenu(TRUE); + } + + menu->SetId(1); /* Mark as popped-up */ + menu->CreateMenu(NULL, widget, menu); + menu->SetInvokingWindow(this); + + menu->UpdateUI(); + + // menu->SetParent(parent); + // parent->children->Append(menu); // Store menu for later deletion + + Widget menuWidget = (Widget) menu->GetMainWidget(); + + int rootX = 0; + int rootY = 0; + + int deviceX = x; + int deviceY = y; + /* + if (this->IsKindOf(CLASSINFO(wxCanvas))) + { + wxCanvas *canvas = (wxCanvas *) this; + deviceX = canvas->GetDC ()->LogicalToDeviceX (x); + deviceY = canvas->GetDC ()->LogicalToDeviceY (y); + } + */ + + Display *display = XtDisplay (widget); + Window rootWindow = RootWindowOfScreen (XtScreen((Widget)widget)); + Window thisWindow = XtWindow (widget); + Window childWindow; + XTranslateCoordinates (display, thisWindow, rootWindow, (int) deviceX, (int) deviceY, + &rootX, &rootY, &childWindow); + + XButtonPressedEvent event; + event.type = ButtonPress; + event.button = 1; + + event.x = deviceX; + event.y = deviceY; + + event.x_root = rootX; + event.y_root = rootY; + + XmMenuPosition (menuWidget, &event); + XtManageChild (menuWidget); + + return TRUE; +} + // --------------------------------------------------------------------------- // moving and resizing // --------------------------------------------------------------------------- @@ -1037,7 +1166,7 @@ bool wxWindow::PreResize() } // Get total size -void wxWindow::GetSize(int *x, int *y) const +void wxWindow::DoGetSize(int *x, int *y) const { if (m_drawingArea) { @@ -1051,7 +1180,7 @@ void wxWindow::GetSize(int *x, int *y) const *x = xx; *y = yy; } -void wxWindow::GetPosition(int *x, int *y) const +void wxWindow::DoGetPosition(int *x, int *y) const { if (m_drawingArea) { @@ -1074,7 +1203,7 @@ void wxWindow::GetPosition(int *x, int *y) const *x = xx; *y = yy; } -void wxWindow::ScreenToClient(int *x, int *y) const +void wxWindow::DoScreenToClient(int *x, int *y) const { Widget widget = (Widget) GetClientWidget(); Display *display = XtDisplay((Widget) GetMainWidget()); @@ -1087,7 +1216,7 @@ void wxWindow::ScreenToClient(int *x, int *y) const XTranslateCoordinates(display, rootWindow, thisWindow, xx, yy, x, y, &childWindow); } -void wxWindow::ClientToScreen(int *x, int *y) const +void wxWindow::DoClientToScreen(int *x, int *y) const { Widget widget = (Widget) GetClientWidget(); Display *display = XtDisplay(widget); @@ -1102,7 +1231,7 @@ void wxWindow::ClientToScreen(int *x, int *y) const // Get size *available for subwindows* i.e. excluding menu bar etc. -void wxWindow::GetClientSize(int *x, int *y) const +void wxWindow::DoGetClientSize(int *x, int *y) const { Widget widget = (Widget) GetClientWidget(); Dimension xx, yy; @@ -1257,9 +1386,9 @@ void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, in int wxWindow::GetCharHeight() const { - wxCHECK_MSG( m_windowFont.Ok(), 0, "valid window font needed" ); + wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" ); - WXFontStructPtr pFontStruct = m_windowFont.GetFontStruct(1.0, GetXDisplay()); + WXFontStructPtr pFontStruct = m_font.GetFontStruct(1.0, GetXDisplay()); int direction, ascent, descent; XCharStruct overall; @@ -1272,9 +1401,9 @@ int wxWindow::GetCharHeight() const int wxWindow::GetCharWidth() const { - wxCHECK_MSG( m_windowFont.Ok(), 0, "valid window font needed" ); + wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" ); - WXFontStructPtr pFontStruct = m_windowFont.GetFontStruct(1.0, GetXDisplay()); + WXFontStructPtr pFontStruct = m_font.GetFontStruct(1.0, GetXDisplay()); int direction, ascent, descent; XCharStruct overall; @@ -1291,15 +1420,15 @@ void wxWindow::GetTextExtent(const wxString& string, { wxFont *fontToUse = (wxFont *)theFont; if (!fontToUse) - fontToUse = (wxFont *) & m_windowFont; - - wxCHECK_RET( fontToUse.Ok(), "valid window font needed" ); + fontToUse = (wxFont *) & m_font; + wxCHECK_RET( fontToUse->Ok(), "valid window font needed" ); + WXFontStructPtr pFontStruct = theFont->GetFontStruct(1.0, GetXDisplay()); int direction, ascent, descent2; XCharStruct overall; - int slen; + int slen = string.Len(); #if 0 if (use16) @@ -1318,6 +1447,7 @@ void wxWindow::GetTextExtent(const wxString& string, *descent = descent2; if (externalLeading) *externalLeading = 0; + } // ---------------------------------------------------------------------------- @@ -1378,13 +1508,14 @@ void wxWindow::Clear() void wxWindow::ClearUpdateRects() { - wxNode* node = m_updateRects.First(); + wxRectList::Node* node = m_updateRects.GetFirst(); while (node) { - wxRect* rect = (wxRect*) node->Data(); + wxRect* rect = node->GetData(); delete rect; - node = node->Next(); + node = node->GetNext(); } + m_updateRects.Clear(); } @@ -1484,7 +1615,7 @@ void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event) } } -void wxWindow::OnIdle(wxIdleEvent& event) +void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event)) { // This calls the UI-update mechanism (querying windows for // menu/toolbar/control state information) @@ -1526,7 +1657,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) // Try for a menu command if (frame->GetMenuBar()) { - wxMenuItem* item = frame->GetMenuBar()->FindItemForId(entry->GetCommand()); + wxMenuItem* item = frame->GetMenuBar()->FindItem(entry->GetCommand()); if (item) { wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, entry->GetCommand()); @@ -1574,26 +1705,29 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) bool wxAddWindowToTable(Widget w, wxWindow *win) { wxWindow *oldItem = NULL; - if ((oldItem = (wxWindow *)gs_wxWidgetHashTable->Get ((long) w))) + if ((oldItem = (wxWindow *)wxWidgetHashTable->Get ((long) w))) { wxLogDebug("Widget table clash: new widget is %ld, %s", (long)w, win->GetClassInfo()->GetClassName()); return FALSE; } - gs_wxWidgetHashTable->Put((long) w, win); + wxWidgetHashTable->Put((long) w, win); + + wxLogDebug("Widget 0x%08x <-> window %p (%s)", + w, win, win->GetClassInfo()->GetClassName()); return TRUE; } wxWindow *wxGetWindowFromTable(Widget w) { - return (wxWindow *)gs_wxWidgetHashTable->Get((long) w); + return (wxWindow *)wxWidgetHashTable->Get((long) w); } void wxDeleteWindowFromTable(Widget w) { - gs_wxWidgetHashTable->Delete((long)w); + wxWidgetHashTable->Delete((long)w); } // ---------------------------------------------------------------------------- @@ -1601,7 +1735,7 @@ void wxDeleteWindowFromTable(Widget w) // ---------------------------------------------------------------------------- // Add to hash table, add event handler -bool wxWindow::AttachWidget (wxWindow* parent, WXWidget mainWidget, +bool wxWindow::AttachWidget (wxWindow* WXUNUSED(parent), WXWidget mainWidget, WXWidget formWidget, int x, int y, int width, int height) { wxAddWindowToTable((Widget) mainWidget, this); @@ -1666,7 +1800,7 @@ bool wxWindow::DetachWidget(WXWidget widget) // Get the underlying X window WXWindow wxWindow::GetXWindow() const { - Widget wMain = GetMainWidget(); + Widget wMain = (Widget)GetMainWidget(); if ( wMain ) return (WXWindow) XtWindow(wMain); else @@ -1676,7 +1810,7 @@ WXWindow wxWindow::GetXWindow() const // Get the underlying X display WXDisplay *wxWindow::GetXDisplay() const { - Widget wMain = GetMainWidget(); + Widget wMain = (Widget)GetMainWidget(); if ( wMain ) return (WXDisplay*) XtDisplay(wMain); else @@ -1715,7 +1849,7 @@ WXWidget wxWindow::GetLabelWidget() const // All widgets should have this as their resize proc. // OnSize sent to wxWindow via client data. -void wxWidgetResizeProc(Widget w, XConfigureEvent *event, String args[], int *num_args) +void wxWidgetResizeProc(Widget w, XConfigureEvent *WXUNUSED(event), String WXUNUSED(args)[], int *WXUNUSED(num_args)) { wxWindow *win = wxGetWindowFromTable(w); if (!win) @@ -1740,25 +1874,16 @@ static void wxCanvasRepaintProc(Widget drawingArea, XEvent * event = cbs->event; wxWindow * win = (wxWindow *) clientData; - Display * display = (Display *) win->GetXDisplay(); switch (event->type) { case Expose: { - wxRect* rect = new wxRect(event->xexpose.x, event->xexpose.y, - event->xexpose.width, event->xexpose.height); - - win->m_updateRects.Append((wxObject*) rect); - + win->AddUpdateRect(event->xexpose.x, event->xexpose.y, + event->xexpose.width, event->xexpose.height); + if (event -> xexpose.count == 0) { -#if 0 - wxPaintEvent event(win->GetId()); - event.SetEventObject(win); - win->GetEventHandler()->ProcessEvent(event); -#endif // 0 - win->DoPaint(); win->ClearUpdateRects(); } @@ -1769,7 +1894,7 @@ static void wxCanvasRepaintProc(Widget drawingArea, // Unable to deal with Enter/Leave without a separate EventHandler (Motif 1.1.4) static void wxCanvasEnterLeave(Widget drawingArea, - XtPointer clientData, + XtPointer WXUNUSED(clientData), XCrossingEvent * event) { XmDrawingAreaCallbackStruct cbs; @@ -1784,7 +1909,7 @@ static void wxCanvasEnterLeave(Widget drawingArea, } // Fix to make it work under Motif 1.0 (!) -static void wxCanvasMotionEvent (Widget drawingArea, XButtonEvent * event) +static void wxCanvasMotionEvent (Widget WXUNUSED(drawingArea), XButtonEvent * WXUNUSED(event)) { #if XmVersion <= 1000 XmDrawingAreaCallbackStruct cbs; @@ -1799,7 +1924,7 @@ static void wxCanvasMotionEvent (Widget drawingArea, XButtonEvent * event) } static void wxCanvasInputEvent(Widget drawingArea, - XtPointer data, + XtPointer WXUNUSED(data), XmDrawingAreaCallbackStruct * cbs) { wxWindow *canvas = wxGetWindowFromTable(drawingArea); @@ -1821,6 +1946,9 @@ static void wxCanvasInputEvent(Widget drawingArea, case ButtonRelease: case MotionNotify: { + // FIXME: most of this mouse event code is more or less + // duplicated in wxTranslateMouseEvent + // wxEventType eventType = wxEVT_NULL; if (local_event.xany.type == EnterNotify) @@ -1832,7 +1960,7 @@ static void wxCanvasInputEvent(Widget drawingArea, } else if (local_event.xany.type == LeaveNotify) { - //if (local_event.xcrossing.mode!=NotifyNormal) + //if (local_event.xcrossingr.mode!=NotifyNormal) // return ; // Ignore grab events eventType = wxEVT_LEAVE_WINDOW; // canvas->GetEventHandler()->OnKillFocus(); @@ -1863,17 +1991,17 @@ static void wxCanvasInputEvent(Widget drawingArea, if (local_event.xbutton.button == Button1) { eventType = wxEVT_LEFT_DOWN; - canvas->m_button1Pressed = TRUE; + canvas->SetButton1(TRUE); } else if (local_event.xbutton.button == Button2) { eventType = wxEVT_MIDDLE_DOWN; - canvas->m_button2Pressed = TRUE; + canvas->SetButton2(TRUE); } else if (local_event.xbutton.button == Button3) { eventType = wxEVT_RIGHT_DOWN; - canvas->m_button3Pressed = TRUE; + canvas->SetButton3(TRUE); } } else if (local_event.xany.type == ButtonRelease) @@ -1881,22 +2009,21 @@ static void wxCanvasInputEvent(Widget drawingArea, if (local_event.xbutton.button == Button1) { eventType = wxEVT_LEFT_UP; - canvas->m_button1Pressed = FALSE; + canvas->SetButton1(FALSE); } else if (local_event.xbutton.button == Button2) { eventType = wxEVT_MIDDLE_UP; - canvas->m_button2Pressed = FALSE; + canvas->SetButton2(FALSE); } else if (local_event.xbutton.button == Button3) { eventType = wxEVT_RIGHT_UP; - canvas->m_button3Pressed = FALSE; + canvas->SetButton3(FALSE); } } wxMouseEvent wxevent (eventType); - wxevent.m_eventHandle = (char *) &local_event; wxevent.m_leftDown = ((eventType == wxEVT_LEFT_DOWN) || (event_left_is_down (&local_event) @@ -1923,15 +2050,21 @@ static void wxCanvasInputEvent(Widget drawingArea, // get button and time-stamp int button = 0; - if (wxevent.LeftDown()) button = 1; - else if (wxevent.MiddleDown()) button = 2; - else if (wxevent.RightDown()) button = 3; + if (wxevent.LeftDown()) + button = 1; + else if (wxevent.MiddleDown()) + button = 2; + else if (wxevent.RightDown()) + button = 3; long ts = wxevent.GetTimestamp(); + // check, if single or double click - if (canvas->m_lastButton && canvas->m_lastButton==button && (ts - canvas->m_lastTS) < dclickTime) + int buttonLast = canvas->GetLastClickedButton(); + long lastTS = canvas->GetLastClickTime(); + if ( buttonLast && buttonLast == button && (ts - lastTS) < dclickTime ) { // I have a dclick - canvas->m_lastButton = 0; + canvas->SetLastClick(0, ts); switch ( eventType ) { case wxEVT_LEFT_DOWN: @@ -1952,8 +2085,7 @@ static void wxCanvasInputEvent(Widget drawingArea, else { // not fast enough or different button - canvas->m_lastTS = ts; - canvas->m_lastButton = button; + canvas->SetLastClick(button, ts); } } } @@ -2078,13 +2210,13 @@ static void wxCanvasInputEvent(Widget drawingArea, } static void wxPanelItemEventHandler(Widget wid, - XtPointer client_data, + XtPointer WXUNUSED(client_data), XEvent* event, Boolean *continueToDispatch) { // Widget can be a label or the actual widget. - wxWindow *window = wxGetWindowFromTable(drawingArea); + wxWindow *window = wxGetWindowFromTable(wid); if (window) { wxMouseEvent wxevent(0); @@ -2106,9 +2238,8 @@ static void wxPanelItemEventHandler(Widget wid, static void wxScrollBarCallback(Widget scrollbar, XtPointer clientData, - XmScaleCallbackStruct *cbs) + XmScrollBarCallbackStruct *cbs) { - Widget scrolledWindow = XtParent (scrollbar); wxWindow *win = wxGetWindowFromTable(scrollbar); int orientation = (int) clientData; @@ -2117,44 +2248,44 @@ static void wxScrollBarCallback(Widget scrollbar, { case XmCR_INCREMENT: { - eventType = wxEVT_SCROLL_LINEDOWN; + eventType = wxEVT_SCROLLWIN_LINEDOWN; break; } case XmCR_DECREMENT: { - eventType = wxEVT_SCROLL_LINEUP; + eventType = wxEVT_SCROLLWIN_LINEUP; break; } case XmCR_DRAG: { - eventType = wxEVT_SCROLL_THUMBTRACK; + eventType = wxEVT_SCROLLWIN_THUMBTRACK; break; } case XmCR_VALUE_CHANGED: { // TODO: Should this be intercepted too, or will it cause // duplicate events? - eventType = wxEVT_SCROLL_THUMBTRACK; + eventType = wxEVT_SCROLLWIN_THUMBTRACK; break; } case XmCR_PAGE_INCREMENT: { - eventType = wxEVT_SCROLL_PAGEDOWN; + eventType = wxEVT_SCROLLWIN_PAGEDOWN; break; } case XmCR_PAGE_DECREMENT: { - eventType = wxEVT_SCROLL_PAGEUP; + eventType = wxEVT_SCROLLWIN_PAGEUP; break; } case XmCR_TO_TOP: { - eventType = wxEVT_SCROLL_TOP; + eventType = wxEVT_SCROLLWIN_TOP; break; } case XmCR_TO_BOTTOM: { - eventType = wxEVT_SCROLL_BOTTOM; + eventType = wxEVT_SCROLLWIN_BOTTOM; break; } default: @@ -2165,11 +2296,11 @@ static void wxScrollBarCallback(Widget scrollbar, } } - wxScrollEvent event(eventType, win->GetId()); - event.SetEventObject(win); - event.SetPosition(cbs->value); - event.SetOrientation( (orientation == XmHORIZONTAL) ? wxHORIZONTAL : wxVERTICAL ); - + wxScrollWinEvent event(eventType, + cbs->value, + ((orientation == XmHORIZONTAL) ? + wxHORIZONTAL : wxVERTICAL)); + event.SetEventObject( win ); win->GetEventHandler()->ProcessEvent(event); } @@ -2185,21 +2316,23 @@ void wxUniversalRepaintProc(Widget w, XtPointer WXUNUSED(c_data), XEvent *event, switch(event -> type) { - case Expose : + case Expose: { window = (Window) win -> GetXWindow(); display = (Display *) win -> GetXDisplay(); - wxRect* rect = new wxRect(event->xexpose.x, event->xexpose.y, - event->xexpose.width, event->xexpose.height); - win->m_updateRects.Append((wxObject*) rect); - if (event -> xexpose.count == 0) { win->DoPaint(); win->ClearUpdateRects(); } + else + { + win->AddUpdateRect(event->xexpose.x, event->xexpose.y, + event->xexpose.width, event->xexpose.height); + } + break; } } @@ -2243,7 +2376,7 @@ void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags) if (managed) XtUnmanageChild (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow); - XtVaSetValues((Widget) m_drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL); + XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL); int xx = x; int yy = y; AdjustForParentClientOrigin(xx, yy, sizeFlags); @@ -2295,7 +2428,9 @@ void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags) w -= (spacing + wsbar); - // XtVaSetValues ((Widget) m_drawingArea, XmNwidth, w, NULL); +#if 0 + XtVaSetValues(drawingArea, XmNwidth, w, NULL); +#endif // 0 } if (h > -1) { @@ -2326,14 +2461,15 @@ void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags) h -= (spacing + wsbar); - // XtVaSetValues ((Widget) m_drawingArea, XmNheight, h, NULL); - +#if 0 + XtVaSetValues(drawingArea, XmNheight, h, NULL); +#endif // 0 } } if (managed) XtManageChild (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow); - XtVaSetValues((Widget) m_drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL); + XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL); #if 0 int ww, hh; @@ -2341,7 +2477,7 @@ void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags) wxSizeEvent sizeEvent(wxSize(ww, hh), GetId()); sizeEvent.SetEventObject(this); - GetEventHandler()->ProcessEvent(sizeEvent); + GetEventHandler()->ProcessEvent(sizeEvent); #endif // 0 } @@ -2349,12 +2485,12 @@ void wxWindow::CanvasSetClientSize (int w, int h) { Widget drawingArea = (Widget) m_drawingArea; - XtVaSetValues((Widget) m_drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL); + XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL); if (w > -1) - XtVaSetValues ((Widget) m_drawingArea, XmNwidth, w, NULL); + XtVaSetValues(drawingArea, XmNwidth, w, NULL); if (h > -1) - XtVaSetValues ((Widget) m_drawingArea, XmNheight, h, NULL); + XtVaSetValues(drawingArea, XmNheight, h, NULL); #if 0 // TODO: is this necessary? @@ -2370,16 +2506,16 @@ void wxWindow::CanvasSetClientSize (int w, int h) } #endif // 0 - XtVaSetValues((Widget) m_drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL); + XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL); #if 0 - allowRepainting = TRUE; - DoRefresh (); + allowRepainting = TRUE; + DoRefresh (); - wxSizeEvent sizeEvent(wxSize(w, h), GetId()); - sizeEvent.SetEventObject(this); + wxSizeEvent sizeEvent(wxSize(w, h), GetId()); + sizeEvent.SetEventObject(this); - GetEventHandler()->ProcessEvent(sizeEvent); + GetEventHandler()->ProcessEvent(sizeEvent); #endif // 0 } @@ -2433,19 +2569,21 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget, { switch (xevent->xany.type) { - case EnterNotify: - case LeaveNotify: - case ButtonPress: - case ButtonRelease: - case MotionNotify: + case EnterNotify: // never received here - yes ? MB + case LeaveNotify: // never received here - yes ? MB + case ButtonPress: + case ButtonRelease: + case MotionNotify: { wxEventType eventType = wxEVT_NULL; + // FIXME: this is never true I think - MB + // if (xevent->xany.type == LeaveNotify) { - win->m_button1Pressed = FALSE; - win->m_button2Pressed = FALSE; - win->m_button3Pressed = FALSE; + win->SetButton1(FALSE); + win->SetButton2(FALSE); + win->SetButton3(FALSE); return FALSE; } else if (xevent->xany.type == MotionNotify) @@ -2454,20 +2592,59 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget, } else if (xevent->xany.type == ButtonPress) { + wxevent.SetTimestamp(xevent->xbutton.time); + int button = 0; if (xevent->xbutton.button == Button1) { eventType = wxEVT_LEFT_DOWN; - win->m_button1Pressed = TRUE; + win->SetButton1(TRUE); + button = 1; } else if (xevent->xbutton.button == Button2) { eventType = wxEVT_MIDDLE_DOWN; - win->m_button2Pressed = TRUE; + win->SetButton2(TRUE); + button = 2; } else if (xevent->xbutton.button == Button3) { eventType = wxEVT_RIGHT_DOWN; - win->m_button3Pressed = TRUE; + win->SetButton3(TRUE); + button = 3; + } + + // check for a double click + // + long dclickTime = XtGetMultiClickTime((Display*) wxGetDisplay()); + long ts = wxevent.GetTimestamp(); + + int buttonLast = win->GetLastClickedButton(); + long lastTS = win->GetLastClickTime(); + if ( buttonLast && buttonLast == button && (ts - lastTS) < dclickTime ) + { + // I have a dclick + win->SetLastClick(0, ts); + switch ( eventType ) + { + case wxEVT_LEFT_DOWN: + eventType = wxEVT_LEFT_DCLICK; + break; + case wxEVT_MIDDLE_DOWN: + eventType = wxEVT_MIDDLE_DCLICK; + break; + case wxEVT_RIGHT_DOWN: + eventType = wxEVT_RIGHT_DCLICK; + break; + + default : + break; + } + + } + else + { + // not fast enough or different button + win->SetLastClick(button, ts); } } else if (xevent->xany.type == ButtonRelease) @@ -2475,23 +2652,25 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget, if (xevent->xbutton.button == Button1) { eventType = wxEVT_LEFT_UP; - win->m_button1Pressed = FALSE; + win->SetButton1(FALSE); } else if (xevent->xbutton.button == Button2) { eventType = wxEVT_MIDDLE_UP; - win->m_button2Pressed = FALSE; + win->SetButton2(FALSE); } else if (xevent->xbutton.button == Button3) { eventType = wxEVT_RIGHT_UP; - win->m_button3Pressed = FALSE; + win->SetButton3(FALSE); } else return FALSE; } - else return FALSE; + else + { + return FALSE; + } - wxevent.m_eventHandle = (char *)xevent; wxevent.SetEventType(eventType); Position x1, y1; @@ -2526,17 +2705,24 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget, 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.SetId(win->GetId()); + wxevent.SetEventObject(win); + return TRUE; } } return FALSE; } -bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Widget widget, XEvent *xevent) +bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Widget WXUNUSED(widget), XEvent *xevent) { switch (xevent->xany.type) { case KeyPress: + case KeyRelease: { char buf[20]; @@ -2713,16 +2899,24 @@ void wxWindow::DoChangeBackgroundColour(WXWidget widget, wxColour& backgroundCol NULL); } -void wxWindow::SetBackgroundColour(const wxColour& col) +bool wxWindow::SetBackgroundColour(const wxColour& col) { - m_backgroundColour = col; + if ( !wxWindowBase::SetBackgroundColour(col) ) + return FALSE; + ChangeBackgroundColour(); + + return TRUE; } -void wxWindow::SetForegroundColour(const wxColour& col) +bool wxWindow::SetForegroundColour(const wxColour& col) { - m_foregroundColour = col; + if ( !wxWindowBase::SetForegroundColour(col) ) + return FALSE; + ChangeForegroundColour(); + + return TRUE; } void wxWindow::ChangeFont(bool keepOriginalSize) @@ -2731,7 +2925,7 @@ void wxWindow::ChangeFont(bool keepOriginalSize) // to its original size! We therefore have to set the size // back again. TODO: a better way in Motif? Widget w = (Widget) GetLabelWidget(); // Usually the main widget - if (w && m_windowFont.Ok()) + if (w && m_font.Ok()) { int width, height, width1, height1; GetSize(& width, & height); @@ -2739,7 +2933,7 @@ void wxWindow::ChangeFont(bool keepOriginalSize) // lesstif 0.87 hangs here #ifndef LESSTIF_VERSION XtVaSetValues (w, - XmNfontList, (XmFontList) m_windowFont.GetFontList(1.0, XtDisplay(w)), + XmNfontList, (XmFontList) m_font.GetFontList(1.0, XtDisplay(w)), NULL); #endif @@ -2765,20 +2959,8 @@ wxWindow *wxGetActiveWindow() // wxNoOptimize: switch off size optimization // ---------------------------------------------------------------------------- -int wxNoOptimize::m_count = 0; +int wxNoOptimize::ms_count = 0; -wxNoOptimize::wxNoOptimize() -{ - m_count ++; -} -wxNoOptimize::~wxNoOptimize() -{ - m_count --; -} -bool wxNoOptimize::CanOptimize() -{ - return (m_count == 0); -}