diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 31 | ||||
| -rw-r--r-- | src/lisp.h | 1 | ||||
| -rw-r--r-- | src/xselect.c | 17 | ||||
| -rw-r--r-- | src/xsettings.c | 8 | ||||
| -rw-r--r-- | src/xsmfns.c | 4 | ||||
| -rw-r--r-- | src/xterm.c | 279 | ||||
| -rw-r--r-- | src/xterm.h | 18 |
7 files changed, 204 insertions, 154 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 05b8ef46598..13f90d12790 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,5 +1,36 @@ | |||
| 1 | 2010-11-11 Julien Danjou <julien@danjou.info> | 1 | 2010-11-11 Julien Danjou <julien@danjou.info> |
| 2 | 2 | ||
| 3 | * xsettings.c (init_xsettings): Use already fetch atoms. | ||
| 4 | |||
| 5 | * xsmfns.c (create_client_leader_window): Use SM_CLIENT_ID atom | ||
| 6 | from dpyinfo. | ||
| 7 | |||
| 8 | * xselect.c (Fx_send_client_event): Split and create | ||
| 9 | x_send_client_event. | ||
| 10 | |||
| 11 | * lisp.h: Do not EXFUN Fx_send_client_event. | ||
| 12 | |||
| 13 | * xterm.c (x_set_frame_alpha): Use _NET_WM_WINDOW_OPACITY atom | ||
| 14 | from dpyinfo. | ||
| 15 | (wm_supports): Use atoms from dpyinfo. | ||
| 16 | (do_ewmh_fullscreen): Use atoms from dpyinfo. | ||
| 17 | (x_ewmh_activate_frame): Use atoms from dpyinfo. | ||
| 18 | (xembed_set_info): Use atoms from dpyinfo. | ||
| 19 | (x_term_init): Fetch _XEMBED_INFO, _NET_SUPPORTED, | ||
| 20 | _NET_SUPPORTING_WM_CHECK, _NET_WM_WINDOW_OPACITY and | ||
| 21 | _NET_ACTIVE_WINDOW, XSETTINGS atoms. | ||
| 22 | Get all atoms in one round-trip. | ||
| 23 | (set_wm_state): Use x_send_client_event rather than | ||
| 24 | Fx_send_client_event, using Atom directly. | ||
| 25 | (x_ewmh_activate_frame): Ditto. | ||
| 26 | (x_set_sticky): Pass atoms to set_wm_state. | ||
| 27 | (do_ewmh_fullscreen): Ditto. | ||
| 28 | |||
| 29 | |||
| 30 | * xterm.h (x_display_info): Add Xatom_net_supported, | ||
| 31 | Xatom_net_supporting_wm_check, Xatom_net_active_window, | ||
| 32 | Xatom_net_wm_window_opacity, Xatom_XEMBED_INFO, SM_CLIENT_ID. | ||
| 33 | |||
| 3 | * xfns.c (Fx_show_tip): Fix typo in docstring. | 34 | * xfns.c (Fx_show_tip): Fix typo in docstring. |
| 4 | 35 | ||
| 5 | 2010-11-11 Stefan Monnier <monnier@iro.umontreal.ca> | 36 | 2010-11-11 Stefan Monnier <monnier@iro.umontreal.ca> |
diff --git a/src/lisp.h b/src/lisp.h index 4adf9ef9c69..6c00aa28c46 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -3600,7 +3600,6 @@ extern void syms_of_xfns (void); | |||
| 3600 | extern void syms_of_xsmfns (void); | 3600 | extern void syms_of_xsmfns (void); |
| 3601 | 3601 | ||
| 3602 | /* Defined in xselect.c */ | 3602 | /* Defined in xselect.c */ |
| 3603 | EXFUN (Fx_send_client_event, 6); | ||
| 3604 | extern void syms_of_xselect (void); | 3603 | extern void syms_of_xselect (void); |
| 3605 | 3604 | ||
| 3606 | /* Defined in xterm.c */ | 3605 | /* Defined in xterm.c */ |
diff --git a/src/xselect.c b/src/xselect.c index 7479f245a77..b566b90898f 100644 --- a/src/xselect.c +++ b/src/xselect.c | |||
| @@ -2527,6 +2527,18 @@ are ignored. */) | |||
| 2527 | (Lisp_Object display, Lisp_Object dest, Lisp_Object from, Lisp_Object message_type, Lisp_Object format, Lisp_Object values) | 2527 | (Lisp_Object display, Lisp_Object dest, Lisp_Object from, Lisp_Object message_type, Lisp_Object format, Lisp_Object values) |
| 2528 | { | 2528 | { |
| 2529 | struct x_display_info *dpyinfo = check_x_display_info (display); | 2529 | struct x_display_info *dpyinfo = check_x_display_info (display); |
| 2530 | |||
| 2531 | x_send_client_event(display, dest, from, | ||
| 2532 | XInternAtom (dpyinfo->display, SDATA (message_type), False), | ||
| 2533 | format, values); | ||
| 2534 | |||
| 2535 | return Qnil; | ||
| 2536 | } | ||
| 2537 | |||
| 2538 | void | ||
| 2539 | x_send_client_event (Lisp_Object display, Lisp_Object dest, Lisp_Object from, Atom message_type, Lisp_Object format, Lisp_Object values) | ||
| 2540 | { | ||
| 2541 | struct x_display_info *dpyinfo = check_x_display_info (display); | ||
| 2530 | Window wdest; | 2542 | Window wdest; |
| 2531 | XEvent event; | 2543 | XEvent event; |
| 2532 | Lisp_Object cons; | 2544 | Lisp_Object cons; |
| @@ -2584,8 +2596,7 @@ are ignored. */) | |||
| 2584 | 2596 | ||
| 2585 | BLOCK_INPUT; | 2597 | BLOCK_INPUT; |
| 2586 | 2598 | ||
| 2587 | event.xclient.message_type | 2599 | event.xclient.message_type = message_type; |
| 2588 | = XInternAtom (dpyinfo->display, SDATA (message_type), False); | ||
| 2589 | event.xclient.display = dpyinfo->display; | 2600 | event.xclient.display = dpyinfo->display; |
| 2590 | 2601 | ||
| 2591 | /* Some clients (metacity for example) expects sending window to be here | 2602 | /* Some clients (metacity for example) expects sending window to be here |
| @@ -2610,8 +2621,6 @@ are ignored. */) | |||
| 2610 | } | 2621 | } |
| 2611 | x_uncatch_errors (); | 2622 | x_uncatch_errors (); |
| 2612 | UNBLOCK_INPUT; | 2623 | UNBLOCK_INPUT; |
| 2613 | |||
| 2614 | return Qnil; | ||
| 2615 | } | 2624 | } |
| 2616 | 2625 | ||
| 2617 | 2626 | ||
diff --git a/src/xsettings.c b/src/xsettings.c index 0d9c9cadb27..b3f3cb61541 100644 --- a/src/xsettings.c +++ b/src/xsettings.c | |||
| @@ -656,18 +656,10 @@ init_gconf (void) | |||
| 656 | static void | 656 | static void |
| 657 | init_xsettings (struct x_display_info *dpyinfo) | 657 | init_xsettings (struct x_display_info *dpyinfo) |
| 658 | { | 658 | { |
| 659 | char sel[64]; | ||
| 660 | Display *dpy = dpyinfo->display; | 659 | Display *dpy = dpyinfo->display; |
| 661 | 660 | ||
| 662 | BLOCK_INPUT; | 661 | BLOCK_INPUT; |
| 663 | 662 | ||
| 664 | sprintf (sel, "_XSETTINGS_S%d", XScreenNumberOfScreen (dpyinfo->screen)); | ||
| 665 | dpyinfo->Xatom_xsettings_sel = XInternAtom (dpy, sel, False); | ||
| 666 | dpyinfo->Xatom_xsettings_prop = XInternAtom (dpy, | ||
| 667 | "_XSETTINGS_SETTINGS", | ||
| 668 | False); | ||
| 669 | dpyinfo->Xatom_xsettings_mgr = XInternAtom (dpy, "MANAGER", False); | ||
| 670 | |||
| 671 | /* Select events so we can detect client messages sent when selection | 663 | /* Select events so we can detect client messages sent when selection |
| 672 | owner changes. */ | 664 | owner changes. */ |
| 673 | XSelectInput (dpy, dpyinfo->root_window, StructureNotifyMask); | 665 | XSelectInput (dpy, dpyinfo->root_window, StructureNotifyMask); |
diff --git a/src/xsmfns.c b/src/xsmfns.c index 79dccfa55e1..7b82fd4e61e 100644 --- a/src/xsmfns.c +++ b/src/xsmfns.c | |||
| @@ -410,8 +410,8 @@ create_client_leader_window (struct x_display_info *dpyinfo, char *client_id) | |||
| 410 | XSetClassHint (dpyinfo->display, w, &class_hints); | 410 | XSetClassHint (dpyinfo->display, w, &class_hints); |
| 411 | XStoreName (dpyinfo->display, w, class_hints.res_name); | 411 | XStoreName (dpyinfo->display, w, class_hints.res_name); |
| 412 | 412 | ||
| 413 | sm_id = XInternAtom (dpyinfo->display, "SM_CLIENT_ID", False); | 413 | XChangeProperty (dpyinfo->display, w, dpyinfo->Xatom_SM_CLIENT_ID, |
| 414 | XChangeProperty (dpyinfo->display, w, sm_id, XA_STRING, 8, PropModeReplace, | 414 | XA_STRING, 8, PropModeReplace, |
| 415 | (unsigned char *)client_id, strlen (client_id)); | 415 | (unsigned char *)client_id, strlen (client_id)); |
| 416 | 416 | ||
| 417 | dpyinfo->client_leader_window = w; | 417 | dpyinfo->client_leader_window = w; |
diff --git a/src/xterm.c b/src/xterm.c index 4c0493891e3..e58d072e59f 100644 --- a/src/xterm.c +++ b/src/xterm.c | |||
| @@ -442,7 +442,6 @@ x_display_info_for_display (Display *dpy) | |||
| 442 | } | 442 | } |
| 443 | 443 | ||
| 444 | #define OPAQUE 0xffffffff | 444 | #define OPAQUE 0xffffffff |
| 445 | #define OPACITY "_NET_WM_WINDOW_OPACITY" | ||
| 446 | 445 | ||
| 447 | void | 446 | void |
| 448 | x_set_frame_alpha (struct frame *f) | 447 | x_set_frame_alpha (struct frame *f) |
| @@ -486,7 +485,7 @@ x_set_frame_alpha (struct frame *f) | |||
| 486 | unsigned long n, left; | 485 | unsigned long n, left; |
| 487 | 486 | ||
| 488 | x_catch_errors (dpy); | 487 | x_catch_errors (dpy); |
| 489 | rc = XGetWindowProperty (dpy, win, XInternAtom(dpy, OPACITY, False), | 488 | rc = XGetWindowProperty (dpy, win, dpyinfo->Xatom_net_wm_window_opacity, |
| 490 | 0L, 1L, False, XA_CARDINAL, | 489 | 0L, 1L, False, XA_CARDINAL, |
| 491 | &actual, &format, &n, &left, | 490 | &actual, &format, &n, &left, |
| 492 | &data); | 491 | &data); |
| @@ -504,7 +503,7 @@ x_set_frame_alpha (struct frame *f) | |||
| 504 | } | 503 | } |
| 505 | 504 | ||
| 506 | x_catch_errors (dpy); | 505 | x_catch_errors (dpy); |
| 507 | XChangeProperty (dpy, win, XInternAtom (dpy, OPACITY, False), | 506 | XChangeProperty (dpy, win, dpyinfo->Xatom_net_wm_window_opacity, |
| 508 | XA_CARDINAL, 32, PropModeReplace, | 507 | XA_CARDINAL, 32, PropModeReplace, |
| 509 | (unsigned char *) &opac, 1L); | 508 | (unsigned char *) &opac, 1L); |
| 510 | x_uncatch_errors (); | 509 | x_uncatch_errors (); |
| @@ -8285,12 +8284,11 @@ x_set_offset (struct frame *f, register int xoff, register int yoff, int change_ | |||
| 8285 | http://freedesktop.org/wiki/Specifications/wm-spec. */ | 8284 | http://freedesktop.org/wiki/Specifications/wm-spec. */ |
| 8286 | 8285 | ||
| 8287 | static int | 8286 | static int |
| 8288 | wm_supports (struct frame *f, const char *atomname) | 8287 | wm_supports (struct frame *f, Atom want_atom) |
| 8289 | { | 8288 | { |
| 8290 | Atom actual_type; | 8289 | Atom actual_type; |
| 8291 | unsigned long actual_size, bytes_remaining; | 8290 | unsigned long actual_size, bytes_remaining; |
| 8292 | int i, rc, actual_format; | 8291 | int i, rc, actual_format; |
| 8293 | Atom prop_atom; | ||
| 8294 | Window wmcheck_window; | 8292 | Window wmcheck_window; |
| 8295 | struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); | 8293 | struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); |
| 8296 | Window target_window = dpyinfo->root_window; | 8294 | Window target_window = dpyinfo->root_window; |
| @@ -8298,15 +8296,13 @@ wm_supports (struct frame *f, const char *atomname) | |||
| 8298 | Display *dpy = FRAME_X_DISPLAY (f); | 8296 | Display *dpy = FRAME_X_DISPLAY (f); |
| 8299 | unsigned char *tmp_data = NULL; | 8297 | unsigned char *tmp_data = NULL; |
| 8300 | Atom target_type = XA_WINDOW; | 8298 | Atom target_type = XA_WINDOW; |
| 8301 | Atom want_atom; | ||
| 8302 | 8299 | ||
| 8303 | BLOCK_INPUT; | 8300 | BLOCK_INPUT; |
| 8304 | 8301 | ||
| 8305 | prop_atom = XInternAtom (dpy, "_NET_SUPPORTING_WM_CHECK", False); | ||
| 8306 | |||
| 8307 | x_catch_errors (dpy); | 8302 | x_catch_errors (dpy); |
| 8308 | rc = XGetWindowProperty (dpy, target_window, | 8303 | rc = XGetWindowProperty (dpy, target_window, |
| 8309 | prop_atom, 0, max_len, False, target_type, | 8304 | dpyinfo->Xatom_net_supporting_wm_check, |
| 8305 | 0, max_len, False, target_type, | ||
| 8310 | &actual_type, &actual_format, &actual_size, | 8306 | &actual_type, &actual_format, &actual_size, |
| 8311 | &bytes_remaining, &tmp_data); | 8307 | &bytes_remaining, &tmp_data); |
| 8312 | 8308 | ||
| @@ -8341,10 +8337,10 @@ wm_supports (struct frame *f, const char *atomname) | |||
| 8341 | dpyinfo->net_supported_window = 0; | 8337 | dpyinfo->net_supported_window = 0; |
| 8342 | 8338 | ||
| 8343 | target_type = XA_ATOM; | 8339 | target_type = XA_ATOM; |
| 8344 | prop_atom = XInternAtom (dpy, "_NET_SUPPORTED", False); | ||
| 8345 | tmp_data = NULL; | 8340 | tmp_data = NULL; |
| 8346 | rc = XGetWindowProperty (dpy, target_window, | 8341 | rc = XGetWindowProperty (dpy, target_window, |
| 8347 | prop_atom, 0, max_len, False, target_type, | 8342 | dpyinfo->Xatom_net_supported, |
| 8343 | 0, max_len, False, target_type, | ||
| 8348 | &actual_type, &actual_format, &actual_size, | 8344 | &actual_type, &actual_format, &actual_size, |
| 8349 | &bytes_remaining, &tmp_data); | 8345 | &bytes_remaining, &tmp_data); |
| 8350 | 8346 | ||
| @@ -8362,7 +8358,6 @@ wm_supports (struct frame *f, const char *atomname) | |||
| 8362 | } | 8358 | } |
| 8363 | 8359 | ||
| 8364 | rc = 0; | 8360 | rc = 0; |
| 8365 | want_atom = XInternAtom (dpy, atomname, False); | ||
| 8366 | 8361 | ||
| 8367 | for (i = 0; rc == 0 && i < dpyinfo->nr_net_supported_atoms; ++i) | 8362 | for (i = 0; rc == 0 && i < dpyinfo->nr_net_supported_atoms; ++i) |
| 8368 | rc = dpyinfo->net_supported_atoms[i] == want_atom; | 8363 | rc = dpyinfo->net_supported_atoms[i] == want_atom; |
| @@ -8374,31 +8369,31 @@ wm_supports (struct frame *f, const char *atomname) | |||
| 8374 | } | 8369 | } |
| 8375 | 8370 | ||
| 8376 | static void | 8371 | static void |
| 8377 | set_wm_state (Lisp_Object frame, int add, const char *what, const char *what2) | 8372 | set_wm_state (Lisp_Object frame, int add, Atom atom, Atom value) |
| 8378 | { | 8373 | { |
| 8379 | const char *atom = "_NET_WM_STATE"; | 8374 | struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (XFRAME (frame)); |
| 8380 | Fx_send_client_event (frame, make_number (0), frame, | 8375 | |
| 8381 | make_unibyte_string (atom, strlen (atom)), | 8376 | x_send_client_event (frame, make_number (0), frame, |
| 8382 | make_number (32), | 8377 | dpyinfo->Xatom_net_wm_state, |
| 8383 | /* 1 = add, 0 = remove */ | 8378 | make_number (32), |
| 8379 | /* 1 = add, 0 = remove */ | ||
| 8380 | Fcons | ||
| 8381 | (make_number (add ? 1 : 0), | ||
| 8384 | Fcons | 8382 | Fcons |
| 8385 | (make_number (add ? 1 : 0), | 8383 | (atom, |
| 8386 | Fcons | 8384 | value != 0 ? value : Qnil))); |
| 8387 | (make_unibyte_string (what, strlen (what)), | ||
| 8388 | what2 != 0 | ||
| 8389 | ? Fcons (make_unibyte_string (what2, strlen (what2)), | ||
| 8390 | Qnil) | ||
| 8391 | : Qnil))); | ||
| 8392 | } | 8385 | } |
| 8393 | 8386 | ||
| 8394 | void | 8387 | void |
| 8395 | x_set_sticky (struct frame *f, Lisp_Object new_value, Lisp_Object old_value) | 8388 | x_set_sticky (struct frame *f, Lisp_Object new_value, Lisp_Object old_value) |
| 8396 | { | 8389 | { |
| 8397 | Lisp_Object frame; | 8390 | Lisp_Object frame; |
| 8391 | struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); | ||
| 8398 | 8392 | ||
| 8399 | XSETFRAME (frame, f); | 8393 | XSETFRAME (frame, f); |
| 8394 | |||
| 8400 | set_wm_state (frame, NILP (new_value) ? 0 : 1, | 8395 | set_wm_state (frame, NILP (new_value) ? 0 : 1, |
| 8401 | "_NET_WM_STATE_STICKY", NULL); | 8396 | dpyinfo->Xatom_net_wm_state_sticky, None); |
| 8402 | } | 8397 | } |
| 8403 | 8398 | ||
| 8404 | /* Return the current _NET_WM_STATE. | 8399 | /* Return the current _NET_WM_STATE. |
| @@ -8457,7 +8452,7 @@ get_current_vm_state (struct frame *f, | |||
| 8457 | else | 8452 | else |
| 8458 | *size_state = FULLSCREEN_HEIGHT; | 8453 | *size_state = FULLSCREEN_HEIGHT; |
| 8459 | } | 8454 | } |
| 8460 | else if (a == dpyinfo->Xatom_net_wm_state_fullscreen_atom) | 8455 | else if (a == dpyinfo->Xatom_net_wm_state_fullscreen) |
| 8461 | *size_state = FULLSCREEN_BOTH; | 8456 | *size_state = FULLSCREEN_BOTH; |
| 8462 | else if (a == dpyinfo->Xatom_net_wm_state_sticky) | 8457 | else if (a == dpyinfo->Xatom_net_wm_state_sticky) |
| 8463 | *sticky = 1; | 8458 | *sticky = 1; |
| @@ -8472,7 +8467,8 @@ get_current_vm_state (struct frame *f, | |||
| 8472 | static int | 8467 | static int |
| 8473 | do_ewmh_fullscreen (struct frame *f) | 8468 | do_ewmh_fullscreen (struct frame *f) |
| 8474 | { | 8469 | { |
| 8475 | int have_net_atom = wm_supports (f, "_NET_WM_STATE"); | 8470 | struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); |
| 8471 | int have_net_atom = wm_supports (f, dpyinfo->Xatom_net_wm_state); | ||
| 8476 | Lisp_Object lval = get_frame_param (f, Qfullscreen); | 8472 | Lisp_Object lval = get_frame_param (f, Qfullscreen); |
| 8477 | int cur, dummy; | 8473 | int cur, dummy; |
| 8478 | 8474 | ||
| @@ -8481,14 +8477,11 @@ do_ewmh_fullscreen (struct frame *f) | |||
| 8481 | /* Some window managers don't say they support _NET_WM_STATE, but they do say | 8477 | /* Some window managers don't say they support _NET_WM_STATE, but they do say |
| 8482 | they support _NET_WM_STATE_FULLSCREEN. Try that also. */ | 8478 | they support _NET_WM_STATE_FULLSCREEN. Try that also. */ |
| 8483 | if (!have_net_atom) | 8479 | if (!have_net_atom) |
| 8484 | have_net_atom = wm_supports (f, "_NET_WM_STATE_FULLSCREEN"); | 8480 | have_net_atom = wm_supports (f, dpyinfo->Xatom_net_wm_state_fullscreen); |
| 8485 | 8481 | ||
| 8486 | if (have_net_atom && cur != f->want_fullscreen) | 8482 | if (have_net_atom && cur != f->want_fullscreen) |
| 8487 | { | 8483 | { |
| 8488 | Lisp_Object frame; | 8484 | Lisp_Object frame; |
| 8489 | const char *fs = "_NET_WM_STATE_FULLSCREEN"; | ||
| 8490 | const char *fw = "_NET_WM_STATE_MAXIMIZED_HORZ"; | ||
| 8491 | const char *fh = "_NET_WM_STATE_MAXIMIZED_VERT"; | ||
| 8492 | 8485 | ||
| 8493 | XSETFRAME (frame, f); | 8486 | XSETFRAME (frame, f); |
| 8494 | 8487 | ||
| @@ -8500,33 +8493,38 @@ do_ewmh_fullscreen (struct frame *f) | |||
| 8500 | case FULLSCREEN_BOTH: | 8493 | case FULLSCREEN_BOTH: |
| 8501 | if (cur == FULLSCREEN_WIDTH || cur == FULLSCREEN_MAXIMIZED | 8494 | if (cur == FULLSCREEN_WIDTH || cur == FULLSCREEN_MAXIMIZED |
| 8502 | || cur == FULLSCREEN_HEIGHT) | 8495 | || cur == FULLSCREEN_HEIGHT) |
| 8503 | set_wm_state (frame, 0, fw, fh); | 8496 | set_wm_state (frame, 0, dpyinfo->Xatom_net_wm_state_maximized_horz, |
| 8504 | set_wm_state (frame, 1, fs, NULL); | 8497 | dpyinfo->Xatom_net_wm_state_maximized_vert); |
| 8498 | set_wm_state (frame, 1, dpyinfo->Xatom_net_wm_state_fullscreen, None); | ||
| 8505 | break; | 8499 | break; |
| 8506 | case FULLSCREEN_WIDTH: | 8500 | case FULLSCREEN_WIDTH: |
| 8507 | if (cur == FULLSCREEN_BOTH || cur == FULLSCREEN_HEIGHT | 8501 | if (cur == FULLSCREEN_BOTH || cur == FULLSCREEN_HEIGHT |
| 8508 | || cur == FULLSCREEN_MAXIMIZED) | 8502 | || cur == FULLSCREEN_MAXIMIZED) |
| 8509 | set_wm_state (frame, 0, fs, fh); | 8503 | set_wm_state (frame, 0, dpyinfo->Xatom_net_wm_state_fullscreen, |
| 8504 | dpyinfo->Xatom_net_wm_state_maximized_vert); | ||
| 8510 | if (cur != FULLSCREEN_MAXIMIZED) | 8505 | if (cur != FULLSCREEN_MAXIMIZED) |
| 8511 | set_wm_state (frame, 1, fw, NULL); | 8506 | set_wm_state (frame, 1, dpyinfo->Xatom_net_wm_state_maximized_horz, None); |
| 8512 | break; | 8507 | break; |
| 8513 | case FULLSCREEN_HEIGHT: | 8508 | case FULLSCREEN_HEIGHT: |
| 8514 | if (cur == FULLSCREEN_BOTH || cur == FULLSCREEN_WIDTH | 8509 | if (cur == FULLSCREEN_BOTH || cur == FULLSCREEN_WIDTH |
| 8515 | || cur == FULLSCREEN_MAXIMIZED) | 8510 | || cur == FULLSCREEN_MAXIMIZED) |
| 8516 | set_wm_state (frame, 0, fs, fw); | 8511 | set_wm_state (frame, 0, dpyinfo->Xatom_net_wm_state_fullscreen, |
| 8512 | dpyinfo->Xatom_net_wm_state_maximized_horz); | ||
| 8517 | if (cur != FULLSCREEN_MAXIMIZED) | 8513 | if (cur != FULLSCREEN_MAXIMIZED) |
| 8518 | set_wm_state (frame, 1, fh, NULL); | 8514 | set_wm_state (frame, 1, dpyinfo->Xatom_net_wm_state_maximized_vert, None); |
| 8519 | break; | 8515 | break; |
| 8520 | case FULLSCREEN_MAXIMIZED: | 8516 | case FULLSCREEN_MAXIMIZED: |
| 8521 | if (cur == FULLSCREEN_BOTH) | 8517 | if (cur == FULLSCREEN_BOTH) |
| 8522 | set_wm_state (frame, 0, fs, NULL); | 8518 | set_wm_state (frame, 0, dpyinfo->Xatom_net_wm_state_fullscreen, None); |
| 8523 | set_wm_state (frame, 1, fw, fh); | 8519 | set_wm_state (frame, 1, dpyinfo->Xatom_net_wm_state_maximized_horz, |
| 8520 | dpyinfo->Xatom_net_wm_state_maximized_vert); | ||
| 8524 | break; | 8521 | break; |
| 8525 | case FULLSCREEN_NONE: | 8522 | case FULLSCREEN_NONE: |
| 8526 | if (cur == FULLSCREEN_BOTH) | 8523 | if (cur == FULLSCREEN_BOTH) |
| 8527 | set_wm_state (frame, 0, fs, NULL); | 8524 | set_wm_state (frame, 0, dpyinfo->Xatom_net_wm_state_fullscreen, None); |
| 8528 | else | 8525 | else |
| 8529 | set_wm_state (frame, 0, fw, fh); | 8526 | set_wm_state (frame, 0, dpyinfo->Xatom_net_wm_state_maximized_horz, |
| 8527 | dpyinfo->Xatom_net_wm_state_maximized_vert); | ||
| 8530 | } | 8528 | } |
| 8531 | 8529 | ||
| 8532 | f->want_fullscreen = FULLSCREEN_NONE; | 8530 | f->want_fullscreen = FULLSCREEN_NONE; |
| @@ -8966,17 +8964,17 @@ x_ewmh_activate_frame (FRAME_PTR f) | |||
| 8966 | /* See Window Manager Specification/Extended Window Manager Hints at | 8964 | /* See Window Manager Specification/Extended Window Manager Hints at |
| 8967 | http://freedesktop.org/wiki/Specifications/wm-spec */ | 8965 | http://freedesktop.org/wiki/Specifications/wm-spec */ |
| 8968 | 8966 | ||
| 8969 | const char *atom = "_NET_ACTIVE_WINDOW"; | 8967 | struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); |
| 8970 | if (f->async_visible && wm_supports (f, atom)) | 8968 | if (f->async_visible && wm_supports (f, dpyinfo->Xatom_net_active_window)) |
| 8971 | { | 8969 | { |
| 8972 | Lisp_Object frame; | 8970 | Lisp_Object frame; |
| 8973 | XSETFRAME (frame, f); | 8971 | XSETFRAME (frame, f); |
| 8974 | Fx_send_client_event (frame, make_number (0), frame, | 8972 | x_send_client_event (frame, make_number (0), frame, |
| 8975 | make_unibyte_string (atom, strlen (atom)), | 8973 | dpyinfo->Xatom_net_active_window, |
| 8976 | make_number (32), | 8974 | make_number (32), |
| 8977 | Fcons (make_number (1), | 8975 | Fcons (make_number (1), |
| 8978 | Fcons (make_number (last_user_time), | 8976 | Fcons (make_number (last_user_time), |
| 8979 | Qnil))); | 8977 | Qnil))); |
| 8980 | } | 8978 | } |
| 8981 | } | 8979 | } |
| 8982 | 8980 | ||
| @@ -8996,13 +8994,13 @@ xembed_set_info (struct frame *f, enum xembed_info flags) | |||
| 8996 | { | 8994 | { |
| 8997 | Atom atom; | 8995 | Atom atom; |
| 8998 | unsigned long data[2]; | 8996 | unsigned long data[2]; |
| 8999 | 8997 | struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); | |
| 9000 | atom = XInternAtom (FRAME_X_DISPLAY (f), "_XEMBED_INFO", False); | ||
| 9001 | 8998 | ||
| 9002 | data[0] = XEMBED_VERSION; | 8999 | data[0] = XEMBED_VERSION; |
| 9003 | data[1] = flags; | 9000 | data[1] = flags; |
| 9004 | 9001 | ||
| 9005 | XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), atom, atom, | 9002 | XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), |
| 9003 | dpyinfo->Xatom_XEMBED_INFO, dpyinfo->Xatom_XEMBED_INFO, | ||
| 9006 | 32, PropModeReplace, (unsigned char *) data, 2); | 9004 | 32, PropModeReplace, (unsigned char *) data, 2); |
| 9007 | } | 9005 | } |
| 9008 | 9006 | ||
| @@ -10196,90 +10194,97 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) | |||
| 10196 | dpyinfo->resx = (mm < 1) ? 100 : pixels * 25.4 / mm; | 10194 | dpyinfo->resx = (mm < 1) ? 100 : pixels * 25.4 / mm; |
| 10197 | } | 10195 | } |
| 10198 | 10196 | ||
| 10199 | dpyinfo->Xatom_wm_protocols | 10197 | { |
| 10200 | = XInternAtom (dpyinfo->display, "WM_PROTOCOLS", False); | 10198 | const struct |
| 10201 | dpyinfo->Xatom_wm_take_focus | 10199 | { |
| 10202 | = XInternAtom (dpyinfo->display, "WM_TAKE_FOCUS", False); | 10200 | const char *name; |
| 10203 | dpyinfo->Xatom_wm_save_yourself | 10201 | Atom *atom; |
| 10204 | = XInternAtom (dpyinfo->display, "WM_SAVE_YOURSELF", False); | 10202 | } atom_refs[] = { |
| 10205 | dpyinfo->Xatom_wm_delete_window | 10203 | { "WM_PROTOCOLS", &dpyinfo->Xatom_wm_protocols }, |
| 10206 | = XInternAtom (dpyinfo->display, "WM_DELETE_WINDOW", False); | 10204 | { "WM_TAKE_FOCUS", &dpyinfo->Xatom_wm_take_focus }, |
| 10207 | dpyinfo->Xatom_wm_change_state | 10205 | { "WM_SAVE_YOURSELF", &dpyinfo->Xatom_wm_save_yourself }, |
| 10208 | = XInternAtom (dpyinfo->display, "WM_CHANGE_STATE", False); | 10206 | { "WM_DELETE_WINDOW", &dpyinfo->Xatom_wm_delete_window }, |
| 10209 | dpyinfo->Xatom_wm_configure_denied | 10207 | { "WM_CHANGE_STATE", &dpyinfo->Xatom_wm_change_state }, |
| 10210 | = XInternAtom (dpyinfo->display, "WM_CONFIGURE_DENIED", False); | 10208 | { "WM_CONFIGURE_DENIED", &dpyinfo->Xatom_wm_configure_denied }, |
| 10211 | dpyinfo->Xatom_wm_window_moved | 10209 | { "WM_MOVED", &dpyinfo->Xatom_wm_window_moved }, |
| 10212 | = XInternAtom (dpyinfo->display, "WM_MOVED", False); | 10210 | { "WM_CLIENT_LEADER", &dpyinfo->Xatom_wm_client_leader }, |
| 10213 | dpyinfo->Xatom_wm_client_leader | 10211 | { "Editres", &dpyinfo->Xatom_editres }, |
| 10214 | = XInternAtom (dpyinfo->display, "WM_CLIENT_LEADER", False); | 10212 | { "CLIPBOARD", &dpyinfo->Xatom_CLIPBOARD }, |
| 10215 | dpyinfo->Xatom_editres | 10213 | { "TIMESTAMP", &dpyinfo->Xatom_TIMESTAMP }, |
| 10216 | = XInternAtom (dpyinfo->display, "Editres", False); | 10214 | { "TEXT", &dpyinfo->Xatom_TEXT }, |
| 10217 | dpyinfo->Xatom_CLIPBOARD | 10215 | { "COMPOUND_TEXT", &dpyinfo->Xatom_COMPOUND_TEXT }, |
| 10218 | = XInternAtom (dpyinfo->display, "CLIPBOARD", False); | 10216 | { "UTF8_STRING", &dpyinfo->Xatom_UTF8_STRING }, |
| 10219 | dpyinfo->Xatom_TIMESTAMP | 10217 | { "DELETE", &dpyinfo->Xatom_DELETE }, |
| 10220 | = XInternAtom (dpyinfo->display, "TIMESTAMP", False); | 10218 | { "MULTIPLE", &dpyinfo->Xatom_MULTIPLE }, |
| 10221 | dpyinfo->Xatom_TEXT | 10219 | { "INCR", &dpyinfo->Xatom_INCR }, |
| 10222 | = XInternAtom (dpyinfo->display, "TEXT", False); | 10220 | { "_EMACS_TMP_", &dpyinfo->Xatom_EMACS_TMP }, |
| 10223 | dpyinfo->Xatom_COMPOUND_TEXT | 10221 | { "TARGETS", &dpyinfo->Xatom_TARGETS }, |
| 10224 | = XInternAtom (dpyinfo->display, "COMPOUND_TEXT", False); | 10222 | { "NULL", &dpyinfo->Xatom_NULL }, |
| 10225 | dpyinfo->Xatom_UTF8_STRING | 10223 | { "ATOM_PAIR", &dpyinfo->Xatom_ATOM_PAIR }, |
| 10226 | = XInternAtom (dpyinfo->display, "UTF8_STRING", False); | 10224 | { "_XEMBED_INFO", &dpyinfo->Xatom_XEMBED_INFO }, |
| 10227 | dpyinfo->Xatom_DELETE | 10225 | /* For properties of font. */ |
| 10228 | = XInternAtom (dpyinfo->display, "DELETE", False); | 10226 | { "PIXEL_SIZE", &dpyinfo->Xatom_PIXEL_SIZE }, |
| 10229 | dpyinfo->Xatom_MULTIPLE | 10227 | { "AVERAGE_WIDTH", &dpyinfo->Xatom_AVERAGE_WIDTH }, |
| 10230 | = XInternAtom (dpyinfo->display, "MULTIPLE", False); | 10228 | { "_MULE_BASELINE_OFFSET", &dpyinfo->Xatom_MULE_BASELINE_OFFSET }, |
| 10231 | dpyinfo->Xatom_INCR | 10229 | { "_MULE_RELATIVE_COMPOSE", &dpyinfo->Xatom_MULE_RELATIVE_COMPOSE }, |
| 10232 | = XInternAtom (dpyinfo->display, "INCR", False); | 10230 | { "_MULE_DEFAULT_ASCENT", &dpyinfo->Xatom_MULE_DEFAULT_ASCENT }, |
| 10233 | dpyinfo->Xatom_EMACS_TMP | 10231 | /* Ghostscript support. */ |
| 10234 | = XInternAtom (dpyinfo->display, "_EMACS_TMP_", False); | 10232 | { "DONE", &dpyinfo->Xatom_DONE }, |
| 10235 | dpyinfo->Xatom_TARGETS | 10233 | { "PAGE", &dpyinfo->Xatom_PAGE }, |
| 10236 | = XInternAtom (dpyinfo->display, "TARGETS", False); | 10234 | { "SCROLLBAR", &dpyinfo->Xatom_Scrollbar }, |
| 10237 | dpyinfo->Xatom_NULL | 10235 | { "_XEMBED", &dpyinfo->Xatom_XEMBED }, |
| 10238 | = XInternAtom (dpyinfo->display, "NULL", False); | 10236 | /* EWMH */ |
| 10239 | dpyinfo->Xatom_ATOM_PAIR | 10237 | { "_NET_WM_STATE", &dpyinfo->Xatom_net_wm_state }, |
| 10240 | = XInternAtom (dpyinfo->display, "ATOM_PAIR", False); | 10238 | { "_NET_WM_STATE_FULLSCREEN", &dpyinfo->Xatom_net_wm_state_fullscreen }, |
| 10241 | /* For properties of font. */ | 10239 | { "_NET_WM_STATE_MAXIMIZED_HORZ", |
| 10242 | dpyinfo->Xatom_PIXEL_SIZE | 10240 | &dpyinfo->Xatom_net_wm_state_maximized_horz }, |
| 10243 | = XInternAtom (dpyinfo->display, "PIXEL_SIZE", False); | 10241 | { "_NET_WM_STATE_MAXIMIZED_VERT", |
| 10244 | dpyinfo->Xatom_AVERAGE_WIDTH | 10242 | &dpyinfo->Xatom_net_wm_state_maximized_vert }, |
| 10245 | = XInternAtom (dpyinfo->display, "AVERAGE_WIDTH", False); | 10243 | { "_NET_WM_STATE_STICKY", &dpyinfo->Xatom_net_wm_state_sticky }, |
| 10246 | dpyinfo->Xatom_MULE_BASELINE_OFFSET | 10244 | { "_NET_WM_WINDOW_TYPE", &dpyinfo->Xatom_net_window_type }, |
| 10247 | = XInternAtom (dpyinfo->display, "_MULE_BASELINE_OFFSET", False); | 10245 | { "_NET_WM_WINDOW_TYPE_TOOLTIP", |
| 10248 | dpyinfo->Xatom_MULE_RELATIVE_COMPOSE | 10246 | &dpyinfo->Xatom_net_window_type_tooltip }, |
| 10249 | = XInternAtom (dpyinfo->display, "_MULE_RELATIVE_COMPOSE", False); | 10247 | { "_NET_WM_ICON_NAME", &dpyinfo->Xatom_net_wm_icon_name }, |
| 10250 | dpyinfo->Xatom_MULE_DEFAULT_ASCENT | 10248 | { "_NET_WM_NAME", &dpyinfo->Xatom_net_wm_name }, |
| 10251 | = XInternAtom (dpyinfo->display, "_MULE_DEFAULT_ASCENT", False); | 10249 | { "_NET_SUPPORTED", &dpyinfo->Xatom_net_supported }, |
| 10252 | 10250 | { "_NET_SUPPORTING_WM_CHECK", &dpyinfo->Xatom_net_supported }, | |
| 10253 | /* Ghostscript support. */ | 10251 | { "_NET_WM_WINDOW_OPACITY", &dpyinfo->Xatom_net_wm_window_opacity }, |
| 10254 | dpyinfo->Xatom_PAGE = XInternAtom (dpyinfo->display, "PAGE", False); | 10252 | { "_NET_ACTIVE_WINDOW", &dpyinfo->Xatom_net_active_window }, |
| 10255 | dpyinfo->Xatom_DONE = XInternAtom (dpyinfo->display, "DONE", False); | 10253 | { "_NET_FRAME_EXTENTS", &dpyinfo->Xatom_net_frame_extents }, |
| 10256 | 10254 | /* Session management */ | |
| 10257 | dpyinfo->Xatom_Scrollbar = XInternAtom (dpyinfo->display, "SCROLLBAR", | 10255 | { "SM_CLIENT_ID", &dpyinfo->Xatom_SM_CLIENT_ID }, |
| 10258 | False); | 10256 | { "_XSETTINGS_SETTINGS", &dpyinfo->Xatom_xsettings_prop }, |
| 10259 | 10257 | { "MANAGER", &dpyinfo->Xatom_xsettings_mgr }, | |
| 10260 | dpyinfo->Xatom_XEMBED = XInternAtom (dpyinfo->display, "_XEMBED", | 10258 | }; |
| 10261 | False); | 10259 | |
| 10262 | 10260 | int i; | |
| 10263 | dpyinfo->Xatom_net_wm_state | 10261 | const int atom_count = sizeof (atom_refs) / sizeof (atom_refs[0]); |
| 10264 | = XInternAtom (dpyinfo->display, "_NET_WM_STATE", False); | 10262 | /* 1 for _XSETTINGS_SN */ |
| 10265 | dpyinfo->Xatom_net_wm_state_fullscreen_atom | 10263 | const int total_atom_count = 1 + atom_count; |
| 10266 | = XInternAtom (dpyinfo->display, "_NET_WM_STATE_FULLSCREEN", False); | 10264 | Atom *atoms_return = xmalloc (sizeof (Atom) * total_atom_count); |
| 10267 | dpyinfo->Xatom_net_wm_state_maximized_horz | 10265 | char **atom_names = xmalloc (sizeof (char *) * total_atom_count); |
| 10268 | = XInternAtom (dpyinfo->display, "_NET_WM_STATE_MAXIMIZED_HORZ", False); | 10266 | char xsettings_atom_name[64]; |
| 10269 | dpyinfo->Xatom_net_wm_state_maximized_vert | 10267 | |
| 10270 | = XInternAtom (dpyinfo->display, "_NET_WM_STATE_MAXIMIZED_VERT", False); | 10268 | for (i = 0; i < atom_count; i++) |
| 10271 | dpyinfo->Xatom_net_wm_state_sticky | 10269 | atom_names[i] = (char *) atom_refs[i].name; |
| 10272 | = XInternAtom (dpyinfo->display, "_NET_WM_STATE_STICKY", False); | 10270 | |
| 10273 | dpyinfo->Xatom_net_window_type | 10271 | /* Build _XSETTINGS_SN atom name */ |
| 10274 | = XInternAtom (dpyinfo->display, "_NET_WM_WINDOW_TYPE", False); | 10272 | snprintf (xsettings_atom_name, sizeof (xsettings_atom_name), |
| 10275 | dpyinfo->Xatom_net_window_type_tooltip | 10273 | "_XSETTINGS_S%d", XScreenNumberOfScreen (dpyinfo->screen)); |
| 10276 | = XInternAtom (dpyinfo->display, "_NET_WM_WINDOW_TYPE_TOOLTIP", False); | 10274 | atom_names[i] = xsettings_atom_name; |
| 10277 | dpyinfo->Xatom_net_wm_icon_name | 10275 | |
| 10278 | = XInternAtom (dpyinfo->display, "_NET_WM_ICON_NAME", False); | 10276 | XInternAtoms (dpyinfo->display, atom_names, total_atom_count, |
| 10279 | dpyinfo->Xatom_net_wm_name | 10277 | False, atoms_return); |
| 10280 | = XInternAtom (dpyinfo->display, "_NET_WM_NAME", False); | 10278 | |
| 10281 | dpyinfo->Xatom_net_frame_extents | 10279 | for (i = 0; i < atom_count; i++) |
| 10282 | = XInternAtom (dpyinfo->display, "_NET_FRAME_EXTENTS", False); | 10280 | *atom_refs[i].atom = atoms_return[i]; |
| 10281 | |||
| 10282 | /* Manual copy of last atom */ | ||
| 10283 | dpyinfo->Xatom_xsettings_sel = atoms_return[i]; | ||
| 10284 | |||
| 10285 | xfree (atom_names); | ||
| 10286 | xfree (atoms_return); | ||
| 10287 | } | ||
| 10283 | 10288 | ||
| 10284 | dpyinfo->x_dnd_atoms_size = 8; | 10289 | dpyinfo->x_dnd_atoms_size = 8; |
| 10285 | dpyinfo->x_dnd_atoms_length = 0; | 10290 | dpyinfo->x_dnd_atoms_length = 0; |
diff --git a/src/xterm.h b/src/xterm.h index 1d144b3b704..fbfb043601a 100644 --- a/src/xterm.h +++ b/src/xterm.h | |||
| @@ -270,7 +270,7 @@ struct x_display_info | |||
| 270 | Atom Xatom_Scrollbar; | 270 | Atom Xatom_Scrollbar; |
| 271 | 271 | ||
| 272 | /* Atom used in XEmbed client messages. */ | 272 | /* Atom used in XEmbed client messages. */ |
| 273 | Atom Xatom_XEMBED; | 273 | Atom Xatom_XEMBED, Xatom_XEMBED_INFO;; |
| 274 | 274 | ||
| 275 | /* The frame (if any) which has the X window that has keyboard focus. | 275 | /* The frame (if any) which has the X window that has keyboard focus. |
| 276 | Zero if none. This is examined by Ffocus_frame in xfns.c. Note | 276 | Zero if none. This is examined by Ffocus_frame in xfns.c. Note |
| @@ -332,13 +332,15 @@ struct x_display_info | |||
| 332 | 332 | ||
| 333 | /* Extended window manager hints, Atoms supported by the window manager and | 333 | /* Extended window manager hints, Atoms supported by the window manager and |
| 334 | atoms for settig the window type. */ | 334 | atoms for settig the window type. */ |
| 335 | Atom Xatom_net_supported, Xatom_net_supporting_wm_check; | ||
| 335 | Atom *net_supported_atoms; | 336 | Atom *net_supported_atoms; |
| 336 | int nr_net_supported_atoms; | 337 | int nr_net_supported_atoms; |
| 337 | Window net_supported_window; | 338 | Window net_supported_window; |
| 338 | Atom Xatom_net_window_type, Xatom_net_window_type_tooltip; | 339 | Atom Xatom_net_window_type, Xatom_net_window_type_tooltip; |
| 340 | Atom Xatom_net_active_window; | ||
| 339 | 341 | ||
| 340 | /* Atoms dealing with EWMH (i.e. _NET_...) */ | 342 | /* Atoms dealing with EWMH (i.e. _NET_...) */ |
| 341 | Atom Xatom_net_wm_state, Xatom_net_wm_state_fullscreen_atom, | 343 | Atom Xatom_net_wm_state, Xatom_net_wm_state_fullscreen, |
| 342 | Xatom_net_wm_state_maximized_horz, Xatom_net_wm_state_maximized_vert, | 344 | Xatom_net_wm_state_maximized_horz, Xatom_net_wm_state_maximized_vert, |
| 343 | Xatom_net_wm_state_sticky, Xatom_net_frame_extents; | 345 | Xatom_net_wm_state_sticky, Xatom_net_frame_extents; |
| 344 | 346 | ||
| @@ -348,6 +350,11 @@ struct x_display_info | |||
| 348 | 350 | ||
| 349 | /* Frame name and icon name */ | 351 | /* Frame name and icon name */ |
| 350 | Atom Xatom_net_wm_name, Xatom_net_wm_icon_name; | 352 | Atom Xatom_net_wm_name, Xatom_net_wm_icon_name; |
| 353 | /* Frame opacity */ | ||
| 354 | Atom Xatom_net_wm_window_opacity; | ||
| 355 | |||
| 356 | /* SM */ | ||
| 357 | Atom Xatom_SM_CLIENT_ID; | ||
| 351 | }; | 358 | }; |
| 352 | 359 | ||
| 353 | #ifdef HAVE_X_I18N | 360 | #ifdef HAVE_X_I18N |
| @@ -1011,6 +1018,13 @@ extern void x_handle_selection_notify (XSelectionEvent *); | |||
| 1011 | extern void x_handle_selection_event (struct input_event *); | 1018 | extern void x_handle_selection_event (struct input_event *); |
| 1012 | extern void x_clear_frame_selections (struct frame *); | 1019 | extern void x_clear_frame_selections (struct frame *); |
| 1013 | 1020 | ||
| 1021 | extern void x_send_client_event (Lisp_Object display, | ||
| 1022 | Lisp_Object dest, | ||
| 1023 | Lisp_Object from, | ||
| 1024 | Atom message_type, | ||
| 1025 | Lisp_Object format, | ||
| 1026 | Lisp_Object values); | ||
| 1027 | |||
| 1014 | extern int x_handle_dnd_message (struct frame *, | 1028 | extern int x_handle_dnd_message (struct frame *, |
| 1015 | XClientMessageEvent *, | 1029 | XClientMessageEvent *, |
| 1016 | struct x_display_info *, | 1030 | struct x_display_info *, |