// readyToReopen( EmulatorSkin.this, isOnTop );
-
- if( SkinUtil.isLinuxPlatform() ) {
+ /* TODO: convert to generic type function */
+ String osArch = System.getProperty("os.arch"); //$NON-NLS-1$
+ if (osArch.equals ("i386") || osArch.equals ("i686")) //$NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$
+ { //32bit OS
+ logger.info("32bit architecture");
- // reference : http://wmctrl.sourcearchive.com/documentation/1.07/main_8c-source.html
-
-// if ( !OS.GDK_WINDOWING_X11() ) {
-// logger.warning( "There is no x11 system." );
-// return;
-// }
-//
-// int eventData0 = isOnTop ? 1 : 0; // 'add' or 'remove'
-//
-// int topHandle = 0;
-//
-// Method m = null;
-// try {
-// m = Shell.class.getDeclaredMethod( "topHandle", new Class<?>[] {} );
-// m.setAccessible( true );
-// topHandle = (Integer) m.invoke( shell, new Object[] {} );
-// } catch ( SecurityException ex ) {
-// logger.log( Level.SEVERE, ex.getMessage(), ex );
-// } catch ( NoSuchMethodException ex ) {
-// logger.log( Level.SEVERE, ex.getMessage(), ex );
-// } catch ( IllegalArgumentException ex ) {
-// logger.log( Level.SEVERE, ex.getMessage(), ex );
-// } catch ( IllegalAccessException ex ) {
-// logger.log( Level.SEVERE, ex.getMessage(), ex );
-// } catch ( InvocationTargetException ex ) {
-// logger.log( Level.SEVERE, ex.getMessage(), ex );
-// }
-//
-// int xWindow = OS.gdk_x11_drawable_get_xid( OS.GTK_WIDGET_WINDOW( topHandle ) );
-// int xDisplay = OS.GDK_DISPLAY();
-//
-// byte[] messageBuffer = Converter.wcsToMbcs( null, "_NET_WM_STATE", true );
-// int xMessageAtomType = OS.XInternAtom( xDisplay, messageBuffer, false );
-//
-// messageBuffer = Converter.wcsToMbcs( null, "_NET_WM_STATE_ABOVE", true );
-// int xMessageAtomAbove = OS.XInternAtom( xDisplay, messageBuffer, false );
-//
-// XClientMessageEvent event = new XClientMessageEvent();
-// event.type = OS.ClientMessage;
-// event.window = xWindow;
-// event.message_type = xMessageAtomType;
-// event.format = 32;
-// event.data[0] = eventData0;
-// event.data[1] = xMessageAtomAbove;
-//
-// int clientEvent = OS.g_malloc( XClientMessageEvent.sizeof );
-// OS.memmove( clientEvent, event, XClientMessageEvent.sizeof );
-// int rootWin = OS.XDefaultRootWindow( xDisplay );
-// // SubstructureRedirectMask:1L<<20 | SubstructureNotifyMask:1L<<19
-// OS.XSendEvent( xDisplay, rootWin, false, (int) ( 1L << 20 | 1L << 19 ), clientEvent );
-// OS.g_free( clientEvent );
-
- Boolean gdkWindowingX11 = (Boolean) invokeOSMethod( getOSMethod( "GDK_WINDOWING_X11" ) );
- if( null == gdkWindowingX11 ) {
- return;
- }
- if( !gdkWindowingX11 ) {
- logger.warning( "There is no x11 system." );
- return;
- }
-
- int eventData0 = isOnTop ? 1 : 0; // 'add' or 'remove'
-
- int topHandle = 0;
-
- Method m = null;
- try {
- m = Shell.class.getDeclaredMethod( "topHandle", new Class<?>[] {} );
- m.setAccessible( true );
- topHandle = (Integer) m.invoke( shell, new Object[] {} );
- } catch ( SecurityException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- } catch ( NoSuchMethodException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- } catch ( IllegalArgumentException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- } catch ( IllegalAccessException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- } catch ( InvocationTargetException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- }
-
- Integer gtkWidgetWindow = (Integer) invokeOSMethod(
- getOSMethod( "GTK_WIDGET_WINDOW", int.class ), topHandle );
- if( null == gtkWidgetWindow ) {
- return;
- }
-
- Integer xWindow = (Integer) invokeOSMethod( getOSMethod( "gdk_x11_drawable_get_xid", int.class ),
- gtkWidgetWindow );
- if( null == xWindow ) {
- return;
- }
-
- Integer xDisplay = (Integer) invokeOSMethod( getOSMethod( "GDK_DISPLAY" ) );
- if( null == xDisplay ) {
- return;
- }
-
- Method xInternAtom = getOSMethod( "XInternAtom", int.class, byte[].class, boolean.class );
-
- Class<?> converterClass = null;
- try {
- converterClass = Class.forName( "org.eclipse.swt.internal.Converter" );
- } catch ( ClassNotFoundException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- }
-
- Method wcsToMbcs = null;
- byte[] messageBufferState = null;
- byte[] messageBufferAbove = null;
-
- try {
- wcsToMbcs = converterClass.getMethod( "wcsToMbcs", String.class, String.class, boolean.class );
- } catch ( SecurityException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- } catch ( NoSuchMethodException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- }
-
- try {
- messageBufferState = (byte[]) wcsToMbcs.invoke( null, null, "_NET_WM_STATE", true );
- messageBufferAbove = (byte[]) wcsToMbcs.invoke( null, null, "_NET_WM_STATE_ABOVE", true );
- } catch ( IllegalArgumentException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- } catch ( IllegalAccessException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- } catch ( InvocationTargetException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- }
-
- Integer xMessageAtomType = (Integer) invokeOSMethod( xInternAtom, xDisplay, messageBufferState, false );
- if( null == xMessageAtomType ) {
- return;
- }
+ if ( SkinUtil.isLinuxPlatform() ) {
- Integer xMessageAtomAbove = (Integer) invokeOSMethod( xInternAtom, xDisplay, messageBufferAbove, false );
- if( null == xMessageAtomAbove ) {
- return;
- }
-
- Class<?> eventClazz = null;
- Object event = null;
- try {
- eventClazz = Class.forName( "org.eclipse.swt.internal.gtk.XClientMessageEvent" );
- event = eventClazz.newInstance();
- } catch ( InstantiationException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- } catch ( IllegalAccessException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- } catch ( ClassNotFoundException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- }
+ // reference : http://wmctrl.sourcearchive.com/documentation/1.07/main_8c-source.html
- if( null == eventClazz || null == event ) {
- return;
- }
-
- Integer malloc = null;
- try {
-
- Field type = eventClazz.getField( "type" );
-
- Field clientMessageField = getOSField( "ClientMessage" );
- if( null == clientMessageField ) {
+ /* if ( !OS.GDK_WINDOWING_X11() ) {
+ logger.warning( "There is no x11 system." );
return;
}
- type.set( event, clientMessageField.get( null ) );
-
- Field window = eventClazz.getField( "window" );
- window.set( event, xWindow );
- Field messageType = eventClazz.getField( "message_type" );
- messageType.set( event, xMessageAtomType );
- Field format = eventClazz.getField( "format" );
- format.set( event, 32 );
-
- Object data = Array.newInstance( int.class, 5 );
- Array.setInt( data, 0, eventData0 );
- Array.setInt( data, 1, xMessageAtomAbove );
- Array.setInt( data, 2, 0 );
- Array.setInt( data, 3, 0 );
- Array.setInt( data, 4, 0 );
-
- Field dataField = eventClazz.getField( "data" );
- dataField.set( event, data );
-
- Field sizeofField = eventClazz.getField( "sizeof" );
- Integer sizeof = (Integer) sizeofField.get( null );
-
- Method gMalloc = getOSMethod( "g_malloc", int.class );
- malloc = (Integer) invokeOSMethod( gMalloc, sizeof );
-
- Method memmove = getOSMethod( "memmove", int.class, eventClazz, int.class );
- invokeOSMethod( memmove, malloc, event, sizeof );
-
- } catch ( NoSuchFieldException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- } catch ( IllegalAccessException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- }
-
- Method xDefaultRootWindow = getOSMethod( "XDefaultRootWindow", int.class );
- Integer rootWin = (Integer) invokeOSMethod( xDefaultRootWindow, xDisplay );
-
- Method xSendEvent = getOSMethod( "XSendEvent", int.class, int.class, boolean.class, int.class,
- int.class );
- // SubstructureRedirectMask:1L<<20 | SubstructureNotifyMask:1L<<19
- invokeOSMethod( xSendEvent, xDisplay, rootWin, false, (int) ( 1L << 20 | 1L << 19 ), malloc );
- invokeOSMethod( getOSMethod( "g_free", int.class ), malloc ) ;
-
- }else if( SkinUtil.isWindowsPlatform() ) {
-
- Point location = shell.getLocation();
-
-// int hWndInsertAfter = 0;
-// if( isOnTop ) {
-// hWndInsertAfter = OS.HWND_TOPMOST;
-// }else {
-// hWndInsertAfter = OS.HWND_NOTOPMOST;
-// }
-//
-// OS.SetWindowPos( shell.handle, hWndInsertAfter, location.x, location.y, 0, 0, OS.SWP_NOSIZE );
-
- int hWndInsertAfter = 0;
- int noSize = 0;
- try {
- if ( isOnTop ) {
- Field topMost = getOSField( "HWND_TOPMOST" );
- if ( null == topMost ) {
+ int eventData0 = isOnTop ? 1 : 0; // 'add' or 'remove'
+
+ int topHandle = 0;
+
+ Method m = null;
+ try {
+ m = Shell.class.getDeclaredMethod( "topHandle", new Class<?>[] {} );
+ m.setAccessible( true );
+ topHandle = (Integer) m.invoke( shell, new Object[] {} );
+ } catch ( SecurityException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ } catch ( NoSuchMethodException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ } catch ( IllegalArgumentException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ } catch ( IllegalAccessException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ } catch ( InvocationTargetException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ }
+
+ int xWindow = OS.gdk_x11_drawable_get_xid( OS.GTK_WIDGET_WINDOW( topHandle ) );
+ int xDisplay = OS.GDK_DISPLAY();
+
+ byte[] messageBuffer = Converter.wcsToMbcs( null, "_NET_WM_STATE", true );
+ int xMessageAtomType = OS.XInternAtom( xDisplay, messageBuffer, false );
+
+ messageBuffer = Converter.wcsToMbcs( null, "_NET_WM_STATE_ABOVE", true );
+ int xMessageAtomAbove = OS.XInternAtom( xDisplay, messageBuffer, false );
+
+ XClientMessageEvent event = new XClientMessageEvent();
+ event.type = OS.ClientMessage;
+ event.window = xWindow;
+ event.message_type = xMessageAtomType;
+ event.format = 32;
+ event.data[0] = eventData0;
+ event.data[1] = xMessageAtomAbove;
+
+ int clientEvent = OS.g_malloc( XClientMessageEvent.sizeof );
+ OS.memmove( clientEvent, event, XClientMessageEvent.sizeof );
+ int rootWin = OS.XDefaultRootWindow( xDisplay );
+ // SubstructureRedirectMask:1L<<20 | SubstructureNotifyMask:1L<<19
+ OS.XSendEvent( xDisplay, rootWin, false, (int) ( 1L << 20 | 1L << 19 ), clientEvent );
+ OS.g_free( clientEvent ); */
+
+
+ Boolean gdkWindowingX11 = (Boolean) invokeOSMethod( getOSMethod( "GDK_WINDOWING_X11" ) );
+ if( null == gdkWindowingX11 ) {
+ return;
+ }
+ if( !gdkWindowingX11 ) {
+ logger.warning( "There is no x11 system." );
+ return;
+ }
+
+ int eventData0 = isOnTop ? 1 : 0; // 'add' or 'remove'
+ int topHandle = 0;
+
+ Method m = null;
+ try {
+ m = Shell.class.getDeclaredMethod( "topHandle", new Class<?>[] {} );
+ m.setAccessible( true );
+ topHandle = (Integer) m.invoke( shell, new Object[] {} );
+ } catch ( SecurityException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( NoSuchMethodException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( IllegalArgumentException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( IllegalAccessException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( InvocationTargetException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ }
+
+ Integer gtkWidgetWindow = (Integer) invokeOSMethod(
+ getOSMethod( "GTK_WIDGET_WINDOW", int.class ), topHandle );
+ if( null == gtkWidgetWindow ) {
+ return;
+ }
+
+ Integer xWindow = (Integer) invokeOSMethod( getOSMethod( "gdk_x11_drawable_get_xid", int.class ),
+ gtkWidgetWindow );
+ if( null == xWindow ) {
+ return;
+ }
+
+ Integer xDisplay = (Integer) invokeOSMethod( getOSMethod( "GDK_DISPLAY" ) );
+ if( null == xDisplay ) {
+ return;
+ }
+
+ Method xInternAtom = getOSMethod( "XInternAtom", int.class, byte[].class, boolean.class );
+
+ Class<?> converterClass = null;
+ try {
+ converterClass = Class.forName( "org.eclipse.swt.internal.Converter" );
+ } catch ( ClassNotFoundException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ }
+
+ Method wcsToMbcs = null;
+ byte[] messageBufferState = null;
+ byte[] messageBufferAbove = null;
+
+ try {
+ wcsToMbcs = converterClass.getMethod( "wcsToMbcs", String.class, String.class, boolean.class );
+ } catch ( SecurityException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( NoSuchMethodException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ }
+
+ try {
+ messageBufferState = (byte[]) wcsToMbcs.invoke( null, null, "_NET_WM_STATE", true );
+ messageBufferAbove = (byte[]) wcsToMbcs.invoke( null, null, "_NET_WM_STATE_ABOVE", true );
+ } catch ( IllegalArgumentException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( IllegalAccessException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( InvocationTargetException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ }
+
+ Integer xMessageAtomType = (Integer) invokeOSMethod( xInternAtom, xDisplay, messageBufferState, false );
+ if( null == xMessageAtomType ) {
+ return;
+ }
+
+ Integer xMessageAtomAbove = (Integer) invokeOSMethod( xInternAtom, xDisplay, messageBufferAbove, false );
+ if( null == xMessageAtomAbove ) {
+ return;
+ }
+
+ Class<?> eventClazz = null;
+ Object event = null;
+ try {
+ eventClazz = Class.forName( "org.eclipse.swt.internal.gtk.XClientMessageEvent" );
+ event = eventClazz.newInstance();
+ } catch ( InstantiationException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ } catch ( IllegalAccessException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ } catch ( ClassNotFoundException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ }
+
+ if( null == eventClazz || null == event ) {
+ return;
+ }
+
+ Integer malloc = null;
+ try {
+
+ Field type = eventClazz.getField( "type" );
+
+ Field clientMessageField = getOSField( "ClientMessage" );
+ if( null == clientMessageField ) {
return;
}
- hWndInsertAfter = topMost.getInt( null );
+ type.set( event, clientMessageField.get( null ) );
+
+ Field window = eventClazz.getField( "window" );
+ window.set( event, xWindow );
+ Field messageType = eventClazz.getField( "message_type" );
+ messageType.set( event, xMessageAtomType );
+ Field format = eventClazz.getField( "format" );
+ format.set( event, 32 );
+
+ Object data = Array.newInstance( int.class, 5 );
+ Array.setInt( data, 0, eventData0 );
+ Array.setInt( data, 1, xMessageAtomAbove );
+ Array.setInt( data, 2, 0 );
+ Array.setInt( data, 3, 0 );
+ Array.setInt( data, 4, 0 );
+
+ Field dataField = eventClazz.getField( "data" );
+ dataField.set( event, data );
+
+ Field sizeofField = eventClazz.getField( "sizeof" );
+ Integer sizeof = (Integer) sizeofField.get( null );
+
+ Method gMalloc = getOSMethod( "g_malloc", int.class );
+ malloc = (Integer) invokeOSMethod( gMalloc, sizeof );
+
+ Method memmove = getOSMethod( "memmove", int.class, eventClazz, int.class );
+ invokeOSMethod( memmove, malloc, event, sizeof );
+
+ } catch ( NoSuchFieldException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( IllegalAccessException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ }
+
+ Method xDefaultRootWindow = getOSMethod( "XDefaultRootWindow", int.class );
+ Integer rootWin = (Integer) invokeOSMethod( xDefaultRootWindow, xDisplay );
+
+ Method xSendEvent = getOSMethod( "XSendEvent", int.class, int.class, boolean.class, int.class,
+ int.class );
+ // SubstructureRedirectMask:1L<<20 | SubstructureNotifyMask:1L<<19
+ invokeOSMethod( xSendEvent, xDisplay, rootWin, false, (int) ( 1L << 20 | 1L << 19 ), malloc );
+ invokeOSMethod( getOSMethod( "g_free", int.class ), malloc ) ;
+
+ } else if( SkinUtil.isWindowsPlatform() ) {
+
+ Point location = shell.getLocation();
+
+ /* int hWndInsertAfter = 0;
+ if( isOnTop ) {
+ hWndInsertAfter = OS.HWND_TOPMOST;
} else {
- Field noTopMost = getOSField( "HWND_NOTOPMOST" );
- if ( null == noTopMost ) {
+ hWndInsertAfter = OS.HWND_NOTOPMOST;
+ }
+
+ OS.SetWindowPos( shell.handle, hWndInsertAfter, location.x, location.y, 0, 0, OS.SWP_NOSIZE ); */
+
+ int hWndInsertAfter = 0;
+ int noSize = 0;
+
+ try {
+ if ( isOnTop ) {
+ Field topMost = getOSField( "HWND_TOPMOST" );
+ if ( null == topMost ) {
+ return;
+ }
+ hWndInsertAfter = topMost.getInt( null );
+ } else {
+ Field noTopMost = getOSField( "HWND_NOTOPMOST" );
+ if ( null == noTopMost ) {
+ return;
+ }
+ hWndInsertAfter = noTopMost.getInt( null );
+ }
+
+ Field noSizeField = getOSField( "SWP_NOSIZE" );
+ if ( null == noSizeField ) {
return;
}
- hWndInsertAfter = noTopMost.getInt( null );
- }
+ noSize = noSizeField.getInt( null );
- Field noSizeField = getOSField( "SWP_NOSIZE" );
- if ( null == noSizeField ) {
+ } catch ( IllegalArgumentException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( IllegalAccessException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
return;
}
- noSize = noSizeField.getInt( null );
-
- } catch ( IllegalArgumentException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- } catch ( IllegalAccessException ex ) {
- logger.log( Level.SEVERE, ex.getMessage(), ex );
- return;
- }
- Method m = getOSMethod( "SetWindowPos", int.class, int.class, int.class, int.class, int.class,
- int.class, int.class );
+ Method m = getOSMethod( "SetWindowPos", int.class, int.class, int.class, int.class, int.class,
+ int.class, int.class );
- invokeOSMethod( m, shell.handle, hWndInsertAfter, location.x, location.y, 0, 0, noSize );
+ invokeOSMethod( m, shell.handle, hWndInsertAfter, location.x, location.y, 0, 0, noSize );
+ } else if( SkinUtil.isMacPlatform() ) {
+ //TODO:
+ } //SkinUtil.isMacPlatform()
}
-
+ else //64bit OS
+ {
+ logger.info("64bit architecture");
+
+ if ( SkinUtil.isLinuxPlatform() ) {
+ Boolean gdkWindowingX11 = (Boolean) invokeOSMethod( getOSMethod( "GDK_WINDOWING_X11" ) );
+ if (null == gdkWindowingX11) {
+ return;
+ }
+ if (!gdkWindowingX11) {
+ logger.warning( "There is no x11 system." );
+ return;
+ }
+
+ int eventData0 = isOnTop ? 1 : 0; // 'add' or 'remove'
+ long topHandle = 0;
+
+ Method m = null;
+ try {
+ m = Shell.class.getDeclaredMethod( "topHandle", new Class<?>[] {} );
+ m.setAccessible( true );
+ topHandle = (Long) m.invoke( shell, new Object[] {} );
+ } catch ( SecurityException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( NoSuchMethodException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( IllegalArgumentException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( IllegalAccessException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( InvocationTargetException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ }
+
+ Long gtkWidgetWindow = (Long) invokeOSMethod(
+ getOSMethod( "GTK_WIDGET_WINDOW", long.class ), topHandle );
+ if( null == gtkWidgetWindow ) {
+ return;
+ }
+
+ Long xWindow = (Long) invokeOSMethod( getOSMethod( "gdk_x11_drawable_get_xid", long.class ),
+ gtkWidgetWindow );
+ if( null == xWindow ) {
+ return;
+ }
+
+ Long xDisplay = (Long) invokeOSMethod( getOSMethod( "GDK_DISPLAY" ) );
+ if( null == xDisplay ) {
+ return;
+ }
+
+ Method xInternAtom = getOSMethod( "XInternAtom", long.class, byte[].class, boolean.class );
+
+ Class<?> converterClass = null;
+ try {
+ converterClass = Class.forName( "org.eclipse.swt.internal.Converter" );
+ } catch ( ClassNotFoundException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ }
+
+ Method wcsToMbcs = null;
+ byte[] messageBufferState = null;
+ byte[] messageBufferAbove = null;
+
+ try {
+ wcsToMbcs = converterClass.getMethod( "wcsToMbcs", String.class, String.class, boolean.class );
+ } catch ( SecurityException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( NoSuchMethodException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ }
+
+ try {
+ messageBufferState = (byte[]) wcsToMbcs.invoke( null, null, "_NET_WM_STATE", true );
+ messageBufferAbove = (byte[]) wcsToMbcs.invoke( null, null, "_NET_WM_STATE_ABOVE", true );
+ } catch ( IllegalArgumentException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( IllegalAccessException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( InvocationTargetException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ }
+
+ Long xMessageAtomType = (Long) invokeOSMethod( xInternAtom, xDisplay, messageBufferState, false );
+ if( null == xMessageAtomType ) {
+ return;
+ }
+
+ Long xMessageAtomAbove = (Long) invokeOSMethod( xInternAtom, xDisplay, messageBufferAbove, false );
+ if( null == xMessageAtomAbove ) {
+ return;
+ }
+
+ Class<?> eventClazz = null;
+ Object event = null;
+ try {
+ eventClazz = Class.forName( "org.eclipse.swt.internal.gtk.XClientMessageEvent" );
+ event = eventClazz.newInstance();
+ } catch ( InstantiationException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ } catch ( IllegalAccessException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ } catch ( ClassNotFoundException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ }
+
+ if( null == eventClazz || null == event ) {
+ return;
+ }
+
+ Long malloc = null;
+ try {
+
+ Field type = eventClazz.getField( "type" );
+
+ Field clientMessageField = getOSField( "ClientMessage" );
+ if( null == clientMessageField ) {
+ return;
+ }
+ type.set( event, clientMessageField.get( null ) );
+
+ Field window = eventClazz.getField( "window" );
+ window.set( event, xWindow );
+ Field messageType = eventClazz.getField( "message_type" );
+ messageType.set( event, xMessageAtomType );
+ Field format = eventClazz.getField( "format" );
+ format.set( event, 32 );
+
+ Object data = Array.newInstance( long.class, 5 );
+ Array.setLong( data, 0, eventData0 );
+ Array.setLong( data, 1, xMessageAtomAbove );
+ Array.setLong( data, 2, 0 );
+ Array.setLong( data, 3, 0 );
+ Array.setLong( data, 4, 0 );
+
+ Field dataField = eventClazz.getField( "data" );
+ dataField.set( event, data );
+
+ Field sizeofField = eventClazz.getField( "sizeof" );
+ Integer sizeof = (Integer) sizeofField.get( null );
+
+ Method gMalloc = getOSMethod( "g_malloc", long.class );
+ malloc = (Long) invokeOSMethod( gMalloc, sizeof.longValue() );
+
+ Method memmove = getOSMethod( "memmove", long.class, eventClazz, long.class );
+ invokeOSMethod( memmove, malloc, event, sizeof.longValue() );
+
+ } catch ( NoSuchFieldException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ } catch ( IllegalAccessException ex ) {
+ logger.log( Level.SEVERE, ex.getMessage(), ex );
+ return;
+ }
+
+ Method xDefaultRootWindow = getOSMethod( "XDefaultRootWindow", long.class );
+ Long rootWin = (Long) invokeOSMethod( xDefaultRootWindow, xDisplay );
+
+ Method xSendEvent = getOSMethod( "XSendEvent", long.class, long.class, boolean.class, long.class,
+ long.class );
+ // SubstructureRedirectMask:1L<<20 | SubstructureNotifyMask:1L<<19
+ invokeOSMethod( xSendEvent, xDisplay, rootWin, false, (long) ( 1L << 20 | 1L << 19 ), malloc );
+ invokeOSMethod( getOSMethod( "g_free", long.class ), malloc );
+ } else if (SkinUtil.isWindowsPlatform()) {
+ //TODO:
+ } else if( SkinUtil.isMacPlatform() ) {
+ //TODO:
+ }
+
+ } //end osArch.equals
}
} );