source: trunk/gcc/libjava/gnu/gcj/xlib/natDisplay.cc

Last change on this file was 2, checked in by bird, 22 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 3.7 KB
Line 
1/* Copyright (C) 1999, 2000 Free Software Foundation
2
3 This file is part of libgcj.
4
5This software is copyrighted work licensed under the terms of the
6Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
7details. */
8
9#include <X11/Xproto.h>
10#include <X11/Xlib.h>
11#include <stdio.h>
12
13#include <java/lang/System.h>
14#include <java/lang/RuntimeException.h>
15#include <java/io/PrintStream.h>
16#include <gcj/cni.h>
17
18#include <gnu/gcj/xlib/Display.h>
19#include <gnu/gcj/xlib/XConnectException.h>
20#include <gnu/gcj/xlib/XException.h>
21
22void gnu::gcj::xlib::Display::init()
23{
24 ::Display* openedDisplay = XOpenDisplay(0); // default display
25
26 if (openedDisplay == 0) {
27 jstring msg = JvNewStringLatin1("Unable to open display");
28 throw new gnu::gcj::xlib::XConnectException(msg);
29 }
30
31 display = reinterpret_cast<gnu::gcj::RawData*>(openedDisplay);
32}
33
34void gnu::gcj::xlib::Display::finalize()
35{
36 if (display == 0) return;
37 ::Display* dpy = (::Display*) display;
38 XCloseDisplay(dpy);
39}
40
41jint gnu::gcj::xlib::Display::getDefaultScreenNumber()
42{
43 ::Display* dpy = (::Display*) display;
44 return DefaultScreen(dpy);
45}
46
47jint gnu::gcj::xlib::Display::getDefaultRootWindowXID()
48{
49 ::Display* dpy = (::Display*) display;
50 return DefaultRootWindow(dpy);
51}
52
53jint gnu::gcj::xlib::Display::internAtom(jstring name)
54{
55 ::Display* dpy = (::Display*) display;
56 int len = JvGetStringUTFLength(name);
57 char cName[len+1];
58 JvGetStringUTFRegion(name, 0, name->length(), cName);
59 cName[len] = '\0';
60 bool onlyIfExists = false;
61 return XInternAtom(dpy, cName, onlyIfExists);
62}
63
64jstring gnu::gcj::xlib::Display::getAtomName(jint atom)
65{
66 ::Display* dpy = (::Display*) display;
67 char* cName = XGetAtomName(dpy, atom);
68 jstring name = JvNewStringLatin1(cName);
69 XFree(cName);
70 return name;
71}
72
73static int handleXError(Display* dpy, XErrorEvent* xee)
74{
75 const int ERROR_TEXT_LENGTH = 256;
76 char errorText[ERROR_TEXT_LENGTH];
77 XGetErrorText(dpy, xee->error_code, errorText, ERROR_TEXT_LENGTH);
78 int requestCode = xee->request_code;
79
80 if (requestCode == X_GetImage)
81 {
82 /* The current implementation of Drawable.copyIntoXImage()
83 will generate harmless X_GetImage errors if the initially
84 requested area is not completly within the drawable. Until
85 we find a better solution, simply ignore these errors. */
86 return 0;
87 }
88
89 java::lang::System::err->print(JvNewStringLatin1("X error: "));
90 java::lang::System::err->print(JvNewStringLatin1(errorText));
91 java::lang::System::err->print(JvNewStringLatin1(", serial="));
92 java::lang::System::err->print((jlong) xee->serial);
93 java::lang::System::err->print(JvNewStringLatin1(", requestCode="));
94 java::lang::System::err->print((jint) requestCode);
95
96 if (requestCode < 128)
97 {
98 char number[8];
99 snprintf(number, 8, "%d", requestCode);
100 number[7] = '\0';
101
102 XGetErrorDatabaseText(dpy, "XRequest", number,
103 "", errorText, ERROR_TEXT_LENGTH);
104 java::lang::System::err->print(JvNewStringLatin1(" ("));
105 java::lang::System::err->print(JvNewStringLatin1(errorText));
106 java::lang::System::err->print(JvNewStringLatin1(")"));
107 }
108
109 java::lang::System::err->print(JvNewStringLatin1(", minorCode="));
110 java::lang::System::err->print((jint) xee->minor_code);
111 java::lang::System::err->print(JvNewStringLatin1(", XID="));
112 java::lang::System::err->println((jlong) xee->resourceid);
113
114 return 0;
115}
116
117void gnu::gcj::xlib::Display::staticInit()
118{
119 if (XInitThreads() == 0)
120 {
121 char msg[] = "threads is not supported on this platform";
122 throw new java::lang::RuntimeException(JvNewStringLatin1(msg));
123 }
124
125 XSetErrorHandler(&handleXError);
126}
127
128void gnu::gcj::xlib::Display::flush()
129{
130 ::Display* dpy = (::Display*) display;
131 XFlush(dpy);
132}
Note: See TracBrowser for help on using the repository browser.