diff options
| author | Jan Djärv | 2010-11-04 09:41:25 +0100 |
|---|---|---|
| committer | Jan Djärv | 2010-11-04 09:41:25 +0100 |
| commit | d75c99921883af96fe9152cf9d1766e5ec0e5126 (patch) | |
| tree | c8bc1bf217efb541595664ad42fac24227ad83c0 /src | |
| parent | 630a5546c9cfaa5f4c8017486f05ac7566141f88 (diff) | |
| download | emacs-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/ChangeLog | 9 | ||||
| -rw-r--r-- | src/xfns.c | 52 | ||||
| -rw-r--r-- | src/xterm.c | 3 | ||||
| -rw-r--r-- | src/xterm.h | 4 |
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 @@ | |||
| 1 | 2010-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 | |||
| 1 | 2010-11-03 Glenn Morris <rgm@gnu.org> | 10 | 2010-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; |