aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.7/libjava/gnu/gcj/xlib/natDisplay.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.7/libjava/gnu/gcj/xlib/natDisplay.cc')
-rw-r--r--gcc-4.7/libjava/gnu/gcj/xlib/natDisplay.cc132
1 files changed, 132 insertions, 0 deletions
diff --git a/gcc-4.7/libjava/gnu/gcj/xlib/natDisplay.cc b/gcc-4.7/libjava/gnu/gcj/xlib/natDisplay.cc
new file mode 100644
index 000000000..f89cb740c
--- /dev/null
+++ b/gcc-4.7/libjava/gnu/gcj/xlib/natDisplay.cc
@@ -0,0 +1,132 @@
+/* Copyright (C) 1999, 2000 Free Software Foundation
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <X11/Xproto.h>
+#include <X11/Xlib.h>
+#include <stdio.h>
+
+#include <java/lang/System.h>
+#include <java/lang/RuntimeException.h>
+#include <java/io/PrintStream.h>
+#include <gcj/cni.h>
+
+#include <gnu/gcj/xlib/Display.h>
+#include <gnu/gcj/xlib/XConnectException.h>
+#include <gnu/gcj/xlib/XException.h>
+
+void gnu::gcj::xlib::Display::init()
+{
+ ::Display* openedDisplay = XOpenDisplay(0); // default display
+
+ if (openedDisplay == 0) {
+ jstring msg = JvNewStringLatin1("Unable to open display");
+ throw new gnu::gcj::xlib::XConnectException(msg);
+ }
+
+ display = reinterpret_cast<gnu::gcj::RawData*>(openedDisplay);
+}
+
+void gnu::gcj::xlib::Display::finalize()
+{
+ if (display == 0) return;
+ ::Display* dpy = (::Display*) display;
+ XCloseDisplay(dpy);
+}
+
+jint gnu::gcj::xlib::Display::getDefaultScreenNumber()
+{
+ ::Display* dpy = (::Display*) display;
+ return DefaultScreen(dpy);
+}
+
+jint gnu::gcj::xlib::Display::getDefaultRootWindowXID()
+{
+ ::Display* dpy = (::Display*) display;
+ return DefaultRootWindow(dpy);
+}
+
+jint gnu::gcj::xlib::Display::internAtom(jstring name)
+{
+ ::Display* dpy = (::Display*) display;
+ int len = JvGetStringUTFLength(name);
+ char cName[len+1];
+ JvGetStringUTFRegion(name, 0, name->length(), cName);
+ cName[len] = '\0';
+ bool onlyIfExists = false;
+ return XInternAtom(dpy, cName, onlyIfExists);
+}
+
+jstring gnu::gcj::xlib::Display::getAtomName(jint atom)
+{
+ ::Display* dpy = (::Display*) display;
+ char* cName = XGetAtomName(dpy, atom);
+ jstring name = JvNewStringLatin1(cName);
+ XFree(cName);
+ return name;
+}
+
+static int handleXError(Display* dpy, XErrorEvent* xee)
+{
+ const int ERROR_TEXT_LENGTH = 256;
+ char errorText[ERROR_TEXT_LENGTH];
+ XGetErrorText(dpy, xee->error_code, errorText, ERROR_TEXT_LENGTH);
+ int requestCode = xee->request_code;
+
+ if (requestCode == X_GetImage)
+ {
+ /* The current implementation of Drawable.copyIntoXImage()
+ will generate harmless X_GetImage errors if the initially
+ requested area is not completly within the drawable. Until
+ we find a better solution, simply ignore these errors. */
+ return 0;
+ }
+
+ java::lang::System::err->print(JvNewStringLatin1("X error: "));
+ java::lang::System::err->print(JvNewStringLatin1(errorText));
+ java::lang::System::err->print(JvNewStringLatin1(", serial="));
+ java::lang::System::err->print((jlong) xee->serial);
+ java::lang::System::err->print(JvNewStringLatin1(", requestCode="));
+ java::lang::System::err->print((jint) requestCode);
+
+ if (requestCode < 128)
+ {
+ char number[8];
+ snprintf(number, 8, "%d", requestCode);
+ number[7] = '\0';
+
+ XGetErrorDatabaseText(dpy, "XRequest", number,
+ "", errorText, ERROR_TEXT_LENGTH);
+ java::lang::System::err->print(JvNewStringLatin1(" ("));
+ java::lang::System::err->print(JvNewStringLatin1(errorText));
+ java::lang::System::err->print(JvNewStringLatin1(")"));
+ }
+
+ java::lang::System::err->print(JvNewStringLatin1(", minorCode="));
+ java::lang::System::err->print((jint) xee->minor_code);
+ java::lang::System::err->print(JvNewStringLatin1(", XID="));
+ java::lang::System::err->println((jlong) xee->resourceid);
+
+ return 0;
+}
+
+void gnu::gcj::xlib::Display::staticInit()
+{
+ if (XInitThreads() == 0)
+ {
+ char msg[] = "threads are not supported on this platform";
+ throw new ::java::lang::RuntimeException(JvNewStringLatin1(msg));
+ }
+
+ XSetErrorHandler(&handleXError);
+}
+
+void gnu::gcj::xlib::Display::flush()
+{
+ ::Display* dpy = (::Display*) display;
+ XFlush(dpy);
+}