/////////////////////////////////////////////////////////////////////////////
-// Name: windows.cpp
+// Name: src/motif/window.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"
-#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"
+#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"
+ #include "wx/module.h"
+#endif
+
#include "wx/evtloop.h"
-#include "wx/hash.h"
#if wxUSE_DRAG_AND_DROP
#include "wx/dnd.h"
// 2) call DoMoveWindow from DoSetSize, allowing controls to override it
#ifdef __VMS__
-#pragma message disable nosimpint
+ #pragma message disable nosimpint
#endif
#include <Xm/Xm.h>
#include <Xm/Label.h>
#include <Xm/RowColumn.h> // for XmMenuPosition
#ifdef __VMS__
-#pragma message enable nosimpint
+ #pragma message enable nosimpint
#endif
#include "wx/motif/private.h"
#include <string.h>
-// ----------------------------------------------------------------------------
-// constants
-// ----------------------------------------------------------------------------
-
-static const int SCROLL_MARGIN = 4;
-
// ----------------------------------------------------------------------------
// global variables for this module
// ----------------------------------------------------------------------------
m_winCaptured = false;
m_isShown = true;
-
+
m_hScrollBar =
m_vScrollBar =
m_borderWidget =
CreateBase(parent, id, pos, size, style, wxDefaultValidator, name);
parent->AddChild(this);
-
- m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
- m_foregroundColour = *wxBLACK;
+ PreCreation();
//// TODO: we should probably optimize by only creating a
//// a drawing area if we have one or more scrollbars (wxVSCROLL/wxHSCROLL).
//// 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\
<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);
(XtPointer) this
);
- // Scrolled widget needs to have its colour changed or we get a little blue
- // square where the scrollbars abutt
- wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
- wxDoChangeBackgroundColour(m_scrolledWindow, backgroundColour, true);
- wxDoChangeBackgroundColour(m_drawingArea, backgroundColour, true);
-
XmScrolledWindowSetAreas(
(Widget)m_scrolledWindow,
(Widget) 0, (Widget) 0,
(Widget) m_drawingArea);
+ PostCreation();
+
// Without this, the cursor may not be restored properly (e.g. in splitter
// sample).
SetCursor(*wxSTANDARD_CURSOR);
- SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
DoSetSizeIntr(pos.x, pos.y, size.x,size.y, wxSIZE_AUTO, true);
return true;
}
{
if (g_captureWindow == this)
g_captureWindow = NULL;
-
+
m_isBeingDeleted = true;
// Motif-specific actions first
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,
+ (const char*)label.mb_str(), NULL);
}
-wxString wxWindow::GetTitle() const
+wxString wxWindow::GetLabel() const
{
- char *title;
- XtVaGetValues((Widget)GetMainWidget(), XmNtitle, &title, NULL);
+ char *label = NULL;
+ XtVaGetValues((Widget)GetMainWidget(), XmNtitle, &label, NULL);
- return wxString(title);
+ return wxString(label);
}
void wxWindow::DoCaptureMouse()
// 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
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;
}
// 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
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;
}
menu->SetId(1); /* Mark as popped-up */
- menu->CreateMenu(NULL, widget, menu);
+ menu->CreateMenu(NULL, widget, menu, 0);
menu->SetInvokingWindow(this);
menu->UpdateUI();
m_drawingArea ) );
Dimension xx, yy;
- XtVaGetValues( widget,
- XmNwidth, &xx,
- XmNheight, &yy,
- NULL );
- if(x) *x = xx;
- if(y) *y = yy;
+ if (widget)
+ XtVaGetValues( widget,
+ XmNwidth, &xx,
+ XmNheight, &yy,
+ NULL );
+ if(x) *x = widget ? xx : -1;
+ if(y) *y = widget ? yy : -1;
}
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;
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;
Window thisWindow = XtWindow(widget);
Window childWindow;
- int xx = *x;
- int yy = *y;
- XTranslateCoordinates(display, rootWindow, thisWindow, xx, yy, x, y, &childWindow);
+ int xx = x ? *x : 0;
+ int yy = y ? *y : 0;
+ XTranslateCoordinates(display, rootWindow, thisWindow,
+ xx, yy, x ? x : &xx, y ? y : &yy,
+ &childWindow);
}
void wxWindow::DoClientToScreen(int *x, int *y) const
Window thisWindow = XtWindow(widget);
Window childWindow;
- int xx = *x;
- int yy = *y;
- XTranslateCoordinates(display, thisWindow, rootWindow, xx, yy, x, y, &childWindow);
+ int xx = x ? *x : 0;
+ int yy = y ? *y : 0;
+ XTranslateCoordinates(display, thisWindow, rootWindow,
+ xx, yy, x ? x : &xx, y ? y : &yy,
+ &childWindow);
}
{
// A bit of optimization to help sort out the flickers.
int oldX = -1, oldY = -1, oldW = -1, oldH = -1;
+
if( !fromCtor )
{
GetSize(& oldW, & oldH);
GetPosition(& oldX, & oldY);
}
+ if (x == -1)
+ x = oldX;
+ if (x == -1)
+ x = oldY;
+
if ( !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
{
- if ( x == -1 )
- x = oldX;
- if ( y == -1 )
- y = oldY;
+ if ( width == -1 )
+ width = oldW;
+ if ( height == -1 )
+ height = oldH;
}
- wxSize size(-1, -1);
+ wxSize size(wxDefaultSize);
if ( width <= 0 )
{
if ( ( sizeFlags & wxSIZE_AUTO_WIDTH ) && !fromCtor )
{
int flags = 0;
- if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+ if (x != oldX)
flags |= wxMOVE_X;
- if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+ if (y != oldY)
flags |= wxMOVE_Y;
if (width > 0)
}
else
{
- if( xx < 0 ) xx = 0;
- if( yy < 0 ) yy = 0;
if( w < 1 ) w = 1;
if( h < 1 ) h = 1;
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);
+
+ if (m_font.Ok())
+ wxGetTextExtent (GetXDisplay(), m_font, 1.0,
+ "x", NULL, &height, NULL, NULL);
+ else
+ wxGetTextExtent (this, "x", NULL, &height, NULL, NULL);
return height;
}
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);
+
+ if (m_font.Ok())
+ wxGetTextExtent (GetXDisplay(), m_font, 1.0,
+ "x", &width, NULL, NULL, NULL);
+ else
+ wxGetTextExtent (this, "x", &width, NULL, NULL, NULL);
return width;
}
{
const wxFont *fontToUse = theFont ? theFont : &m_font;
- wxCHECK_RET( fontToUse->Ok(), "valid window font needed" );
-
if (externalLeading)
*externalLeading = 0;
- wxGetTextExtent (GetXDisplay(), *fontToUse, 1.0,
- string, x, y, NULL, descent);
+ if (fontToUse->Ok())
+ wxGetTextExtent (GetXDisplay(), *fontToUse, 1.0,
+ string, x, y, NULL, descent);
+ else
+ wxGetTextExtent (this, string, x, y, NULL, descent);
}
// ----------------------------------------------------------------------------
void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
{
+ Widget widget = (Widget) GetMainWidget();
+ if (!widget)
+ return;
m_needsRefresh = true;
- Display *display = XtDisplay((Widget) GetMainWidget());
- Window thisWindow = XtWindow((Widget) GetMainWidget());
+ Display *display = XtDisplay(widget);
+ Window thisWindow = XtWindow(widget);
XExposeEvent dummyEvent;
int width, height;
{
// This calls the UI-update mechanism (querying windows for
// menu/toolbar/control state information)
- if (wxUpdateUIEvent::CanUpdate(this))
+ if (wxUpdateUIEvent::CanUpdate(this) && IsShown())
UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
}
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;
}
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);
}
XmScrollBarCallbackStruct *cbs)
{
wxWindow *win = wxGetWindowFromTable(scrollbar);
- wxOrientation orientation = (wxOrientation)(int)clientData;
+ wxCHECK_RET( win, _T("invalid widget in scrollbar callback") );
+
+ wxOrientation orientation = (wxOrientation)wxPtrToUInt(clientData);
wxEventType eventType = wxEVT_NULL;
switch (cbs->reason)
// 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();
}
|| (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);
if (id > -1)
return true;
- else
- return false;
- break;
+
+ return false;
}
default:
break;
#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;
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)
{
}
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;
int width, height, width1, height1;
GetSize(& width, & height);
- wxDoChangeFont( GetLabelWidget(), m_font );
+ wxDoChangeFont( w, m_font );
GetSize(& width1, & height1);
if (keepOriginalSize && (width != width1 || height != height1))
{
- SetSize(-1, -1, width, height);
+ SetSize(wxDefaultCoord, wxDefaultCoord, width, height);
}
}
}
+// Post-creation
+void wxWindow::PostCreation()
+{
+ ChangeFont();
+ ChangeForegroundColour();
+ ChangeBackgroundColour();
+}
+
+// Pre-creation
+void wxWindow::PreCreation()
+{
+ InheritAttributes();
+}
+
// ----------------------------------------------------------------------------
// global functions
// ----------------------------------------------------------------------------
// 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;
+}
+
+
+#if wxMOTIF_NEW_FONT_HANDLING
+
+#include <Xm/XmP.h>
+
+void wxGetTextExtent(const wxWindow* window, const wxString& str,
+ int* width, int* height, int* ascent, int* descent)
+{
+ Arg args[2];
+ int count = 0;
+ XmRendition rendition = NULL;
+ XmRenderTable table = NULL;
+ Widget w = (Widget) window->GetLabelWidget();
+
+ XtVaGetValues( w, XmNrenderTable, &table, NULL );
+ if (table == NULL)
+ table = XmeGetDefaultRenderTable(w, XmTEXT_RENDER_TABLE);
+
+ rendition = XmRenderTableGetRendition( table, "" );
+ XtSetArg( args[count], XmNfont, 0 ); ++count;
+ XtSetArg( args[count], XmNfontType, 0 ); ++count;
+ XmRenditionRetrieve( rendition, args, count );
+
+ if (args[1].value == XmFONT_IS_FONTSET)
+ {
+ XRectangle ink, logical;
+ WXFontSet fset = (WXFontSet) args[0].value;
+
+ XmbTextExtents( (XFontSet)fset, str.c_str(), str.length(),
+ &ink, &logical);
+
+ if( width ) *width = logical.width;
+ if( height ) *height = logical.height;
+ if( ascent ) *ascent = -logical.y;
+ if( descent ) *descent = logical.height + logical.y;
+ }
+ else
+ {
+ int direction, ascent2, descent2;
+ XCharStruct overall;
+ XFontStruct* fontStruct;
+
+ XmeRenderTableGetDefaultFont( table, &fontStruct );
+ XTextExtents(fontStruct, (const char*)str.c_str(), str.length(),
+ &direction, &ascent2, &descent2, &overall);
+
+ if ( width ) *width = overall.width;
+ if ( height ) *height = ascent2 + descent2;
+ if ( descent ) *descent = descent2;
+ if ( ascent ) *ascent = ascent2;
+ }
+}
+
+#else // if !wxMOTIF_NEW_FONT_HANDLING
+
+void wxGetTextExtent(const wxWindow* window, const wxString& str,
+ int* width, int* height, int* ascent, int* descent)
+{
+ XmFontList list = NULL;
+ XmFontContext cxt;
+ XmFontType type;
+ Widget w = (Widget) window->GetLabelWidget();
+
+ XtVaGetValues( w, XmNfontList, &list, NULL );
+ XmFontListInitFontContext( &cxt, list );
+
+ XmFontListEntry entry = XmFontListNextEntry( cxt );
+ XmFontListFreeFontContext( cxt );
+ XtPointer thing = XmFontListEntryGetFont( entry, &type );
+
+ if (type == XmFONT_IS_FONTSET)
+ {
+ XRectangle ink, logical;
+
+ XmbTextExtents( (XFontSet)thing, str.c_str(), str.length(),
+ &ink, &logical);
+
+ if( width ) *width = logical.width;
+ if( height ) *height = logical.height;
+ if( ascent ) *ascent = -logical.y;
+ if( descent ) *descent = logical.height + logical.y;
+ }
+ else
+ {
+ int direction, ascent2, descent2;
+ XCharStruct overall;
+
+ XTextExtents( (XFontStruct*)thing, (char*)(const char*)str.c_str(), str.length(),
+ &direction, &ascent2, &descent2, &overall);
+
+ if ( width ) *width = overall.width;
+ if ( height ) *height = ascent2 + descent2;
+ if ( descent ) *descent = descent2;
+ if ( ascent ) *ascent = ascent2;
+ }
+}
+
+#endif // !wxMOTIF_NEW_FONT_HANDLING
// ----------------------------------------------------------------------------
// wxNoOptimize: switch off size optimization
// ----------------------------------------------------------------------------
int wxNoOptimize::ms_count = 0;
-