f->left_pos, f->top_pos);
}
+/* Clear under internal border if any. As we use a mix of Gtk+ and X calls
+ and use a GtkFixed widget, this doesn't happen automatically. */
+
+static void
+xg_clear_under_internal_border (f)
+ FRAME_PTR f;
+{
+ if (FRAME_INTERNAL_BORDER_WIDTH (f) > 0)
+ {
+ GtkWidget *wfixed = f->output_data.x->edit_widget;
+ gtk_widget_queue_draw (wfixed);
+ gdk_window_process_all_updates ();
+ x_clear_area (FRAME_X_DISPLAY (f),
+ FRAME_X_WINDOW (f),
+ 0, 0,
+ FRAME_PIXEL_WIDTH (f),
+ FRAME_INTERNAL_BORDER_WIDTH (f), 0);
+ x_clear_area (FRAME_X_DISPLAY (f),
+ FRAME_X_WINDOW (f),
+ 0, 0,
+ FRAME_INTERNAL_BORDER_WIDTH (f),
+ FRAME_PIXEL_HEIGHT (f), 0);
+ x_clear_area (FRAME_X_DISPLAY (f),
+ FRAME_X_WINDOW (f),
+ 0, FRAME_PIXEL_HEIGHT (f) - FRAME_INTERNAL_BORDER_WIDTH (f),
+ FRAME_PIXEL_WIDTH (f),
+ FRAME_INTERNAL_BORDER_WIDTH (f), 0);
+ x_clear_area (FRAME_X_DISPLAY (f),
+ FRAME_X_WINDOW (f),
+ FRAME_PIXEL_WIDTH (f) - FRAME_INTERNAL_BORDER_WIDTH (f),
+ 0,
+ FRAME_INTERNAL_BORDER_WIDTH (f),
+ FRAME_PIXEL_HEIGHT (f), 0);
+ }
+}
+
/* Function to handle resize of our frame. As we have a Gtk+ tool bar
and a Gtk+ menu bar, we get resize events for the edit part of the
frame only. We let Gtk+ deal with the Gtk+ parts.
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);
+ gdk_window_get_geometry (FRAME_GTK_WIDGET (f)->window, 0, 0,
+ &pixelwidth, &pixelheight, 0);
else return;
}
FRAME_PIXEL_WIDTH (f) = pixelwidth;
FRAME_PIXEL_HEIGHT (f) = pixelheight;
+ xg_clear_under_internal_border (f);
change_frame_size (f, rows, columns, 0, 1, 0);
SET_FRAME_GARBAGED (f);
cancel_mouse_face (f);
after calculating that value. */
pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, cols);
+
+ /* Do this before resize, as we don't know yet if we will be resized. */
+ xg_clear_under_internal_border (f);
+
/* Must resize our top level widget. Font size may have changed,
but not rows/cols. */
gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
{
GtkWidget *wfixed = f->output_data.x->edit_widget;
GtkWidget *wparent = gtk_widget_get_parent (wscroll);
+ GtkFixed *wf = GTK_FIXED (wfixed);
+
+ /* Clear out old position. */
+ GList *iter;
+ int oldx = -1, oldy = -1, oldw, oldh;
+ for (iter = wf->children; iter; iter = iter->next)
+ if (((GtkFixedChild *)iter->data)->widget == wparent)
+ {
+ GtkFixedChild *ch = (GtkFixedChild *)iter->data;
+ if (ch->x != left || ch->y != top)
+ {
+ oldx = ch->x;
+ oldy = ch->y;
+ gtk_widget_get_size_request (wscroll, &oldw, &oldh);
+ }
+ break;
+ }
/* Move and resize to new values. */
gtk_fixed_move (GTK_FIXED (wfixed), wparent, left, top);
gtk_widget_set_size_request (wscroll, width, height);
- gtk_widget_queue_draw (wparent);
+ gtk_widget_queue_draw (wfixed);
gdk_window_process_all_updates ();
+ if (oldx != -1)
+ {
+ /* Clear under old scroll bar position. This must be done after
+ the gtk_widget_queue_draw and gdk_window_process_all_updates
+ above. */
+ x_clear_area (FRAME_X_DISPLAY (f),
+ FRAME_X_WINDOW (f),
+ oldx, oldy, oldw, oldh, 0);
+ }
+
/* GTK does not redraw until the main loop is entered again, but
if there are no X events pending we will not enter it. So we sync
here to get some events. */
+
x_sync (f);
SET_FRAME_GARBAGED (f);
cancel_mouse_face (f);
doing it because it's done in Fx_show_tip, and it leads to
problems because the tip frame has no widget. */
if (NILP (tip_frame) || XFRAME (tip_frame) != f)
- {
- int rows, cols;
-
- /* When the frame is maximized/fullscreen or running under for
- example Xmonad, x_set_window_size will be a no-op.
- In that case, the right thing to do is extend rows/cols to
- the current frame size. We do that first if x_set_window_size
- turns out to not be a no-op (there is no way to know).
- The size will be adjusted again if the frame gets a
- ConfigureNotify event as a result of x_set_window_size. */
- int pixelh = FRAME_PIXEL_HEIGHT (f);
-#ifdef USE_X_TOOLKIT
- /* The menu bar is not part of text lines. The tool bar
- is however. */
- pixelh -= FRAME_MENUBAR_HEIGHT (f);
-#endif
- rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, pixelh);
- /* Update f->scroll_bar_actual_width because it is used in
- FRAME_PIXEL_WIDTH_TO_TEXT_COLS. */
- f->scroll_bar_actual_width
- = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f);
- cols = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, FRAME_PIXEL_WIDTH (f));
-
- change_frame_size (f, rows, cols, 0, 1, 0);
- x_set_window_size (f, 0, FRAME_COLS (f), FRAME_LINES (f));
- }
+ x_set_window_size (f, 0, FRAME_COLS (f), FRAME_LINES (f));
}
#ifdef HAVE_X_I18N
{
BLOCK_INPUT;
+ if (NILP (tip_frame) || XFRAME (tip_frame) != f)
+ {
+ int r, c;
+
+ /* When the frame is maximized/fullscreen or running under for
+ example Xmonad, x_set_window_size_1 will be a no-op.
+ In that case, the right thing to do is extend rows/cols to
+ the current frame size. We do that first if x_set_window_size_1
+ turns out to not be a no-op (there is no way to know).
+ The size will be adjusted again if the frame gets a
+ ConfigureNotify event as a result of x_set_window_size. */
+ int pixelh = FRAME_PIXEL_HEIGHT (f);
+#ifdef USE_X_TOOLKIT
+ /* The menu bar is not part of text lines. The tool bar
+ is however. */
+ pixelh -= FRAME_MENUBAR_HEIGHT (f);
+#endif
+ r = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, pixelh);
+ /* Update f->scroll_bar_actual_width because it is used in
+ FRAME_PIXEL_WIDTH_TO_TEXT_COLS. */
+ f->scroll_bar_actual_width
+ = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f);
+ c = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, FRAME_PIXEL_WIDTH (f));
+ fprintf (stderr, "1: old %d/%d, new %d/%d\n", rows, cols, r, c);
+ change_frame_size (f, r, c, 0, 1, 0);
+ }
+
#ifdef USE_GTK
if (FRAME_GTK_WIDGET (f))
xg_frame_set_char_size (f, cols, rows);