0N/A/*
2362N/A * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage sun.awt.X11;
0N/A
0N/Aimport sun.misc.Unsafe;
0N/A
1696N/Aimport sun.util.logging.PlatformLogger;
1696N/A
0N/Aimport java.awt.AWTKeyStroke;
0N/Aimport java.awt.event.InputEvent;
0N/A
0N/A/**
0N/A * Common class for all XEmbed protocol participating classes.
0N/A * Contains constant definitions and helper routines.
0N/A */
0N/Apublic class XEmbedHelper {
1696N/A private static final PlatformLogger xembedLog = PlatformLogger.getLogger("sun.awt.X11.xembed");
0N/A final static Unsafe unsafe = Unsafe.getUnsafe();
0N/A
0N/A final static int XEMBED_VERSION = 0,
0N/A XEMBED_MAPPED = (1 << 0);
0N/A/* XEMBED messages */
0N/A final static int XEMBED_EMBEDDED_NOTIFY = 0;
0N/A final static int XEMBED_WINDOW_ACTIVATE = 1;
0N/A final static int XEMBED_WINDOW_DEACTIVATE = 2;
0N/A final static int XEMBED_REQUEST_FOCUS =3;
0N/A final static int XEMBED_FOCUS_IN = 4;
0N/A final static int XEMBED_FOCUS_OUT = 5;
0N/A final static int XEMBED_FOCUS_NEXT = 6;
0N/A final static int XEMBED_FOCUS_PREV = 7;
0N/A/* 8-9 were used for XEMBED_GRAB_KEY/XEMBED_UNGRAB_KEY */
0N/A final static int XEMBED_GRAB_KEY = 8;
0N/A final static int XEMBED_UNGRAB_KEY = 9;
0N/A final static int XEMBED_MODALITY_ON = 10;
0N/A final static int XEMBED_MODALITY_OFF = 11;
0N/A final static int XEMBED_REGISTER_ACCELERATOR = 12;
0N/A final static int XEMBED_UNREGISTER_ACCELERATOR= 13;
0N/A final static int XEMBED_ACTIVATE_ACCELERATOR = 14;
0N/A
0N/A final static int NON_STANDARD_XEMBED_GTK_GRAB_KEY = 108;
0N/A final static int NON_STANDARD_XEMBED_GTK_UNGRAB_KEY = 109;
0N/A
0N/A// A detail code is required for XEMBED_FOCUS_IN. The following values are valid:
0N/A/* Details for XEMBED_FOCUS_IN: */
0N/A final static int XEMBED_FOCUS_CURRENT = 0;
0N/A final static int XEMBED_FOCUS_FIRST = 1;
0N/A final static int XEMBED_FOCUS_LAST = 2;
0N/A
0N/A// Modifiers bits
0N/A final static int XEMBED_MODIFIER_SHIFT = (1 << 0);
0N/A final static int XEMBED_MODIFIER_CONTROL = (1 << 1);
0N/A final static int XEMBED_MODIFIER_ALT = (1 << 2);
0N/A final static int XEMBED_MODIFIER_SUPER = (1 << 3);
0N/A final static int XEMBED_MODIFIER_HYPER = (1 << 4);
0N/A
0N/A static XAtom XEmbedInfo;
0N/A static XAtom XEmbed;
0N/A
0N/A XEmbedHelper() {
0N/A if (XEmbed == null) {
0N/A XEmbed = XAtom.get("_XEMBED");
1696N/A if (xembedLog.isLoggable(PlatformLogger.FINER)) xembedLog.finer("Created atom " + XEmbed.toString());
0N/A }
0N/A if (XEmbedInfo == null) {
0N/A XEmbedInfo = XAtom.get("_XEMBED_INFO");
1696N/A if (xembedLog.isLoggable(PlatformLogger.FINER)) xembedLog.finer("Created atom " + XEmbedInfo.toString());
0N/A }
0N/A }
0N/A
0N/A void sendMessage(long window, int message) {
0N/A sendMessage(window, message, 0, 0, 0);
0N/A }
0N/A void sendMessage(long window, int message, long detail, long data1, long data2) {
0N/A XClientMessageEvent msg = new XClientMessageEvent();
216N/A msg.set_type((int)XConstants.ClientMessage);
0N/A msg.set_window(window);
0N/A msg.set_message_type(XEmbed.getAtom());
0N/A msg.set_format(32);
0N/A msg.set_data(0, XToolkit.getCurrentServerTime());
0N/A msg.set_data(1, message);
0N/A msg.set_data(2, detail);
0N/A msg.set_data(3, data1);
0N/A msg.set_data(4, data2);
0N/A XToolkit.awtLock();
0N/A try {
1696N/A if (xembedLog.isLoggable(PlatformLogger.FINE)) xembedLog.fine("Sending " + XEmbedMessageToString(msg));
216N/A XlibWrapper.XSendEvent(XToolkit.getDisplay(), window, false, XConstants.NoEventMask, msg.pData);
0N/A }
0N/A finally {
0N/A XToolkit.awtUnlock();
0N/A }
0N/A msg.dispose();
0N/A }
0N/A
0N/A static String msgidToString(int msg_id) {
0N/A switch (msg_id) {
0N/A case XEMBED_EMBEDDED_NOTIFY:
0N/A return "XEMBED_EMBEDDED_NOTIFY";
0N/A case XEMBED_WINDOW_ACTIVATE:
0N/A return "XEMBED_WINDOW_ACTIVATE";
0N/A case XEMBED_WINDOW_DEACTIVATE:
0N/A return "XEMBED_WINDOW_DEACTIVATE";
0N/A case XEMBED_FOCUS_IN:
0N/A return "XEMBED_FOCUS_IN";
0N/A case XEMBED_FOCUS_OUT:
0N/A return "XEMBED_FOCUS_OUT";
0N/A case XEMBED_REQUEST_FOCUS:
0N/A return "XEMBED_REQUEST_FOCUS";
0N/A case XEMBED_FOCUS_NEXT:
0N/A return "XEMBED_FOCUS_NEXT";
0N/A case XEMBED_FOCUS_PREV:
0N/A return "XEMBED_FOCUS_PREV";
0N/A case XEMBED_MODALITY_ON:
0N/A return "XEMBED_MODALITY_ON";
0N/A case XEMBED_MODALITY_OFF:
0N/A return "XEMBED_MODALITY_OFF";
0N/A case XEMBED_REGISTER_ACCELERATOR:
0N/A return "XEMBED_REGISTER_ACCELERATOR";
0N/A case XEMBED_UNREGISTER_ACCELERATOR:
0N/A return "XEMBED_UNREGISTER_ACCELERATOR";
0N/A case XEMBED_ACTIVATE_ACCELERATOR:
0N/A return "XEMBED_ACTIVATE_ACCELERATOR";
0N/A case XEMBED_GRAB_KEY:
0N/A return "XEMBED_GRAB_KEY";
0N/A case XEMBED_UNGRAB_KEY:
0N/A return "XEMBED_UNGRAB_KEY";
0N/A case NON_STANDARD_XEMBED_GTK_UNGRAB_KEY:
0N/A return "NON_STANDARD_XEMBED_GTK_UNGRAB_KEY";
0N/A case NON_STANDARD_XEMBED_GTK_GRAB_KEY:
0N/A return "NON_STANDARD_XEMBED_GTK_GRAB_KEY";
0N/A case XConstants.KeyPress | XEmbedServerTester.SYSTEM_EVENT_MASK:
0N/A return "KeyPress";
0N/A case XConstants.MapNotify | XEmbedServerTester.SYSTEM_EVENT_MASK:
0N/A return "MapNotify";
0N/A case XConstants.PropertyNotify | XEmbedServerTester.SYSTEM_EVENT_MASK:
0N/A return "PropertyNotify";
0N/A default:
0N/A return "unknown XEMBED id " + msg_id;
0N/A }
0N/A }
0N/A
0N/A static String focusIdToString(int focus_id) {
0N/A switch(focus_id) {
0N/A case XEMBED_FOCUS_CURRENT:
0N/A return "XEMBED_FOCUS_CURRENT";
0N/A case XEMBED_FOCUS_FIRST:
0N/A return "XEMBED_FOCUS_FIRST";
0N/A case XEMBED_FOCUS_LAST:
0N/A return "XEMBED_FOCUS_LAST";
0N/A default:
0N/A return "unknown focus id " + focus_id;
0N/A }
0N/A }
0N/A
0N/A static String XEmbedMessageToString(XClientMessageEvent msg) {
0N/A return ("XEmbed message to " + Long.toHexString(msg.get_window()) + ": " + msgidToString((int)msg.get_data(1)) +
0N/A ", detail: " + msg.get_data(2) +
0N/A ", data:[" + msg.get_data(3) + "," + msg.get_data(4) + "]");
0N/A
0N/A }
0N/A
0N/A
0N/A /**
0N/A * Converts XEMBED modifiers mask into AWT InputEvent mask
0N/A */
0N/A int getModifiers(int state) {
0N/A int mods = 0;
0N/A if ((state & XEMBED_MODIFIER_SHIFT) != 0) {
0N/A mods |= InputEvent.SHIFT_DOWN_MASK;
0N/A }
0N/A if ((state & XEMBED_MODIFIER_CONTROL) != 0) {
0N/A mods |= InputEvent.CTRL_DOWN_MASK;
0N/A }
0N/A if ((state & XEMBED_MODIFIER_ALT) != 0) {
0N/A mods |= InputEvent.ALT_DOWN_MASK;
0N/A }
0N/A // FIXME: What is super/hyper?
0N/A // FIXME: Experiments show that SUPER is ALT. So what is Alt then?
0N/A if ((state & XEMBED_MODIFIER_SUPER) != 0) {
0N/A mods |= InputEvent.ALT_DOWN_MASK;
0N/A }
0N/A// if ((state & XEMBED_MODIFIER_HYPER) != 0) {
0N/A// mods |= InputEvent.DOWN_MASK;
0N/A// }
0N/A return mods;
0N/A }
0N/A
0N/A // Shouldn't be called on Toolkit thread.
0N/A AWTKeyStroke getKeyStrokeForKeySym(long keysym, long state) {
0N/A XBaseWindow.checkSecurity();
0N/A
0N/A int keycode;
0N/A
0N/A XToolkit.awtLock();
0N/A try {
1975N/A XKeysym.Keysym2JavaKeycode kc = XKeysym.getJavaKeycode( keysym );
1975N/A if(kc == null) {
1975N/A keycode = java.awt.event.KeyEvent.VK_UNDEFINED;
1975N/A }else{
1975N/A keycode = kc.getJavaKeycode();
1975N/A }
0N/A } finally {
0N/A XToolkit.awtUnlock();
0N/A }
0N/A
0N/A int modifiers = getModifiers((int)state);
0N/A return AWTKeyStroke.getAWTKeyStroke(keycode, modifiers);
0N/A }
0N/A}