From b28d3abf7eb85e8a8d056076d2812977105a28e1 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Mon, 11 Feb 2002 11:06:50 +0000 Subject: [PATCH] Small changes to wxX11 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14122 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/x11/private.h | 8 +- include/wx/x11/toplevel.h | 14 +-- include/wx/x11/window.h | 6 -- src/x11/app.cpp | 2 - src/x11/popupwin.cpp | 59 ++++++++++-- src/x11/settings.cpp | 68 +------------- src/x11/toplevel.cpp | 43 +++------ src/x11/utils.cpp | 14 --- src/x11/window.cpp | 192 +++++++++++--------------------------- 9 files changed, 131 insertions(+), 275 deletions(-) diff --git a/include/wx/x11/private.h b/include/wx/x11/private.h index 8970bb9505..d5514db7b9 100644 --- a/include/wx/x11/private.h +++ b/include/wx/x11/private.h @@ -65,11 +65,13 @@ Pixmap XCreateInsensitivePixmap( Display *display, Pixmap pixmap ); 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(); } diff --git a/include/wx/x11/toplevel.h b/include/wx/x11/toplevel.h index 4f75c698ca..2f05fec508 100644 --- a/include/wx/x11/toplevel.h +++ b/include/wx/x11/toplevel.h @@ -72,17 +72,6 @@ protected: // 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; @@ -98,5 +87,8 @@ protected: wxString m_title; }; +// list of all frames and modeless dialogs +//extern WXDLLEXPORT_DATA(wxWindowList) wxModelessWindows; + #endif // _WX_X11_TOPLEVEL_H_ diff --git a/include/wx/x11/window.h b/include/wx/x11/window.h index 5383f7d3ba..4a4b780bef 100644 --- a/include/wx/x11/window.h +++ b/include/wx/x11/window.h @@ -81,12 +81,6 @@ public: 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 ); diff --git a/src/x11/app.cpp b/src/x11/app.cpp index f1d67cd58b..9e840d40a5 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -296,8 +296,6 @@ void wxApp::ProcessXEvent(WXEvent* _event) while (window && !(win = wxGetWindowFromTable(window))) window = wxGetWindowParent(window); - // TODO: shouldn't all the ProcessEvents below - // be win->GetEventHandler()->ProcessEvent? switch (event->type) { case KeyPress: diff --git a/src/x11/popupwin.cpp b/src/x11/popupwin.cpp index fe1d27c1ed..6f9c4b7e50 100644 --- a/src/x11/popupwin.cpp +++ b/src/x11/popupwin.cpp @@ -16,9 +16,7 @@ #if wxUSE_POPUPWIN #include "wx/popupwin.h" -#include "wx/frame.h" #include "wx/app.h" -#include "wx/cursor.h" #include "wx/x11/private.h" @@ -40,11 +38,58 @@ bool wxPopupWindow::Create( wxWindow *parent, int style ) } // 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; } @@ -56,14 +101,12 @@ void wxPopupWindow::DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED( 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 diff --git a/src/x11/settings.cpp b/src/x11/settings.cpp index 5d64ffcd06..d27621f7c4 100644 --- a/src/x11/settings.cpp +++ b/src/x11/settings.cpp @@ -22,71 +22,9 @@ 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) diff --git a/src/x11/toplevel.cpp b/src/x11/toplevel.cpp index 54389a2161..c958328cef 100644 --- a/src/x11/toplevel.cpp +++ b/src/x11/toplevel.cpp @@ -41,12 +41,8 @@ #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 @@ -66,22 +62,6 @@ void wxTopLevelWindowX11::Init() 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, @@ -94,11 +74,15 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent, 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(); @@ -119,6 +103,7 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent, 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 | @@ -143,9 +128,7 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent, 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); @@ -262,7 +245,6 @@ void wxTopLevelWindowX11::SetIcon(const wxIcon& icon) if (icon.Ok() && GetMainWindow()) { -#if 0 XWMHints *wmHints = XAllocWMHints(); wmHints.icon_pixmap = (Pixmap) icon.GetPixmap(); @@ -277,7 +259,6 @@ void wxTopLevelWindowX11::SetIcon(const wxIcon& icon) XSetWMHints(wxGlobalDisplay(), (Window) GetMainWindow(), wmHints); XFree(wmHints); -#endif } } @@ -290,6 +271,8 @@ void wxTopLevelWindowX11::SetTitle(const wxString& title) (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; @@ -335,8 +318,7 @@ struct MwmHints { // 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; @@ -398,9 +380,8 @@ static bool SetWMDecorations(Widget w, long style) return TRUE; } -#endif -static bool MWMIsRunning(Window w) +bool wxMWMIsRunning(Window w) { Display *dpy = (Display*)wxGetDisplay(); Atom motifWmInfo = XInternAtom(dpy, "_MOTIF_WM_INFO", False); diff --git a/src/x11/utils.cpp b/src/x11/utils.cpp index cad46c2911..eef7ceb4ec 100644 --- a/src/x11/utils.cpp +++ b/src/x11/utils.cpp @@ -180,25 +180,11 @@ void wxBell() 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 } // ---------------------------------------------------------------------------- diff --git a/src/x11/window.cpp b/src/x11/window.cpp index c8c3d5dbf3..c7dc89cd39 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -127,21 +127,6 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, 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(); @@ -173,12 +158,9 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, 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). @@ -226,8 +208,7 @@ wxWindowX11::~wxWindowX11() void wxWindowX11::SetFocus() { -#if 0 - Window wMain = (Window) GetMainWidget(); + Window wMain = (Window) GetMainWindow(); if (wMain) { XSetInputFocus(wxGlobalDisplay(), wMain, RevertToParent, CurrentTime); @@ -237,7 +218,6 @@ void wxWindowX11::SetFocus() wmhints.input = True; XSetWMHints(wxGlobalDisplay(), wMain, &wmhints) } -#endif } // Get the window with the focus @@ -311,7 +291,6 @@ void wxWindowX11::DoCaptureMouse() if ( m_winCaptured ) return; - // TODO: should we also call XGrabButton, XGrabKeyboard? if (GetMainWindow()) { int res = XGrabPointer(wxGlobalDisplay(), (Window) GetMainWindow(), @@ -323,10 +302,45 @@ void wxWindowX11::DoCaptureMouse() 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; } } @@ -338,9 +352,13 @@ void wxWindowX11::DoReleaseMouse() 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; } @@ -386,40 +404,6 @@ void wxWindowX11::WarpPointer (int x, int y) 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) { @@ -1082,79 +1066,6 @@ WXWindow wxWindowX11::GetMainWindow() const 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 // ---------------------------------------------------------------------------- @@ -1396,6 +1307,17 @@ bool wxWindowX11::SetBackgroundColour(const wxColour& col) 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; } -- 2.47.2