From 5664fc3253cbf994465257fffdb7734e6ee2c9f9 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Thu, 11 Feb 1999 16:27:56 +0000 Subject: [PATCH] distrin corrections files the return of TAB, part IV git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1679 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- distrib/gtk/README.txt | 210 +++++++++++++++++++++++++++++++++++++++++ distrib/gtk/Setup | 42 +++++++++ src/generic/panelg.cpp | 1 - src/gtk/textctrl.cpp | 6 ++ src/gtk/window.cpp | 12 ++- src/gtk1/textctrl.cpp | 6 ++ src/gtk1/window.cpp | 12 ++- 7 files changed, 280 insertions(+), 9 deletions(-) create mode 100644 distrib/gtk/README.txt create mode 100644 distrib/gtk/Setup diff --git a/distrib/gtk/README.txt b/distrib/gtk/README.txt new file mode 100644 index 0000000000..bb106ce7c0 --- /dev/null +++ b/distrib/gtk/README.txt @@ -0,0 +1,210 @@ +wxPython README +--------------- + +Introduction +------------ +The code in this subtree is a Python Extension Module that enables the +use of wxWindows from the Python language. So what is Python? Go to +http://www.python.org to learn more but in a nutshell, it's an +extremly cool object oriented language. It's easier than Perl and +nearly as powerful. It runs on more platforms than Java, and by some +reports, is even faster than Java with a JIT compiler! + +So why would you want to use wxPython over just C++ and wxWindows? +Personally I prefer using Python for everything. I only use C++ when +I absolutly have to eek more performance out of an algorithm, and even +then I ususally code it as an extension module and leave the majority +of the program in Python. Another good thing to use wxPython for is +quick prototyping of your wxWindows apps. With C++ you have to +continuously go though the edit-compile-link-run cycle, which can be +quite time comsuming. With Python it is only an edit-run cycle. You +can easily build an application in a few hours with Python that would +normally take a few days with C++. Converting a wxPython app to a +C++/wxWindows app should be a straight forward task. + +This extension module attempts to mirror the class heiarchy of +wxWindows as closely as possble. This means that there is a wxFrame +class in wxPython that looks, smells, tastes and acts almost the same +as the wxFrame class in the C++ version. Unfortunatly, I wasn't able +to match things exactly because of differences in the languages, but +the differences should be easy to absorb because they are natural to +Python. For example, some methods that return mutliple values via +argument pointers in C++ will return a tuple of values in Python. +These differences have not been documented yet so if something isn't +working the same as described in the wxWindows documents the best +thing to do is to scan through the wxPython sources, especially the .i +files, as that is where the interfaces for wxPython are defined. + +Currently this extension module is designed such that the entire +application will be written in Python. I havn't tried it yet, but I +am sure that attempting to embed wxPython in a C++ wxWindows +application will cause problems. However there is a plan to support +this in the future. + + +What's new in 0.5.3 +------------------- +Added wxSashWindow, wxSashEvent, wxLayoutAlgorithm, etc. + +Various cleanup, tweaks, minor additions, etc. to maintain +compatibility with the current wxWindows. + + + +What's new in 0.5.0 +------------------- +Changed the import semantics from "from wxPython import *" to "from +wxPython.wx import *" This is for people who are worried about +namespace pollution, they can use "from wxPython import wx" and then +prefix all the wxPython identifiers with "wx." + +Added wxTaskbarIcon for wxMSW. + +Made the events work for wxGrid. + +Added wxConfig. + +Added wxMiniFrame for wxGTK. + +Changed many of the args and return values that were pointers to gdi +objects to references to reflect changes in the wxWindows API. + +Other assorted fixes and additions. + + + + +What's new in 0.4.2 +------------------- + +wxPython on wxGTK works!!! Both dynamic and static on Linux and +static on Solaris have been tested. Many thanks go to Harm + for his astute detective work on tracking +down a nasty DECREF bug. Okay so I have to confess that it was just a +DSM (Dumb Stupid Mistake) on my part but it was nasty none the less +because the behavior was so different on different platforms. + + +The dynamicly loaded module on Solaris is still segfaulting, so it +must have been a different issue all along... + + + +What's New in 0.4 +----------------- + +1. Worked on wxGTK compatibility. It is partially working. On a +Solaris/Sparc box wxPython is working but only when it is statically +linked with the Python interpreter. When built as a dyamically loaded +extension module, things start acting weirdly and it soon seg-faults. +And on Linux both the statically linked and the dynamically linked +version segfault shortly after starting up. + +2. Added Toolbar, StatusBar and SplitterWindow classes. + +3. Varioius bug fixes, enhancements, etc. + + + +Build Instructions +------------------ +I used SWIG (http://www.swig.org) to create the source code for the +extension module. This enabled me to only have to deal with a small +amount of code and only have to bother with the exceptional issues. +SWIG takes care of the rest and generates all the repetative code for +me. You don't need SWIG to build the extension module as all the +generated C++ code is included under the src directory. + +I added a few minor features to SWIG to control some of the code +generation. If you want to playaround with this the patches are in +wxPython/SWIG.patches and they should be applied to the 1.1p5 version +of SWIG. These new patches are documented at +http://starship.skyport.net/crew/robind/python/#swig, and they should +also end up in the 1.2 version of SWIG. + +wxPython is organized as a Python package. This means that the +directory containing the results of the build process should be a +subdirectory of a directory on the PYTHONPATH. (And preferably should +be named wxPython.) You can control where the build process will dump +wxPython by setting the TARGETDIR makefile variable. The default is +$(WXWIN)/utils/wxPython, where this README.txt is located. If you +leave it here then you should add $(WXWIN)/utils to your PYTHONPATH. +However, you may prefer to use something that is already on your +PYTHONPATH, such as the site-packages directory on Unix systems. + + +Win32 +----- + +1. Build wxWindows with wxUSE_RESOURCE_LOADING_IN_MSW set to 1 in +include/wx/msw/setup.h so icons can be loaded dynamically. While +there, make sure wxUSE_OWNER_DRAWN is also set to 1. + +2. Change into the $(WXWIN)/utils/wxPython/src directory. + +3. Edit makefile.nt and specify where your python installation is at. +You may also want to fiddle with the TARGETDIR variable as described +above. + +4. Run nmake -f makefile.nt + +5. If it builds successfully, congratulations! Move on to the next +step. If not then you can try mailing me for help. Also, I will +always have a pre-built win32 version of this extension module at +http://starship.skyport.net/crew/robind/python. + +6. Change to the $(WXWIN)/utils/wxPython/tests directory. + +7. Try executing the test programs. Note that some of these print +diagnositc or test info to standard output, so they will require the +console version of python. For example: + + python test1.py + +To run them without requiring a console, you can use the pythonw.exe +version of Python either from the command line or from a shortcut. + + + +Unix +---- + +1. Change into the wxPython/src directory. + +2. Edit Setup.in and ensure that the flags, directories, and toolkit +options are correct. See the above commentary about TARGETDIR. There +are a few sample Setup.in.[platform] files provided. + +[I've written a Setup which should work in almost all Unix systems, + so that the steps 1 and 2 don't have to be done. Robert Roebling. ] + +3. Run this command to generate a makefile: + + make -f Makefile.pre.in boot + +4. Run these commands to build and then install the wxPython extension +module: + + make + +4b. Log in as root. [Robert Roebling] + + make install + + +5. Change to the wxPython/tests directory. + +6. Try executing the test programs. For example: + + python test1.py + + + +------------------------ +10/20/1998 + +Robin Dunn +robin@alldunn.com + + + diff --git a/distrib/gtk/Setup b/distrib/gtk/Setup new file mode 100644 index 0000000000..2b29b59b2c --- /dev/null +++ b/distrib/gtk/Setup @@ -0,0 +1,42 @@ +# This file gives the details of what is needed to build this extension +# module so the Makefile can be created. + +### +### This file should be created by configure. Currently it is tweaked by hand. +### + +*shared* + +CCC=g++ +WXWIN=~/wxWindows +GENCODEDIR=gtk +srcdir=$(GENCODEDIR) +WX_CONFIG_CFLAGS=`wx-config --cflags` +WX_CONFIG_LIBS=`wx-config --libs` + +# Depending on how your Python was built, you may have to set this +# value to use the C++ driver to link with instead of the default +# C driver. For example: +MY_LDSHARED=$(CCC) -shared $(WX_CONFIG_LIBS) + +# Same as above, but for statically linking Python and wxPython together, +# in other words, if you comment out the *shared* above. If this is the +# case then you should ensure that the main() function is Python's, not +# wxWindows'. You can rebuild $(WXWIN)/src/gtk/app.cpp with NOMAIN defined +# to force this... +MY_LINKCC=$(CCC) + + +## Pick one of these, or set your own. This is where the +## wxPython module should be installed. It should be a +## subdirectory named wxPython. +#TARGETDIR=.. +#TARGETDIR=$(BINLIBDEST)/site-packages/wxPython +TARGETDIR=$(BINLIBDEST)/wxPython + + +wxc wx.cpp helpers.cpp windows.cpp events.cpp misc.cpp gdi.cpp \ + mdi.cpp controls.cpp controls2.cpp windows2.cpp cmndlgs.cpp \ + frames.cpp stattool.cpp utils.cpp windows3.cpp \ + -I. $(WX_CONFIG_CFLAGS) -DSWIG_GLOBAL + diff --git a/src/generic/panelg.cpp b/src/generic/panelg.cpp index 8c25ac1570..2fe0d39572 100644 --- a/src/generic/panelg.cpp +++ b/src/generic/panelg.cpp @@ -142,7 +142,6 @@ void wxPanel::OnNavigationKey( wxNavigationKeyEvent& event ) node = event.GetDirection() ? GetChildren().First() : GetChildren().Last(); - continue; } wxWindow *child = (wxWindow *)node->Data(); diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 538735085e..d7f0dcd96e 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -127,6 +127,8 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, // ... and put into the upper left hand corner of the table m_widget = gtk_table_new(bHasHScrollbar ? 2 : 1, 2, FALSE); + GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); + gtk_table_attach( GTK_TABLE(m_widget), m_text, 0, 1, 0, 1, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK), (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK), @@ -136,6 +138,8 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, if (bHasHScrollbar) { GtkWidget *hscrollbar = gtk_hscrollbar_new(GTK_TEXT(m_text)->hadj); + GTK_WIDGET_UNSET_FLAGS( hscrollbar, GTK_CAN_FOCUS ); + gtk_table_attach(GTK_TABLE(m_widget), hscrollbar, 0, 1, 1, 2, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), GTK_FILL, @@ -145,6 +149,8 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, // finally, put the vertical scrollbar in the upper right corner m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj ); + GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS ); + gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1, GTK_FILL, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK), diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index f60a748ecf..3e33241748 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -244,6 +244,8 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e switch (gdk_event->keyval) { case GDK_BackSpace: key_code = WXK_BACK; break; + case GDK_ISO_Left_Tab: + case GDK_KP_Tab: case GDK_Tab: key_code = WXK_TAB; break; case GDK_Linefeed: key_code = WXK_RETURN; break; case GDK_Clear: key_code = WXK_CLEAR; break; @@ -268,7 +270,6 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e case GDK_Execute: key_code = WXK_EXECUTE; break; case GDK_Insert: key_code = WXK_INSERT; break; case GDK_Num_Lock: key_code = WXK_NUMLOCK; break; - case GDK_KP_Tab: key_code = WXK_TAB; break; case GDK_KP_Enter: key_code = WXK_RETURN; break; case GDK_KP_Home: key_code = WXK_HOME; break; case GDK_KP_Left: key_code = WXK_LEFT; break; @@ -349,10 +350,12 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e } // win is a control: tab can be propagated up - if ((!ret) && (gdk_event->keyval == GDK_Tab) && ((win->m_windowStyle & wxTE_PROCESS_TAB) == 0)) + if ( (!ret) && + ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) && + ((win->m_windowStyle & wxTE_PROCESS_TAB) == 0)) { wxNavigationKeyEvent new_event; - new_event.SetDirection( !(gdk_event->state & GDK_SHIFT_MASK) ); + new_event.SetDirection( (gdk_event->keyval == GDK_Tab) ); new_event.SetWindowChange( FALSE ); new_event.SetCurrentFocus( win ); ret = win->GetEventHandler()->ProcessEvent( new_event ); @@ -407,6 +410,8 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk switch (gdk_event->keyval) { case GDK_BackSpace: key_code = WXK_BACK; break; + case GDK_ISO_Left_Tab: + case GDK_KP_Tab: case GDK_Tab: key_code = WXK_TAB; break; case GDK_Linefeed: key_code = WXK_RETURN; break; case GDK_Clear: key_code = WXK_CLEAR; break; @@ -431,7 +436,6 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk case GDK_Execute: key_code = WXK_EXECUTE; break; case GDK_Insert: key_code = WXK_INSERT; break; case GDK_Num_Lock: key_code = WXK_NUMLOCK; break; - case GDK_KP_Tab: key_code = WXK_TAB; break; case GDK_KP_Enter: key_code = WXK_RETURN; break; case GDK_KP_Home: key_code = WXK_HOME; break; case GDK_KP_Left: key_code = WXK_LEFT; break; diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index 538735085e..d7f0dcd96e 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -127,6 +127,8 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, // ... and put into the upper left hand corner of the table m_widget = gtk_table_new(bHasHScrollbar ? 2 : 1, 2, FALSE); + GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); + gtk_table_attach( GTK_TABLE(m_widget), m_text, 0, 1, 0, 1, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK), (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK), @@ -136,6 +138,8 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, if (bHasHScrollbar) { GtkWidget *hscrollbar = gtk_hscrollbar_new(GTK_TEXT(m_text)->hadj); + GTK_WIDGET_UNSET_FLAGS( hscrollbar, GTK_CAN_FOCUS ); + gtk_table_attach(GTK_TABLE(m_widget), hscrollbar, 0, 1, 1, 2, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), GTK_FILL, @@ -145,6 +149,8 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, // finally, put the vertical scrollbar in the upper right corner m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj ); + GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS ); + gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1, GTK_FILL, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK), diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index f60a748ecf..3e33241748 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -244,6 +244,8 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e switch (gdk_event->keyval) { case GDK_BackSpace: key_code = WXK_BACK; break; + case GDK_ISO_Left_Tab: + case GDK_KP_Tab: case GDK_Tab: key_code = WXK_TAB; break; case GDK_Linefeed: key_code = WXK_RETURN; break; case GDK_Clear: key_code = WXK_CLEAR; break; @@ -268,7 +270,6 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e case GDK_Execute: key_code = WXK_EXECUTE; break; case GDK_Insert: key_code = WXK_INSERT; break; case GDK_Num_Lock: key_code = WXK_NUMLOCK; break; - case GDK_KP_Tab: key_code = WXK_TAB; break; case GDK_KP_Enter: key_code = WXK_RETURN; break; case GDK_KP_Home: key_code = WXK_HOME; break; case GDK_KP_Left: key_code = WXK_LEFT; break; @@ -349,10 +350,12 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e } // win is a control: tab can be propagated up - if ((!ret) && (gdk_event->keyval == GDK_Tab) && ((win->m_windowStyle & wxTE_PROCESS_TAB) == 0)) + if ( (!ret) && + ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) && + ((win->m_windowStyle & wxTE_PROCESS_TAB) == 0)) { wxNavigationKeyEvent new_event; - new_event.SetDirection( !(gdk_event->state & GDK_SHIFT_MASK) ); + new_event.SetDirection( (gdk_event->keyval == GDK_Tab) ); new_event.SetWindowChange( FALSE ); new_event.SetCurrentFocus( win ); ret = win->GetEventHandler()->ProcessEvent( new_event ); @@ -407,6 +410,8 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk switch (gdk_event->keyval) { case GDK_BackSpace: key_code = WXK_BACK; break; + case GDK_ISO_Left_Tab: + case GDK_KP_Tab: case GDK_Tab: key_code = WXK_TAB; break; case GDK_Linefeed: key_code = WXK_RETURN; break; case GDK_Clear: key_code = WXK_CLEAR; break; @@ -431,7 +436,6 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk case GDK_Execute: key_code = WXK_EXECUTE; break; case GDK_Insert: key_code = WXK_INSERT; break; case GDK_Num_Lock: key_code = WXK_NUMLOCK; break; - case GDK_KP_Tab: key_code = WXK_TAB; break; case GDK_KP_Enter: key_code = WXK_RETURN; break; case GDK_KP_Home: key_code = WXK_HOME; break; case GDK_KP_Left: key_code = WXK_LEFT; break;