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);
     }