From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: YAMAMOTO Mitsuharu Newsgroups: gmane.emacs.devel Subject: Re: Extending fringe backgrounds to scroll bar gaps Date: Sat, 23 Jun 2007 11:05:56 +0900 Organization: Faculty of Science, Chiba University Message-ID: References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII X-Trace: sea.gmane.org 1182564374 21573 80.91.229.12 (23 Jun 2007 02:06:14 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Sat, 23 Jun 2007 02:06:14 +0000 (UTC) Cc: rms@gnu.org, emacs-devel@gnu.org To: "Juanma Barranquero" Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Jun 23 04:06:11 2007 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1I1v0s-0001zA-Ff for ged-emacs-devel@m.gmane.org; Sat, 23 Jun 2007 04:06:11 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1I1v0r-0001sS-Sm for ged-emacs-devel@m.gmane.org; Fri, 22 Jun 2007 22:06:09 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1I1v0m-0001qA-Q3 for emacs-devel@gnu.org; Fri, 22 Jun 2007 22:06:04 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1I1v0k-0001pm-G5 for emacs-devel@gnu.org; Fri, 22 Jun 2007 22:06:04 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1I1v0j-0001pj-Vr for emacs-devel@gnu.org; Fri, 22 Jun 2007 22:06:02 -0400 Original-Received: from ntp.math.s.chiba-u.ac.jp ([133.82.132.2] helo=mathmail.math.s.chiba-u.ac.jp) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1I1v0g-0001jp-OX; Fri, 22 Jun 2007 22:05:59 -0400 Original-Received: from church.math.s.chiba-u.ac.jp (church [133.82.132.36]) by mathmail.math.s.chiba-u.ac.jp (Postfix) with ESMTP id B60232C43; Sat, 23 Jun 2007 11:05:56 +0900 (JST) In-Reply-To: User-Agent: Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.8 (=?ISO-8859-4?Q?Shij=F2?=) APEL/10.6 Emacs/22.1.50 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI) X-detected-kernel: NetBSD 3.0 (DF) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:73678 Archived-At: >>>>> On Fri, 22 Jun 2007 10:19:18 +0200, "Juanma Barranquero" said: > It doesn't help. The redisplay bug is still present. BTW, it only > happens AFAICS when `indicate-empty-lines' is t and the fringe is > showing the empty lines bitmap. I could reproduce it also on Mac with indicate-empty-lines, left scroll bar, and half-width fringes. The fringe background was not extended when the bitmap fills the fringe. YAMAMOTO Mitsuharu mituharu@math.s.chiba-u.ac.jp Index: src/w32term.c =================================================================== RCS file: /cvsroot/emacs/emacs/src/w32term.c,v retrieving revision 1.260 diff -c -p -r1.260 w32term.c *** src/w32term.c 20 Jun 2007 08:32:59 -0000 1.260 --- src/w32term.c 22 Jun 2007 23:20:32 -0000 *************** w32_draw_fringe_bitmap (w, row, p) *** 682,687 **** --- 682,741 ---- hdc = get_frame_dc (f); + if (!p->overlay_p) + { + int bx = p->bx, by = p->by, nx = p->nx, ny = p->ny; + + /* If the fringe is adjacent to the left (right) scroll bar of a + leftmost (rightmost, respectively) window, then extend its + background to the gap between the fringe and the bar. */ + if ((WINDOW_LEFTMOST_P (w) + && WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w)) + || (WINDOW_RIGHTMOST_P (w) + && WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w))) + { + int sb_width = WINDOW_CONFIG_SCROLL_BAR_WIDTH (w); + + if (sb_width > 0) + { + int left = WINDOW_SCROLL_BAR_AREA_X (w); + int width = (WINDOW_CONFIG_SCROLL_BAR_COLS (w) + * FRAME_COLUMN_WIDTH (f)); + + if (bx < 0) + { + /* Bitmap fills the fringe. */ + if (left + width == p->x) + bx = left + sb_width; + else if (p->x + p->wd == left) + bx = left; + if (bx >= 0) + { + int header_line_height = WINDOW_HEADER_LINE_HEIGHT (w); + + nx = width - sb_width; + by = WINDOW_TO_FRAME_PIXEL_Y (w, max (header_line_height, + row->y)); + ny = row->visible_height; + } + } + else + { + if (left + width == bx) + { + bx = left + sb_width; + nx += width - sb_width; + } + else if (bx + nx == left) + nx += width - sb_width; + } + } + } + + if (bx >= 0 && nx > 0) + w32_fill_area (f, hdc, face->background, bx, by, nx, ny); + } + /* Must clip because of partially visible lines. */ rowY = WINDOW_TO_FRAME_PIXEL_Y (w, row->y); if (p->y < rowY) *************** w32_draw_fringe_bitmap (w, row, p) *** 699,710 **** else w32_clip_to_row (w, row, -1, hdc); - if (p->bx >= 0 && !p->overlay_p) - { - w32_fill_area (f, hdc, face->background, - p->bx, p->by, p->nx, p->ny); - } - if (p->which && p->which < max_fringe_bmp) { HBITMAP pixmap = fringe_bmp[p->which]; --- 753,758 ---- *************** x_scroll_bar_create (w, top, left, width *** 3637,3642 **** --- 3685,3691 ---- XSETINT (bar->start, 0); XSETINT (bar->end, 0); bar->dragging = Qnil; + bar->fringe_extended_p = Qnil; /* Requires geometry to be set before call to create the real window */ *************** w32_set_vertical_scroll_bar (w, portion, *** 3700,3705 **** --- 3749,3755 ---- struct scroll_bar *bar; int top, height, left, sb_left, width, sb_width; int window_y, window_height; + int fringe_extended_p; /* Get window dimensions. */ window_box (w, -1, 0, &window_y, 0, &window_height); *************** w32_set_vertical_scroll_bar (w, portion, *** 3719,3727 **** /* Compute the left edge of the scroll bar. */ if (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w)) ! sb_left = left + width - sb_width - (width - sb_width) / 2; else ! sb_left = left + (width - sb_width) / 2; /* Does the scroll bar exist yet? */ if (NILP (w->vertical_scroll_bar)) --- 3769,3788 ---- /* Compute the left edge of the scroll bar. */ if (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w)) ! sb_left = left + (WINDOW_RIGHTMOST_P (w) ? width - sb_width : 0); else ! sb_left = left + (WINDOW_LEFTMOST_P (w) ? 0 : width - sb_width); ! ! if (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w)) ! fringe_extended_p = (WINDOW_LEFTMOST_P (w) ! && WINDOW_LEFT_FRINGE_WIDTH (w) ! && (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w) ! || WINDOW_LEFT_MARGIN_COLS (w) == 0)); ! else ! fringe_extended_p = (WINDOW_RIGHTMOST_P (w) ! && WINDOW_RIGHT_FRINGE_WIDTH (w) ! && (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w) ! || WINDOW_RIGHT_MARGIN_COLS (w) == 0)); /* Does the scroll bar exist yet? */ if (NILP (w->vertical_scroll_bar)) *************** w32_set_vertical_scroll_bar (w, portion, *** 3731,3737 **** if (width > 0 && height > 0) { hdc = get_frame_dc (f); ! w32_clear_area (f, hdc, left, top, width, height); release_frame_dc (f, hdc); } UNBLOCK_INPUT; --- 3792,3801 ---- if (width > 0 && height > 0) { hdc = get_frame_dc (f); ! if (fringe_extended_p) ! w32_clear_area (f, hdc, sb_left, top, sb_width, height); ! else ! w32_clear_area (f, hdc, left, top, width, height); release_frame_dc (f, hdc); } UNBLOCK_INPUT; *************** w32_set_vertical_scroll_bar (w, portion, *** 3750,3756 **** if ( XINT (bar->left) == sb_left && XINT (bar->top) == top && XINT (bar->width) == sb_width ! && XINT (bar->height) == height ) { /* Redraw after clear_frame. */ if (!my_show_window (f, hwnd, SW_NORMAL)) --- 3814,3821 ---- if ( XINT (bar->left) == sb_left && XINT (bar->top) == top && XINT (bar->width) == sb_width ! && XINT (bar->height) == height ! && !NILP (bar->fringe_extended_p) == fringe_extended_p ) { /* Redraw after clear_frame. */ if (!my_show_window (f, hwnd, SW_NORMAL)) *************** w32_set_vertical_scroll_bar (w, portion, *** 3767,3777 **** hdc = get_frame_dc (f); /* Since Windows scroll bars are smaller than the space reserved for them on the frame, we have to clear "under" them. */ ! w32_clear_area (f, hdc, ! left, ! top, ! width, ! height); release_frame_dc (f, hdc); } /* Make sure scroll bar is "visible" before moving, to ensure the --- 3832,3841 ---- hdc = get_frame_dc (f); /* Since Windows scroll bars are smaller than the space reserved for them on the frame, we have to clear "under" them. */ ! if (fringe_extended_p) ! w32_clear_area (f, hdc, sb_left, top, sb_width, height); ! else ! w32_clear_area (f, hdc, left, top, width, height); release_frame_dc (f, hdc); } /* Make sure scroll bar is "visible" before moving, to ensure the *************** w32_set_vertical_scroll_bar (w, portion, *** 3801,3806 **** --- 3865,3872 ---- UNBLOCK_INPUT; } } + bar->fringe_extended_p = fringe_extended_p ? Qt : Qnil; + w32_set_scroll_bar_thumb (bar, portion, position, whole); XSETVECTOR (w->vertical_scroll_bar, bar); Index: src/w32term.h =================================================================== RCS file: /cvsroot/emacs/emacs/src/w32term.h,v retrieving revision 1.68 diff -c -p -r1.68 w32term.h *** src/w32term.h 22 Feb 2007 22:50:15 -0000 1.68 --- src/w32term.h 22 Jun 2007 23:20:32 -0000 *************** struct scroll_bar { *** 487,492 **** --- 487,496 ---- place where the user grabbed it. If the handle isn't currently being dragged, this is Qnil. */ Lisp_Object dragging; + + /* t if the background of the fringe that is adjacent to a scroll + bar is extended to the gap between the fringe and the bar. */ + Lisp_Object fringe_extended_p; }; /* The number of elements a vector holding a struct scroll_bar needs. */ *************** extern void w32_fill_rect (); *** 576,589 **** extern void w32_clear_window (); #define w32_fill_area(f,hdc,pix,x,y,nx,ny) \ ! { \ RECT rect; \ rect.left = x; \ rect.top = y; \ rect.right = x + nx; \ rect.bottom = y + ny; \ w32_fill_rect (f,hdc,pix,&rect); \ ! } #define w32_clear_rect(f,hdc,lprect) \ w32_fill_rect (f,hdc,f->output_data.x->background_pixel,lprect) --- 580,593 ---- extern void w32_clear_window (); #define w32_fill_area(f,hdc,pix,x,y,nx,ny) \ ! do { \ RECT rect; \ rect.left = x; \ rect.top = y; \ rect.right = x + nx; \ rect.bottom = y + ny; \ w32_fill_rect (f,hdc,pix,&rect); \ ! } while (0) #define w32_clear_rect(f,hdc,lprect) \ w32_fill_rect (f,hdc,f->output_data.x->background_pixel,lprect) Index: src/xterm.c =================================================================== RCS file: /cvsroot/emacs/emacs/src/xterm.c,v retrieving revision 1.947 diff -c -p -r1.947 xterm.c *** src/xterm.c 8 Jun 2007 20:06:31 -0000 1.947 --- src/xterm.c 22 Jun 2007 23:20:32 -0000 *************** x_draw_fringe_bitmap (w, row, p) *** 720,727 **** else x_clip_to_row (w, row, -1, gc); ! if (p->bx >= 0 && !p->overlay_p) { /* In case the same realized face is used for fringes and for something displayed in the text (e.g. face `region' on mono-displays, the fill style may have been changed to --- 720,729 ---- else x_clip_to_row (w, row, -1, gc); ! if (!p->overlay_p) { + int bx = p->bx, by = p->by, nx = p->nx, ny = p->ny; + /* In case the same realized face is used for fringes and for something displayed in the text (e.g. face `region' on mono-displays, the fill style may have been changed to *************** x_draw_fringe_bitmap (w, row, p) *** 731,738 **** else XSetForeground (display, face->gc, face->background); ! XFillRectangle (display, window, face->gc, ! p->bx, p->by, p->nx, p->ny); if (!face->stipple) XSetForeground (display, face->gc, face->foreground); --- 733,787 ---- else XSetForeground (display, face->gc, face->background); ! #ifdef USE_TOOLKIT_SCROLL_BARS ! /* If the fringe is adjacent to the left (right) scroll bar of a ! leftmost (rightmost, respectively) window, then extend its ! background to the gap between the fringe and the bar. */ ! if ((WINDOW_LEFTMOST_P (w) ! && WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w)) ! || (WINDOW_RIGHTMOST_P (w) ! && WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w))) ! { ! int sb_width = WINDOW_CONFIG_SCROLL_BAR_WIDTH (w); ! ! if (sb_width > 0) ! { ! int left = WINDOW_SCROLL_BAR_AREA_X (w); ! int width = (WINDOW_CONFIG_SCROLL_BAR_COLS (w) ! * FRAME_COLUMN_WIDTH (f)); ! ! if (bx < 0) ! { ! /* Bitmap fills the fringe. */ ! if (left + width == p->x) ! bx = left + sb_width; ! else if (p->x + p->wd == left) ! bx = left; ! if (bx >= 0) ! { ! int header_line_height = WINDOW_HEADER_LINE_HEIGHT (w); ! ! nx = width - sb_width; ! by = WINDOW_TO_FRAME_PIXEL_Y (w, max (header_line_height, ! row->y)); ! ny = row->visible_height; ! } ! } ! else ! { ! if (left + width == bx) ! { ! bx = left + sb_width; ! nx += width - sb_width; ! } ! else if (bx + nx == left) ! nx += width - sb_width; ! } ! } ! } ! #endif ! if (bx >= 0 && nx > 0) ! XFillRectangle (display, window, face->gc, bx, by, nx, ny); if (!face->stipple) XSetForeground (display, face->gc, face->foreground); *************** x_scroll_bar_create (w, top, left, width *** 4787,4792 **** --- 4836,4844 ---- XSETINT (bar->start, 0); XSETINT (bar->end, 0); bar->dragging = Qnil; + #ifdef USE_TOOLKIT_SCROLL_BARS + bar->fringe_extended_p = Qnil; + #endif /* Add bar to its frame's list of scroll bars. */ bar->next = FRAME_SCROLL_BARS (f); *************** XTset_vertical_scroll_bar (w, portion, w *** 4979,4984 **** --- 5031,5039 ---- struct scroll_bar *bar; int top, height, left, sb_left, width, sb_width; int window_y, window_height; + #ifdef USE_TOOLKIT_SCROLL_BARS + int fringe_extended_p; + #endif /* Get window dimensions. */ window_box (w, -1, 0, &window_y, 0, &window_height); *************** XTset_vertical_scroll_bar (w, portion, w *** 4999,5013 **** /* Compute the left edge of the scroll bar. */ #ifdef USE_TOOLKIT_SCROLL_BARS if (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w)) ! sb_left = (left + ! (WINDOW_RIGHTMOST_P (w) ! ? width - sb_width - (width - sb_width) / 2 ! : 0)); ! else ! sb_left = (left + ! (WINDOW_LEFTMOST_P (w) ! ? (width - sb_width) / 2 ! : width - sb_width)); #else if (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w)) sb_left = left + width - sb_width; --- 5054,5062 ---- /* Compute the left edge of the scroll bar. */ #ifdef USE_TOOLKIT_SCROLL_BARS if (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w)) ! sb_left = left + (WINDOW_RIGHTMOST_P (w) ? width - sb_width : 0); ! else ! sb_left = left + (WINDOW_LEFTMOST_P (w) ? 0 : width - sb_width); #else if (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w)) sb_left = left + width - sb_width; *************** XTset_vertical_scroll_bar (w, portion, w *** 5015,5028 **** sb_left = left; #endif /* Does the scroll bar exist yet? */ if (NILP (w->vertical_scroll_bar)) { if (width > 0 && height > 0) { BLOCK_INPUT; ! x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), ! left, top, width, height, False); UNBLOCK_INPUT; } --- 5064,5096 ---- sb_left = left; #endif + #ifdef USE_TOOLKIT_SCROLL_BARS + if (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w)) + fringe_extended_p = (WINDOW_LEFTMOST_P (w) + && WINDOW_LEFT_FRINGE_WIDTH (w) + && (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w) + || WINDOW_LEFT_MARGIN_COLS (w) == 0)); + else + fringe_extended_p = (WINDOW_RIGHTMOST_P (w) + && WINDOW_RIGHT_FRINGE_WIDTH (w) + && (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w) + || WINDOW_RIGHT_MARGIN_COLS (w) == 0)); + #endif + /* Does the scroll bar exist yet? */ if (NILP (w->vertical_scroll_bar)) { if (width > 0 && height > 0) { BLOCK_INPUT; ! #ifdef USE_TOOLKIT_SCROLL_BARS ! if (fringe_extended_p) ! x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), ! sb_left, top, sb_width, height, False); ! else ! #endif ! x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), ! left, top, width, height, False); UNBLOCK_INPUT; } *************** XTset_vertical_scroll_bar (w, portion, w *** 5049,5061 **** #ifdef USE_TOOLKIT_SCROLL_BARS /* Move/size the scroll bar widget. */ ! if (mask) { /* Since toolkit scroll bars are smaller than the space reserved for them on the frame, we have to clear "under" them. */ if (width > 0 && height > 0) ! x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), ! left, top, width, height, False); #ifdef USE_GTK xg_update_scrollbar_pos (f, SCROLL_BAR_X_WINDOW (bar), --- 5117,5135 ---- #ifdef USE_TOOLKIT_SCROLL_BARS /* Move/size the scroll bar widget. */ ! if (mask || !NILP (bar->fringe_extended_p) != fringe_extended_p) { /* Since toolkit scroll bars are smaller than the space reserved for them on the frame, we have to clear "under" them. */ if (width > 0 && height > 0) ! { ! if (fringe_extended_p) ! x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), ! sb_left, top, sb_width, height, False); ! else ! x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), ! left, top, width, height, False); ! } #ifdef USE_GTK xg_update_scrollbar_pos (f, SCROLL_BAR_X_WINDOW (bar), *************** XTset_vertical_scroll_bar (w, portion, w *** 5130,5135 **** --- 5204,5211 ---- } #ifdef USE_TOOLKIT_SCROLL_BARS + bar->fringe_extended_p = fringe_extended_p ? Qt : Qnil; + x_set_toolkit_scroll_bar_thumb (bar, portion, position, whole); #else /* not USE_TOOLKIT_SCROLL_BARS */ /* Set the scroll bar's current state, unless we're currently being Index: src/xterm.h =================================================================== RCS file: /cvsroot/emacs/emacs/src/xterm.h,v retrieving revision 1.190 diff -c -p -r1.190 xterm.h *** src/xterm.h 21 Jan 2007 04:18:14 -0000 1.190 --- src/xterm.h 22 Jun 2007 23:20:33 -0000 *************** struct scroll_bar *** 807,812 **** --- 807,818 ---- place where the user grabbed it. If the handle isn't currently being dragged, this is Qnil. */ Lisp_Object dragging; + + #ifdef USE_TOOLKIT_SCROLL_BARS + /* t if the background of the fringe that is adjacent to a scroll + bar is extended to the gap between the fringe and the bar. */ + Lisp_Object fringe_extended_p; + #endif }; /* The number of elements a vector holding a struct scroll_bar needs. */