Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c
41153 views
1
/*
2
* Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
#ifdef HEADLESS
27
#error This file should not be included in headless library
28
#endif
29
30
#include "awt.h"
31
#include "awt_util.h"
32
#include "jni.h"
33
#include "jlong.h"
34
#include "Region.h"
35
#include "sizecalc.h"
36
#include "utility/rect.h"
37
38
#include "sun_awt_X11_XlibWrapper.h"
39
40
#include <stdlib.h>
41
#include <string.h>
42
#include <X11/extensions/Xdbe.h>
43
#include <X11/extensions/shape.h>
44
#include <X11/keysym.h>
45
#include <X11/Sunkeysym.h>
46
#include <X11/Xlib.h>
47
#include <X11/Xatom.h>
48
#include <X11/XKBlib.h>
49
#include <X11/Xos.h>
50
#include <X11/Xutil.h>
51
52
#if defined(AIX)
53
#undef X_HAVE_UTF8_STRING
54
extern Bool statusWindowEventHandler(XEvent event);
55
#endif
56
57
// From XWindow.c
58
extern KeySym keycodeToKeysym(Display *display, KeyCode keycode, int index);
59
60
#if defined(DEBUG)
61
static jmethodID lockIsHeldMID = NULL;
62
63
static void
64
CheckHaveAWTLock(JNIEnv *env)
65
{
66
if (lockIsHeldMID == NULL) {
67
if (tkClass == NULL) return;
68
lockIsHeldMID =
69
(*env)->GetStaticMethodID(env, tkClass,
70
"isAWTLockHeldByCurrentThread", "()Z");
71
if (lockIsHeldMID == NULL) return;
72
}
73
if (!(*env)->CallStaticBooleanMethod(env, tkClass, lockIsHeldMID)) {
74
JNU_ThrowInternalError(env, "Current thread does not hold AWT_LOCK!");
75
}
76
}
77
78
#define AWT_CHECK_HAVE_LOCK() \
79
do { \
80
CheckHaveAWTLock(env); \
81
if ((*env)->ExceptionCheck(env)) { \
82
return; \
83
} \
84
} while (0); \
85
86
#define AWT_CHECK_HAVE_LOCK_RETURN(ret) \
87
do { \
88
CheckHaveAWTLock(env); \
89
if ((*env)->ExceptionCheck(env)) { \
90
return (ret); \
91
} \
92
} while (0); \
93
94
#else
95
#define AWT_CHECK_HAVE_LOCK()
96
#define AWT_CHECK_HAVE_LOCK_RETURN(ret)
97
#endif
98
99
void freeNativeStringArray(char **array, jsize length) {
100
int i;
101
if (array == NULL) {
102
return;
103
}
104
for (i = 0; i < length; i++) {
105
free(array[i]);
106
}
107
free(array);
108
}
109
110
char** stringArrayToNative(JNIEnv *env, jobjectArray array, jsize * ret_length) {
111
Bool err = FALSE;
112
char ** strings;
113
int index, str_index = 0;
114
jsize length = (*env)->GetArrayLength(env, array);
115
116
if (length == 0) {
117
return NULL;
118
}
119
120
strings = (char**) calloc(length, sizeof (char*));
121
122
if (strings == NULL) {
123
JNU_ThrowOutOfMemoryError(env, "");
124
return NULL;
125
}
126
127
for (index = 0; index < length; index++) {
128
jstring str = (*env)->GetObjectArrayElement(env, array, index);
129
if (str != NULL) {
130
const char * str_char = JNU_GetStringPlatformChars(env, str, NULL);
131
if (str_char != NULL) {
132
char * dup_str = strdup(str_char);
133
if (dup_str != NULL) {
134
strings[str_index++] = dup_str;
135
} else {
136
JNU_ThrowOutOfMemoryError(env, "");
137
err = TRUE;
138
}
139
JNU_ReleaseStringPlatformChars(env, str, str_char);
140
} else {
141
err = TRUE;
142
}
143
(*env)->DeleteLocalRef(env, str);
144
if (err) {
145
break;
146
}
147
}
148
}
149
150
if (err) {
151
freeNativeStringArray(strings, str_index);
152
strings = NULL;
153
str_index = -1;
154
}
155
*ret_length = str_index;
156
157
return strings;
158
}
159
160
/*
161
* Class: XlibWrapper
162
* Method: XOpenDisplay
163
* Signature: (J)J
164
*/
165
166
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XOpenDisplay
167
(JNIEnv *env, jclass clazz, jlong display_name)
168
{
169
Display *dp;
170
AWT_CHECK_HAVE_LOCK_RETURN(0);
171
dp = XOpenDisplay((char *) jlong_to_ptr(display_name));
172
173
return ptr_to_jlong(dp);
174
}
175
176
JNIEXPORT void JNICALL
177
Java_sun_awt_X11_XlibWrapper_XCloseDisplay(JNIEnv *env, jclass clazz,
178
jlong display) {
179
AWT_CHECK_HAVE_LOCK();
180
XCloseDisplay((Display*) jlong_to_ptr(display));
181
}
182
183
JNIEXPORT jlong JNICALL
184
Java_sun_awt_X11_XlibWrapper_XDisplayString(JNIEnv *env, jclass clazz,
185
jlong display) {
186
AWT_CHECK_HAVE_LOCK_RETURN(0);
187
return ptr_to_jlong(XDisplayString((Display*) jlong_to_ptr(display)));
188
}
189
190
JNIEXPORT void JNICALL
191
Java_sun_awt_X11_XlibWrapper_XSetCloseDownMode(JNIEnv *env, jclass clazz,
192
jlong display, jint mode) {
193
AWT_CHECK_HAVE_LOCK();
194
XSetCloseDownMode((Display*) jlong_to_ptr(display), (int)mode);
195
}
196
197
/*
198
* Class: sun_awt_X11_XlibWrapper
199
* Method: DefaultScreen
200
* Signature: (J)J
201
*/
202
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DefaultScreen (JNIEnv *env, jclass clazz, jlong display) {
203
204
AWT_CHECK_HAVE_LOCK_RETURN(0);
205
return (jlong) DefaultScreen((Display *) jlong_to_ptr(display));
206
}
207
208
/*
209
* Class: sun_awt_X11_XlibWrapper
210
* Method: ScreenOfDisplay
211
* Signature: (JJ)J
212
*/
213
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_ScreenOfDisplay(JNIEnv *env, jclass clazz, jlong display, jlong screen_number) {
214
AWT_CHECK_HAVE_LOCK_RETURN(0);
215
return ptr_to_jlong(ScreenOfDisplay((Display *) jlong_to_ptr(display),
216
screen_number));
217
}
218
219
/*
220
* Class: sun_awt_X11_XlibWrapper
221
* Method: DoesBackingStore
222
* Signature: (J)I
223
*/
224
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_DoesBackingStore(JNIEnv *env, jclass clazz, jlong screen) {
225
AWT_CHECK_HAVE_LOCK_RETURN(0);
226
return (jint) DoesBackingStore((Screen*) jlong_to_ptr(screen));
227
}
228
229
/*
230
* Class: sun_awt_X11_XlibWrapper
231
* Method: DisplayWidth
232
* Signature: (JJ)J
233
*/
234
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayWidth
235
(JNIEnv *env, jclass clazz, jlong display, jlong screen) {
236
237
AWT_CHECK_HAVE_LOCK_RETURN(0);
238
return (jlong) DisplayWidth((Display *) jlong_to_ptr(display),screen);
239
240
}
241
242
/*
243
* Class: sun_awt_X11_XlibWrapper
244
* Method: DisplayWidthMM
245
* Signature: (JJ)J
246
*/
247
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayWidthMM
248
(JNIEnv *env, jclass clazz, jlong display, jlong screen) {
249
AWT_CHECK_HAVE_LOCK_RETURN(0);
250
return (jlong) DisplayWidthMM((Display *) jlong_to_ptr(display),screen);
251
}
252
253
/*
254
* Class: sun_awt_X11_XlibWrapper
255
* Method: DisplayHeight
256
* Signature: (JJ)J
257
*/
258
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayHeight
259
(JNIEnv *env, jclass clazz, jlong display, jlong screen) {
260
261
AWT_CHECK_HAVE_LOCK_RETURN(0);
262
return (jlong) DisplayHeight((Display *) jlong_to_ptr(display),screen);
263
}
264
/*
265
* Class: sun_awt_X11_XlibWrapper
266
* Method: DisplayHeightMM
267
* Signature: (JJ)J
268
*/
269
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayHeightMM
270
(JNIEnv *env, jclass clazz, jlong display, jlong screen) {
271
AWT_CHECK_HAVE_LOCK_RETURN(0);
272
return (jlong) DisplayHeightMM((Display *) jlong_to_ptr(display),screen);
273
}
274
275
/*
276
* Class: sun_awt_X11_XlibWrapper
277
* Method: RootWindow
278
* Signature: (JJ)J
279
*/
280
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_RootWindow
281
(JNIEnv *env , jclass clazz, jlong display, jlong screen_number) {
282
AWT_CHECK_HAVE_LOCK_RETURN(0);
283
return (jlong) RootWindow((Display *) jlong_to_ptr(display), screen_number);
284
}
285
286
/*
287
* Class: sun_awt_X11_XlibWrapper
288
* Method: ScreenCount
289
*/
290
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_ScreenCount
291
(JNIEnv *env , jclass clazz, jlong display) {
292
AWT_CHECK_HAVE_LOCK_RETURN(0);
293
return ScreenCount((Display *) jlong_to_ptr(display));
294
}
295
296
/*
297
* Class: XlibWrapper
298
* Method: XCreateWindow
299
* Signature: (JJIIIIIIJJJJ)J
300
*/
301
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreateWindow
302
(JNIEnv *env, jclass clazz, jlong display, jlong window,
303
jint x, jint y, jint w, jint h , jint border_width, jint depth,
304
jlong wclass, jlong visual, jlong valuemask, jlong attributes)
305
{
306
AWT_CHECK_HAVE_LOCK_RETURN(0);
307
return XCreateWindow((Display *) jlong_to_ptr(display),(Window) window, x, y, w, h,
308
border_width, depth, wclass, (Visual *) jlong_to_ptr(visual),
309
valuemask, (XSetWindowAttributes *) jlong_to_ptr(attributes));
310
}
311
312
/*
313
* Class: XlibWrapper
314
* Method: XConvertCase
315
* Signature: (JJJ)V
316
*/
317
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConvertCase
318
(JNIEnv *env, jclass clazz, jlong keysym,
319
jlong keysym_lowercase, jlong keysym_uppercase)
320
{
321
AWT_CHECK_HAVE_LOCK();
322
XConvertCase(keysym, (jlong_to_ptr(keysym_lowercase)),
323
(jlong_to_ptr(keysym_uppercase)));
324
}
325
326
/*
327
* Class: XlibWrapper
328
* Method: XMapWindow
329
* Signature: (JJ)V
330
*/
331
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMapWindow
332
(JNIEnv *env, jclass clazz, jlong display, jlong window)
333
{
334
AWT_CHECK_HAVE_LOCK();
335
XMapWindow( (Display *)jlong_to_ptr(display),(Window) window);
336
}
337
338
/*
339
* Class: XlibWrapper
340
* Method: XMapRaised
341
* Signature: (JJ)V
342
*/
343
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMapRaised
344
(JNIEnv *env, jclass clazz, jlong display, jlong window)
345
{
346
AWT_CHECK_HAVE_LOCK();
347
XMapRaised( (Display *)jlong_to_ptr(display),(Window) window);
348
}
349
350
/*
351
* Class: XlibWrapper
352
* Method: XRaiseWindow
353
* Signature: (JJ)V
354
*/
355
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRaiseWindow
356
(JNIEnv *env, jclass clazz, jlong display, jlong window)
357
{
358
AWT_CHECK_HAVE_LOCK();
359
XRaiseWindow( (Display *)jlong_to_ptr(display),(Window) window);
360
}
361
362
/*
363
* Class: XlibWrapper
364
* Method: XLowerWindow
365
* Signature: (JJ)V
366
*/
367
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XLowerWindow
368
(JNIEnv *env, jclass clazz, jlong display, jlong window)
369
{
370
AWT_CHECK_HAVE_LOCK();
371
XLowerWindow( (Display *)jlong_to_ptr(display),(Window) window);
372
}
373
374
/*
375
* Class: XlibWrapper
376
* Method: XRestackWindows
377
* Signature: (JJI)V
378
*/
379
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRestackWindows
380
(JNIEnv *env, jclass clazz, jlong display, jlong windows, jint length)
381
{
382
AWT_CHECK_HAVE_LOCK();
383
XRestackWindows( (Display *) jlong_to_ptr(display), (Window *) jlong_to_ptr(windows), length);
384
}
385
386
/*
387
* Class: XlibWrapper
388
* Method: XConfigureWindow
389
* Signature: (JJJJ)V
390
*/
391
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConfigureWindow
392
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong value_mask,
393
jlong values)
394
{
395
AWT_CHECK_HAVE_LOCK();
396
XConfigureWindow((Display*)jlong_to_ptr(display), (Window)window,
397
(unsigned int)value_mask, (XWindowChanges*)jlong_to_ptr(values));
398
}
399
400
/*
401
* Class: XlibWrapper
402
* Method: XSetInputFocus
403
* Signature: (JJ)V
404
*/
405
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetInputFocus
406
(JNIEnv *env, jclass clazz, jlong display, jlong window)
407
{
408
AWT_CHECK_HAVE_LOCK();
409
XSetInputFocus( (Display *)jlong_to_ptr(display),(Window) window, RevertToPointerRoot, CurrentTime);
410
}
411
412
/*
413
* Class: XlibWrapper
414
* Method: XSetInputFocus2
415
* Signature: (JJJ)V
416
*/
417
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetInputFocus2
418
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong time)
419
{
420
AWT_CHECK_HAVE_LOCK();
421
XSetInputFocus( (Display *)jlong_to_ptr(display),(Window) window, RevertToPointerRoot, time);
422
}
423
424
/*
425
* Class: XlibWrapper
426
* Method: XGetInputFocus
427
* Signature: (JJ)V
428
*/
429
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XGetInputFocus
430
(JNIEnv *env, jclass clazz, jlong display)
431
{
432
Window focusOwner;
433
int revert_to;
434
AWT_CHECK_HAVE_LOCK_RETURN(0);
435
XGetInputFocus( (Display *)jlong_to_ptr(display), &focusOwner, &revert_to);
436
return focusOwner;
437
}
438
439
/*
440
* Class: XlibWrapper
441
* Method: XDestroyWindow
442
* Signature: (JJ)V
443
*/
444
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XDestroyWindow
445
(JNIEnv *env, jclass clazz, jlong display, jlong window)
446
{
447
AWT_CHECK_HAVE_LOCK();
448
XDestroyWindow( (Display *)jlong_to_ptr(display),(Window) window);
449
}
450
451
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGrabPointer
452
(JNIEnv *env, jclass clazz, jlong display, jlong window,
453
jint owner_events, jint event_mask, jint pointer_mode,
454
jint keyboard_mode, jlong confine_to, jlong cursor, jlong time)
455
{
456
AWT_CHECK_HAVE_LOCK_RETURN(0);
457
return XGrabPointer( (Display *)jlong_to_ptr(display), (Window) window,
458
(Bool) owner_events, (unsigned int) event_mask, (int) pointer_mode,
459
(int) keyboard_mode, (Window) confine_to, (Cursor) cursor, (Time) time);
460
}
461
462
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUngrabPointer
463
(JNIEnv *env, jclass clazz, jlong display, jlong time)
464
{
465
AWT_CHECK_HAVE_LOCK();
466
XUngrabPointer( (Display *)jlong_to_ptr(display), (Time) time);
467
}
468
469
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGrabKeyboard
470
(JNIEnv *env, jclass clazz, jlong display, jlong window,
471
jint owner_events, jint pointer_mode,
472
jint keyboard_mode, jlong time)
473
{
474
AWT_CHECK_HAVE_LOCK_RETURN(0);
475
return XGrabKeyboard( (Display *)jlong_to_ptr(display), (Window) window,
476
(Bool) owner_events, (int) pointer_mode,
477
(int) keyboard_mode, (Time) time);
478
}
479
480
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUngrabKeyboard
481
(JNIEnv *env, jclass clazz, jlong display, jlong time)
482
{
483
AWT_CHECK_HAVE_LOCK();
484
XUngrabKeyboard( (Display *)jlong_to_ptr(display), (Time) time);
485
}
486
487
JNIEXPORT void JNICALL
488
Java_sun_awt_X11_XlibWrapper_XGrabServer(JNIEnv *env, jclass clazz,
489
jlong display) {
490
AWT_CHECK_HAVE_LOCK();
491
XGrabServer((Display*)jlong_to_ptr(display));
492
}
493
494
JNIEXPORT void JNICALL
495
Java_sun_awt_X11_XlibWrapper_XUngrabServer(JNIEnv *env, jclass clazz,
496
jlong display) {
497
AWT_CHECK_HAVE_LOCK();
498
XUngrabServer((Display*)jlong_to_ptr(display));
499
/* Workaround for bug 5039226 */
500
XSync((Display*)jlong_to_ptr(display), False);
501
}
502
503
/*
504
* Class: XlibWrapper
505
* Method: XUnmapWindow
506
* Signature: (JJ)V
507
*/
508
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUnmapWindow
509
(JNIEnv *env, jclass clazz, jlong display, jlong window)
510
{
511
512
AWT_CHECK_HAVE_LOCK();
513
XUnmapWindow( (Display *)jlong_to_ptr(display),(Window) window);
514
515
}
516
517
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSelectInput
518
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong mask)
519
{
520
AWT_CHECK_HAVE_LOCK();
521
XSelectInput((Display *) jlong_to_ptr(display), (Window) window, mask);
522
}
523
524
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEvents
525
(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong bits_to_change,
526
jlong values_for_bits)
527
{
528
AWT_CHECK_HAVE_LOCK();
529
XkbSelectEvents((Display *) jlong_to_ptr(display), (unsigned int)device,
530
(unsigned long)bits_to_change,
531
(unsigned long)values_for_bits);
532
}
533
534
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails
535
(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong event_type,
536
jlong bits_to_change, jlong values_for_bits)
537
{
538
AWT_CHECK_HAVE_LOCK();
539
XkbSelectEventDetails((Display *) jlong_to_ptr(display), (unsigned int)device,
540
(unsigned int) event_type,
541
(unsigned long)bits_to_change,
542
(unsigned long)values_for_bits);
543
}
544
545
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbQueryExtension
546
(JNIEnv *env, jclass clazz, jlong display, jlong opcode_rtrn, jlong event_rtrn,
547
jlong error_rtrn, jlong major_in_out, jlong minor_in_out)
548
{
549
Bool status;
550
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
551
status = XkbQueryExtension((Display *) jlong_to_ptr(display),
552
(int *) jlong_to_ptr(opcode_rtrn),
553
(int *) jlong_to_ptr(event_rtrn),
554
(int *) jlong_to_ptr(error_rtrn),
555
(int *) jlong_to_ptr(major_in_out),
556
(int *) jlong_to_ptr(minor_in_out));
557
return status ? JNI_TRUE : JNI_FALSE;
558
}
559
560
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion
561
(JNIEnv *env, jclass clazz, jlong lib_major_in_out, jlong lib_minor_in_out)
562
{
563
Bool status;
564
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
565
*((int *)jlong_to_ptr(lib_major_in_out)) = XkbMajorVersion;
566
*((int *)jlong_to_ptr(lib_minor_in_out)) = XkbMinorVersion;
567
status = XkbLibraryVersion((int *)jlong_to_ptr(lib_major_in_out),
568
(int *)jlong_to_ptr(lib_minor_in_out));
569
return status ? JNI_TRUE : JNI_FALSE;
570
}
571
572
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetMap
573
(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong device_spec)
574
{
575
AWT_CHECK_HAVE_LOCK_RETURN(0);
576
return (jlong) XkbGetMap( (Display *) jlong_to_ptr(display),
577
(unsigned int) which,
578
(unsigned int) device_spec);
579
}
580
581
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap
582
(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong xkb)
583
{
584
AWT_CHECK_HAVE_LOCK_RETURN(0);
585
return (jlong) XkbGetUpdatedMap( (Display *) jlong_to_ptr(display),
586
(unsigned int) which,
587
(XkbDescPtr) jlong_to_ptr(xkb));
588
}
589
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard
590
(JNIEnv *env, jclass clazz, jlong xkb, jlong which, jboolean free_all)
591
{
592
AWT_CHECK_HAVE_LOCK();
593
XkbFreeKeyboard(jlong_to_ptr(xkb), (unsigned int)which, free_all);
594
}
595
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode
596
(JNIEnv *env, jclass clazz, jlong xkb, jint keycode, jlong mods, jlong mods_rtrn, jlong keysym_rtrn)
597
{
598
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
599
Bool b;
600
b = XkbTranslateKeyCode((XkbDescPtr)xkb, (unsigned int)keycode, (unsigned int)mods,
601
(unsigned int *)jlong_to_ptr(mods_rtrn),
602
(KeySym *)jlong_to_ptr(keysym_rtrn));
603
//printf("native, input: keycode:0x%0X; mods:0x%0X\n", keycode, mods);
604
//printf("native, output: keysym:0x%0X; mods:0x%0X\n",
605
// *(unsigned int *)jlong_to_ptr(keysym_rtrn),
606
// *(unsigned int *)jlong_to_ptr(mods_rtrn));
607
return b ? JNI_TRUE : JNI_FALSE;
608
}
609
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSetDetectableAutoRepeat
610
(JNIEnv *env, jclass clazz, jlong display, jboolean detectable)
611
{
612
AWT_CHECK_HAVE_LOCK();
613
XkbSetDetectableAutoRepeat((Display *) jlong_to_ptr(display), detectable, NULL);
614
}
615
/*
616
* Class: sun_awt_X11_XlibWrapper
617
* Method: XNextEvent
618
* Signature: (JJ)V
619
*/
620
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XNextEvent
621
(JNIEnv *env, jclass clazz, jlong display, jlong ptr)
622
{
623
AWT_CHECK_HAVE_LOCK();
624
XNextEvent( (Display *) jlong_to_ptr(display), jlong_to_ptr(ptr));
625
}
626
627
/*
628
* Class: sun_awt_X11_XlibWrapper
629
* Method: XMaskEvent
630
* Signature: (JJJ)V
631
*/
632
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMaskEvent
633
(JNIEnv *env, jclass clazz, jlong display, jlong event_mask, jlong event_return)
634
{
635
AWT_CHECK_HAVE_LOCK();
636
XMaskEvent( (Display *) jlong_to_ptr(display), event_mask, (XEvent *) jlong_to_ptr(event_return));
637
}
638
639
/*
640
* Class: sun_awt_X11_XlibWrapper
641
* Method: XWindowEvent
642
* Signature: (JJJJ)V
643
*/
644
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XWindowEvent
645
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong event_mask, jlong event_return)
646
{
647
AWT_CHECK_HAVE_LOCK();
648
XWindowEvent( (Display *) jlong_to_ptr(display), (Window)window, event_mask, (XEvent *) jlong_to_ptr(event_return));
649
}
650
651
/*
652
* Class: sun_awt_X11_XlibWrapper
653
* Method: XFilterEvent
654
* Signature: (JJ)Z
655
*/
656
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XFilterEvent
657
(JNIEnv *env, jclass clazz, jlong ptr, jlong window)
658
{
659
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
660
#if defined(AIX)
661
if (True == statusWindowEventHandler(*((XEvent *)(uintptr_t)ptr))) {
662
return (jboolean)True;
663
}
664
#endif
665
return (jboolean) XFilterEvent((XEvent *) jlong_to_ptr(ptr), (Window) window);
666
}
667
668
/*
669
* Class: sun_awt_X11_XlibWrapper
670
* Method: XSupportsLocale
671
* Signature: ()Z
672
*/
673
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XSupportsLocale
674
(JNIEnv *env, jclass clazz)
675
{
676
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
677
return (jboolean)XSupportsLocale();
678
}
679
680
/*
681
* Class: sun_awt_X11_XlibWrapper
682
* Method: XSetLocaleModifiers
683
* Signature: (Ljava/lang/String;)Ljava/lang/String;
684
*/
685
JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_XSetLocaleModifiers
686
(JNIEnv *env, jclass clazz, jstring jstr)
687
{
688
char * modifier_list = NULL;
689
char * ret = NULL;
690
691
if (!JNU_IsNull(env, jstr)) {
692
modifier_list = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);
693
CHECK_NULL_RETURN(modifier_list, NULL);
694
}
695
696
AWT_CHECK_HAVE_LOCK_RETURN(NULL);
697
if (modifier_list) {
698
ret = XSetLocaleModifiers(modifier_list);
699
JNU_ReleaseStringPlatformChars(env, jstr, (const char *) modifier_list);
700
} else {
701
ret = XSetLocaleModifiers("");
702
}
703
704
return (ret != NULL ? JNU_NewStringPlatform(env, ret): NULL);
705
}
706
707
708
/*
709
* Class: sun_awt_X11_wrappers_XlibWrapper
710
* Method: XPeekEvent
711
* Signature: (JJ)V
712
*/
713
714
715
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XPeekEvent
716
(JNIEnv *env, jclass clazz, jlong display, jlong ptr)
717
{
718
AWT_CHECK_HAVE_LOCK();
719
XPeekEvent((Display *) jlong_to_ptr(display),jlong_to_ptr(ptr));
720
}
721
722
/*
723
* Class: sun_awt_X11_XlibWrapper
724
* Method: XMoveResizeWindow
725
* Signature: (JJIIII)V
726
*/
727
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMoveResizeWindow
728
(JNIEnv *env, jclass clazz, jlong display, jlong window, jint x , jint y , jint width, jint height) {
729
AWT_CHECK_HAVE_LOCK();
730
XMoveResizeWindow( (Display *) jlong_to_ptr(display), (Window) window, x, y, width, height);
731
}
732
733
/*
734
* Class: sun_awt_X11_XlibWrapper
735
* Method: XResizeWindow
736
* Signature: (JJII)V
737
*/
738
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XResizeWindow
739
(JNIEnv *env, jclass clazz, jlong display, jlong window, jint width, jint height) {
740
AWT_CHECK_HAVE_LOCK();
741
XResizeWindow( (Display *) jlong_to_ptr(display),(Window) window,width,height);
742
}
743
744
/*
745
* Class: sun_awt_X11_XlibWrapper
746
* Method: XMoveWindow
747
* Signature: (JJII)V
748
*/
749
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMoveWindow
750
(JNIEnv *env, jclass clazz, jlong display, jlong window, jint width, jint height) {
751
AWT_CHECK_HAVE_LOCK();
752
XMoveWindow( (Display *) jlong_to_ptr(display),(Window) window,width,height);
753
}
754
755
756
/*
757
* Class: sun_awt_X11_XlibWrapper
758
* Method: XSetWindowBackground
759
* Signature: (JJJ)V
760
*/
761
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetWindowBackground
762
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong background_pixel) {
763
AWT_CHECK_HAVE_LOCK();
764
XSetWindowBackground((Display *) jlong_to_ptr(display),window,background_pixel);
765
}
766
767
768
/*
769
* Class: sun_awt_X11_XlibWrapper
770
* Method: XFlush
771
* Signature: (J)V
772
*/
773
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFlush
774
(JNIEnv *env, jclass clazz, jlong display) {
775
776
AWT_CHECK_HAVE_LOCK();
777
XFlush((Display *)jlong_to_ptr(display));
778
}
779
780
/*
781
* Class: sun_awt_X11_XlibWrapper
782
* Method: XSync
783
* Signature: (JI)V
784
*/
785
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSync
786
(JNIEnv *env, jclass clazz, jlong display, jint discard) {
787
AWT_CHECK_HAVE_LOCK();
788
XSync((Display *) jlong_to_ptr(display), discard);
789
}
790
791
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XTranslateCoordinates
792
(JNIEnv *env, jclass clazz, jlong display, jlong src_w, jlong dest_w,
793
jlong src_x, jlong src_y, jlong dest_x_return, jlong dest_y_return,
794
jlong child_return)
795
{
796
AWT_CHECK_HAVE_LOCK_RETURN(0);
797
return XTranslateCoordinates( (Display *) jlong_to_ptr(display), src_w, dest_w,
798
src_x, src_y,
799
(int *) jlong_to_ptr(dest_x_return),
800
(int *) jlong_to_ptr(dest_y_return),
801
(Window *) jlong_to_ptr(child_return));
802
}
803
804
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XEventsQueued
805
(JNIEnv *env, jclass clazz, jlong display, jint mode) {
806
807
AWT_CHECK_HAVE_LOCK_RETURN(0);
808
return XEventsQueued((Display *) jlong_to_ptr(display), mode);
809
810
}
811
812
/*
813
* Class: sun_awt_X11_XlibWrapper
814
* Method: SetProperty
815
* Signature: (JJJLjava/lang/String;)V
816
*/
817
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_SetProperty
818
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom, jstring jstr) {
819
char *cname;
820
XTextProperty tp;
821
int32_t status;
822
823
/*
824
In case there are direct support of UTF-8 declared, use UTF-8 strings.
825
*/
826
if (!JNU_IsNull(env, jstr)) {
827
#ifdef X_HAVE_UTF8_STRING
828
cname = (char *) (*env)->GetStringUTFChars(env, jstr, JNI_FALSE);
829
#else
830
cname = (char *) JNU_GetStringPlatformChars(env, jstr, NULL);
831
#endif
832
CHECK_NULL(cname);
833
} else {
834
cname = "";
835
}
836
837
AWT_CHECK_HAVE_LOCK();
838
839
#ifdef X_HAVE_UTF8_STRING
840
status = Xutf8TextListToTextProperty((Display *)jlong_to_ptr(display), &cname, 1,
841
XStdICCTextStyle, &tp);
842
#else
843
status = XmbTextListToTextProperty((Display *)jlong_to_ptr(display), &cname, 1,
844
XStdICCTextStyle, &tp);
845
#endif
846
847
if (status == Success || status > 0) {
848
XChangeProperty((Display *)jlong_to_ptr(display), window, atom, tp.encoding, tp.format, PropModeReplace, tp.value, tp.nitems);
849
if (tp.value != NULL) {
850
XFree(tp.value);
851
}
852
}
853
854
if (!JNU_IsNull(env, jstr)) {
855
#ifdef X_HAVE_UTF8_STRING
856
(*env)->ReleaseStringUTFChars(env, jstr, (const char *) cname);
857
#else
858
JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);
859
#endif
860
}
861
}
862
863
/*
864
* Class: sun_awt_X11_XlibWrapper
865
* Method: XChangeProperty
866
* Signature: (JJJJJJJJJJJ)V
867
*/
868
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangePropertyImpl(
869
JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property,
870
jlong type, jint format, jint mode, jlong data, jint nelements)
871
{
872
AWT_CHECK_HAVE_LOCK();
873
XChangeProperty((Display*) jlong_to_ptr(display), (Window) window, (Atom) property,
874
(Atom) type, format, mode, (unsigned char*) jlong_to_ptr(data),
875
nelements);
876
}
877
/*
878
* Class: sun_awt_X11_XlibWrapper
879
* Method: XChangePropertyS
880
* Signature: (JJJJJJJJJLjava/lang/String;)V
881
*/
882
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangePropertyS(
883
JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property,
884
jlong type, jint format, jint mode, jstring value)
885
{
886
jboolean iscopy;
887
AWT_CHECK_HAVE_LOCK();
888
const char * chars = JNU_GetStringPlatformChars(env, value, &iscopy);
889
CHECK_NULL(chars);
890
XChangeProperty((Display*)jlong_to_ptr(display), window, (Atom)property,
891
(Atom)type, format, mode, (unsigned char*)chars, strlen(chars));
892
if (iscopy) {
893
JNU_ReleaseStringPlatformChars(env, value, chars);
894
}
895
}
896
897
/*
898
* Class: sun_awt_X11_XlibWrapper
899
* Method: XGetWindowProperty
900
* Signature: (JJJJJJJJJJJ)J;
901
*/
902
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWindowProperty
903
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property, jlong long_offset,
904
jlong long_length, jlong delete, jlong req_type, jlong actual_type,
905
jlong actual_format, jlong nitems_ptr, jlong bytes_after, jlong data_ptr)
906
{
907
AWT_CHECK_HAVE_LOCK_RETURN(0);
908
return XGetWindowProperty((Display*) jlong_to_ptr(display), window, property, long_offset, long_length,
909
delete, (Atom) req_type, (Atom*) jlong_to_ptr(actual_type),
910
(int *) jlong_to_ptr(actual_format), (unsigned long *) jlong_to_ptr(nitems_ptr),
911
(unsigned long*) jlong_to_ptr(bytes_after), (unsigned char**) jlong_to_ptr(data_ptr));
912
}
913
914
/*
915
* Class: sun_awt_X11_XlibWrapper
916
* Method: GetProperty
917
* Signature: (JJJ)Ljava/lang/String;
918
*/
919
JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_GetProperty
920
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom)
921
{
922
/* Request status */
923
int status;
924
925
/* Returns of XGetWindowProperty */
926
Atom actual_type;
927
int actual_format;
928
unsigned long nitems;
929
unsigned long bytes_after;
930
unsigned char * string;
931
jstring res = NULL;
932
AWT_CHECK_HAVE_LOCK_RETURN(NULL);
933
status = XGetWindowProperty((Display*)jlong_to_ptr(display), window,
934
atom, 0, 0xFFFF, False, XA_STRING,
935
&actual_type, &actual_format, &nitems, &bytes_after,
936
&string);
937
938
if (status != Success || string == NULL) {
939
return NULL;
940
}
941
942
if (actual_type == XA_STRING && actual_format == 8) {
943
res = JNU_NewStringPlatform(env,(char*) string);
944
}
945
XFree(string);
946
return res;
947
}
948
949
/*
950
* Class: sun_awt_X11_XlibWrapper
951
* Method: InternAtom
952
* Signature: (JLjava/lang/String;I)J
953
*/
954
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_InternAtom
955
(JNIEnv *env, jclass clazz, jlong display, jstring jstr, jint ife) {
956
957
char *cname;
958
unsigned long atom;
959
960
AWT_CHECK_HAVE_LOCK_RETURN(0);
961
962
if (!JNU_IsNull(env, jstr)) {
963
cname = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);
964
CHECK_NULL_RETURN(cname, 0);
965
} else {
966
cname = "";
967
}
968
969
atom = XInternAtom((Display *) jlong_to_ptr(display), cname, ife);
970
971
if (!JNU_IsNull(env, jstr)) {
972
JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);
973
}
974
975
return (jlong) atom;
976
977
}
978
979
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XCreateFontCursor
980
(JNIEnv *env, jclass clazz, jlong display, jint shape) {
981
AWT_CHECK_HAVE_LOCK_RETURN(0);
982
return XCreateFontCursor((Display *) jlong_to_ptr(display), (int) shape);
983
}
984
985
/*
986
* Class: sun_awt_X11_XlibWrapper
987
* Method: XCreatePixmapCursor
988
* Signature: (JJJJJII)J
989
*/
990
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreatePixmapCursor
991
(JNIEnv *env , jclass clazz, jlong display, jlong source, jlong mask, jlong fore, jlong back, jint x , jint y) {
992
993
AWT_CHECK_HAVE_LOCK_RETURN(0);
994
return (jlong) XCreatePixmapCursor((Display *) jlong_to_ptr(display), (Pixmap) source, (Pixmap) mask,
995
(XColor *) jlong_to_ptr(fore), (XColor *) jlong_to_ptr(back), x, y);
996
}
997
998
/*
999
* Class: sun_awt_X11_XlibWrapper
1000
* Method: XQueryBestCursor
1001
* Signature: (JJIIJJ)Z
1002
*/
1003
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryBestCursor
1004
(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jint width, jint height, jlong width_return, jlong height_return) {
1005
1006
Status status;
1007
1008
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1009
status = XQueryBestCursor((Display *) jlong_to_ptr(display), (Drawable) drawable, width,height,
1010
(unsigned int *) jlong_to_ptr(width_return), (unsigned int *) jlong_to_ptr(height_return));
1011
1012
if (status == 0) return JNI_FALSE;
1013
else return JNI_TRUE;
1014
}
1015
1016
/*
1017
* Class: sun_awt_X11_XlibWrapper
1018
* Method: XFreeCursor
1019
* Signature: (JJ)V
1020
*/
1021
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFreeCursor
1022
(JNIEnv *env, jclass clazz, jlong display, jlong cursor) {
1023
1024
AWT_CHECK_HAVE_LOCK();
1025
XFreeCursor( (Display *) jlong_to_ptr(display), (Cursor) cursor);
1026
}
1027
1028
/*
1029
* Class: sun_awt_X11_XlibWrapper
1030
* Method: XQueryPointer
1031
* Signature: (JJJJJJJJJ)Z
1032
*/
1033
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryPointer
1034
(JNIEnv *env, jclass clazz, jlong display, jlong w, jlong root_return, jlong child_return, jlong root_x_return , jlong root_y_return, jlong win_x_return, jlong win_y_return, jlong mask_return) {
1035
1036
Bool b;
1037
1038
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1039
b = XQueryPointer((Display *) jlong_to_ptr(display),
1040
(Window) w, (Window *) jlong_to_ptr(root_return), (Window *) jlong_to_ptr(child_return),
1041
(int *) jlong_to_ptr(root_x_return), (int *) jlong_to_ptr(root_y_return),
1042
(int *) jlong_to_ptr(win_x_return), (int *) jlong_to_ptr(win_y_return),
1043
(unsigned int *) jlong_to_ptr(mask_return));
1044
1045
return b ? JNI_TRUE : JNI_FALSE;
1046
}
1047
1048
/*
1049
* Class: sun_awt_X11_XlibWrapper
1050
* Method: XChangeWindowAttributes
1051
* Signature: (JJJJ)V
1052
*/
1053
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangeWindowAttributes
1054
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong valuemask, jlong attributes) {
1055
1056
AWT_CHECK_HAVE_LOCK();
1057
XChangeWindowAttributes((Display *) jlong_to_ptr(display), (Window) window, (unsigned long) valuemask,
1058
(XSetWindowAttributes *) jlong_to_ptr(attributes));
1059
}
1060
1061
/*
1062
* Class: sun_awt_X11_XlibWrapper
1063
* Method: XSetTransientFor
1064
* Signature: (JJJ)V
1065
*/
1066
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetTransientFor
1067
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong transient_for_window)
1068
{
1069
AWT_CHECK_HAVE_LOCK();
1070
XSetTransientForHint((Display *) jlong_to_ptr(display), window, transient_for_window);
1071
}
1072
1073
/*
1074
* Class: sun_awt_X11_XlibWrapper
1075
* Method: XSetWMHints
1076
* Signature: (JJJ)V
1077
*/
1078
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetWMHints
1079
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)
1080
{
1081
AWT_CHECK_HAVE_LOCK();
1082
XSetWMHints((Display *) jlong_to_ptr(display), window, (XWMHints *) jlong_to_ptr(hints));
1083
}
1084
1085
/*
1086
* Class: sun_awt_X11_XlibWrapper
1087
* Method: XGetWMHints
1088
* Signature: (JJJ)V
1089
*/
1090
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XGetWMHints
1091
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)
1092
{
1093
XWMHints * get_hints;
1094
AWT_CHECK_HAVE_LOCK();
1095
get_hints = XGetWMHints((Display*)jlong_to_ptr(display), window);
1096
if (get_hints != NULL) {
1097
memcpy(jlong_to_ptr(hints), get_hints, sizeof(XWMHints));
1098
XFree(get_hints);
1099
} else {
1100
memset(jlong_to_ptr(hints), 0, sizeof(XWMHints));
1101
}
1102
}
1103
1104
/*
1105
* Class: sun_awt_X11_XlibWrapper
1106
* Method: XGetPointerMapping
1107
* Signature: (JJI)I
1108
*/
1109
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetPointerMapping
1110
(JNIEnv *env, jclass clazz, jlong display, jlong map, jint buttonNumber)
1111
{
1112
AWT_CHECK_HAVE_LOCK_RETURN(0);
1113
return XGetPointerMapping((Display*)jlong_to_ptr(display), (unsigned char*) jlong_to_ptr(map), buttonNumber);
1114
}
1115
1116
/*
1117
* Class: sun_awt_X11_XlibWrapper
1118
* Method: XGetDefault
1119
* Signature: (JJI)I
1120
*/
1121
JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_XGetDefault
1122
(JNIEnv *env, jclass clazz, jlong display, jstring program, jstring option)
1123
{
1124
char * c_program = NULL;
1125
char * c_option = NULL;
1126
char * c_res = NULL;
1127
1128
if (!JNU_IsNull(env, program)) {
1129
c_program = (char *)JNU_GetStringPlatformChars(env, program, NULL);
1130
}
1131
CHECK_NULL_RETURN(c_program, NULL);
1132
1133
if (!JNU_IsNull(env, option)) {
1134
c_option = (char *)JNU_GetStringPlatformChars(env, option, NULL);
1135
}
1136
1137
if (c_option == NULL) {
1138
JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program);
1139
return NULL;
1140
}
1141
1142
AWT_CHECK_HAVE_LOCK_RETURN(NULL);
1143
c_res = XGetDefault((Display*)jlong_to_ptr(display), c_program, c_option);
1144
// The strings returned by XGetDefault() are owned by Xlib and
1145
// should not be modified or freed by the client.
1146
1147
JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program);
1148
JNU_ReleaseStringPlatformChars(env, option, (const char *) c_option);
1149
1150
if (c_res != NULL) {
1151
return JNU_NewStringPlatform(env, c_res);
1152
} else {
1153
return NULL;
1154
}
1155
}
1156
1157
/*
1158
* Class: sun_awt_X11_XlibWrapper
1159
* Method: getScreenOfWindow
1160
* Signature: (JJ)J
1161
*/
1162
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_getScreenOfWindow
1163
(JNIEnv *env, jclass clazz, jlong display, jlong window)
1164
{
1165
XWindowAttributes attrs;
1166
memset(&attrs, 0, sizeof(attrs));
1167
AWT_CHECK_HAVE_LOCK_RETURN(0);
1168
XGetWindowAttributes((Display *) jlong_to_ptr(display), window, &attrs);
1169
return ptr_to_jlong(attrs.screen);
1170
}
1171
1172
/*
1173
* Class: sun_awt_X11_XlibWrapper
1174
* Method: XScreenNumberOfScreen
1175
* Signature: (J)J
1176
*/
1177
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XScreenNumberOfScreen
1178
(JNIEnv *env, jclass clazz, jlong screen)
1179
{
1180
AWT_CHECK_HAVE_LOCK_RETURN(-1);
1181
if(jlong_to_ptr(screen) == NULL) {
1182
return -1;
1183
}
1184
return XScreenNumberOfScreen((Screen*) jlong_to_ptr(screen));
1185
}
1186
1187
/*
1188
* Class: sun_awt_X11_XlibWrapper
1189
* Method: XIconifyWindow
1190
* Signature: (JJJ)V
1191
*/
1192
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XIconifyWindow
1193
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong screenNumber)
1194
{
1195
AWT_CHECK_HAVE_LOCK_RETURN(0);
1196
return XIconifyWindow((Display*) jlong_to_ptr(display), window, screenNumber);
1197
}
1198
1199
/*
1200
* Class: sun_awt_X11_XlibWrapper
1201
* Method: XFree
1202
* Signature: (J)V
1203
*/
1204
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFree
1205
(JNIEnv *env, jclass clazz, jlong ptr)
1206
{
1207
AWT_CHECK_HAVE_LOCK();
1208
XFree(jlong_to_ptr(ptr));
1209
}
1210
1211
/*
1212
* Class: sun_awt_X11_XlibWrapper
1213
* Method: XFree
1214
* Signature: (J)V
1215
*/
1216
JNIEXPORT jbyteArray JNICALL Java_sun_awt_X11_XlibWrapper_getStringBytes
1217
(JNIEnv *env, jclass clazz, jlong str_ptr)
1218
{
1219
unsigned char * str = (unsigned char*) jlong_to_ptr(str_ptr);
1220
long length = strlen((char*)str);
1221
jbyteArray res = (*env)->NewByteArray(env, length);
1222
CHECK_NULL_RETURN(res, NULL);
1223
(*env)->SetByteArrayRegion(env, res, 0, length,
1224
(const signed char*) str);
1225
return res;
1226
}
1227
1228
/*
1229
* Class: sun_awt_X11_XlibWrapper
1230
* Method: ServerVendor
1231
* Signature: (J)Ljava/lang/String;
1232
*/
1233
JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_ServerVendor
1234
(JNIEnv *env, jclass clazz, jlong display)
1235
{
1236
AWT_CHECK_HAVE_LOCK_RETURN(NULL);
1237
return JNU_NewStringPlatform(env, ServerVendor((Display*)jlong_to_ptr(display)));
1238
}
1239
1240
/*
1241
* Class: sun_awt_X11_XlibWrapper
1242
* Method: VendorRelease
1243
* Signature: (J)I;
1244
*/
1245
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_VendorRelease
1246
(JNIEnv *env, jclass clazz, jlong display)
1247
{
1248
AWT_CHECK_HAVE_LOCK_RETURN(0);
1249
return VendorRelease((Display*)jlong_to_ptr(display));
1250
}
1251
1252
/*
1253
* Class: sun_awt_X11_XlibWrapper
1254
* Method: IsXsunKPBehavior
1255
* Signature: (J)Z;
1256
*/
1257
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsXsunKPBehavior
1258
(JNIEnv *env, jclass clazz, jlong display)
1259
{
1260
// Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event.
1261
// Otherwise, it is [1] or sometimes [0].
1262
// This sniffer first tries to determine what is a keycode for XK_KP_7
1263
// using XKeysymToKeycode;
1264
// second, in which place in the keysymarray is XK_KP_7
1265
// using XKeycodeToKeysym.
1266
int kc7;
1267
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1268
kc7 = XKeysymToKeycode((Display*)jlong_to_ptr(display), XK_KP_7);
1269
if( !kc7 ) {
1270
// keycode is not defined. Why, it's a reduced keyboard perhaps:
1271
// report arbitrarily false.
1272
return JNI_FALSE;
1273
} else {
1274
long ks2 = keycodeToKeysym((Display*)jlong_to_ptr(display), kc7, 2);
1275
if( ks2 == XK_KP_7 ) {
1276
//XXX If some Xorg server would put XK_KP_7 in keysymarray[2] as well,
1277
//XXX for yet unknown to me reason, the sniffer would lie.
1278
return JNI_TRUE;
1279
}else{
1280
return JNI_FALSE;
1281
}
1282
}
1283
}
1284
1285
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsSunKeyboard
1286
(JNIEnv *env, jclass clazz, jlong display)
1287
{
1288
int xx;
1289
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1290
xx = XKeysymToKeycode((Display*)jlong_to_ptr(display), SunXK_F37);
1291
return (!xx) ? JNI_FALSE : JNI_TRUE;
1292
}
1293
1294
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsKanaKeyboard
1295
(JNIEnv *env, jclass clazz, jlong display)
1296
{
1297
int xx;
1298
static jboolean result = JNI_FALSE;
1299
1300
int32_t minKeyCode, maxKeyCode, keySymsPerKeyCode;
1301
KeySym *keySyms, *keySymsStart, keySym;
1302
int32_t i;
1303
int32_t kanaCount = 0;
1304
1305
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1306
1307
// There's no direct way to determine whether the keyboard has
1308
// a kana lock key. From available keyboard mapping tables, it looks
1309
// like only keyboards with the kana lock key can produce keysyms
1310
// for kana characters. So, as an indirect test, we check for those.
1311
XDisplayKeycodes((Display*)jlong_to_ptr(display), &minKeyCode, &maxKeyCode);
1312
keySyms = XGetKeyboardMapping((Display*)jlong_to_ptr(display), minKeyCode, maxKeyCode - minKeyCode + 1, &keySymsPerKeyCode);
1313
keySymsStart = keySyms;
1314
for (i = 0; i < (maxKeyCode - minKeyCode + 1) * keySymsPerKeyCode; i++) {
1315
keySym = *keySyms++;
1316
if ((keySym & 0xff00) == 0x0400) {
1317
kanaCount++;
1318
}
1319
}
1320
XFree(keySymsStart);
1321
1322
// use a (somewhat arbitrary) minimum so we don't get confused by a stray function key
1323
result = kanaCount > 10;
1324
return result ? JNI_TRUE : JNI_FALSE;
1325
}
1326
1327
JavaVM* jvm = NULL;
1328
static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {
1329
JNIEnv * env;
1330
// First call the native synthetic error handler declared in "awt_util.h" file.
1331
if (current_native_xerror_handler != NULL) {
1332
current_native_xerror_handler(dpy, event);
1333
}
1334
if (jvm != NULL) {
1335
env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
1336
if (env) {
1337
return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil",
1338
"globalErrorHandler", "(JJ)I", ptr_to_jlong(dpy), ptr_to_jlong(event)).i;
1339
}
1340
}
1341
return 0;
1342
}
1343
1344
/*
1345
* Class: sun_awt_X11_XlibWrapper
1346
* Method: SetToolkitErrorHandler
1347
* Signature: ()J
1348
*/
1349
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_SetToolkitErrorHandler
1350
(JNIEnv *env, jclass clazz)
1351
{
1352
if ((*env)->GetJavaVM(env, &jvm) < 0) {
1353
return 0;
1354
}
1355
AWT_CHECK_HAVE_LOCK_RETURN(0);
1356
return ptr_to_jlong(XSetErrorHandler(ToolkitErrorHandler));
1357
}
1358
1359
/*
1360
* Class: sun_awt_X11_XlibWrapper
1361
* Method: XSetErrorHandler
1362
* Signature: (J)V
1363
*/
1364
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetErrorHandler
1365
(JNIEnv *env, jclass clazz, jlong handler)
1366
{
1367
AWT_CHECK_HAVE_LOCK();
1368
XSetErrorHandler((XErrorHandler) jlong_to_ptr(handler));
1369
}
1370
1371
/*
1372
* Class: sun_awt_X11_XlibWrapper
1373
* Method: CallErrorHandler
1374
* Signature: (JJJ)I
1375
*/
1376
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_CallErrorHandler
1377
(JNIEnv *env, jclass clazz, jlong handler, jlong display, jlong event_ptr)
1378
{
1379
return (*(XErrorHandler)jlong_to_ptr(handler))((Display*) jlong_to_ptr(display), (XErrorEvent*) jlong_to_ptr(event_ptr));
1380
}
1381
1382
/*
1383
* Class: sun_awt_X11_XlibWrapper
1384
* Method: PrintXErrorEvent
1385
* Signature: (JJ)V
1386
*/
1387
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_PrintXErrorEvent
1388
(JNIEnv *env, jclass clazz, jlong display, jlong event_ptr)
1389
{
1390
char msg[128];
1391
char buf[128];
1392
1393
XErrorEvent* err = (XErrorEvent *)jlong_to_ptr(event_ptr);
1394
1395
XGetErrorText((Display *)jlong_to_ptr(display), err->error_code, msg, sizeof(msg));
1396
jio_fprintf(stderr, "Xerror %s, XID %x, ser# %d\n", msg, err->resourceid, err->serial);
1397
jio_snprintf(buf, sizeof(buf), "%d", err->request_code);
1398
XGetErrorDatabaseText((Display *)jlong_to_ptr(display), "XRequest", buf, "Unknown", msg, sizeof(msg));
1399
jio_fprintf(stderr, "Major opcode %d (%s)\n", err->request_code, msg);
1400
if (err->request_code > 128) {
1401
jio_fprintf(stderr, "Minor opcode %d\n", err->minor_code);
1402
}
1403
}
1404
1405
/*
1406
* Class: sun_awt_X11_XlibWrapper
1407
* Method: XInternAtoms
1408
* Signature: (J[Ljava/lang/String;ZJ)I
1409
*/
1410
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XInternAtoms
1411
(JNIEnv *env, jclass clazz, jlong display, jobjectArray names_arr, jboolean only_if_exists, jlong atoms)
1412
{
1413
int status = 0;
1414
AWT_CHECK_HAVE_LOCK_RETURN(0);
1415
jsize length;
1416
char** names = stringArrayToNative(env, names_arr, &length);
1417
if (names) {
1418
status = XInternAtoms((Display*)jlong_to_ptr(display), names, length, only_if_exists, (Atom*) jlong_to_ptr(atoms));
1419
freeNativeStringArray(names, length);
1420
}
1421
return status;
1422
}
1423
1424
/*
1425
* Class: sun_awt_X11_XlibWrapper
1426
* Method: XGetWindowAttributes
1427
* Signature: (JJJ)I
1428
*/
1429
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWindowAttributes
1430
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong attr_ptr)
1431
{
1432
jint status;
1433
AWT_CHECK_HAVE_LOCK_RETURN(0);
1434
memset((XWindowAttributes*) jlong_to_ptr(attr_ptr), 0, sizeof(XWindowAttributes));
1435
status = XGetWindowAttributes((Display*)jlong_to_ptr(display), window, (XWindowAttributes*) jlong_to_ptr(attr_ptr));
1436
return status;
1437
}
1438
1439
/*
1440
* Class: sun_awt_X11_XlibWrapper
1441
* Method: XGetGeometry
1442
* Signature: (JJJJJJJJJ)I
1443
*/
1444
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetGeometry
1445
(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jlong root_return,
1446
jlong x_return, jlong y_return, jlong width_return, jlong height_return,
1447
jlong border_width_return, jlong depth_return)
1448
{
1449
jint status;
1450
AWT_CHECK_HAVE_LOCK_RETURN(0);
1451
status = XGetGeometry((Display *)jlong_to_ptr(display),
1452
(Drawable)drawable, (Window *)jlong_to_ptr(root_return),
1453
(int *)jlong_to_ptr(x_return), (int *)jlong_to_ptr(y_return),
1454
(unsigned int *)jlong_to_ptr(width_return), (unsigned int *)jlong_to_ptr(height_return),
1455
(unsigned int *)jlong_to_ptr(border_width_return),
1456
(unsigned int *)jlong_to_ptr(depth_return));
1457
return status;
1458
}
1459
1460
/*
1461
* Class: sun_awt_X11_XlibWrapper
1462
* Method: XGetWMNormalHints
1463
* Signature: (JJJJ)I
1464
*/
1465
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWMNormalHints
1466
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints, jlong supplied_return)
1467
{
1468
AWT_CHECK_HAVE_LOCK_RETURN(0);
1469
return XGetWMNormalHints((Display*) jlong_to_ptr(display),
1470
window,
1471
(XSizeHints*) jlong_to_ptr(hints),
1472
(long*) jlong_to_ptr(supplied_return));
1473
}
1474
1475
/*
1476
* Class: sun_awt_X11_XlibWrapper
1477
* Method: XSetWMNormalHints
1478
* Signature: (JJJ)V
1479
*/
1480
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetWMNormalHints
1481
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)
1482
{
1483
AWT_CHECK_HAVE_LOCK();
1484
XSetWMNormalHints((Display*) jlong_to_ptr(display), window, (XSizeHints*) jlong_to_ptr(hints));
1485
}
1486
1487
/*
1488
* Class: sun_awt_X11_XlibWrapper
1489
* Method: XDeleteProperty
1490
* Signature: (JJJ)V
1491
*/
1492
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XDeleteProperty
1493
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom)
1494
{
1495
AWT_CHECK_HAVE_LOCK();
1496
XDeleteProperty((Display*) jlong_to_ptr(display), window, (Atom)atom);
1497
}
1498
1499
/*
1500
* Class: sun_awt_X11_XlibWrapper
1501
* Method: XSendEvent
1502
* Signature: (JJZJJ)V
1503
*/
1504
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XSendEvent
1505
(JNIEnv *env, jclass clazz, jlong display, jlong window, jboolean propagate, jlong event_mask, jlong event)
1506
{
1507
AWT_CHECK_HAVE_LOCK_RETURN(0);
1508
return XSendEvent((Display*) jlong_to_ptr(display),
1509
window,
1510
propagate==JNI_TRUE?True:False,
1511
(long) event_mask,
1512
(XEvent*) jlong_to_ptr(event));
1513
}
1514
1515
/*
1516
* Class: sun_awt_X11_XlibWrapper
1517
* Method: XQueryTree
1518
* Signature: (JJJJJJ)I
1519
*/
1520
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XQueryTree
1521
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong root_return, jlong parent_return, jlong children_return, jlong nchildren_return)
1522
{
1523
AWT_CHECK_HAVE_LOCK_RETURN(0);
1524
return XQueryTree((Display*) jlong_to_ptr(display),
1525
window,
1526
(Window *) jlong_to_ptr(root_return),
1527
(Window*) jlong_to_ptr(parent_return),
1528
(Window**) jlong_to_ptr(children_return),
1529
(unsigned int*) jlong_to_ptr(nchildren_return));
1530
}
1531
1532
/*
1533
* Class: sun_awt_X11_XlibWrapper
1534
* Method: memcpy
1535
* Signature: (JJJ)V
1536
*/
1537
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_memcpy
1538
(JNIEnv *env, jclass clazz, jlong dest_ptr, jlong src_ptr, jlong length)
1539
{
1540
memcpy(jlong_to_ptr(dest_ptr), jlong_to_ptr(src_ptr), length);
1541
}
1542
1543
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetMinMaxHints
1544
(JNIEnv *env, jclass clazz, jlong display, jlong window, jint x, jint y, jint width, jint height, jlong flags) {
1545
XSizeHints * hints;
1546
AWT_CHECK_HAVE_LOCK();
1547
hints = XAllocSizeHints();
1548
hints->flags = flags;
1549
hints->width = width;
1550
hints->min_width = width;
1551
hints->max_width = width;
1552
hints->height = height;
1553
hints->min_height = height;
1554
hints->max_height = height;
1555
hints->x = x;
1556
hints->y = y;
1557
XSetWMNormalHints((Display*) jlong_to_ptr(display), window, hints);
1558
XFree(hints);
1559
}
1560
1561
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XGetVisualInfo
1562
(JNIEnv *env, jclass clazz, jlong display, jlong vinfo_mask, jlong vinfo_template,
1563
jlong nitems_return)
1564
{
1565
AWT_CHECK_HAVE_LOCK_RETURN(0);
1566
return ptr_to_jlong(XGetVisualInfo((Display*) jlong_to_ptr(display),
1567
(long) vinfo_mask,
1568
(XVisualInfo*) jlong_to_ptr(vinfo_template),
1569
(int*) jlong_to_ptr(nitems_return)));
1570
}
1571
1572
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XAllocSizeHints
1573
(JNIEnv *env, jclass clazz)
1574
{
1575
AWT_CHECK_HAVE_LOCK_RETURN(0);
1576
return ptr_to_jlong(XAllocSizeHints());
1577
}
1578
1579
/*
1580
* Class: sun_awt_X11_XlibWrapper
1581
* Method: XIconifyWindow
1582
* Signature: (JJJ)V
1583
*/
1584
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XBell
1585
(JNIEnv *env, jclass clazz, jlong display, jint percent)
1586
{
1587
AWT_CHECK_HAVE_LOCK();
1588
XBell((Display*)jlong_to_ptr(display), percent);
1589
}
1590
1591
/*
1592
* Class: sun_awt_X11_XlibWrapper
1593
* Method: XAllocColor
1594
* Signature: (JJJ)Z
1595
*/
1596
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XAllocColor
1597
(JNIEnv *env, jclass clazz, jlong display , jlong colormap, jlong xcolor) {
1598
1599
Status status;
1600
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1601
status = XAllocColor((Display *) jlong_to_ptr(display), (Colormap) colormap, (XColor *) jlong_to_ptr(xcolor));
1602
1603
if (status == 0) return JNI_FALSE;
1604
else return JNI_TRUE;
1605
}
1606
1607
/*
1608
* Class: sun_awt_X11_XlibWrapper
1609
* Method: XCreateBitmapFromData
1610
* Signature: (JJJII)J
1611
*/
1612
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreateBitmapFromData
1613
(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jlong data, jint width, jint height) {
1614
AWT_CHECK_HAVE_LOCK_RETURN(0);
1615
1616
return (jlong) XCreateBitmapFromData((Display *) jlong_to_ptr(display), (Drawable) drawable,
1617
(char *) jlong_to_ptr(data), width, height);
1618
}
1619
1620
/*
1621
* Class: sun_awt_X11_XlibWrapper
1622
* Method: XFreePixmap
1623
* Signature: (JJ)V
1624
*/
1625
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFreePixmap
1626
(JNIEnv *env, jclass clazz, jlong display, jlong pixmap) {
1627
AWT_CHECK_HAVE_LOCK();
1628
XFreePixmap((Display *)jlong_to_ptr(display), (Pixmap) pixmap);
1629
}
1630
1631
/*
1632
* Class: sun_awt_X11_XlibWrapper
1633
* Method: XReparentWindow
1634
* Signature: (JJJII)V
1635
*/
1636
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XReparentWindow
1637
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong parent, jint x, jint y) {
1638
AWT_CHECK_HAVE_LOCK();
1639
XReparentWindow((Display*)jlong_to_ptr(display), window, parent, x, y);
1640
}
1641
1642
/*
1643
* Class: sun_awt_X11_XlibWrapper
1644
* Method: XConvertSelection
1645
* Signature: (JJJJJJ)V
1646
*/
1647
JNIEXPORT void JNICALL
1648
Java_sun_awt_X11_XlibWrapper_XConvertSelection(JNIEnv *env, jclass clazz,
1649
jlong display, jlong selection,
1650
jlong target, jlong property,
1651
jlong requestor, jlong time) {
1652
AWT_CHECK_HAVE_LOCK();
1653
XConvertSelection((Display*)jlong_to_ptr(display), selection, target, property, requestor,
1654
time);
1655
}
1656
1657
/*
1658
* Class: sun_awt_X11_XlibWrapper
1659
* Method: XSetSelectionOwner
1660
* Signature: (JJJJ)V
1661
*/
1662
JNIEXPORT void JNICALL
1663
Java_sun_awt_X11_XlibWrapper_XSetSelectionOwner(JNIEnv *env, jclass clazz,
1664
jlong display, jlong selection,
1665
jlong owner, jlong time) {
1666
AWT_CHECK_HAVE_LOCK();
1667
XSetSelectionOwner((Display*)jlong_to_ptr(display), selection, owner, time);
1668
}
1669
1670
/*
1671
* Class: sun_awt_X11_XlibWrapper
1672
* Method: XGetSelectionOwner
1673
* Signature: (JJ)J
1674
*/
1675
JNIEXPORT jlong JNICALL
1676
Java_sun_awt_X11_XlibWrapper_XGetSelectionOwner(JNIEnv *env, jclass clazz,
1677
jlong display, jlong selection) {
1678
AWT_CHECK_HAVE_LOCK_RETURN(0);
1679
return (jlong)XGetSelectionOwner((Display*)jlong_to_ptr(display), selection);
1680
}
1681
1682
/*
1683
* Class: sun_awt_X11_XlibWrapper
1684
* Method: XGetAtomName
1685
* Signature: (JJ)Ljava/lang/String;
1686
*/
1687
JNIEXPORT jstring JNICALL
1688
Java_sun_awt_X11_XlibWrapper_XGetAtomName(JNIEnv *env, jclass clazz,
1689
jlong display, jlong atom)
1690
{
1691
jstring string = NULL;
1692
char* name;
1693
AWT_CHECK_HAVE_LOCK_RETURN(NULL);
1694
name = (char*) XGetAtomName((Display*)jlong_to_ptr(display), atom);
1695
1696
if (name == NULL) {
1697
fprintf(stderr, "Atom was %d\n", (int)atom);
1698
JNU_ThrowNullPointerException(env, "Failed to retrieve atom name.");
1699
return NULL;
1700
}
1701
1702
string = (*env)->NewStringUTF(env, (const char *)name);
1703
1704
XFree(name);
1705
1706
return string;
1707
}
1708
1709
/*
1710
* Class: sun_awt_X11_XlibWrapper
1711
* Method: XMaxRequestSize
1712
* Signature: (J)J
1713
*/
1714
JNIEXPORT jlong JNICALL
1715
Java_sun_awt_X11_XlibWrapper_XMaxRequestSize(JNIEnv *env, jclass clazz,
1716
jlong display) {
1717
AWT_CHECK_HAVE_LOCK_RETURN(0);
1718
return XMaxRequestSize((Display*) jlong_to_ptr(display));
1719
}
1720
1721
JNIEXPORT jlong JNICALL
1722
Java_sun_awt_X11_XlibWrapper_XAllocWMHints(JNIEnv *env, jclass clazz)
1723
{
1724
AWT_CHECK_HAVE_LOCK_RETURN(0);
1725
return ptr_to_jlong(XAllocWMHints());
1726
}
1727
1728
JNIEXPORT jlong JNICALL
1729
Java_sun_awt_X11_XlibWrapper_XCreatePixmap(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jint width, jint height, jint depth)
1730
{
1731
AWT_CHECK_HAVE_LOCK_RETURN(0);
1732
return XCreatePixmap((Display*)jlong_to_ptr(display), (Drawable)drawable, width, height, depth);
1733
}
1734
1735
JNIEXPORT jlong JNICALL
1736
Java_sun_awt_X11_XlibWrapper_XCreateImage
1737
(JNIEnv *env, jclass clazz, jlong display, jlong visual_ptr,
1738
jint depth, jint format, jint offset, jlong data, jint width,
1739
jint height, jint bitmap_pad, jint bytes_per_line)
1740
{
1741
AWT_CHECK_HAVE_LOCK_RETURN(0);
1742
return ptr_to_jlong(XCreateImage((Display*) jlong_to_ptr(display), (Visual*) jlong_to_ptr(visual_ptr),
1743
depth, format, offset, (char*) jlong_to_ptr(data),
1744
width, height, bitmap_pad, bytes_per_line));
1745
}
1746
1747
JNIEXPORT jlong JNICALL
1748
Java_sun_awt_X11_XlibWrapper_XCreateGC
1749
(JNIEnv *env, jclass clazz, jlong display, jlong drawable,
1750
jlong valuemask, jlong values)
1751
{
1752
AWT_CHECK_HAVE_LOCK_RETURN(0);
1753
return ptr_to_jlong(XCreateGC((Display*) jlong_to_ptr(display), (Drawable)drawable, valuemask, (XGCValues*) jlong_to_ptr(values)));
1754
}
1755
1756
JNIEXPORT void JNICALL
1757
Java_sun_awt_X11_XlibWrapper_XDestroyImage(JNIEnv *env, jclass clazz, jlong image)
1758
{
1759
XImage *img = (XImage*) jlong_to_ptr(image);
1760
AWT_CHECK_HAVE_LOCK();
1761
1762
// Fix for bug 4903671 :
1763
// We should be careful to not double free the memory pointed to data
1764
// Since we use unsafe to allocate it, we should use unsafe to free it.
1765
// So we should NULL the data pointer before calling XDestroyImage so
1766
// that X does not free the pointer for us.
1767
img->data = NULL;
1768
XDestroyImage(img);
1769
}
1770
1771
JNIEXPORT void JNICALL
1772
Java_sun_awt_X11_XlibWrapper_XPutImage(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jlong gc, jlong image, jint src_x, jint src_y, jint dest_x, jint dest_y, jint width, jint height)
1773
{
1774
AWT_CHECK_HAVE_LOCK();
1775
XPutImage((Display*)jlong_to_ptr(display), (Drawable)drawable, (GC) jlong_to_ptr(gc), (XImage*) jlong_to_ptr(image), src_x, src_y,
1776
dest_x, dest_y, width, height);
1777
}
1778
1779
JNIEXPORT void JNICALL
1780
Java_sun_awt_X11_XlibWrapper_XFreeGC(JNIEnv *env, jclass clazz, jlong display, jlong gc)
1781
{
1782
AWT_CHECK_HAVE_LOCK();
1783
XFreeGC((Display*) jlong_to_ptr(display), (GC) jlong_to_ptr(gc));
1784
}
1785
1786
JNIEXPORT void JNICALL
1787
Java_sun_awt_X11_XlibWrapper_XSetWindowBackgroundPixmap(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong pixmap)
1788
{
1789
AWT_CHECK_HAVE_LOCK();
1790
XSetWindowBackgroundPixmap((Display*) jlong_to_ptr(display), (Window)window, (Pixmap)pixmap);
1791
}
1792
1793
JNIEXPORT void JNICALL
1794
Java_sun_awt_X11_XlibWrapper_XClearWindow(JNIEnv *env, jclass clazz, jlong display, jlong window)
1795
{
1796
AWT_CHECK_HAVE_LOCK();
1797
XClearWindow((Display*) jlong_to_ptr(display), (Window)window);
1798
}
1799
1800
JNIEXPORT jint JNICALL
1801
Java_sun_awt_X11_XlibWrapper_XGetIconSizes(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong ret_sizes, jlong ret_count)
1802
{
1803
XIconSize** psize = (XIconSize**) jlong_to_ptr(ret_sizes);
1804
int * pcount = (int *) jlong_to_ptr(ret_count);
1805
Status res;
1806
AWT_CHECK_HAVE_LOCK_RETURN(0);
1807
res = XGetIconSizes((Display*) jlong_to_ptr(display), (Window)window, psize, pcount);
1808
return res;
1809
}
1810
1811
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeQueryExtension
1812
(JNIEnv *env, jclass clazz, jlong display, jlong major_version_return,
1813
jlong minor_version_return)
1814
{
1815
AWT_CHECK_HAVE_LOCK_RETURN(0);
1816
return XdbeQueryExtension((Display*) jlong_to_ptr(display), (int *) jlong_to_ptr(major_version_return),
1817
(int *) jlong_to_ptr(minor_version_return));
1818
}
1819
1820
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryExtension
1821
(JNIEnv *env, jclass clazz, jlong display, jstring jstr, jlong mop_return,
1822
jlong feve_return, jlong err_return)
1823
{
1824
char *cname;
1825
Boolean bu;
1826
if (!JNU_IsNull(env, jstr)) {
1827
cname = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);
1828
CHECK_NULL_RETURN(cname, JNI_FALSE);
1829
} else {
1830
cname = "";
1831
}
1832
1833
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1834
bu = XQueryExtension((Display*) jlong_to_ptr(display), cname, (int *) jlong_to_ptr(mop_return),
1835
(int *) jlong_to_ptr(feve_return), (int *) jlong_to_ptr(err_return));
1836
if (!JNU_IsNull(env, jstr)) {
1837
JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);
1838
}
1839
return bu ? JNI_TRUE : JNI_FALSE;
1840
}
1841
1842
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsKeypadKey
1843
(JNIEnv *env, jclass clazz, jlong keysym)
1844
{
1845
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1846
if(IsKeypadKey(keysym)) {
1847
return JNI_TRUE;
1848
}
1849
return JNI_FALSE;
1850
}
1851
1852
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XdbeAllocateBackBufferName
1853
(JNIEnv *env, jclass clazz, jlong display, jlong window, jint swap_action)
1854
{
1855
AWT_CHECK_HAVE_LOCK_RETURN(0);
1856
return XdbeAllocateBackBufferName((Display*) jlong_to_ptr(display), (Window) window,
1857
(XdbeSwapAction) swap_action);
1858
}
1859
1860
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeDeallocateBackBufferName
1861
(JNIEnv *env, jclass clazz, jlong display, jlong buffer)
1862
{
1863
AWT_CHECK_HAVE_LOCK_RETURN(0);
1864
return XdbeDeallocateBackBufferName((Display*) jlong_to_ptr(display), (XdbeBackBuffer) buffer);
1865
}
1866
1867
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeBeginIdiom
1868
(JNIEnv *env, jclass clazz, jlong display)
1869
{
1870
AWT_CHECK_HAVE_LOCK_RETURN(0);
1871
return XdbeBeginIdiom((Display*) jlong_to_ptr(display));
1872
}
1873
1874
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeEndIdiom
1875
(JNIEnv *env, jclass clazz, jlong display)
1876
{
1877
AWT_CHECK_HAVE_LOCK_RETURN(0);
1878
return XdbeEndIdiom((Display*) jlong_to_ptr(display));
1879
}
1880
1881
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeSwapBuffers
1882
(JNIEnv *env, jclass clazz, jlong display, jlong swap_info, jint num_windows)
1883
{
1884
AWT_CHECK_HAVE_LOCK_RETURN(0);
1885
return XdbeSwapBuffers((Display*) jlong_to_ptr(display), (XdbeSwapInfo *) jlong_to_ptr(swap_info), num_windows);
1886
}
1887
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XQueryKeymap
1888
(JNIEnv *env, jclass clazz, jlong display, jlong vector)
1889
{
1890
AWT_CHECK_HAVE_LOCK();
1891
XQueryKeymap( (Display *) jlong_to_ptr(display), (char *) jlong_to_ptr(vector));
1892
}
1893
1894
// XKeycodeToKeysym is deprecated but for compatibility we keep the API.
1895
JNIEXPORT jlong JNICALL
1896
Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym(JNIEnv *env, jclass clazz,
1897
jlong display, jint keycode,
1898
jint index) {
1899
AWT_CHECK_HAVE_LOCK_RETURN(0);
1900
return keycodeToKeysym((Display*)jlong_to_ptr(display), (unsigned int)keycode, (int)index);
1901
}
1902
1903
JNIEXPORT jint JNICALL
1904
Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup(JNIEnv *env, jclass clazz,
1905
jlong display) {
1906
XkbStateRec sr;
1907
AWT_CHECK_HAVE_LOCK_RETURN(0);
1908
memset(&sr, 0, sizeof(XkbStateRec));
1909
XkbGetState((Display*) jlong_to_ptr(display), XkbUseCoreKbd, &sr);
1910
// printf("-------------------------------------VVVV\n");
1911
// printf(" group:0x%0X\n",sr.group);
1912
// printf(" base_group:0x%0X\n",sr.base_group);
1913
// printf(" latched_group:0x%0X\n",sr.latched_group);
1914
// printf(" locked_group:0x%0X\n",sr.locked_group);
1915
// printf(" mods:0x%0X\n",sr.mods);
1916
// printf(" base_mods:0x%0X\n",sr.base_mods);
1917
// printf(" latched_mods:0x%0X\n",sr.latched_mods);
1918
// printf(" locked_mods:0x%0X\n",sr.locked_mods);
1919
// printf(" compat_state:0x%0X\n",sr.compat_state);
1920
// printf(" grab_mods:0x%0X\n",sr.grab_mods);
1921
// printf(" compat_grab_mods:0x%0X\n",sr.compat_grab_mods);
1922
// printf(" lookup_mods:0x%0X\n",sr.lookup_mods);
1923
// printf(" compat_lookup_mods:0x%0X\n",sr.compat_lookup_mods);
1924
// printf(" ptr_buttons:0x%0X\n",sr.ptr_buttons);
1925
// printf("-------------------------------------^^^^\n");
1926
return (jint)(sr.group);
1927
}
1928
1929
JNIEXPORT jlong JNICALL
1930
Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym(JNIEnv *env, jclass clazz,
1931
jlong display, jint keycode,
1932
jint group, jint level) {
1933
AWT_CHECK_HAVE_LOCK_RETURN(0);
1934
return XkbKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (unsigned int)group, (unsigned int)level);
1935
}
1936
1937
JNIEXPORT jint JNICALL
1938
Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode(JNIEnv *env, jclass clazz,
1939
jlong display, jlong keysym) {
1940
AWT_CHECK_HAVE_LOCK_RETURN(0);
1941
return XKeysymToKeycode((Display*) jlong_to_ptr(display), (KeySym)keysym);
1942
}
1943
1944
JNIEXPORT jlong JNICALL
1945
Java_sun_awt_X11_XlibWrapper_XGetModifierMapping(JNIEnv *env, jclass clazz,
1946
jlong display) {
1947
AWT_CHECK_HAVE_LOCK_RETURN(0);
1948
return ptr_to_jlong(XGetModifierMapping((Display*) jlong_to_ptr(display)));
1949
}
1950
1951
JNIEXPORT void JNICALL
1952
Java_sun_awt_X11_XlibWrapper_XFreeModifiermap(JNIEnv *env, jclass clazz,
1953
jlong keymap) {
1954
AWT_CHECK_HAVE_LOCK();
1955
XFreeModifiermap((XModifierKeymap*) jlong_to_ptr(keymap));
1956
}
1957
1958
/*
1959
* Class: sun_awt_X11_XlibWrapper
1960
* Method: XRefreshKeyboardMapping
1961
* Signature: (J)V
1962
*/
1963
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRefreshKeyboardMapping
1964
(JNIEnv *env, jclass clazz, jlong event_ptr)
1965
{
1966
AWT_CHECK_HAVE_LOCK();
1967
XRefreshKeyboardMapping((XMappingEvent*) jlong_to_ptr(event_ptr));
1968
}
1969
1970
JNIEXPORT void JNICALL
1971
Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab(JNIEnv *env, jclass clazz,
1972
jlong display, jint mask,
1973
jlong cursor, jlong time) {
1974
AWT_CHECK_HAVE_LOCK();
1975
XChangeActivePointerGrab((Display*)jlong_to_ptr(display), (unsigned int)mask,
1976
(Cursor)cursor, (Time)time);
1977
}
1978
1979
/******************* Secondary loop support ************************************/
1980
#define AWT_SECONDARY_LOOP_TIMEOUT 250
1981
1982
static Bool exitSecondaryLoop = True;
1983
1984
/*
1985
* This predicate procedure allows the Toolkit thread to process specific events
1986
* while it is blocked waiting for the event dispatch thread to process
1987
* a SunDropTargetEvent. We need this to prevent deadlock when the client code
1988
* processing SunDropTargetEvent sets or gets the contents of the system
1989
* clipboard/selection. In this case the event dispatch thread waits for the
1990
* Toolkit thread to process PropertyNotify or SelectionNotify events.
1991
*/
1992
static Bool
1993
secondary_loop_event(Display* dpy, XEvent* event, XPointer xawt_root_window) {
1994
return (
1995
event->type == SelectionNotify ||
1996
event->type == SelectionClear ||
1997
event->type == PropertyNotify ||
1998
(event->type == ConfigureNotify
1999
&& event->xany.window == *(Window*) xawt_root_window)
2000
) ? True : False;
2001
}
2002
2003
JNIEXPORT jboolean JNICALL
2004
Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent(JNIEnv *env, jclass clazz,
2005
jlong display, jlong ptr) {
2006
uint32_t timeout = 1;
2007
2008
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
2009
exitSecondaryLoop = False;
2010
Window xawt_root_window = get_xawt_root_shell(env);
2011
2012
while (!exitSecondaryLoop) {
2013
if (XCheckIfEvent((Display*) jlong_to_ptr(display),
2014
(XEvent*) jlong_to_ptr(ptr), secondary_loop_event, (XPointer) &xawt_root_window)) {
2015
return JNI_TRUE;
2016
}
2017
timeout = (timeout < AWT_SECONDARY_LOOP_TIMEOUT) ? (timeout << 1) : AWT_SECONDARY_LOOP_TIMEOUT;
2018
AWT_WAIT(timeout);
2019
}
2020
return JNI_FALSE;
2021
}
2022
2023
JNIEXPORT void JNICALL
2024
Java_sun_awt_X11_XlibWrapper_ExitSecondaryLoop(JNIEnv *env, jclass clazz) {
2025
DASSERT(!exitSecondaryLoop);
2026
AWT_CHECK_HAVE_LOCK();
2027
exitSecondaryLoop = True;
2028
AWT_NOTIFY_ALL();
2029
}
2030
2031
JNIEXPORT jobjectArray JNICALL
2032
Java_sun_awt_X11_XlibWrapper_XTextPropertyToStringList(JNIEnv *env,
2033
jclass clazz,
2034
jbyteArray bytes,
2035
jlong encodingAtom) {
2036
XTextProperty tp;
2037
jbyte *value;
2038
2039
char** strings = (char **)NULL;
2040
int32_t nstrings = 0;
2041
jobjectArray ret = NULL;
2042
int32_t i;
2043
jsize len;
2044
jboolean isCopy = JNI_FALSE;
2045
static jclass stringClass = NULL;
2046
jclass stringClassLocal = NULL;
2047
2048
AWT_CHECK_HAVE_LOCK_RETURN(NULL);
2049
2050
if (JNU_IsNull(env, stringClass)) {
2051
stringClassLocal = (*env)->FindClass(env, "java/lang/String");
2052
2053
if ((*env)->ExceptionCheck(env)) {
2054
(*env)->ExceptionDescribe(env);
2055
(*env)->ExceptionClear(env);
2056
DASSERT(False);
2057
}
2058
2059
if (JNU_IsNull(env, stringClassLocal)) {
2060
return NULL;
2061
}
2062
2063
stringClass = (*env)->NewGlobalRef(env, stringClassLocal); /* never freed! */
2064
(*env)->DeleteLocalRef(env, stringClassLocal);
2065
2066
if (JNU_IsNull(env, stringClass)) {
2067
JNU_ThrowOutOfMemoryError(env, "");
2068
return NULL;
2069
}
2070
}
2071
2072
/*
2073
* If the length of the byte array is 0 just return a null
2074
*/
2075
len = (*env)->GetArrayLength(env, bytes);
2076
if (len == 0) {
2077
return (*env)->NewObjectArray(env, 0, stringClass, NULL);
2078
}
2079
2080
value = (*env)->GetByteArrayElements(env, bytes, &isCopy);
2081
if (JNU_IsNull(env, value)) {
2082
return NULL;
2083
}
2084
2085
tp.encoding = encodingAtom;
2086
tp.value = (unsigned char *)value;
2087
tp.nitems = len;
2088
tp.format = 8;
2089
2090
/*
2091
* Convert the byte stream into a list of X11 strings
2092
*/
2093
if (XTextPropertyToStringList(&tp, &strings, &nstrings) == 0) {
2094
(*env)->ReleaseByteArrayElements(env, bytes, value, JNI_ABORT);
2095
return NULL;
2096
}
2097
2098
(*env)->ReleaseByteArrayElements(env, bytes, value, JNI_ABORT);
2099
2100
if (nstrings == 0) {
2101
return (*env)->NewObjectArray(env, 0, stringClass, NULL);
2102
}
2103
2104
ret = (*env)->NewObjectArray(env, nstrings, stringClass, NULL);
2105
2106
if ((*env)->ExceptionCheck(env)) {
2107
(*env)->ExceptionDescribe(env);
2108
(*env)->ExceptionClear(env);
2109
goto wayout;
2110
}
2111
2112
if (JNU_IsNull(env, ret)) {
2113
goto wayout;
2114
}
2115
2116
for (i = 0; i < nstrings; i++) {
2117
jstring string = (*env)->NewStringUTF(env,
2118
(const char *)strings[i]);
2119
if ((*env)->ExceptionCheck(env)) {
2120
(*env)->ExceptionDescribe(env);
2121
(*env)->ExceptionClear(env);
2122
goto wayout;
2123
}
2124
2125
if (JNU_IsNull(env, string)) {
2126
goto wayout;
2127
}
2128
2129
(*env)->SetObjectArrayElement(env, ret, i, string);
2130
2131
if ((*env)->ExceptionCheck(env)) {
2132
(*env)->ExceptionDescribe(env);
2133
(*env)->ExceptionClear(env);
2134
goto wayout;
2135
}
2136
2137
(*env)->DeleteLocalRef(env, string);
2138
}
2139
2140
wayout:
2141
/*
2142
* Clean up and return
2143
*/
2144
XFreeStringList(strings);
2145
return ret;
2146
}
2147
2148
JNIEXPORT void JNICALL
2149
Java_sun_awt_X11_XlibWrapper_XPutBackEvent(JNIEnv *env,
2150
jclass clazz,
2151
jlong display,
2152
jlong event) {
2153
XPutBackEvent((Display*)jlong_to_ptr(display), (XEvent*) jlong_to_ptr(event));
2154
}
2155
2156
JNIEXPORT jlong JNICALL
2157
Java_sun_awt_X11_XlibWrapper_getAddress(JNIEnv *env,
2158
jclass clazz,
2159
jobject o) {
2160
return ptr_to_jlong(o);
2161
}
2162
2163
JNIEXPORT void JNICALL
2164
Java_sun_awt_X11_XlibWrapper_copyIntArray(JNIEnv *env,
2165
jclass clazz,
2166
jlong dest, jobject array, jint size) {
2167
jboolean isCopy = JNI_FALSE;
2168
jint * ints = (*env)->GetIntArrayElements(env, array, &isCopy);
2169
memcpy(jlong_to_ptr(dest), ints, size);
2170
if (isCopy) {
2171
(*env)->ReleaseIntArrayElements(env, array, ints, JNI_ABORT);
2172
}
2173
}
2174
2175
JNIEXPORT void JNICALL
2176
Java_sun_awt_X11_XlibWrapper_copyLongArray(JNIEnv *env,
2177
jclass clazz,
2178
jlong dest, jobject array, jint size) {
2179
jboolean isCopy = JNI_FALSE;
2180
jlong * longs = (*env)->GetLongArrayElements(env, array, &isCopy);
2181
memcpy(jlong_to_ptr(dest), longs, size);
2182
if (isCopy) {
2183
(*env)->ReleaseLongArrayElements(env, array, longs, JNI_ABORT);
2184
}
2185
}
2186
2187
JNIEXPORT jint JNICALL
2188
Java_sun_awt_X11_XlibWrapper_XSynchronize(JNIEnv *env, jclass clazz, jlong display, jboolean onoff)
2189
{
2190
return (jint) XSynchronize((Display*)jlong_to_ptr(display), (onoff == JNI_TRUE ? True : False));
2191
}
2192
2193
JNIEXPORT jboolean JNICALL
2194
Java_sun_awt_X11_XlibWrapper_XShapeQueryExtension
2195
(JNIEnv *env, jclass clazz, jlong display, jlong event_base_return, jlong error_base_return)
2196
{
2197
Bool status;
2198
2199
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
2200
2201
status = XShapeQueryExtension((Display *)jlong_to_ptr(display),
2202
(int *)jlong_to_ptr(event_base_return), (int *)jlong_to_ptr(error_base_return));
2203
return status ? JNI_TRUE : JNI_FALSE;
2204
}
2205
2206
/*
2207
* Class: XlibWrapper
2208
* Method: SetRectangularShape
2209
*/
2210
2211
JNIEXPORT void JNICALL
2212
Java_sun_awt_X11_XlibWrapper_SetRectangularShape
2213
(JNIEnv *env, jclass clazz, jlong display, jlong window,
2214
jint x1, jint y1, jint x2, jint y2,
2215
jobject region)
2216
{
2217
AWT_CHECK_HAVE_LOCK();
2218
2219
// If all the params are zeros, the shape must be simply reset.
2220
// Otherwise, the shape may be not rectangular.
2221
if (region || x1 || x2 || y1 || y2) {
2222
XRectangle rects[256];
2223
XRectangle *pRect = rects;
2224
2225
int numrects = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region,
2226
&pRect, 256);
2227
2228
XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2229
ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded);
2230
XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2231
ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded);
2232
2233
if (pRect != rects) {
2234
free(pRect);
2235
}
2236
} else {
2237
// Reset the shape to a rectangular form.
2238
XShapeCombineMask((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2239
ShapeClip, 0, 0, None, ShapeSet);
2240
XShapeCombineMask((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2241
ShapeBounding, 0, 0, None, ShapeSet);
2242
}
2243
}
2244
2245
/*
2246
* Class: XlibWrapper
2247
* Method: SetZOrder
2248
*/
2249
2250
JNIEXPORT void JNICALL
2251
Java_sun_awt_X11_XlibWrapper_SetZOrder
2252
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong above)
2253
{
2254
unsigned int value_mask = CWStackMode;
2255
2256
XWindowChanges wc;
2257
wc.sibling = (Window)jlong_to_ptr(above);
2258
2259
AWT_CHECK_HAVE_LOCK();
2260
2261
if (above == 0) {
2262
wc.stack_mode = Above;
2263
} else {
2264
wc.stack_mode = Below;
2265
value_mask |= CWSibling;
2266
}
2267
2268
XConfigureWindow((Display *)jlong_to_ptr(display),
2269
(Window)jlong_to_ptr(window),
2270
value_mask, &wc );
2271
}
2272
2273
/*
2274
* Class: XlibWrapper
2275
* Method: SetBitmapShape
2276
*/
2277
JNIEXPORT void JNICALL
2278
Java_sun_awt_X11_XlibWrapper_SetBitmapShape
2279
(JNIEnv *env, jclass clazz, jlong display, jlong window,
2280
jint width, jint height, jintArray bitmap)
2281
{
2282
jsize len;
2283
jint *values;
2284
jboolean isCopy = JNI_FALSE;
2285
size_t worstBufferSize = (size_t)((width / 2 + 1) * height);
2286
RECT_T * pRect;
2287
int numrects;
2288
2289
if (!IS_SAFE_SIZE_MUL(width / 2 + 1, height)) {
2290
return;
2291
}
2292
2293
AWT_CHECK_HAVE_LOCK();
2294
2295
len = (*env)->GetArrayLength(env, bitmap);
2296
if (len == 0 || len < width * height) {
2297
return;
2298
}
2299
2300
values = (*env)->GetIntArrayElements(env, bitmap, &isCopy);
2301
if (JNU_IsNull(env, values)) {
2302
return;
2303
}
2304
2305
pRect = (RECT_T *)SAFE_SIZE_ARRAY_ALLOC(malloc, worstBufferSize, sizeof(RECT_T));
2306
if (!pRect) {
2307
return;
2308
}
2309
2310
/* Note: the values[0] and values[1] are supposed to contain the width
2311
* and height (see XIconInfo.getIntData() for details). So, we do +2.
2312
*/
2313
numrects = BitmapToYXBandedRectangles(32, (int)width, (int)height,
2314
(unsigned char *)(values + 2), pRect);
2315
2316
XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2317
ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded);
2318
XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2319
ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded);
2320
2321
free(pRect);
2322
2323
(*env)->ReleaseIntArrayElements(env, bitmap, values, JNI_ABORT);
2324
}
2325
2326