Added battery and power related functions and events (wxMSW only so
far.) See wx.PowerEvent, wx.GetPowerType and wx.GetBatteryState.
-Added wx.ListCtrl.HitTestSubItem which returns the sub-item that was
-hit (if any) in addition to the item and flags.
+Added wx.ListCtrl.HitTestSubItem which returns the sub-item (i.e. the
+column in report mode) that was hit (if any) in addition to the item
+and flags.
Added wrappers for wx.ColourPickerCtrl, wx.DirPickerCtrl,
wx.FilePickerCtrl, and wx.FontPickerCtrl.
image or bitmap directly from a Python object that implements the
buffer interface, such as strings, arrays, etc.
+Added wx.App.DisplayAvailable() which can be used to determine if a
+GUI can be created in the current environment. (Still need an
+implementation for wxMSW...)
bool wxPySimple_typecheck(PyObject* source, const wxChar* classname, int seqLen);
bool wxColour_typecheck(PyObject* source);
-bool wxPyCheckForApp();
-
// Other helpful stuff
+bool wxPyCheckForApp();
+bool wxPyTestDisplayAvailable();
+
bool wxPy2int_seq_helper(PyObject* source, int* i1, int* i2);
bool wxPy4int_seq_helper(PyObject* source, int* i1, int* i2, int* i3, int* i4);
{ wxPyRaiseNotImplemented(); return 0; }
}
#endif
+
+ %extend {
+ DocStr(DisplayAvailable,
+ "Tests if it is possible to create a GUI in the current environment.
+This will mean different things on the different platforms.
+
+ * On X Windows systems this function will return ``False`` if it is
+ not able to open a connection to the X display, which can happen
+ if $DISPLAY is not set, or is not set correctly.
+
+ * On Mac OS X a ``False`` return value will mean that wx is not
+ able to access the window manager, which can happen if logged in
+ remotely or if running from the normal version of python instead
+ of the framework version, (i.e., pythonw.)
+
+ * On MS Windows...
+", "");
+ static bool DisplayAvailable() {
+ return wxPyTestDisplayAvailable();
+ }
+ }
};
#----------------------------------------------------------------------
_defRedirect = (wx.Platform == '__WXMSW__' or wx.Platform == '__WXMAC__')
-
+
class App(wx.PyApp):
"""
The ``wx.App`` class represents the application and is used to:
initialization to ensure that the system, toolkit and
wxWidgets are fully initialized.
"""
+
wx.PyApp.__init__(self)
- if wx.Platform == "__WXMAC__":
- try:
- import MacOS
- if not MacOS.WMAvailable():
- print """\
-This program needs access to the screen. Please run with 'pythonw',
-not 'python', and only when you are logged in on the main display of
-your Mac."""
- _sys.exit(1)
- except SystemExit:
- raise
- except:
- pass
+ # make sure we can create a GUI
+ if not self.DisplayAvailable():
+
+ if wx.Platform == "__WXMAC__":
+ msg = """This program needs access to the screen.
+Please run with 'pythonw', not 'python', and only when you are logged
+in on the main display of your Mac."""
+
+ elif wx.Platform == "__WXGTK__":
+ msg ="Unable to access the X Display, is $DISPLAY set properly?"
+ else:
+ msg = "Unable to create GUI"
+ # TODO: more description is needed for wxMSW...
+
+ raise SystemExit(msg)
+
# This has to be done before OnInit
self.SetUseBestVisual(useBestVisual)
}
+//----------------------------------------------------------------------
+// Function to test if the Display (or whatever is the platform equivallent)
+// can be connected to. This is accessable from wxPython as a staticmethod of
+// wx.App called DisplayAvailable().
+
+
+bool wxPyTestDisplayAvailable()
+{
+#ifdef __WXGTK__
+ Display* display;
+ display = XOpenDisplay(NULL);
+ if (display == NULL)
+ return false;
+ XCloseDisplay(display);
+ return true;
+#endif
+
+#ifdef __WXMAC__
+ // This is adapted from Python's Mac/Modules/MacOS.c in the
+ // MacOS_WMAvailable function.
+ bool rv;
+ ProcessSerialNumber psn;
+
+ /*
+ ** This is a fairly innocuous call to make if we don't have a window
+ ** manager, or if we have no permission to talk to it. It will print
+ ** a message on stderr, but at least it won't abort the process.
+ ** It appears the function caches the result itself, and it's cheap, so
+ ** no need for us to cache.
+ */
+#ifdef kCGNullDirectDisplay
+ /* On 10.1 CGMainDisplayID() isn't available, and
+ ** kCGNullDirectDisplay isn't defined.
+ */
+ if (CGMainDisplayID() == 0) {
+ rv = false;
+ } else
+#endif
+ {
+ // Also foreground the application on the first call as a side-effect.
+ if (GetCurrentProcess(&psn) < 0 || SetFrontProcess(&psn) < 0) {
+ rv = false;
+ } else {
+ rv = true;
+ }
+ }
+ return rv;
+#endif
+
+#ifdef __WXMSW__
+ // TODO...
+ return true;
+#endif
+}
+
+
//----------------------------------------------------------------------
//----------------------------------------------------------------------