From 256d631aaf9ec4028bac066ea21c15337c6e4214 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Fri, 15 Feb 2002 11:14:42 +0000 Subject: [PATCH] Started some NanoX work (blind to begin with) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14224 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- configure.in | 12 ++- distrib/msw/tmake/filelist.txt | 1 + include/wx/x11/app.h | 13 ++- include/wx/x11/nanox/X11/Xlib.h | 39 ++++++++ src/x11/app.cpp | 152 +++++++++++++++++++++++--------- src/x11/toplevel.cpp | 3 + src/x11/utils.cpp | 16 ++-- src/x11/window.cpp | 10 +-- 8 files changed, 185 insertions(+), 61 deletions(-) diff --git a/configure.in b/configure.in index 92404961ea..43621eef19 100644 --- a/configure.in +++ b/configure.in @@ -1854,7 +1854,7 @@ equivalent variable and GTK+ is version 1.2.3 or above. AFMINSTALL=afminstall COMPILED_X_PROGRAM=0 - if test "$wxUSE_NANOX" = 1; then + if test "$wxUSE_NANOX" = "yes"; then AC_MSG_CHECKING(for MicroWindows/NanoX distribution) if test "x$MICROWIN" = x ; then AC_MSG_RESULT(not found) @@ -1895,7 +1895,7 @@ equivalent variable and GTK+ is version 1.2.3 or above. ) fi - if test "$wxUSE_NANOX" = 1; then + if test "$wxUSE_NANOX" = "yes"; then TOOLKIT_INCLUDE="-I\$(top_srcdir)/include/wx/x11/nanox -I\$(MICROWIN)/src/include $TOOLKIT_INCLUDE" TOOLCHAIN_DEFS="${TOOLCHAIN_DEFS} -D__NANOX__" GUI_TK_LIBRARY="$GUI_TK_LIBRARY \$MICROWIN/src/lib/libnano-X.a \$MICROWIN/src/lib/libmwengine.a \$MICROWIN/src/lib/libmwfonts.a \$MICROWIN/src/lib/libmwdrivers.a \$MICROWIN/src/lib/libmwobjects.a" @@ -4043,8 +4043,12 @@ if test "$wxUSE_PROLOGIO" = "yes" ; then fi if test "$wxUSE_RESOURCES" = "yes" ; then - AC_DEFINE(wxUSE_RESOURCES) - SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS resource" + if test "$wxUSE_NANOX" = "yes"; then + AC_MSG_WARN([Cannot use resource database functions in NanoX]) + else + AC_DEFINE(wxUSE_RESOURCES) + SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS resource" + fi fi if test "$wxUSE_X_RESOURCES" = "yes"; then diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index 42bf5e9821..4265aa9311 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -602,6 +602,7 @@ utils.cpp Motif window.cpp Motif gsockx11.c X11 Socket +nanox.c X11 app.cpp X11 bitmap.cpp X11 brush.cpp X11 diff --git a/include/wx/x11/app.h b/include/wx/x11/app.h index 402a8dbf09..1f487dbbc8 100644 --- a/include/wx/x11/app.h +++ b/include/wx/x11/app.h @@ -35,7 +35,7 @@ class WXDLLEXPORT wxLog; class WXDLLEXPORT wxEventLoop; // ---------------------------------------------------------------------------- -// the wxApp class for Motif - see wxAppBase for more details +// the wxApp class for wxX11 - see wxAppBase for more details // ---------------------------------------------------------------------------- class WXDLLEXPORT wxApp : public wxAppBase @@ -99,11 +99,16 @@ public: // We need this before create the app static WXDisplay* GetDisplay() { return ms_display; } static WXDisplay* ms_display; + + // Values that can be passed on the command line. + // Returns -1, -1 if none specified. + const wxSize& GetInitialSize() const { return m_initialSize; } + bool GetShowIconic() const { return m_showIconic; } public: - static long sm_lastMessageTime; - int m_nCmdShow; - + static long sm_lastMessageTime; + bool m_showIconic; + wxSize m_initialSize; protected: bool m_keepGoing; diff --git a/include/wx/x11/nanox/X11/Xlib.h b/include/wx/x11/nanox/X11/Xlib.h index a43c74f56a..3f84a0be71 100644 --- a/include/wx/x11/nanox/X11/Xlib.h +++ b/include/wx/x11/nanox/X11/Xlib.h @@ -3,3 +3,42 @@ */ #include "XtoNX.h" + +/* Data types */ + +typedef GR_PALETTE Colormap; + +/* events*/ + +/* What should this be? */ +#if 0 +#ifndef ResizeRequest +#define ResizeRequest ?? +#endif +#endif + +#ifndef MotionNotify +#define MotionNotify GR_EVENT_TYPE_MOUSE_POSITION +#define PointerMotionMask GR_EVENT_MASK_MOUSE_POSITION +#endif + +#ifndef FocusIn +#define FocusIn GR_EVENT_TYPE_FOCUS_IN +#define FocusOut GR_EVENT_TYPE_FOCUS_OUT +#define FocusChangeMask GR_EVENT_MASK_FOCUS_IN|GR_EVENT_MASK_FOCUS_OUT +#endif + +/* Fuunctions */ + +#ifdef __cpluplus +extern "C" { +#endif + +Colormap DefaultColormapOfScreen(Screen /* screen */); + +#ifdef __cpluplus +} +#endif + +#define XGetMaxRequestSize(display) 16384 + diff --git a/src/x11/app.cpp b/src/x11/app.cpp index 1133927b8d..71650e7b23 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -17,19 +17,14 @@ #include "wx/app.h" #include "wx/utils.h" #include "wx/gdicmn.h" -#include "wx/pen.h" -#include "wx/brush.h" -#include "wx/cursor.h" #include "wx/icon.h" #include "wx/dialog.h" -#include "wx/msgdlg.h" #include "wx/log.h" #include "wx/module.h" #include "wx/memory.h" #include "wx/log.h" #include "wx/intl.h" #include "wx/evtloop.h" -#include "wx/cmdline.h" #if wxUSE_THREADS #include "wx/thread.h" @@ -44,8 +39,8 @@ #endif #include #include -#include #include + #ifdef __VMS__ #pragma message enable nosimpint #endif @@ -81,6 +76,13 @@ static int wxXErrorHandler(Display *dpy, XErrorEvent *xevent) long wxApp::sm_lastMessageTime = 0; WXDisplay *wxApp::ms_display = NULL; +// This is set within wxEntryStart -- too early on +// to put these in wxTheApp +static int g_newArgc = 0; +static wxChar** g_newArgv = NULL; +static bool g_showIconic = FALSE; +static wxSize g_initialSize = wxDefaultSize; + bool wxApp::Initialize() { wxClassInfo::InitializeClasses(); @@ -111,6 +113,10 @@ bool wxApp::Initialize() void wxApp::CleanUp() { + if (g_newArgv) + delete[] g_newArgv; + g_newArgv = NULL; + delete wxWidgetHashTable; wxWidgetHashTable = NULL; @@ -156,11 +162,6 @@ void wxApp::CleanUp() delete wxLog::SetActiveTarget(NULL); } -// This is set within wxEntryStart -- too early on -// to put these in wxTheApp -static int g_newArgc = 0; -static wxChar** g_newArgv = NULL; - // NB: argc and argv may be changed here, pass by reference! int wxEntryStart( int& argc, char *argv[] ) { @@ -169,18 +170,79 @@ int wxEntryStart( int& argc, char *argv[] ) gs_pfnXErrorHandler = XSetErrorHandler( wxXErrorHandler ); #endif // __WXDEBUG__ - /// TODO -#if 0 + wxString displayName; + bool syncDisplay = FALSE; + // Parse the arguments. -#endif + // We can't use wxCmdLineParser or OnInitCmdLine and friends because + // we have to create the Display earlier. If we can find a way to + // use the wxAppBase API then I'll be quite happy to change it. + g_newArgv = new wxChar*[argc]; + g_newArgc = 0; + int i; + for (i = 0; i < argc; i++) + { + wxString arg(argv[i]); + if (arg == wxT("-display")) + { + if (i < (argc - 1)) + { + i ++; + displayName = argv[i]; + continue; + } + } + else if (arg == wxT("-geometry")) + { + if (i < (argc - 1)) + { + i ++; + windowGeometry = argv[i]; + int w, h; + if (wxSscanf(windowGeometry.c_str(), _T("%dx%d"), &w, &h) != 2) + { + wxLogError(_("Invalid geometry specification '%s'", windowGeometry.c_str()); + } + else + { + g_initialSize = wxSize(w, h); + } + continue; + } + } + else if (arg == wxT("-sync")) + { + syncDisplay = TRUE; + continue; + } + else if (arg == wxT("-iconic")) + { + g_showIconic = TRUE; - Display* xdisplay = XOpenDisplay(NULL); + continue; + } + + // Not eaten by wxWindows, so pass through + g_newArgv[g_newArgc] = argv[i]; + g_newArgc ++; + } + + Display* xdisplay; + if (displayName.IsEmpty()) + xdisplay = XOpenDisplay(NULL); + else + xdisplay = XOpenDisplay(displayName); if (!xdisplay) { wxLogError( _("wxWindows could not open display. Exiting.") ); return -1; } + + if (syncDisplay) + { + XSynchronize(xdisplay, True); + } wxApp::ms_display = (WXDisplay*) xdisplay; @@ -194,7 +256,6 @@ int wxEntryStart( int& argc, char *argv[] ) return 0; } - int wxEntryInitGui() { int retValue = 0; @@ -253,6 +314,8 @@ int wxEntry( int argc, char *argv[] ) wxTheApp->argc = argc; wxTheApp->argv = argv; } + wxTheApp->m_showIconic = g_showIconic; + wxTheApp->m_initialSize = g_initialSize; int retValue; retValue = wxEntryInitGui(); @@ -310,6 +373,8 @@ wxApp::wxApp() m_topLevelWidget = (WXWindow) NULL; m_maxRequestSize = 0; m_mainLoop = NULL; + m_showIconic = FALSE; + m_initialSize = wxDefaultSize; } bool wxApp::Initialized() @@ -342,11 +407,6 @@ void wxApp::ProcessXEvent(WXEvent* _event) Window actualWindow = window; // Find the first wxWindow that corresponds to this event window - // TODO: may need to translate coordinates from actualWindow - // to window, if the receiving window != wxWindow window - // while (window && !(win = wxGetWindowFromTable(window))) - // window = wxGetWindowParent(window); - // Because we're receiving events after a window // has been destroyed, assume a 1:1 match between // Window and wxWindow, so if it's not in the table, @@ -399,6 +459,18 @@ void wxApp::ProcessXEvent(WXEvent* _event) } return; } + case ConfigureNotify: + { + // Not clear if this is the same in NanoX + if (win) + { + wxSizeEvent sizeEvent( wxSize(event->xconfigure.width,event->xconfigure.height), win->GetId() ); + sizeEvent.SetEventObject( win ); + + win->GetEventHandler()->ProcessEvent( sizeEvent ); + } + } +#if !wxUSE_NANOX case PropertyNotify: { HandlePropertyChange(_event); @@ -424,19 +496,9 @@ void wxApp::ProcessXEvent(WXEvent* _event) } return; } - case ConfigureNotify: - { - if (win) - { - wxSizeEvent sizeEvent( wxSize(event->xconfigure.width,event->xconfigure.height), win->GetId() ); - sizeEvent.SetEventObject( win ); - - win->GetEventHandler()->ProcessEvent( sizeEvent ); - } - } case ResizeRequest: { - /* Terry Gitnick - 1/21/98 + /* * If resize event, don't resize until the last resize event for this * window is recieved. Prevents flicker as windows are resized. */ @@ -448,9 +510,6 @@ void wxApp::ProcessXEvent(WXEvent* _event) report = * event; while( XCheckTypedWindowEvent (disp, actualWindow, ResizeRequest, &report)); - // TODO: when implementing refresh optimization, we can use - // XtAddExposureToRegion to expand the window's paint region. - if (win) { wxSize sz = win->GetSize(); @@ -462,6 +521,17 @@ void wxApp::ProcessXEvent(WXEvent* _event) return; } +#endif +#if wxUSE_NANOX + case GR_EVENT_TYPE_CLOSE_REQ: + { + if (win) + { + win->Close(FALSE); + } + break; + } +#endif case Expose: { if (win) @@ -497,7 +567,9 @@ void wxApp::ProcessXEvent(WXEvent* _event) } case FocusIn: { +#if !wxUSE_NANOX if (win && event->xfocus.detail != NotifyPointer) +#endif { wxLogDebug( "FocusIn from %s", win->GetName().c_str() ); @@ -509,7 +581,9 @@ void wxApp::ProcessXEvent(WXEvent* _event) } case FocusOut: { +#if !wxUSE_NANOX if (win && event->xfocus.detail != NotifyPointer) +#endif { wxLogDebug( "FocusOut from %s\n", win->GetName().c_str() ); @@ -572,7 +646,7 @@ void wxApp::HandlePropertyChange(WXEvent *event) { // by default do nothing special // TODO: what to do for X11 - // XtDispatchEvent((XEvent*) event); /* let Motif do the work */ + // XtDispatchEvent((XEvent*) event); } void wxApp::OnIdle(wxIdleEvent& event) @@ -671,7 +745,7 @@ void wxApp::DeletePendingObjects() } } -// Create an application context +// Create display, and other initialization bool wxApp::OnInitGui() { // Eventually this line will be removed, but for @@ -682,8 +756,8 @@ bool wxApp::OnInitGui() if (!wxAppBase::OnInitGui()) return FALSE; - GetMainColormap( wxApp::GetDisplay() ); + m_maxRequestSize = XMaxRequestSize( (Display*) wxApp::GetDisplay() ); return TRUE; @@ -764,8 +838,6 @@ bool wxApp::Yield(bool onlyIfNeeded) return TRUE; } -// TODO use XmGetPixmap (?) to get the really standard icons! - // XPM hack: make the arrays const #define static static const diff --git a/src/x11/toplevel.cpp b/src/x11/toplevel.cpp index 7ecbb7fed5..5633dae559 100644 --- a/src/x11/toplevel.cpp +++ b/src/x11/toplevel.cpp @@ -130,6 +130,9 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent, m_mainWidget = (WXWindow) xwindow; XSelectInput( xdisplay, xwindow, +#if wxUSE_NANOX + GR_EVENT_MASK_CLOSE_REQ | +#endif ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask | diff --git a/src/x11/utils.cpp b/src/x11/utils.cpp index c85fcac9ef..3ae95f5cc7 100644 --- a/src/x11/utils.cpp +++ b/src/x11/utils.cpp @@ -45,17 +45,10 @@ #pragma message disable nosimpint #endif -#ifdef __WXMOTIF__ -#include -#endif - -#ifdef __VMS__ -#pragma message enable nosimpint -#endif - #include "wx/unix/execute.h" #ifdef __WXMOTIF__ +#include #include "wx/motif/private.h" #endif @@ -63,9 +56,16 @@ #include "wx/x11/private.h" #endif +#if wxUSE_RESOURCES #include "X11/Xresource.h" +#endif + #include "X11/Xutil.h" +#ifdef __VMS__ +#pragma message enable nosimpint +#endif + // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- diff --git a/src/x11/window.cpp b/src/x11/window.cpp index 3d7a05a6b2..75c41eb94c 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -272,16 +272,16 @@ bool wxWindowX11::Show(bool show) if (show) { wxString msg; - msg.Printf("Mapping window of type %s", GetClassInfo()->GetClassName()); - wxLogDebug(msg); + msg.Printf("Mapping window of type %s", GetClassInfo()->GetClassName()); + wxLogDebug(msg); XMapWindow(xdisp, xwin); - XSync(xdisp, False); + XSync(xdisp, False); } else { wxString msg; - msg.Printf("Unmapping window of type %s", GetClassInfo()->GetClassName()); - wxLogDebug(msg); + msg.Printf("Unmapping window of type %s", GetClassInfo()->GetClassName()); + wxLogDebug(msg); XUnmapWindow(xdisp, xwin); } -- 2.45.2