From: Jan Djärv Date: Thu, 2 Jul 2009 12:27:23 +0000 (+0000) Subject: * gtkutil.c (xg_frame_set_char_size): Do set width/height if the X-Git-Tag: emacs-pretest-23.1.90~2340 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=7b5072481940df702c273797ed13aa2c805bf3d8;p=emacs.git * gtkutil.c (xg_frame_set_char_size): Do set width/height if the frame isn't visible. (xg_frame_resized): If width/height is -1, get size of window from X server. * xterm.c (handle_one_xevent): Call xg_frame_resized for USE_GTK for MapNotify. --- diff --git a/src/ChangeLog b/src/ChangeLog index 673c716753d..52764078844 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,13 @@ 2009-07-02 Jan Djärv + * gtkutil.c (xg_frame_set_char_size): Do set width/height if the + frame isn't visible. + (xg_frame_resized): If width/height is -1, get size of window + from X server. + + * xterm.c (handle_one_xevent): Call xg_frame_resized for USE_GTK + for MapNotify. + * gtkutil.c (xg_frame_set_char_size): Do not set pixel width/height here or call change_frame_size. Just call flush_and_sync. (flush_and_sync): Reintroduced. diff --git a/src/gtkutil.c b/src/gtkutil.c index 2c5d31e571a..e18044f85e2 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -636,14 +636,24 @@ xg_frame_resized (f, pixelwidth, pixelheight) FRAME_PTR f; int pixelwidth, pixelheight; { - int rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, pixelheight); - int columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, pixelwidth); - - if (FRAME_GTK_WIDGET (f) - && (columns != FRAME_COLS (f) - || rows != FRAME_LINES (f) - || pixelwidth != FRAME_PIXEL_WIDTH (f) - || pixelheight != FRAME_PIXEL_HEIGHT (f))) + int rows, columns; + + if (pixelwidth == -1 && pixelheight == -1) + { + if (FRAME_GTK_WIDGET (f) && GTK_WIDGET_MAPPED (FRAME_GTK_WIDGET (f))) + gdk_window_get_geometry(FRAME_GTK_WIDGET (f)->window, 0, 0, + &pixelwidth, &pixelheight, 0); + else return; + } + + + rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, pixelheight); + columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, pixelwidth); + + if (columns != FRAME_COLS (f) + || rows != FRAME_LINES (f) + || pixelwidth != FRAME_PIXEL_WIDTH (f) + || pixelheight != FRAME_PIXEL_HEIGHT (f)) { FRAME_PIXEL_WIDTH (f) = pixelwidth; FRAME_PIXEL_HEIGHT (f) = pixelheight; @@ -704,14 +714,23 @@ xg_frame_set_char_size (f, cols, rows) pixelwidth, pixelheight); x_wm_set_size_hint (f, 0, 0); - SET_FRAME_GARBAGED (f); - - /* We can not call change_frame_size here, we can not set pixel - width/height either. The window manager may override our resize - request, XMonad does this all the time. The best we can do - is try to sync, so lisp code sees the updated size as fast as - possible. */ - flush_and_sync (f); + /* We can not call change_frame_size for a mapped frame, + we can not set pixel width/height either. The window manager may + override our resize request, XMonad does this all the time. + The best we can do is try to sync, so lisp code sees the updated + size as fast as possible. + For unmapped windows, we can set rows/cols. When + the frame is mapped again we will (hopefully) get the correct size. */ + if (f->async_visible) + flush_and_sync (f); + else + { + FRAME_PIXEL_WIDTH (f) = pixelwidth; + FRAME_PIXEL_HEIGHT (f) = pixelheight; + change_frame_size (f, rows, cols, 0, 1, 0); + SET_FRAME_GARBAGED (f); + cancel_mouse_face (f); + } } /* Handle height changes (i.e. add/remove menu/toolbar). diff --git a/src/xterm.c b/src/xterm.c index 168614069f5..77dc48f9a64 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -6206,6 +6206,9 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit) /* Check if fullscreen was specified before we where mapped. */ x_check_fullscreen (f); +#ifdef USE_GTK + xg_frame_resized (f, -1, -1); +#endif } goto OTHER;