comparison src/xterm.c @ 54185:f6e4e454800a

xfns.c (x_window): Fixed indentation * xterm.c (x_calc_absolute_position): Call x_real_positions to get WM window sizes and use those to calculate position. (x_set_offset): Removed code commented out.
author Jan Djärv <jan.h.d@swipnet.se>
date Sat, 28 Feb 2004 16:22:06 +0000
parents 03cb01738926
children 66000dbe48c9 90ccc0dc0d3f
comparison
equal deleted inserted replaced
54184:814c8c5e6841 54185:f6e4e454800a
8135 struct frame *f; 8135 struct frame *f;
8136 { 8136 {
8137 Window child; 8137 Window child;
8138 int win_x = 0, win_y = 0; 8138 int win_x = 0, win_y = 0;
8139 int flags = f->size_hint_flags; 8139 int flags = f->size_hint_flags;
8140 int this_window;
8141 8140
8142 /* We have nothing to do if the current position 8141 /* We have nothing to do if the current position
8143 is already for the top-left corner. */ 8142 is already for the top-left corner. */
8144 if (! ((flags & XNegative) || (flags & YNegative))) 8143 if (! ((flags & XNegative) || (flags & YNegative)))
8145 return; 8144 return;
8146 8145
8147 this_window = FRAME_OUTER_WINDOW (f); 8146 /* Find the offsets of the outside upper-left corner of
8148
8149 /* Find the position of the outside upper-left corner of
8150 the inner window, with respect to the outer window. 8147 the inner window, with respect to the outer window.
8151 But do this only if we will need the results. */ 8148 But do this only if we will need the results. */
8152 if (f->output_data.x->parent_desc != FRAME_X_DISPLAY_INFO (f)->root_window) 8149 if (f->output_data.x->parent_desc != FRAME_X_DISPLAY_INFO (f)->root_window)
8153 { 8150 /* This is to get *_pixels_outer_diff. */
8154 int count; 8151 x_real_positions (f, &win_x, &win_y);
8155
8156 BLOCK_INPUT;
8157 count = x_catch_errors (FRAME_X_DISPLAY (f));
8158 while (1)
8159 {
8160 x_clear_errors (FRAME_X_DISPLAY (f));
8161 XTranslateCoordinates (FRAME_X_DISPLAY (f),
8162
8163 /* From-window, to-window. */
8164 this_window,
8165 f->output_data.x->parent_desc,
8166
8167 /* From-position, to-position. */
8168 0, 0, &win_x, &win_y,
8169
8170 /* Child of win. */
8171 &child);
8172 if (x_had_errors_p (FRAME_X_DISPLAY (f)))
8173 {
8174 Window newroot, newparent = 0xdeadbeef;
8175 Window *newchildren;
8176 unsigned int nchildren;
8177
8178 if (! XQueryTree (FRAME_X_DISPLAY (f), this_window, &newroot,
8179 &newparent, &newchildren, &nchildren))
8180 break;
8181
8182 XFree ((char *) newchildren);
8183
8184 f->output_data.x->parent_desc = newparent;
8185 }
8186 else
8187 break;
8188 }
8189
8190 x_uncatch_errors (FRAME_X_DISPLAY (f), count);
8191 UNBLOCK_INPUT;
8192 }
8193 8152
8194 /* Treat negative positions as relative to the leftmost bottommost 8153 /* Treat negative positions as relative to the leftmost bottommost
8195 position that fits on the screen. */ 8154 position that fits on the screen. */
8196 if (flags & XNegative) 8155 if (flags & XNegative)
8197 f->left_pos = (FRAME_X_DISPLAY_INFO (f)->width 8156 f->left_pos = (FRAME_X_DISPLAY_INFO (f)->width
8198 - 2 * f->border_width - win_x 8157 - 2 * FRAME_X_OUTPUT (f)->x_pixels_outer_diff
8199 - FRAME_PIXEL_WIDTH (f) 8158 - FRAME_PIXEL_WIDTH (f)
8200 + f->left_pos); 8159 + f->left_pos);
8201 8160
8202 { 8161 {
8203 int height = FRAME_PIXEL_HEIGHT (f); 8162 int height = FRAME_PIXEL_HEIGHT (f);
8218 XtVaGetValues (f->output_data.x->column_widget, XtNheight, &height, NULL); 8177 XtVaGetValues (f->output_data.x->column_widget, XtNheight, &height, NULL);
8219 #endif 8178 #endif
8220 8179
8221 if (flags & YNegative) 8180 if (flags & YNegative)
8222 f->top_pos = (FRAME_X_DISPLAY_INFO (f)->height 8181 f->top_pos = (FRAME_X_DISPLAY_INFO (f)->height
8223 - 2 * f->border_width 8182 - FRAME_X_OUTPUT (f)->y_pixels_outer_diff
8224 - win_y 8183
8184 /* Assume the window manager decorations are the same size on
8185 three sides, i.e. left, right and bottom. This is to
8186 compensate for the bottom part. */
8187 - FRAME_X_OUTPUT (f)->x_pixels_outer_diff
8225 - height 8188 - height
8226 + f->top_pos); 8189 + f->top_pos);
8227 } 8190 }
8228 8191
8229 /* The left_pos and top_pos 8192 /* The left_pos and top_pos
8262 BLOCK_INPUT; 8225 BLOCK_INPUT;
8263 x_wm_set_size_hint (f, (long) 0, 0); 8226 x_wm_set_size_hint (f, (long) 0, 0);
8264 8227
8265 modified_left = f->left_pos; 8228 modified_left = f->left_pos;
8266 modified_top = f->top_pos; 8229 modified_top = f->top_pos;
8267
8268 #if 0 /* Running on psilocin (Debian), and displaying on the NCD X-terminal,
8269 this seems to be unnecessary and incorrect. rms, 4/17/97. */
8270 /* It is a mystery why we need to add the border_width here
8271 when the frame is already visible, but experiment says we do. */
8272 if (change_gravity != 0)
8273 {
8274 modified_left += f->border_width;
8275 modified_top += f->border_width;
8276 }
8277 #endif
8278 8230
8279 if (FRAME_X_DISPLAY_INFO (f)->wm_type == X_WMTYPE_A) 8231 if (FRAME_X_DISPLAY_INFO (f)->wm_type == X_WMTYPE_A)
8280 { 8232 {
8281 /* Some WMs (twm, wmaker at least) has an offset that is smaller 8233 /* Some WMs (twm, wmaker at least) has an offset that is smaller
8282 than the WM decorations. So we use the calculated offset instead 8234 than the WM decorations. So we use the calculated offset instead