aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Djärv2008-02-07 14:07:35 +0000
committerJan Djärv2008-02-07 14:07:35 +0000
commit81c02ebe5cd0dc322e25b482930e49b6510e8570 (patch)
tree6d124051cea56502a13747ac01dd097154d34595 /src
parent350c1745732e4b3ab88c69eafd48e1baeb173a08 (diff)
downloademacs-81c02ebe5cd0dc322e25b482930e49b6510e8570.tar.gz
emacs-81c02ebe5cd0dc322e25b482930e49b6510e8570.zip
(x_detect_focus_change): Handle embed client message.
(handle_one_xevent): Ditto. (handle_one_xevent): If embedded and we get a button press/release, request focus. (xembed_set_info, xembed_send_message): New functions. (x_make_frame_visible): Call xembed_set_info if embedded. (x_make_frame_invisible): Call xembed_set_info if embedded. (x_term_init): Initialize Xatom_XEMBED. (x_make_frame_visible): Check for FRAME_X_EMBEDDED_P also. (x_iconify_frame): Ditto.
Diffstat (limited to 'src')
-rw-r--r--src/xterm.c99
1 files changed, 94 insertions, 5 deletions
diff --git a/src/xterm.c b/src/xterm.c
index aea431ea3fa..cf806e49c38 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -3610,6 +3610,15 @@ x_detect_focus_change (dpyinfo, event, bufp)
3610 FOCUS_IMPLICIT : FOCUS_EXPLICIT), 3610 FOCUS_IMPLICIT : FOCUS_EXPLICIT),
3611 dpyinfo, frame, bufp); 3611 dpyinfo, frame, bufp);
3612 break; 3612 break;
3613
3614 case ClientMessage:
3615 if (event->xclient.message_type == dpyinfo->Xatom_XEMBED)
3616 {
3617 enum xembed_message msg = event->xclient.data.l[1];
3618 x_focus_changed ((msg == XEMBED_FOCUS_IN ? FocusIn : FocusOut),
3619 FOCUS_EXPLICIT, dpyinfo, frame, bufp);
3620 }
3621 break;
3613 } 3622 }
3614} 3623}
3615 3624
@@ -6201,6 +6210,18 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit)
6201 } 6210 }
6202#endif /* USE_TOOLKIT_SCROLL_BARS */ 6211#endif /* USE_TOOLKIT_SCROLL_BARS */
6203 6212
6213 /* XEmbed messages from the embedder (if any). */
6214 if (event.xclient.message_type
6215 == dpyinfo->Xatom_XEMBED)
6216 {
6217 enum xembed_message msg = event.xclient.data.l[1];
6218 if (msg == XEMBED_FOCUS_IN || msg == XEMBED_FOCUS_OUT)
6219 x_detect_focus_change (dpyinfo, &event, &inev.ie);
6220
6221 *finish = X_EVENT_GOTO_OUT;
6222 goto done;
6223 }
6224
6204 f = x_any_window_to_frame (dpyinfo, event.xclient.window); 6225 f = x_any_window_to_frame (dpyinfo, event.xclient.window);
6205 if (!f) 6226 if (!f)
6206 goto OTHER; 6227 goto OTHER;
@@ -7086,6 +7107,9 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit)
7086 else 7107 else
7087 construct_mouse_click (&inev.ie, &event.xbutton, f); 7108 construct_mouse_click (&inev.ie, &event.xbutton, f);
7088 } 7109 }
7110 if (FRAME_X_EMBEDDED_P (f))
7111 xembed_send_message (f, event.xbutton.time,
7112 XEMBED_REQUEST_FOCUS, 0, 0, 0);
7089 } 7113 }
7090 else 7114 else
7091 { 7115 {
@@ -9285,6 +9309,51 @@ XTframe_raise_lower (f, raise_flag)
9285 x_lower_frame (f); 9309 x_lower_frame (f);
9286} 9310}
9287 9311
9312/* XEmbed implementation. */
9313
9314void
9315xembed_set_info (f, flags)
9316 struct frame *f;
9317 enum xembed_info flags;
9318{
9319 Atom atom;
9320 unsigned long data[2];
9321
9322 atom = XInternAtom (FRAME_X_DISPLAY (f), "_XEMBED_INFO", False);
9323
9324 data[0] = XEMBED_VERSION;
9325 data[1] = flags;
9326
9327 XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), atom, atom,
9328 32, PropModeReplace, (unsigned char *) data, 2);
9329}
9330
9331void
9332xembed_send_message (f, time, message, detail, data1, data2)
9333 struct frame *f;
9334 Time time;
9335 enum xembed_message message;
9336 long detail;
9337 long data1;
9338 long data2;
9339{
9340 XEvent event;
9341
9342 event.xclient.type = ClientMessage;
9343 event.xclient.window = FRAME_X_OUTPUT (f)->parent_desc;
9344 event.xclient.message_type = FRAME_X_DISPLAY_INFO (f)->Xatom_XEMBED;
9345 event.xclient.format = 32;
9346 event.xclient.data.l[0] = time;
9347 event.xclient.data.l[1] = message;
9348 event.xclient.data.l[2] = detail;
9349 event.xclient.data.l[3] = data1;
9350 event.xclient.data.l[4] = data2;
9351
9352 XSendEvent (FRAME_X_DISPLAY (f), FRAME_X_OUTPUT (f)->parent_desc,
9353 False, NoEventMask, &event);
9354 XSync (FRAME_X_DISPLAY (f), False);
9355}
9356
9288/* Change of visibility. */ 9357/* Change of visibility. */
9289 9358
9290/* This tries to wait until the frame is really visible. 9359/* This tries to wait until the frame is really visible.
@@ -9317,6 +9386,7 @@ x_make_frame_visible (f)
9317 if we get to x_make_frame_visible a second time 9386 if we get to x_make_frame_visible a second time
9318 before the window gets really visible. */ 9387 before the window gets really visible. */
9319 if (! FRAME_ICONIFIED_P (f) 9388 if (! FRAME_ICONIFIED_P (f)
9389 && ! FRAME_X_EMBEDDED_P (f)
9320 && ! f->output_data.x->asked_for_visible) 9390 && ! f->output_data.x->asked_for_visible)
9321 x_set_offset (f, f->left_pos, f->top_pos, 0); 9391 x_set_offset (f, f->left_pos, f->top_pos, 0);
9322 9392
@@ -9325,14 +9395,22 @@ x_make_frame_visible (f)
9325 if (! EQ (Vx_no_window_manager, Qt)) 9395 if (! EQ (Vx_no_window_manager, Qt))
9326 x_wm_set_window_state (f, NormalState); 9396 x_wm_set_window_state (f, NormalState);
9327#ifdef USE_X_TOOLKIT 9397#ifdef USE_X_TOOLKIT
9328 /* This was XtPopup, but that did nothing for an iconified frame. */ 9398 if (FRAME_X_EMBEDDED_P (f))
9329 XtMapWidget (f->output_data.x->widget); 9399 xembed_set_info (f, XEMBED_MAPPED);
9400 else
9401 {
9402 /* This was XtPopup, but that did nothing for an iconified frame. */
9403 XtMapWidget (f->output_data.x->widget);
9404 }
9330#else /* not USE_X_TOOLKIT */ 9405#else /* not USE_X_TOOLKIT */
9331#ifdef USE_GTK 9406#ifdef USE_GTK
9332 gtk_widget_show_all (FRAME_GTK_OUTER_WIDGET (f)); 9407 gtk_widget_show_all (FRAME_GTK_OUTER_WIDGET (f));
9333 gtk_window_deiconify (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f))); 9408 gtk_window_deiconify (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)));
9334#else 9409#else
9335 XMapRaised (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f)); 9410 if (FRAME_X_EMBEDDED_P (f))
9411 xembed_set_info (f, XEMBED_MAPPED);
9412 else
9413 XMapRaised (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f));
9336#endif /* not USE_GTK */ 9414#endif /* not USE_GTK */
9337#endif /* not USE_X_TOOLKIT */ 9415#endif /* not USE_X_TOOLKIT */
9338#if 0 /* This seems to bring back scroll bars in the wrong places 9416#if 0 /* This seems to bring back scroll bars in the wrong places
@@ -9373,7 +9451,9 @@ x_make_frame_visible (f)
9373 because the window manager may choose the position 9451 because the window manager may choose the position
9374 and we don't want to override it. */ 9452 and we don't want to override it. */
9375 9453
9376 if (! FRAME_VISIBLE_P (f) && ! FRAME_ICONIFIED_P (f) 9454 if (! FRAME_VISIBLE_P (f)
9455 && ! FRAME_ICONIFIED_P (f)
9456 && ! FRAME_X_EMBEDDED_P (f)
9377 && f->win_gravity == NorthWestGravity 9457 && f->win_gravity == NorthWestGravity
9378 && previously_visible) 9458 && previously_visible)
9379 { 9459 {
@@ -9484,6 +9564,10 @@ x_make_frame_invisible (f)
9484 if (FRAME_GTK_OUTER_WIDGET (f)) 9564 if (FRAME_GTK_OUTER_WIDGET (f))
9485 gtk_widget_hide (FRAME_GTK_OUTER_WIDGET (f)); 9565 gtk_widget_hide (FRAME_GTK_OUTER_WIDGET (f));
9486 else 9566 else
9567#else
9568 if (FRAME_X_EMBEDDED_P (f))
9569 xembed_set_info (f, 0);
9570 else
9487#endif 9571#endif
9488 { 9572 {
9489 9573
@@ -9588,7 +9672,9 @@ x_iconify_frame (f)
9588 9672
9589 /* Make sure the X server knows where the window should be positioned, 9673 /* Make sure the X server knows where the window should be positioned,
9590 in case the user deiconifies with the window manager. */ 9674 in case the user deiconifies with the window manager. */
9591 if (! FRAME_VISIBLE_P (f) && !FRAME_ICONIFIED_P (f)) 9675 if (! FRAME_VISIBLE_P (f)
9676 && ! FRAME_ICONIFIED_P (f)
9677 && ! FRAME_X_EMBEDDED_P (f))
9592 x_set_offset (f, f->left_pos, f->top_pos, 0); 9678 x_set_offset (f, f->left_pos, f->top_pos, 0);
9593 9679
9594 /* Since we don't know which revision of X we're running, we'll use both 9680 /* Since we don't know which revision of X we're running, we'll use both
@@ -11399,6 +11485,9 @@ x_term_init (display_name, xrm_option, resource_name)
11399 dpyinfo->Xatom_Scrollbar = XInternAtom (dpyinfo->display, "SCROLLBAR", 11485 dpyinfo->Xatom_Scrollbar = XInternAtom (dpyinfo->display, "SCROLLBAR",
11400 False); 11486 False);
11401 11487
11488 dpyinfo->Xatom_XEMBED = XInternAtom (dpyinfo->display, "_XEMBED",
11489 False);
11490
11402 dpyinfo->cut_buffers_initialized = 0; 11491 dpyinfo->cut_buffers_initialized = 0;
11403 11492
11404 dpyinfo->x_dnd_atoms_size = 8; 11493 dpyinfo->x_dnd_atoms_size = 8;