diff options
| author | Jan Djärv | 2008-02-07 14:07:35 +0000 |
|---|---|---|
| committer | Jan Djärv | 2008-02-07 14:07:35 +0000 |
| commit | 81c02ebe5cd0dc322e25b482930e49b6510e8570 (patch) | |
| tree | 6d124051cea56502a13747ac01dd097154d34595 | |
| parent | 350c1745732e4b3ab88c69eafd48e1baeb173a08 (diff) | |
| download | emacs-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.
| -rw-r--r-- | src/xterm.c | 99 |
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 | |||
| 9314 | void | ||
| 9315 | xembed_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 | |||
| 9331 | void | ||
| 9332 | xembed_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; |