#include <string.h>
-// ----------------------------------------------------------------------------
-// constants
-// ----------------------------------------------------------------------------
-
-static const int SCROLL_MARGIN = 4;
-
// ----------------------------------------------------------------------------
// global variables for this module
// ----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxWindowX11, wxWindowBase)
EVT_SYS_COLOUR_CHANGED(wxWindowX11::OnSysColourChanged)
- EVT_IDLE(wxWindowX11::OnIdle)
END_EVENT_TABLE()
// ============================================================================
CreateBase(parent, id, pos, size, style, wxDefaultValidator, name);
- if (parent)
- parent->AddChild(this);
-
- m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
- m_foregroundColour = *wxBLACK;
+ parent->AddChild(this);
int w = size.GetWidth();
int h = size.GetHeight();
if (x == -1) x = 0;
if (y == -1) y = 0;
- int screen = DefaultScreen(wxGlobalDisplay());
+ Display *xdisplay = (Display*) wxGlobalDisplay();
+ int xscreen = DefaultScreen( xdisplay );
+ Colormap cm = DefaultColormap( xdisplay, xscreen );
- Window parentWindow;
- if (parent)
- parentWindow = (Window) parent->GetMainWindow();
- else
- parentWindow = RootWindow(wxGlobalDisplay(), screen);
+ m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
+ m_backgroundColour.CalcPixel( (WXColormap) cm );
+ m_hasBgCol = TRUE;
+
+ m_foregroundColour = *wxBLACK;
+ m_foregroundColour.CalcPixel( (WXColormap) cm );
+
- Window window = XCreateSimpleWindow(wxGlobalDisplay(), parentWindow,
- x, y, w, h, 0,
- m_backgroundColour.AllocColour(wxGlobalDisplay()),
- m_foregroundColour.AllocColour(wxGlobalDisplay()));
+ Window parentWindow = (Window) parent->GetMainWindow();
+
+ Window window = XCreateSimpleWindow(
+ xdisplay, parentWindow,
+ x, y, w, h, 0,
+ m_backgroundColour.GetPixel(),
+ m_backgroundColour.GetPixel() );
+
+ m_mainWidget = (WXWindow) window;
// Select event types wanted
XSelectInput(wxGlobalDisplay(), window,
XWMHints wmhints;
wmhints.flags = InputHint;
wmhints.input = True;
- XSetWMHints(wxGlobalDisplay(), wMain, &wmhints)
+ XSetWMHints(wxGlobalDisplay(), wMain, &wmhints);
}
}
bool wxWindowX11::Show(bool show)
{
- if ( !wxWindowBase::Show(show) )
- return FALSE;
+ wxWindowBase::Show(show);
Window xwin = (Window) GetXWindow();
Display *xdisp = (Display*) GetXDisplay();
if (show)
{
+ wxString msg;
+ msg.Printf("Mapping window of type %s", GetClassInfo()->GetClassName());
+ wxLogDebug(msg);
XMapWindow(xdisp, xwin);
+ XSync(xdisp, False);
}
else
{
+ wxString msg;
+ msg.Printf("Unmapping window of type %s", GetClassInfo()->GetClassName());
+ wxLogDebug(msg);
XUnmapWindow(xdisp, xwin);
}
void wxWindowX11::DoCaptureMouse()
{
- g_captureWindow = (wxWindow*) this;
+ if ((g_captureWindow != NULL) && (g_captureWindow != this))
+ {
+ wxASSERT_MSG(FALSE, "Trying to capture before mouse released.");
+
+ // Core dump now
+ int *tmp = NULL;
+ (*tmp) = 1;
+ return;
+ }
+
if ( m_winCaptured )
return;
+ g_captureWindow = (wxWindow*) this;
+
if (GetMainWindow())
{
int res = XGrabPointer(wxGlobalDisplay(), (Window) GetMainWindow(),
if (res != GrabSuccess)
{
- wxLogDebug("Failed to grab pointer.");
+ wxString msg;
+ msg.Printf("Failed to grab pointer for window %s", this->GetClassInfo()->GetClassName());
+ wxLogDebug(msg);
+ if (res == GrabNotViewable)
+ {
+ wxLogDebug("This is not a viewable window - perhaps not shown yet?");
+ }
+ g_captureWindow = NULL;
return;
}
+ wxLogDebug("Grabbed pointer");
+#if 0
res = XGrabButton(wxGlobalDisplay(), AnyButton, AnyModifier,
(Window) GetMainWindow(),
FALSE,
GrabModeAsync,
None,
None);
-
+
if (res != GrabSuccess)
{
wxLogDebug("Failed to grab mouse buttons.");
XUngrabPointer(wxGlobalDisplay(), CurrentTime);
return;
}
+#endif
+#if 0
res = XGrabKeyboard(wxGlobalDisplay(), (Window) GetMainWindow(),
+#if 0
+ ShiftMask | LockMask | ControlMask | Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask,
+#else
FALSE,
- ShiftMask, LockMask, Control-Mask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, and Mod5Mask.,
+#endif
GrabModeAsync,
GrabModeAsync,
CurrentTime);
{
wxLogDebug("Failed to grab keyboard.");
XUngrabPointer(wxGlobalDisplay(), CurrentTime);
+#if 0
XUngrabButton(wxGlobalDisplay(), AnyButton, AnyModifier,
(Window) GetMainWindow());
+#endif
return;
}
-
+#endif
+
m_winCaptured = TRUE;
}
}
if ( wMain )
{
XUngrabPointer(wxGlobalDisplay(), wMain);
+#if 0
XUngrabButton(wxGlobalDisplay(), AnyButton, AnyModifier,
wMain);
XUngrabKeyboard(wxGlobalDisplay(), CurrentTime);
+#endif
}
+ wxLogDebug("Ungrabbed pointer");
m_winCaptured = FALSE;
}
else
cursor2 = wxSTANDARD_CURSOR;
- WXDisplay *dpy = GetXDisplay();
- WXCursor x_cursor = cursor2->GetXCursor(dpy);
+ WXCursor x_cursor = cursor2->GetCursor();
Window win = (Window) GetMainWindow();
- XDefineCursor((Display*) dpy, win, (Cursor) x_cursor);
+ XDefineCursor((Display*) wxGlobalDisplay(), win, (Cursor) x_cursor);
return TRUE;
}
// Does a physical scroll
void wxWindowX11::ScrollWindow(int dx, int dy, const wxRect *rect)
{
+#if 0
int x, y, w, h;
if (rect)
{
delete rect;
node = node->Next();
}
-
- // TODO
-
- // XmUpdateDisplay((Widget) GetMainWidget());
+#endif
}
// ---------------------------------------------------------------------------
if (window)
{
XWindowAttributes attr;
- Status status = XGetWindowAttributes(wxGlobalDisplay(), window, & attr);
+ Status status = XGetWindowAttributes( wxGlobalDisplay(), window, &attr );
wxASSERT(status);
if (status)
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;
}
windowChanges.height = height /* -m_borderSize*2*/;
valueMask |= CWHeight;
}
- AdjustForParentClientOrigin( x, y, sizeFlags);
XConfigureWindow(wxGlobalDisplay(), (Window) GetMainWindow(),
valueMask, & windowChanges);
int *descent, int *externalLeading,
const wxFont *theFont) const
{
- wxFont *fontToUse = (wxFont *)theFont;
- if (!fontToUse)
- fontToUse = (wxFont *) & m_font;
+ wxFont fontToUse = m_font;
+ if (theFont) fontToUse = *theFont;
- wxCHECK_RET( fontToUse->Ok(), "valid window font needed" );
-
- WXFontStructPtr pFontStruct = theFont->GetFontStruct(1.0, GetXDisplay());
+ wxCHECK_RET( fontToUse.Ok(), wxT("invalid font") );
+
+ WXFontStructPtr pFontStruct = fontToUse.GetFontStruct(1.0, GetXDisplay());
int direction, ascent, descent2;
XCharStruct overall;
&ascent, &descent2, &overall);
#endif
- XTextExtents((XFontStruct*) pFontStruct, string, slen,
+ XTextExtents((XFontStruct*) pFontStruct, string.c_str(), slen,
&direction, &ascent, &descent2, &overall);
if ( x )
}
else
{
- int height,width;
- GetSize( &width, &height );
+ int height,width;
+ GetSize( &width, &height );
// Schedule for later Updating in ::Update() or ::OnInternalIdle().
m_updateRegion.Clear();
m_updateRegion.Union( 0, 0, width, height );
}
-
- // Actually don't schedule yet..
- Update();
}
void wxWindowX11::Update()
{
m_clipPaintRegion = TRUE;
- if (!m_clearRegion.IsEmpty())
+ // if (!m_clearRegion.IsEmpty())
{
wxWindowDC dc( (wxWindow*)this );
dc.SetClippingRegion( m_clearRegion );
wxRegionIterator upd( m_clearRegion );
while (upd)
{
- // XClearArea( ... , upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
+ XClearArea( wxGlobalDisplay(), (Window) m_mainWidget,
+ upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight(), False );
upd ++;
}
}
paint_event.SetEventObject( this );
GetEventHandler()->ProcessEvent( paint_event );
+ m_updateRegion.Clear();
+
m_clipPaintRegion = FALSE;
}
}
}
-void wxWindowX11::OnIdle(wxIdleEvent& WXUNUSED(event))
+void wxWindowX11::OnInternalIdle()
{
+ // Update invalidated regions.
+ Update();
+
// This calls the UI-update mechanism (querying windows for
// menu/toolbar/control state information)
UpdateWindowUI();
bool wxWindowX11::SetBackgroundColour(const wxColour& col)
{
- if ( !wxWindowBase::SetBackgroundColour(col) )
- return FALSE;
+ wxWindowBase::SetBackgroundColour(col);
if (!GetMainWindow())
return FALSE;
+ Display *xdisplay = (Display*) wxGlobalDisplay();
+ int xscreen = DefaultScreen( xdisplay );
+ Colormap cm = DefaultColormap( xdisplay, xscreen );
+
+ wxColour colour( col );
+ colour.CalcPixel( (WXColormap) cm );
+
XSetWindowAttributes attrib;
- attrib.background_pixel = col.AllocColour(wxGlobalDisplay());
+ attrib.background_pixel = colour.GetPixel();
XChangeWindowAttributes(wxGlobalDisplay(),
(Window) GetMainWindow(),