- int winextra = canon_width > width ? (canon_width - width) / 2 : 0;
- int bottom = top + height;
-
- gint slider_width;
- int oldtop, oldleft, oldbottom;
- GtkRequisition req;
-
- /* Get old values. */
- xg_find_top_left_in_fixed (wscroll, wfixed, &oldleft, &oldtop);
- gtk_widget_size_request (wscroll, &req);
- oldbottom = oldtop + req.height;
-
- /* Scroll bars in GTK has a fixed width, so if we say width 16, it
- will only be its fixed width (14 is default) anyway, the rest is
- blank. We are drawing the mode line across scroll bars when
- the frame is split:
- |bar| |fringe|
- ----------------
- mode line
- ----------------
- |bar| |fringe|
-
- When we "unsplit" the frame:
-
- |bar| |fringe|
- -| |-| |
- m¦ |i| |
- -| |-| |
- | | | |
-
-
- the remains of the mode line can be seen in these blank spaces.
- So we must clear them explicitly.
- GTK scroll bars should do that, but they don't.
- Also, the canonical width may be wider than the width for the
- scroll bar so that there is some space (typically 1 pixel) between
- the scroll bar and the edge of the window and between the scroll
- bar and the fringe. */
-
- if (oldtop != -1 && oldleft != -1)
- {
- int gtkextral, gtkextrah;
- int xl, xr, wbl, wbr;
- int bottomdiff, topdiff;
-
- gtk_widget_style_get (wscroll, "slider_width", &slider_width, NULL);
- gtkextral = width > slider_width ? (width - slider_width) / 2 : 0;
- gtkextrah = gtkextral ? (width - slider_width - gtkextral) : 0;
-
- xl = real_left;
- wbl = gtkextral + winextra;
- wbr = gtkextrah + winextra;
- xr = left + gtkextral + slider_width;
- bottomdiff = abs (oldbottom - bottom);
- topdiff = abs (oldtop - top);
-
- if (oldleft != left)
- {
- gdk_window_clear_area (wfixed->window, xl, top, wbl, height);
- gdk_window_clear_area (wfixed->window, xr, top, wbr, height);
- }
-
- if (oldtop > top)
- {
- gdk_window_clear_area (wfixed->window, xl, top, wbl, topdiff);
- gdk_window_clear_area (wfixed->window, xr, top, wbr, topdiff);
- }
- else if (oldtop < top)
- {
- gdk_window_clear_area (wfixed->window, xl, oldtop, wbl, topdiff);
- gdk_window_clear_area (wfixed->window, xr, oldtop, wbr, topdiff);
- }
-
- if (oldbottom > bottom)
- {
- gdk_window_clear_area (wfixed->window, xl, bottom, wbl,
- bottomdiff);
- gdk_window_clear_area (wfixed->window, xr, bottom, wbr,
- bottomdiff);
- }
- else if (oldbottom < bottom)
- {
- gdk_window_clear_area (wfixed->window, xl, oldbottom, wbl,
- bottomdiff);
- gdk_window_clear_area (wfixed->window, xr, oldbottom, wbr,
- bottomdiff);
- }
- }