void x_real_positions (f, xptr, yptr) FRAME_PTR f; int *xptr, *yptr; { int win_x, win_y, outer_x, outer_y; int real_x = 0, real_y = 0; int had_errors = 0; Window win = f->output_data.x->parent_desc; int count; BLOCK_INPUT; count = x_catch_errors (FRAME_X_DISPLAY (f)); if (win == FRAME_X_DISPLAY_INFO (f)->root_window) win = FRAME_OUTER_WINDOW (f); for (;;) { Window wm_window, rootw; Window *tmp_children; unsigned int tmp_nchildren; XQueryTree (FRAME_X_DISPLAY (f), win, &rootw, &wm_window, &tmp_children, &tmp_nchildren); XFree ((char *) tmp_children); had_errors = x_had_errors_p (FRAME_X_DISPLAY (f)); if (wm_window == rootw || had_errors) break; win = wm_window; } if (! had_errors) { int ign; Window child, rootw; XGetGeometry (FRAME_X_DISPLAY (f), win, &rootw, &real_x, &real_y, &ign, &ign, &ign, &ign); XTranslateCoordinates (FRAME_X_DISPLAY (f), /* From-window, to-window. */ FRAME_X_DISPLAY_INFO (f)->root_window, FRAME_X_WINDOW (f), /* From-position, to-position. */ real_x, real_y, &win_x, &win_y, /* Child of win. */ &child); if (FRAME_X_WINDOW (f) == FRAME_OUTER_WINDOW (f)) { outer_x = win_x; outer_y = win_y; } else { XTranslateCoordinates (FRAME_X_DISPLAY (f), /* From-window, to-window. */ FRAME_X_DISPLAY_INFO (f)->root_window, FRAME_OUTER_WINDOW (f), /* From-position, to-position. */ real_x, real_y, &outer_x, &outer_y, /* Child of win. */ &child); } had_errors = x_had_errors_p (FRAME_X_DISPLAY (f)); } x_uncatch_errors (FRAME_X_DISPLAY (f), count); UNBLOCK_INPUT; if (had_errors) return; f->output_data.x->x_pixels_diff = -win_x; f->output_data.x->y_pixels_diff = -win_y; f->output_data.x->x_pixels_outer_diff = -outer_x; f->output_data.x->y_pixels_outer_diff = -outer_y; *xptr = real_x; *yptr = real_y; }