extern XColor g_itemColors[];
extern int wxComputeColours (Display *display, wxColour * back, wxColour * fore);
-extern void wxDoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour);
-extern void wxDoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, bool changeArmColour = FALSE);
-
extern Window wxGetWindowParent(Window window);
+// Set the window manager decorations according to the
+// given wxWindows style
+bool wxSetWMDecorations(Window w, long style);
+bool wxMWMIsRunning(Window w);
+
// For convenience
inline Display* wxGlobalDisplay() { return (Display*) wxGetDisplay(); }
// common part of all ctors
void Init();
- // create a new frame, return FALSE if it couldn't be created
- bool CreateFrame(const wxString& title,
- const wxPoint& pos,
- const wxSize& size);
-
- // create a new dialog using the given dialog template from resources,
- // return FALSE if it couldn't be created
- bool CreateDialog(const wxString& title,
- const wxPoint& pos,
- const wxSize& size);
-
// is the frame currently iconized?
bool m_iconized;
wxString m_title;
};
+// list of all frames and modeless dialogs
+//extern WXDLLEXPORT_DATA(wxWindowList) wxModelessWindows;
+
#endif // _WX_X11_TOPLEVEL_H_
const wxFont *theFont = (const wxFont *) NULL)
const;
- virtual void SetScrollbar( int orient, int pos, int thumbVisible,
- int range, bool refresh = TRUE );
- virtual void SetScrollPos( int orient, int pos, bool refresh = TRUE );
- virtual int GetScrollPos( int orient ) const;
- virtual int GetScrollThumb( int orient ) const;
- virtual int GetScrollRange( int orient ) const;
virtual void ScrollWindow( int dx, int dy,
const wxRect* rect = (wxRect *) NULL );
while (window && !(win = wxGetWindowFromTable(window)))
window = wxGetWindowParent(window);
- // TODO: shouldn't all the ProcessEvents below
- // be win->GetEventHandler()->ProcessEvent?
switch (event->type)
{
case KeyPress:
#if wxUSE_POPUPWIN
#include "wx/popupwin.h"
-#include "wx/frame.h"
#include "wx/app.h"
-#include "wx/cursor.h"
#include "wx/x11/private.h"
}
// All dialogs should really have this style
+ m_windowStyle = style;
m_windowStyle |= wxTAB_TRAVERSAL;
+ m_parent = parent;
if (m_parent) m_parent->AddChild( this );
- // TODO: implementation
+ wxTopLevelWindows.Append(this);
+
+ Display *xdisplay = wxGlobalDisplay();
+ int xscreen = DefaultScreen( xdisplay );
+ Visual *xvisual = DefaultVisual( xdisplay, xscreen );
+ Window xparent = RootWindow( xdisplay, xscreen );
+
+ XSetWindowAttributes xattributes;
+ XSizeHints size_hints;
+ XWMHints wm_hints;
+
+ long xattributes_mask =
+ CWEventMask |
+ CWBorderPixel | CWBackPixel;
+ xattributes.background_pixel = BlackPixel( xdisplay, xscreen );
+ xattributes.border_pixel = BlackPixel( xdisplay, xscreen );
+ xattributes.override_redirect = False;
+
+ Window xwindow = XCreateWindow( xdisplay, xparent, pos.x, pos.y, size.x, size.y,
+ 0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes );
+
+ XSelectInput( xdisplay, xwindow,
+ ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
+ ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask |
+ KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask |
+ PropertyChangeMask );
+
+ m_mainWindow = (WXWindow) xwindow;
+ wxAddWindowToTable( xwindow, (wxWindow*) this );
+
+ XSetTransientForHint( xdisplay, xwindow, xparent );
+
+ size_hints.flags = PSize;
+ size_hints.width = size.x;
+ size_hints.height = size.y;
+ XSetWMNormalHints( xdisplay, xwindow, &size_hints);
+
+ wm_hints.flags = InputHint | StateHint /* | WindowGroupHint */;
+ wm_hints.input = True;
+ wm_hints.initial_state = NormalState;
+ XSetWMHints( xdisplay, xwindow, &wm_hints);
+
+ Atom wm_delete_window = XInternAtom( xdisplay, "WM_DELETE_WINDOW", False);
+ XSetWMProtocols( xdisplay, xwindow, &wm_delete_window, 1);
+
+ wxSetWMDecorations((Window) GetMainWindow(), style);
return TRUE;
}
void wxPopupWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
{
- // TODO
+ wxWindowX11::DoSetSize(x, y, width, height, sizeFlags);
}
+
bool wxPopupWindow::Show( bool show )
{
- // TODO?
- bool ret = wxWindow::Show( show );
-
- return ret;
+ return wxWindow11::Show( show );
}
#endif // wxUSE_POPUPWIN
wxColour wxSystemSettingsNative::GetColour(wxSystemColour index)
{
- switch (index)
- {
- case wxSYS_COLOUR_WINDOW:
- {
- return *wxWHITE;
- }
- case wxSYS_COLOUR_SCROLLBAR:
- // case wxSYS_COLOUR_DESKTOP: // Same as wxSYS_COLOUR_BACKGROUND
- case wxSYS_COLOUR_BACKGROUND:
- case wxSYS_COLOUR_ACTIVECAPTION:
- case wxSYS_COLOUR_INACTIVECAPTION:
- case wxSYS_COLOUR_MENU:
- case wxSYS_COLOUR_WINDOWFRAME:
- case wxSYS_COLOUR_ACTIVEBORDER:
- case wxSYS_COLOUR_INACTIVEBORDER:
- case wxSYS_COLOUR_BTNFACE:
- // case wxSYS_COLOUR_3DFACE: // Same as wxSYS_COLOUR_BTNFACE
- case wxSYS_COLOUR_GRAYTEXT:
- {
- return wxColour("LIGHT GREY");
- }
- case wxSYS_COLOUR_BTNSHADOW:
- // case wxSYS_COLOUR_3DSHADOW: // Same as wxSYS_COLOUR_BTNSHADOW
- {
- return wxColour("GREY");
- }
- case wxSYS_COLOUR_3DDKSHADOW:
- {
- return *wxBLACK;
- }
- case wxSYS_COLOUR_HIGHLIGHT:
- {
- return *wxBLUE;
- }
- case wxSYS_COLOUR_BTNHIGHLIGHT:
- case wxSYS_COLOUR_LISTBOX:
- // case wxSYS_COLOUR_3DHIGHLIGHT: // Same as wxSYS_COLOUR_BTNHIGHLIGHT
- {
- return *wxWHITE;
- }
- case wxSYS_COLOUR_3DLIGHT:
- {
- return wxColour("LIGHT GREY");
- }
- case wxSYS_COLOUR_MENUTEXT:
- case wxSYS_COLOUR_WINDOWTEXT:
- case wxSYS_COLOUR_CAPTIONTEXT:
- case wxSYS_COLOUR_INACTIVECAPTIONTEXT:
- case wxSYS_COLOUR_BTNTEXT:
- case wxSYS_COLOUR_INFOTEXT:
- {
- return *wxBLACK;
- }
- case wxSYS_COLOUR_HIGHLIGHTTEXT:
- {
- return *wxWHITE;
- }
- case wxSYS_COLOUR_INFOBK:
- case wxSYS_COLOUR_APPWORKSPACE:
- {
- return wxColour("LIGHT GREY");
- // return *wxWHITE;
- }
- }
- return *wxWHITE;
+ // Overridden by wxSystemSettings::GetColour in wxUniversal
+ // to do the Right Thing
+ return *wxWHITE;
}
wxFont wxSystemSettingsNative::GetFont(wxSystemFont index)
#include "X11/Xatom.h"
#include "X11/Xutil.h"
-// Set the window manager decorations according to the
-// given wxWindows style
-#if 0
-static bool SetWMDecorations(Widget w, long style);
-#endif
-static bool MWMIsRunning(Window w);
+// list of all frames and modeless dialogs
+// wxWindowList wxModelessWindows;
// ----------------------------------------------------------------------------
// wxTopLevelWindowX11 creation
m_fsIsShowing = FALSE;
}
-bool wxTopLevelWindowX11::CreateDialog(const wxString& title,
- const wxPoint& pos,
- const wxSize& size)
-{
- // TODO
- return FALSE;
-}
-
-bool wxTopLevelWindowX11::CreateFrame(const wxString& title,
- const wxPoint& pos,
- const wxSize& size)
-{
- // TODO
- return FALSE;
-}
-
bool wxTopLevelWindowX11::Create(wxWindow *parent,
wxWindowID id,
const wxString& title,
Init();
m_windowStyle = style;
+ m_parent = parent;
SetName(name);
m_windowId = id == -1 ? NewControlId() : id;
+ if (parent)
+ parent->AddChild(this);
+
wxTopLevelWindows.Append(this);
Display *xdisplay = wxGlobalDisplay();
Window xwindow = XCreateWindow( xdisplay, xparent, pos.x, pos.y, size.x, size.y,
0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes );
+ m_mainWindow = (WXWindow) xwindow;
XSelectInput( xdisplay, xwindow,
ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
Atom wm_delete_window = XInternAtom( xdisplay, "WM_DELETE_WINDOW", False);
XSetWMProtocols( xdisplay, xwindow, &wm_delete_window, 1);
-#if 0
- SetWMDecorations((Window) GetMainWindow(), style);
-#endif
+ wxSetWMDecorations((Window) GetMainWindow(), style);
SetTitle(title);
if (icon.Ok() && GetMainWindow())
{
-#if 0
XWMHints *wmHints = XAllocWMHints();
wmHints.icon_pixmap = (Pixmap) icon.GetPixmap();
XSetWMHints(wxGlobalDisplay(), (Window) GetMainWindow(),
wmHints);
XFree(wmHints);
-#endif
}
}
(const char*) title);
XSetIconName(wxGlobalDisplay(), (Window) GetMainWindow(),
(const char*) title);
+
+ // Use this if the platform doesn't supply the above functions.
#if 0
XTextProperty textProperty;
textProperty.value = (unsigned char*) title;
// Set the window manager decorations according to the
// given wxWindows style
-#if 0
-static bool SetWMDecorations(Widget w, long style)
+bool wxSetWMDecorations(Window w, long style)
{
if (!MWMIsRunning(w))
return FALSE;
return TRUE;
}
-#endif
-static bool MWMIsRunning(Window w)
+bool wxMWMIsRunning(Window w)
{
Display *dpy = (Display*)wxGetDisplay();
Atom motifWmInfo = XInternAtom(dpy, "_MOTIF_WM_INFO", False);
int wxGetOsVersion(int *majorVsn, int *minorVsn)
{
-#if 0
- // FIXME TODO
- // This code is WRONG!! Does NOT return the
- // Motif version of the libs but the X protocol
- // version!
- Display *display = XtDisplay ((Widget) wxTheApp->GetTopLevelWidget());
- if (majorVsn)
- *majorVsn = ProtocolVersion (display);
- if (minorVsn)
- *minorVsn = ProtocolRevision (display);
-
- return wxMOTIF_X;
-#else
if (majorVsn)
*majorVsn = 0;
if (minorVsn)
*minorVsn = 0;
return wxX11;
-#endif
}
// ----------------------------------------------------------------------------
m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
m_foregroundColour = *wxBLACK;
-#if 0
- // TODO: How to create more interesting borders?
- // Will presumably have to create multiple windows.
- if (style & wxSIMPLE_BORDER)
- {
- m_borderSize = 1;
- } else if (style & wxSUNKEN_BORDER)
- {
- m_borderSize = 1;
- } else if (style & wxRAISED_BORDER)
- {
- m_borderSize = 1;
- }
-#endif
-
int w = size.GetWidth();
int h = size.GetHeight();
int x = size.GetX();
wxAddWindowToTable(window, (wxWindow*) this);
- // If a subwindow, show.
-// if (parent && !parent->IsKindOf(CLASSINFO(wxTopLevelWindowX11)) && parent->IsShown())
- {
- m_isShown = TRUE;
- XMapWindow(wxGlobalDisplay(), window);
- }
+ // Is a subwindow, so map immediately
+ m_isShown = TRUE;
+ XMapWindow(wxGlobalDisplay(), window);
// Without this, the cursor may not be restored properly (e.g. in splitter
// sample).
void wxWindowX11::SetFocus()
{
-#if 0
- Window wMain = (Window) GetMainWidget();
+ Window wMain = (Window) GetMainWindow();
if (wMain)
{
XSetInputFocus(wxGlobalDisplay(), wMain, RevertToParent, CurrentTime);
wmhints.input = True;
XSetWMHints(wxGlobalDisplay(), wMain, &wmhints)
}
-#endif
}
// Get the window with the focus
if ( m_winCaptured )
return;
- // TODO: should we also call XGrabButton, XGrabKeyboard?
if (GetMainWindow())
{
int res = XGrabPointer(wxGlobalDisplay(), (Window) GetMainWindow(),
None, /* cursor */ // TODO: This may need to be set to the cursor of this window
CurrentTime);
- if (res == GrabSuccess)
+ if (res != GrabSuccess)
{
- m_winCaptured = TRUE;
+ wxLogDebug("Failed to grab pointer.");
+ return;
}
+
+ res = XGrabButton(wxGlobalDisplay(), AnyButton, AnyModifier,
+ (Window) GetMainWindow(),
+ FALSE,
+ ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
+ GrabModeAsync,
+ GrabModeAsync,
+ None,
+ None);
+
+ if (res != GrabSuccess)
+ {
+ wxLogDebug("Failed to grab mouse buttons.");
+ XUngrabPointer(wxGlobalDisplay(), CurrentTime);
+ return;
+ }
+
+ res = XGrabKeyboard(wxGlobalDisplay(), (Window) GetMainWindow(),
+ FALSE,
+ ShiftMask, LockMask, Control-Mask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, and Mod5Mask.,
+ GrabModeAsync,
+ GrabModeAsync,
+ CurrentTime);
+
+ if (res != GrabSuccess)
+ {
+ wxLogDebug("Failed to grab keyboard.");
+ XUngrabPointer(wxGlobalDisplay(), CurrentTime);
+ XUngrabButton(wxGlobalDisplay(), AnyButton, AnyModifier,
+ (Window) GetMainWindow());
+ return;
+ }
+
+ m_winCaptured = TRUE;
}
}
Window wMain = (Window)GetMainWindow();
- // TODO: should we also call XUngrabButton, XUngrabKeyboard?
if ( wMain )
+ {
XUngrabPointer(wxGlobalDisplay(), wMain);
+ XUngrabButton(wxGlobalDisplay(), AnyButton, AnyModifier,
+ wMain);
+ XUngrabKeyboard(wxGlobalDisplay(), CurrentTime);
+ }
m_winCaptured = FALSE;
}
XWarpPointer( wxGlobalDisplay(), None, (Window) m_mainWidget, 0, 0, 0, 0, x, y);
}
-// ---------------------------------------------------------------------------
-// scrolling stuff
-// ---------------------------------------------------------------------------
-
-int wxWindowX11::GetScrollPos(int orient) const
-{
- return 0;
-}
-
-// This now returns the whole range, not just the number of positions that we
-// can scroll.
-int wxWindowX11::GetScrollRange(int WXUNUSED(orient)) const
-{
- return 0;
-}
-
-int wxWindowX11::GetScrollThumb(int orient) const
-{
- // TODO
- return 0;
-}
-
-void wxWindowX11::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
-{
- // TODO
-}
-
-// New function that will replace some of the above.
-void wxWindowX11::SetScrollbar(int WXUNUSED(orient), int WXUNUSED(pos), int WXUNUSED(thumbVisible),
- int WXUNUSED(range), bool WXUNUSED(refresh))
-{
- // TODO
-}
-
// Does a physical scroll
void wxWindowX11::ScrollWindow(int dx, int dy, const wxRect *rect)
{
return m_mainWidget;
}
-// ----------------------------------------------------------------------------
-// callbacks
-// ----------------------------------------------------------------------------
-
-// TODO: implement wxWindow scrollbar, presumably using wxScrollBar
-#if 0
-static void wxScrollBarCallback(Widget scrollbar,
- XtPointer clientData,
- XmScrollBarCallbackStruct *cbs)
-{
- wxWindow *win = wxGetWindowFromTable(scrollbar);
- int orientation = (int) clientData;
-
- wxEventType eventType = wxEVT_NULL;
- switch (cbs->reason)
- {
- case XmCR_INCREMENT:
- {
- eventType = wxEVT_SCROLLWIN_LINEDOWN;
- break;
- }
- case XmCR_DECREMENT:
- {
- eventType = wxEVT_SCROLLWIN_LINEUP;
- break;
- }
- case XmCR_DRAG:
- {
- eventType = wxEVT_SCROLLWIN_THUMBTRACK;
- break;
- }
- case XmCR_VALUE_CHANGED:
- {
- eventType = wxEVT_SCROLLWIN_THUMBRELEASE;
- break;
- }
- case XmCR_PAGE_INCREMENT:
- {
- eventType = wxEVT_SCROLLWIN_PAGEDOWN;
- break;
- }
- case XmCR_PAGE_DECREMENT:
- {
- eventType = wxEVT_SCROLLWIN_PAGEUP;
- break;
- }
- case XmCR_TO_TOP:
- {
- eventType = wxEVT_SCROLLWIN_TOP;
- break;
- }
- case XmCR_TO_BOTTOM:
- {
- eventType = wxEVT_SCROLLWIN_BOTTOM;
- break;
- }
- default:
- {
- // Should never get here
- wxFAIL_MSG("Unknown scroll event.");
- break;
- }
- }
-
- wxScrollWinEvent event(eventType,
- cbs->value,
- ((orientation == XmHORIZONTAL) ?
- wxHORIZONTAL : wxVERTICAL));
- event.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent(event);
-}
-#endif
-
// ----------------------------------------------------------------------------
// TranslateXXXEvent() functions
// ----------------------------------------------------------------------------
if ( !wxWindowBase::SetBackgroundColour(col) )
return FALSE;
+ if (!GetMainWindow())
+ return FALSE;
+
+ XSetWindowAttributes attrib;
+ attrib.background_pixel = col.AllocColour(wxGlobalDisplay());
+
+ XChangeWindowAttributes(wxGlobalDisplay(),
+ (Window) GetMainWindow(),
+ CWBackPixel,
+ & attrib);
+
return TRUE;
}