X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/aad3612f9eb7280bd4db8ee697186e75b1e82765..92dca4df0956bc153431f79dbfdd0235c1f9fded:/src/widget.c diff --git a/src/widget.c b/src/widget.c index d6469d7eec..bd0fe826e6 100644 --- a/src/widget.c +++ b/src/widget.c @@ -1,5 +1,5 @@ /* The emacs frame widget. - Copyright (C) 1992-1993, 2000-2013 Free Software Foundation, Inc. + Copyright (C) 1992-1993, 2000-2014 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -189,6 +189,14 @@ pixel_to_char_size (EmacsFrame ew, Dimension pixel_width, Dimension pixel_height *char_height = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, (int) pixel_height); } +static void +pixel_to_text_size (EmacsFrame ew, Dimension pixel_width, Dimension pixel_height, int *text_width, int *text_height) +{ + struct frame* f = ew->emacs_frame.frame; + *text_width = FRAME_PIXEL_TO_TEXT_WIDTH (f, (int) pixel_width); + *text_height = FRAME_PIXEL_TO_TEXT_HEIGHT (f, (int) pixel_height); +} + static void char_to_pixel_size (EmacsFrame ew, int char_width, int char_height, Dimension *pixel_width, Dimension *pixel_height) { @@ -404,15 +412,13 @@ set_frame_size (EmacsFrame ew) might end up with a frame width that is not a multiple of the frame's character width which is bad for vertically split windows. */ - f->scroll_bar_actual_width - = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f); compute_fringe_widths (f, 0); #if 0 /* This can run Lisp code, and it is dangerous to give out the frame to Lisp code before it officially exists. This is handled in Fx_create_frame so not needed here. */ - change_frame_size (f, h, w, 1, 0, 0); + change_frame_size (f, w, h, 1, 0, 0, 0); #endif char_to_pixel_size (ew, w, h, &pixel_width, &pixel_height); ew->core.width = pixel_width; @@ -467,7 +473,7 @@ update_wm_hints (EmacsFrame ew) if (! wmshell) return; #if 0 - check_frame_size (ew->emacs_frame.frame, &min_rows, &min_cols); + check_frame_size (ew->emacs_frame.frame, &min_cols, &min_rows, 0); #endif pixel_to_char_size (ew, ew->core.width, ew->core.height, @@ -489,8 +495,8 @@ update_wm_hints (EmacsFrame ew) XtVaSetValues (wmshell, XtNbaseWidth, (XtArgVal) base_width, XtNbaseHeight, (XtArgVal) base_height, - XtNwidthInc, (XtArgVal) cw, - XtNheightInc, (XtArgVal) ch, + XtNwidthInc, (XtArgVal) (frame_resize_pixelwise ? 1 : cw), + XtNheightInc, (XtArgVal) (frame_resize_pixelwise ? 1 : ch), XtNminWidth, (XtArgVal) (base_width + min_cols * cw), XtNminHeight, (XtArgVal) (base_height + min_rows * ch), NULL); @@ -592,11 +598,18 @@ static void update_various_frame_slots (EmacsFrame ew) { struct frame *f = ew->emacs_frame.frame; - struct x_output *x = f->output_data.x; - FRAME_PIXEL_HEIGHT (f) = ew->core.height + x->menubar_height; - FRAME_PIXEL_WIDTH (f) = ew->core.width; - f->internal_border_width = ew->emacs_frame.internal_border_width; + /* Don't do that: It confuses the check in change_frame_size_1 whether + the pixel size of the frame changed due to a change of the internal + border width. Bug#16736. */ + if (false) + { + struct x_output *x = f->output_data.x; + FRAME_PIXEL_HEIGHT (f) = ew->core.height + x->menubar_height; + FRAME_PIXEL_WIDTH (f) = ew->core.width; + } + + f->internal_border_width = ew->emacs_frame.internal_border_width; } static void @@ -671,22 +684,39 @@ EmacsFrameResize (Widget widget) { EmacsFrame ew = (EmacsFrame)widget; struct frame *f = ew->emacs_frame.frame; - struct x_output *x = f->output_data.x; - int columns; - int rows; - - pixel_to_char_size (ew, ew->core.width, ew->core.height, &columns, &rows); - if (columns != FRAME_COLS (f) - || rows != FRAME_LINES (f) - || ew->core.width != FRAME_PIXEL_WIDTH (f) - || ew->core.height + x->menubar_height != FRAME_PIXEL_HEIGHT (f)) + + /* Always process resize requests pixelwise. Frame maximizing + should work even when frame_resize_pixelwise is nil. */ + if (true || frame_resize_pixelwise) { - change_frame_size (f, rows, columns, 0, 1, 0); + int width, height; + + pixel_to_text_size (ew, ew->core.width, ew->core.height, &width, &height); + change_frame_size (f, width, height, 0, 1, 0, 1); + update_wm_hints (ew); update_various_frame_slots (ew); cancel_mouse_face (f); } + else + { + struct x_output *x = f->output_data.x; + int columns, rows; + + pixel_to_char_size (ew, ew->core.width, ew->core.height, &columns, &rows); + if (columns != FRAME_COLS (f) + || rows != FRAME_LINES (f) + || ew->core.width != FRAME_PIXEL_WIDTH (f) + || ew->core.height + x->menubar_height != FRAME_PIXEL_HEIGHT (f)) + { + change_frame_size (f, columns, rows, 0, 1, 0, 0); + update_wm_hints (ew); + update_various_frame_slots (ew); + + cancel_mouse_face (f); + } + } } static Boolean @@ -726,6 +756,7 @@ EmacsFrameSetValues (Widget cur_widget, Widget req_widget, Widget new_widget, Ar if (has_to_recompute_size) { + /* Don't do this pixelwise, hopefully. */ pixel_width = new->core.width; pixel_height = new->core.height; pixel_to_char_size (new, pixel_width, pixel_height, &char_width, @@ -735,8 +766,8 @@ EmacsFrameSetValues (Widget cur_widget, Widget req_widget, Widget new_widget, Ar new->core.width = pixel_width; new->core.height = pixel_height; - change_frame_size (new->emacs_frame.frame, char_height, char_width, - 1, 0, 0); + change_frame_size (new->emacs_frame.frame, char_width, char_height, + 1, 0, 0, 0); needs_a_refresh = True; } @@ -798,7 +829,7 @@ EmacsFrameSetCharSize (Widget widget, int columns, int rows) EmacsFrame ew = (EmacsFrame) widget; struct frame *f = ew->emacs_frame.frame; - x_set_window_size (f, 0, columns, rows); + x_set_window_size (f, 0, columns, rows, 0); }