34 /**
35 * Helper class implementing XEmbed protocol handling routines(client side)
36 * Window which wants to participate in a protocol should create an instance,
37 * call install and forward all XClientMessageEvents to it.
38 */
39 public class XEmbedClientHelper extends XEmbedHelper implements XEventDispatcher {
40 private static final Logger xembedLog = Logger.getLogger("sun.awt.X11.xembed.XEmbedClientHelper");
41
42 private XEmbeddedFramePeer embedded;
43 private boolean active;
44 private long server;
45 private boolean applicationActive;
46
47 XEmbedClientHelper() {
48 super();
49 }
50
51 void install(XEmbeddedFramePeer embedded) {
52 this.embedded = embedded;
53
54 if (xembedLog.isLoggable(Level.FINE)) xembedLog.fine("Installing xembedder on " + embedded);
55 XToolkit.addEventDispatcher(embedded.getWindow(), this);
56 long[] info = new long[] { XEMBED_VERSION, XEMBED_MAPPED };
57 long data = Native.card32ToData(info);
58 try {
59 XEmbedInfo.setAtomData(embedded.getWindow(), data, 2);
60 } finally {
61 unsafe.freeMemory(data);
62 }
63 // XEmbeddedFrame is initially created with a null parent..
64 // Here it is reparented to the proper parent window.
65 long parentWindow = embedded.getParentWindowHandle();
66 if (parentWindow != 0) {
67 XToolkit.awtLock();
68 try {
69 XlibWrapper.XReparentWindow(XToolkit.getDisplay(),
70 embedded.getWindow(),
71 parentWindow,
72 0, 0);
73 } finally {
74 XToolkit.awtUnlock();
75 }
76 }
77 notifyReady();
78 }
79
80 void handleClientMessage(XEvent xev) {
81 XClientMessageEvent msg = xev.get_xclient();
82 if (xembedLog.isLoggable(Level.FINE)) xembedLog.fine(msg.toString());
83 if (msg.get_message_type() == XEmbed.getAtom()) {
84 if (xembedLog.isLoggable(Level.FINE)) xembedLog.fine("Embedded message: " + msgidToString((int)msg.get_data(1)));
85 switch ((int)msg.get_data(1)) {
86 case XEMBED_EMBEDDED_NOTIFY: // Notification about embedding protocol start
87 // NOTE: May be called two times because we send _SUN_XEMBED_START
88 active = true;
89 server = getEmbedder(embedded, msg);
90 // Check if window is reparented. If not - it was created with
91 // parent and so we should update it here.
92 if (!embedded.isReparented()) {
93 embedded.setReparented(true);
94 embedded.updateSizeHints();
95 }
96 embedded.notifyStarted();
97 break;
98 case XEMBED_WINDOW_ACTIVATE:
99 applicationActive = true;
100 break;
101 case XEMBED_WINDOW_DEACTIVATE:
102 if (applicationActive) {
103 applicationActive = false;
104 handleWindowFocusOut();
|
34 /**
35 * Helper class implementing XEmbed protocol handling routines(client side)
36 * Window which wants to participate in a protocol should create an instance,
37 * call install and forward all XClientMessageEvents to it.
38 */
39 public class XEmbedClientHelper extends XEmbedHelper implements XEventDispatcher {
40 private static final Logger xembedLog = Logger.getLogger("sun.awt.X11.xembed.XEmbedClientHelper");
41
42 private XEmbeddedFramePeer embedded;
43 private boolean active;
44 private long server;
45 private boolean applicationActive;
46
47 XEmbedClientHelper() {
48 super();
49 }
50
51 void install(XEmbeddedFramePeer embedded) {
52 this.embedded = embedded;
53
54 if (xembedLog.isLoggable(Level.FINE)) {
55 xembedLog.fine("Installing xembedder on " + embedded);
56 }
57 XToolkit.addEventDispatcher(embedded.getWindow(), this);
58 long[] info = new long[] { XEMBED_VERSION, XEMBED_MAPPED };
59 long data = Native.card32ToData(info);
60 try {
61 XEmbedInfo.setAtomData(embedded.getWindow(), data, 2);
62 } finally {
63 unsafe.freeMemory(data);
64 }
65 // XEmbeddedFrame is initially created with a null parent..
66 // Here it is reparented to the proper parent window.
67 long parentWindow = embedded.getParentWindowHandle();
68 if (parentWindow != 0) {
69 XToolkit.awtLock();
70 try {
71 XlibWrapper.XReparentWindow(XToolkit.getDisplay(),
72 embedded.getWindow(),
73 parentWindow,
74 0, 0);
75 } finally {
76 XToolkit.awtUnlock();
77 }
78 }
79 notifyReady();
80 }
81
82 void handleClientMessage(XEvent xev) {
83 XClientMessageEvent msg = xev.get_xclient();
84 if (xembedLog.isLoggable(Level.FINE)) {
85 xembedLog.fine(msg.toString());
86 }
87 if (msg.get_message_type() == XEmbed.getAtom()) {
88 if (xembedLog.isLoggable(Level.FINE)) {
89 xembedLog.fine("Embedded message: " + msgidToString((int)msg.get_data(1)));
90 }
91 switch ((int)msg.get_data(1)) {
92 case XEMBED_EMBEDDED_NOTIFY: // Notification about embedding protocol start
93 // NOTE: May be called two times because we send _SUN_XEMBED_START
94 active = true;
95 server = getEmbedder(embedded, msg);
96 // Check if window is reparented. If not - it was created with
97 // parent and so we should update it here.
98 if (!embedded.isReparented()) {
99 embedded.setReparented(true);
100 embedded.updateSizeHints();
101 }
102 embedded.notifyStarted();
103 break;
104 case XEMBED_WINDOW_ACTIVATE:
105 applicationActive = true;
106 break;
107 case XEMBED_WINDOW_DEACTIVATE:
108 if (applicationActive) {
109 applicationActive = false;
110 handleWindowFocusOut();
|