X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fredisplay-output.c;h=cfd1d2617be70b16ed5ec91de34172e70cc3b1a8;hb=8ae91923b1c6a495348a86739ef5dafb55993b56;hp=61f22dea6a7440940376bf844563cd62ee0621ea;hpb=59eec5f21669e81977b5b1fe9bf717cab49cf7fb;p=chise%2Fxemacs-chise.git.1 diff --git a/src/redisplay-output.c b/src/redisplay-output.c index 61f22de..cfd1d26 100644 --- a/src/redisplay-output.c +++ b/src/redisplay-output.c @@ -40,6 +40,7 @@ Boston, MA 02111-1307, USA. */ #include "glyphs.h" #include "redisplay.h" #include "faces.h" +#include "gutter.h" static int compare_runes (struct window *w, struct rune *crb, struct rune *drb); @@ -181,7 +182,7 @@ sync_display_line_structs (struct window *w, int line, int do_blocks, /***************************************************************************** compare_runes - Compare to runes to see if each of their fields is equal. If so, + Compare two runes to see if each of their fields is equal. If so, return true otherwise return false. ****************************************************************************/ static int @@ -1161,8 +1162,9 @@ redisplay_output_display_block (struct window *w, struct display_line *dl, int b Remove subwindows from the area in the box defined by the given parameters. ****************************************************************************/ -static void redisplay_unmap_subwindows (struct frame* f, int x, int y, int width, int height, - Lisp_Object ignored_window) +static void +redisplay_unmap_subwindows (struct frame* f, int x, int y, int width, int height, + Lisp_Object ignored_window) { Lisp_Object rest; @@ -1263,7 +1265,12 @@ redisplay_output_subwindow (struct window *w, sdga.height = IMAGE_INSTANCE_HEIGHT (p); sdga.width = IMAGE_INSTANCE_WIDTH (p); - if (redisplay_display_boxes_in_window_p (w, db, &sdga) < 0) + if (redisplay_display_boxes_in_window_p (w, db, &sdga) == 0 + || + /* We only want to do full subwindow display for windows that + are completely in the gutter, otherwise we must clip to be + safe. */ + display_boxes_in_gutter_p (XFRAME (w->frame), db, &sdga) <= 0) { map_subwindow (image_instance, db->xpos, db->ypos, dga); } @@ -1751,7 +1758,17 @@ redisplay_normalize_glyph_area (struct display_box* dest, || -glyphsrc->xoffset >= glyphsrc->width || - -glyphsrc->yoffset >= glyphsrc->height) + -glyphsrc->yoffset >= glyphsrc->height + || + /* #### Not sure why this wasn't coped with before but normalizing + to zero width or height is definitely wrong. */ + (dest->xpos + glyphsrc->xoffset + glyphsrc->width > dest->xpos + dest->width + && + dest->width - glyphsrc->xoffset <= 0) + || + (dest->ypos + glyphsrc->yoffset + glyphsrc->height > dest->ypos + dest->height + && + dest->height - glyphsrc->yoffset <= 0)) { /* It's all clipped out */ return 0; @@ -1822,9 +1839,9 @@ redisplay_normalize_display_box (struct display_box* dest, /***************************************************************************** redisplay_display_boxes_in_window_p - Determine whether the require display_glyph_area is completely inside - the window. 0 means the display_box is not in the window. 1 means the - display_box and the display_glyph_area are in the window. -1 means + Determine whether the required display_glyph_area is completely inside + the window. -1 means the display_box is not in the window. 1 means the + display_box and the display_glyph_area are in the window. 0 means the display_box is in the window but the display_glyph_area is not. ****************************************************************************/ static int @@ -1840,8 +1857,8 @@ redisplay_display_boxes_in_window_p (struct window* w, if (db->xpos < left || db->ypos < top || db->xpos + db->width > right || db->ypos + db->height > bottom) - /* We are not displaying in a window at all */ - return 0; + /* We are not displaying in a window at all */ + return -1; if (db->xpos + dga->xoffset >= left && @@ -1852,7 +1869,7 @@ redisplay_display_boxes_in_window_p (struct window* w, db->ypos + dga->yoffset + dga->height <= bottom) return 1; - return -1; + return 0; } /***************************************************************************** @@ -1898,7 +1915,7 @@ redisplay_calculate_display_boxes (struct display_line *dl, int xpos, If window is topmost, clear the internal border above it. ****************************************************************************/ -static void +void redisplay_clear_top_of_window (struct window *w) { Lisp_Object window; @@ -2135,6 +2152,7 @@ redisplay_update_line (struct window *w, int first_line, int last_line, larger impact on their sizing. */ /* #### See if we can get away with only calling this if max_line_len is greater than the window_char_width. */ + /* #### BILL!!! Should we do this for GTK as well? */ #if defined(HAVE_SCROLLBARS) && defined(HAVE_X_WINDOWS) { extern int stupid_vertical_scrollbar_drag_hack; @@ -2263,7 +2281,7 @@ redisplay_output_window (struct window *w) /* If the window's structure has changed clear the internal border above it if it is topmost (the function will check). */ - if (f->windows_structure_changed) + if (f->windows_structure_changed || f->faces_changed) redisplay_clear_top_of_window (w); /* Output each line. */