src/solaris/native/sun/awt/awt_wm.c
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2001, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -370,29 +370,10 @@
* Utility functions ...
*
\*****************************************************************************/
/*
- * Instead of validating window id, we simply call XGetWindowProperty,
- * but temporary install this function as the error handler to ignore
- * BadWindow error.
- */
-int /* but ingored */
-xerror_ignore_bad_window(Display *dpy, XErrorEvent *err)
-{
- XERROR_SAVE(err);
- if (err->error_code == BadWindow) {
- DTRACE_PRINTLN("IGNORING BadWindow");
- return 0; /* ok to fail */
- }
- else {
- return (*xerror_saved_handler)(dpy, err);
- }
-}
-
-
-/*
* Convenience wrapper for XGetWindowProperty for XA_ATOM properties.
* E.g. WM_PROTOCOLS, _NET_WM_STATE, _OL_DECOR_DEL.
* It's up to caller to XFree returned value.
* Number of items returned is stored to nitems_ptr (if non-null).
*/
@@ -456,20 +437,23 @@
Atom actual_type;
int actual_format;
unsigned long nitems;
unsigned long bytes_after;
unsigned char *string;
+ JNIEnv* env;
+ jboolean errorOccurredFlag;
+ jobject errorHandlerRef;
/* BadWindow is ok and will be blocked by our special handler */
- WITH_XERROR_HANDLER(xerror_ignore_bad_window);
- {
+ env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ EXEC_WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$IgnoreBadWindowHandler",
+ "()Lsun/awt/X11/XErrorHandler$IgnoreBadWindowHandler;", JNI_FALSE,
+ errorHandlerRef, errorOccurredFlag,
status = XGetWindowProperty(awt_display, w,
property, 0, 0xFFFF, False, property_type,
&actual_type, &actual_format, &nitems, &bytes_after,
- &string);
- }
- RESTORE_XERROR_HANDLER;
+ &string));
if (status != Success || string == NULL) {
return NULL;
}
@@ -500,20 +484,23 @@
Atom actual_type;
int actual_format;
unsigned long nitems;
unsigned long bytes_after;
long *data; /* NB: 64 bit: Format 32 props are 'long' */
+ JNIEnv* env;
+ jboolean errorOccurredFlag;
+ jobject errorHandlerRef;
/* BadWindow is ok and will be blocked by our special handler */
- WITH_XERROR_HANDLER(xerror_ignore_bad_window);
- {
+ env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ EXEC_WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$IgnoreBadWindowHandler",
+ "()Lsun/awt/X11/XErrorHandler$IgnoreBadWindowHandler;", JNI_FALSE,
+ errorHandlerRef, errorOccurredFlag,
status = XGetWindowProperty(awt_display, w,
property, 0, 1, False, property_type,
&actual_type, &actual_format, &nitems, &bytes_after,
- (unsigned char **)&data);
- }
- RESTORE_XERROR_HANDLER;
+ (unsigned char **)&data));
if (status != Success || data == NULL) {
return 0;
}
@@ -710,24 +697,27 @@
Atom actual_type;
int actual_format;
unsigned long nitems;
unsigned long bytes_after;
unsigned char *data;
+ JNIEnv* env;
+ jboolean errorOccurredFlag;
+ jobject errorHandlerRef;
if (!awt_wm_atomInterned(&XA_ENLIGHTENMENT_COMMS, "ENLIGHTENMENT_COMMS")) {
return False;
}
/* BadWindow is ok and will be blocked by our special handler */
- WITH_XERROR_HANDLER(xerror_ignore_bad_window);
- {
+ env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ EXEC_WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$IgnoreBadWindowHandler",
+ "()Lsun/awt/X11/XErrorHandler$IgnoreBadWindowHandler;", JNI_FALSE,
+ errorHandlerRef, errorOccurredFlag,
status = XGetWindowProperty(awt_display, w,
XA_ENLIGHTENMENT_COMMS, 0, 14, False, XA_STRING,
&actual_type, &actual_format, &nitems, &bytes_after,
- &data);
- }
- RESTORE_XERROR_HANDLER;
+ &data));
if (status != Success || data == NULL) {
DTRACE_PRINTLN("no ENLIGHTENMENT_COMMS");
return None;
}
@@ -803,10 +793,13 @@
Atom actual_type;
int actual_format;
unsigned long nitems;
unsigned long bytes_after;
long *data; /* NB: 64 bit: Format 32 props are 'long' */
+ JNIEnv* env;
+ jboolean errorOccurredFlag;
+ jobject errorHandlerRef;
DTRACE_PRINT("WM: checking for CDE ... ");
if (!awt_wm_atomInterned(&_XA_DT_SM_WINDOW_INFO, "_DT_SM_WINDOW_INFO")) {
return False;
@@ -838,18 +831,18 @@
if (!awt_wm_atomInterned(&_XA_DT_SM_STATE_INFO, "_DT_SM_STATE_INFO")) {
return False;
}
/* BadWindow is ok and will be blocked by our special handler */
- WITH_XERROR_HANDLER(xerror_ignore_bad_window);
- {
+ env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ EXEC_WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$IgnoreBadWindowHandler",
+ "()Lsun/awt/X11/XErrorHandler$IgnoreBadWindowHandler;", JNI_FALSE,
+ errorHandlerRef, errorOccurredFlag,
status = XGetWindowProperty(awt_display, wmwin,
_XA_DT_SM_STATE_INFO, 0, 1, False, _XA_DT_SM_STATE_INFO,
&actual_type, &actual_format, &nitems, &bytes_after,
- (unsigned char **)&data);
- }
- RESTORE_XERROR_HANDLER;
+ (unsigned char **)&data));
if (status != Success || data == NULL) {
DTRACE_PRINTLN("no _DT_SM_STATE_INFO");
return False;
}
@@ -1009,28 +1002,10 @@
awt_wm_isMetacity(void)
{
return awt_wm_isNetWMName("Metacity");
}
-
-/*
- * Temporary error handler that ensures that we know if
- * XChangeProperty succeeded or not.
- */
-static int /* but ignored */
-xerror_verify_change_property(Display *dpy, XErrorEvent *err)
-{
- XERROR_SAVE(err);
- if (err->request_code == X_ChangeProperty) {
- return 0;
- }
- else {
- return (*xerror_saved_handler)(dpy, err);
- }
-}
-
-
/*
* Prepare IceWM check.
*
* The only way to detect IceWM, seems to be by setting
* _ICEWM_WINOPTHINT(_ICEWM_WINOPTHINT/8) on root and checking if it
@@ -1054,24 +1029,30 @@
static unsigned char opt[] = {
'A','W','T','_','I','C','E','W','M','_','T','E','S','T','\0',
'a','l','l','W','o','r','k','s','p','a','c','e','s','\0',
'0','\0'
};
+ JNIEnv* env;
+ jboolean errorOccurredFlag;
+ jobject errorHandlerRef;
+ jobject savedError;
+ unsigned char xerror_code = Success;
DTRACE_PRINT("WM: scheduling check for IceWM ... ");
if (!awt_wm_atomInterned(&_XA_ICEWM_WINOPTHINT, "_ICEWM_WINOPTHINT")) {
return False;
}
- WITH_XERROR_HANDLER(xerror_verify_change_property);
- {
+ env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ EXEC_WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$VerifyChangePropertyHandler",
+ "()Lsun/awt/X11/XErrorHandler$VerifyChangePropertyHandler;", JNI_FALSE,
+ errorHandlerRef, errorOccurredFlag,
XChangeProperty(awt_display, DefaultRootWindow(awt_display),
_XA_ICEWM_WINOPTHINT, _XA_ICEWM_WINOPTHINT, 8,
- PropModeReplace, opt, sizeof(opt));
- }
- RESTORE_XERROR_HANDLER;
+ PropModeReplace, opt, sizeof(opt)));
+ GET_XERROR_CODE(env, savedError, xerror_code);
if (xerror_code != Success) {
DTRACE_PRINTLN1("can't set _ICEWM_WINOPTHINT, error = %d",
xerror_code);
return False;
@@ -1157,35 +1138,10 @@
DTRACE_PRINTLN("yes");
XFree(list);
return True;
}
-
-
-static Boolean winmgr_running = False;
-
-/*
- * Temporary error handler that checks if selecting for
- * SubstructureRedirect failed.
- */
-static int /* but ignored */
-xerror_detect_wm(Display *dpy, XErrorEvent *err)
-{
- XERROR_SAVE(err);
- if (err->request_code == X_ChangeWindowAttributes
- && err->error_code == BadAccess)
- {
- DTRACE_PRINTLN("some WM is running (hmm, we'll see)");
- winmgr_running = True;
- return 0;
- }
- else {
- return (*xerror_saved_handler)(dpy, err);
- }
-}
-
-
/*
* Make an educated guess about running window manager.
* XXX: ideally, we should detect wm restart.
*/
enum wmgr_t
@@ -1198,10 +1154,13 @@
static enum wmgr_t awt_wmgr = UNDETERMINED_WM;
XSetWindowAttributes substruct;
const char *vendor_string;
Boolean doIsIceWM;
+ JNIEnv* env;
+ jboolean errorOccurredFlag = JNI_FALSE;
+ jobject errorHandlerRef;
if (awt_wmgr != UNDETERMINED_WM) {
return awt_wmgr;
}
@@ -1225,26 +1184,25 @@
*
* Try selecting for SubstructureRedirect, that only one client
* can select for, and if the request fails, than some other WM is
* already running.
*/
- winmgr_running = 0;
substruct.event_mask = SubstructureRedirectMask;
DTRACE_PRINT("WM: trying SubstructureRedirect ... ");
- WITH_XERROR_HANDLER(xerror_detect_wm);
- {
+ env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ EXEC_WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$XChangeWindowAttributesHandler",
+ "()Lsun/awt/X11/XErrorHandler$XChangeWindowAttributesHandler;", JNI_TRUE,
+ errorHandlerRef, errorOccurredFlag,
XChangeWindowAttributes(awt_display, DefaultRootWindow(awt_display),
- CWEventMask, &substruct);
- }
- RESTORE_XERROR_HANDLER;
+ CWEventMask, &substruct));
/*
* If no WM is running than our selection for SubstructureRedirect
* succeeded and needs to be undone (hey we are *not* a WM ;-).
*/
- if (!winmgr_running) {
+ if (errorOccurredFlag == JNI_FALSE) {
DTRACE_PRINTLN("no WM is running");
awt_wmgr = NO_WM;
substruct.event_mask = 0;
XChangeWindowAttributes(awt_display, DefaultRootWindow(awt_display),
CWEventMask, &substruct);
@@ -2727,10 +2685,15 @@
Window shell_win = XtWindow(wdata->winData.shell);
Atom *net_wm_state;
Boolean shaded;
unsigned long nitems;
unsigned long i;
+ JNIEnv* env;
+ jboolean errorOccurredFlag;
+ jobject errorHandlerRef;
+ jobject savedError;
+ unsigned char xerror_code = Success;
net_wm_state = awt_getAtomListProperty(shell_win,
_XA_NET_WM_STATE, &nitems);
if (nitems == 0) {
DTRACE_PRINTLN("WM: _NET_WM_STATE = { }");
@@ -2768,17 +2731,18 @@
#ifdef DEBUG
DTRACE_PRINT("WM: ");
awt_wm_dtraceStateNet(net_wm_state, nitems);
#endif
- WITH_XERROR_HANDLER(xerror_verify_change_property);
- {
+ env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ EXEC_WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$VerifyChangePropertyHandler",
+ "()Lsun/awt/X11/XErrorHandler$VerifyChangePropertyHandler;", JNI_FALSE,
+ errorHandlerRef, errorOccurredFlag,
XChangeProperty(dpy, shell_win,
_XA_NET_WM_STATE, XA_ATOM, 32, PropModeReplace,
- (unsigned char *)net_wm_state, nitems);
- }
- RESTORE_XERROR_HANDLER;
+ (unsigned char *)net_wm_state, nitems));
+ GET_XERROR_CODE(env, savedError, xerror_code);
if (xerror_code != Success) {
DTRACE_PRINTLN1("WM: XChangeProperty failed, error = %d",
xerror_code);
}