aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Djärv2010-11-12 10:31:44 +0100
committerJan Djärv2010-11-12 10:31:44 +0100
commit2d9074ba9a5abaa7956e905a02ea180984f0540f (patch)
tree2c34e3b3af1b7d783d48146bb72db4eb99901a2f /src
parentc869cc377478d21689d00c1cdc7e690905d8891c (diff)
downloademacs-2d9074ba9a5abaa7956e905a02ea180984f0540f.tar.gz
emacs-2d9074ba9a5abaa7956e905a02ea180984f0540f.zip
Apply XAtom revork patches from Julien Danjou.
* xsettings.c (init_xsettings): Use already fetch atoms. * xsmfns.c (create_client_leader_window): Use SM_CLIENT_ID atom from dpyinfo. * xselect.c (Fx_send_client_event): Split and create x_send_client_event. * lisp.h: Do not EXFUN Fx_send_client_event. * xterm.c (x_set_frame_alpha): Use _NET_WM_WINDOW_OPACITY atom from dpyinfo. (wm_supports): Use atoms from dpyinfo. (do_ewmh_fullscreen): Use atoms from dpyinfo. (x_ewmh_activate_frame): Use atoms from dpyinfo. (xembed_set_info): Use atoms from dpyinfo. (x_term_init): Fetch _XEMBED_INFO, _NET_SUPPORTED, _NET_SUPPORTING_WM_CHECK, _NET_WM_WINDOW_OPACITY and _NET_ACTIVE_WINDOW, XSETTINGS atoms. Get all atoms in one round-trip. (set_wm_state): Use x_send_client_event rather than Fx_send_client_event, using Atom directly. (x_ewmh_activate_frame): Ditto. (x_set_sticky): Pass atoms to set_wm_state. (do_ewmh_fullscreen): Ditto. * xterm.h (x_display_info): Add Xatom_net_supported, Xatom_net_supporting_wm_check, Xatom_net_active_window, Xatom_net_wm_window_opacity, Xatom_XEMBED_INFO, SM_CLIENT_ID. * xfns.c (Fx_show_tip): Fix typo in docstring.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog31
-rw-r--r--src/lisp.h1
-rw-r--r--src/xselect.c17
-rw-r--r--src/xsettings.c8
-rw-r--r--src/xsmfns.c4
-rw-r--r--src/xterm.c279
-rw-r--r--src/xterm.h18
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 @@
12010-11-11 Julien Danjou <julien@danjou.info> 12010-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
52010-11-11 Stefan Monnier <monnier@iro.umontreal.ca> 362010-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);
3600extern void syms_of_xsmfns (void); 3600extern void syms_of_xsmfns (void);
3601 3601
3602/* Defined in xselect.c */ 3602/* Defined in xselect.c */
3603EXFUN (Fx_send_client_event, 6);
3604extern void syms_of_xselect (void); 3603extern 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
2538void
2539x_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)
656static void 656static void
657init_xsettings (struct x_display_info *dpyinfo) 657init_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
447void 446void
448x_set_frame_alpha (struct frame *f) 447x_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
8287static int 8286static int
8288wm_supports (struct frame *f, const char *atomname) 8287wm_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
8376static void 8371static void
8377set_wm_state (Lisp_Object frame, int add, const char *what, const char *what2) 8372set_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
8394void 8387void
8395x_set_sticky (struct frame *f, Lisp_Object new_value, Lisp_Object old_value) 8388x_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,
8472static int 8467static int
8473do_ewmh_fullscreen (struct frame *f) 8468do_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 *);
1011extern void x_handle_selection_event (struct input_event *); 1018extern void x_handle_selection_event (struct input_event *);
1012extern void x_clear_frame_selections (struct frame *); 1019extern void x_clear_frame_selections (struct frame *);
1013 1020
1021extern 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
1014extern int x_handle_dnd_message (struct frame *, 1028extern int x_handle_dnd_message (struct frame *,
1015 XClientMessageEvent *, 1029 XClientMessageEvent *,
1016 struct x_display_info *, 1030 struct x_display_info *,