aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Djärv2010-11-04 09:41:25 +0100
committerJan Djärv2010-11-04 09:41:25 +0100
commitd75c99921883af96fe9152cf9d1766e5ec0e5126 (patch)
treec8bc1bf217efb541595664ad42fac24227ad83c0 /src
parent630a5546c9cfaa5f4c8017486f05ac7566141f88 (diff)
downloademacs-d75c99921883af96fe9152cf9d1766e5ec0e5126.tar.gz
emacs-d75c99921883af96fe9152cf9d1766e5ec0e5126.zip
Get window position by reading _NET_FRAME_EXTENTS (Bug#5721).
* src/xfns.c (x_real_positions): Try to get _NET_FRAME_EXTENTS first before traversing window tree (Bug#5721). * src/xterm.c (x_term_init): Initialize Xatom_net_frame_extents. * src/xterm.h (struct x_display_info): Xatom_net_frame_extents is new.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog9
-rw-r--r--src/xfns.c52
-rw-r--r--src/xterm.c3
-rw-r--r--src/xterm.h4
4 files changed, 63 insertions, 5 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index a44fdbb7e42..a1a049c66c1 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,12 @@
12010-11-04 Jan Djärv <jan.h.d@swipnet.se>
2
3 * xterm.c (x_term_init): Initialize Xatom_net_frame_extents.
4
5 * xterm.h (struct x_display_info): Xatom_net_frame_extents is new.
6
7 * xfns.c (x_real_positions): Try to get _NET_FRAME_EXTENTS first
8 before traversing window tree (Bug#5721).
9
12010-11-03 Glenn Morris <rgm@gnu.org> 102010-11-03 Glenn Morris <rgm@gnu.org>
2 11
3 * Makefile.in (CRT_DIR): New variable, set by configure. 12 * Makefile.in (CRT_DIR): New variable, set by configure.
diff --git a/src/xfns.c b/src/xfns.c
index 1d7d3d03580..0b0f1cd0d96 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -532,12 +532,60 @@ x_real_positions (f, xptr, yptr)
532 int win_x, win_y, outer_x, outer_y; 532 int win_x, win_y, outer_x, outer_y;
533 int real_x = 0, real_y = 0; 533 int real_x = 0, real_y = 0;
534 int had_errors = 0; 534 int had_errors = 0;
535 Window win = f->output_data.x->parent_desc; 535 Window win;
536 Atom actual_type;
537 unsigned long actual_size, bytes_remaining;
538 int i, rc, actual_format;
539 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
540 long max_len = 400;
541 Display *dpy = FRAME_X_DISPLAY (f);
542 unsigned char *tmp_data = NULL;
543 Atom target_type = XA_CARDINAL;
536 544
537 BLOCK_INPUT; 545 BLOCK_INPUT;
538 546
539 x_catch_errors (FRAME_X_DISPLAY (f)); 547 x_catch_errors (dpy);
548
549 win = FRAME_OUTER_WINDOW (f);
550 /* Try _NET_FRAME_EXTENTS first. */
551 rc = XGetWindowProperty (dpy, win, dpyinfo->Xatom_net_frame_extents,
552 0, max_len, False, target_type,
553 &actual_type, &actual_format, &actual_size,
554 &bytes_remaining, &tmp_data);
555
556 if (0 && rc == Success && actual_type == target_type && !x_had_errors_p (dpy)
557 && actual_size == 4 && actual_format == 32)
558 {
559 int ign;
560 Window rootw;
561
562 XGetGeometry (FRAME_X_DISPLAY (f), win,
563 &rootw, &real_x, &real_y, &ign, &ign, &ign, &ign);
564 long *fe = (long *)tmp_data;
565
566 FRAME_X_OUTPUT (f)->x_pixels_outer_diff = fe[0];
567 FRAME_X_OUTPUT (f)->y_pixels_outer_diff = fe[2];
568 *xptr = real_x - fe[0];
569 *yptr = real_y - fe[2];
570
571 if (FRAME_X_WINDOW (f) != win)
572 {
573 XGetGeometry (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
574 &rootw, &real_x, &real_y, &ign, &ign, &ign, &ign);
575
576 f->x_pixels_diff = real_x;
577 f->y_pixels_diff = real_y;
578 }
579
580 if (tmp_data) XFree (tmp_data);
581 x_uncatch_errors ();
582 UNBLOCK_INPUT;
583 return;
584 }
585
586 if (tmp_data) XFree (tmp_data);
540 587
588 win = f->output_data.x->parent_desc;
541 if (win == FRAME_X_DISPLAY_INFO (f)->root_window) 589 if (win == FRAME_X_DISPLAY_INFO (f)->root_window)
542 win = FRAME_OUTER_WINDOW (f); 590 win = FRAME_OUTER_WINDOW (f);
543 591
diff --git a/src/xterm.c b/src/xterm.c
index 808eaad3f5f..22019e2279b 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -10522,7 +10522,8 @@ x_term_init (display_name, xrm_option, resource_name)
10522 = XInternAtom (dpyinfo->display, "_NET_WM_WINDOW_TYPE", False); 10522 = XInternAtom (dpyinfo->display, "_NET_WM_WINDOW_TYPE", False);
10523 dpyinfo->Xatom_net_window_type_tooltip 10523 dpyinfo->Xatom_net_window_type_tooltip
10524 = XInternAtom (dpyinfo->display, "_NET_WM_WINDOW_TYPE_TOOLTIP", False); 10524 = XInternAtom (dpyinfo->display, "_NET_WM_WINDOW_TYPE_TOOLTIP", False);
10525 10525 dpyinfo->Xatom_net_frame_extents
10526 = XInternAtom (dpyinfo->display, "_NET_FRAME_EXTENTS", False);
10526 dpyinfo->cut_buffers_initialized = 0; 10527 dpyinfo->cut_buffers_initialized = 0;
10527 10528
10528 dpyinfo->x_dnd_atoms_size = 8; 10529 dpyinfo->x_dnd_atoms_size = 8;
diff --git a/src/xterm.h b/src/xterm.h
index c8601b8c43d..07eaec3060c 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -362,10 +362,10 @@ struct x_display_info
362 Window net_supported_window; 362 Window net_supported_window;
363 Atom Xatom_net_window_type, Xatom_net_window_type_tooltip; 363 Atom Xatom_net_window_type, Xatom_net_window_type_tooltip;
364 364
365 /* Atoms dealing with maximization and fullscreen */ 365 /* Atoms dealing with EWMH (i.e. _NET_...) */
366 Atom Xatom_net_wm_state, Xatom_net_wm_state_fullscreen_atom, 366 Atom Xatom_net_wm_state, Xatom_net_wm_state_fullscreen_atom,
367 Xatom_net_wm_state_maximized_horz, Xatom_net_wm_state_maximized_vert, 367 Xatom_net_wm_state_maximized_horz, Xatom_net_wm_state_maximized_vert,
368 Xatom_net_wm_state_sticky; 368 Xatom_net_wm_state_sticky, Xatom_net_frame_extents;
369 369
370 /* XSettings atoms and windows. */ 370 /* XSettings atoms and windows. */
371 Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr; 371 Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr;