X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fredisplay-x.c;h=d55a7982dadd448518b735174a64452e7d4593ad;hb=44ea030ec31ae441e59974eb9f6b2a9404611cd8;hp=65551637ae8cd96acd7c4b50233565ba2635518a;hpb=44e716ef11bd794a51f8c5b56c4f3f10a7dbf217;p=chise%2Fxemacs-chise.git.1 diff --git a/src/redisplay-x.c b/src/redisplay-x.c index 6555163..b6247a5 100644 --- a/src/redisplay-x.c +++ b/src/redisplay-x.c @@ -74,6 +74,8 @@ static void x_redraw_exposed_window (struct window *w, int x, int y, int width, int height); static void x_redraw_exposed_windows (Lisp_Object window, int x, int y, int width, int height); +static void x_clear_region (Lisp_Object window, face_index findex, int x, + int y, int width, int height); static void x_output_eol_cursor (struct window *w, struct display_line *dl, int xpos, face_index findex); static void x_clear_frame (struct frame *f); @@ -195,7 +197,7 @@ separate_textual_runs (unsigned char *text_storage, char_converter.reg[0] = XCHARSET_ID (charset); char_converter.reg[1] = byte1; char_converter.reg[2] = byte2; - ccl_driver (&char_converter, 0, 0, 0, 0, CCL_MODE_ENCODING); + ccl_driver (&char_converter, 0, 0, 0, 0); byte1 = char_converter.reg[1]; byte2 = char_converter.reg[2]; } @@ -414,7 +416,7 @@ x_output_display_block (struct window *w, struct display_line *dl, int block, /* Clear in case a cursor was formerly here. */ int height = dl->ascent + dl->descent - dl->clip; - redisplay_clear_region (window, findex, xpos, dl->ypos - dl->ascent, + x_clear_region (window, findex, xpos, dl->ypos - dl->ascent, rb->width, height); elt++; } @@ -488,12 +490,9 @@ x_output_display_block (struct window *w, struct display_line *dl, int block, case IMAGE_POINTER: abort (); - case IMAGE_WIDGET: case IMAGE_SUBWINDOW: - redisplay_output_subwindow (w, dl, instance, xpos, - rb->object.dglyph.xoffset, start_pixpos, - rb->width, findex, cursor_start, - cursor_width, cursor_height); + /* #### implement me */ + break; case IMAGE_NOTHING: /* nothing is as nothing does */ @@ -694,18 +693,8 @@ x_get_gc (struct device *d, Lisp_Object font, Lisp_Object fg, Lisp_Object bg, mask |= GCBackground; } - /* This special case comes from a request to draw text with a face which has - the dim property. We'll use a stippled foreground GC. */ - if (EQ (bg_pmap, Qdim)) - { - assert (DEVICE_X_GRAY_PIXMAP (d) != None); - - gcv.fill_style = FillStippled; - gcv.stipple = DEVICE_X_GRAY_PIXMAP (d); - mask |= (GCFillStyle | GCStipple); - } - else if (IMAGE_INSTANCEP (bg_pmap) - && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap))) + if (IMAGE_INSTANCEP (bg_pmap) + && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap))) { if (XIMAGE_INSTANCE_PIXMAP_DEPTH (bg_pmap) == 0) { @@ -903,21 +892,21 @@ x_output_string (struct window *w, struct display_line *dl, if (ypos1_line < ypos1_string) { - redisplay_clear_region (window, findex, clear_start, ypos1_line, + x_clear_region (window, findex, clear_start, ypos1_line, clear_end - clear_start, ypos1_string - ypos1_line); } if (ypos2_line > ypos2_string) { - redisplay_clear_region (window, findex, clear_start, ypos2_string, + x_clear_region (window, findex, clear_start, ypos2_string, clear_end - clear_start, ypos2_line - ypos2_string); } } else { - redisplay_clear_region (window, findex, clear_start, + x_clear_region (window, findex, clear_start, dl->ypos - dl->ascent, clear_end - clear_start, height); } @@ -926,18 +915,6 @@ x_output_string (struct window *w, struct display_line *dl, if (cursor && cursor_cachel && focus && NILP (bar_cursor_value)) gc = x_get_gc (d, font, cursor_cachel->foreground, cursor_cachel->background, Qnil, Qnil); - else if (cachel->dim) - { - /* Ensure the gray bitmap exists */ - if (DEVICE_X_GRAY_PIXMAP (d) == None) - DEVICE_X_GRAY_PIXMAP (d) = - XCreateBitmapFromData (dpy, x_win, (char *)gray_bits, - gray_width, gray_height); - - /* Request a GC with the gray stipple pixmap to draw dimmed text */ - gc = x_get_gc (d, font, cachel->foreground, cachel->background, - Qdim, Qnil); - } else gc = x_get_gc (d, font, cachel->foreground, cachel->background, Qnil, Qnil); @@ -1335,7 +1312,7 @@ x_output_pixmap (struct window *w, struct display_line *dl, clear_width = width; } - redisplay_clear_region (window, findex, clear_x, clear_y, + x_clear_region (window, findex, clear_x, clear_y, clear_width, clear_height); } @@ -1411,7 +1388,7 @@ x_output_vertical_divider (struct window *w, int clear) unsigned long mask; int x, y1, y2, width, shadow_thickness, spacing, line_width; face_index div_face = get_builtin_face_cache_index (w, Vvertical_divider_face); - + width = window_divider_width (w); shadow_thickness = XINT (w->vertical_divider_shadow_thickness); spacing = XINT (w->vertical_divider_spacing); @@ -1419,20 +1396,20 @@ x_output_vertical_divider (struct window *w, int clear) x = WINDOW_RIGHT (w) - width; y1 = WINDOW_TOP (w); y2 = WINDOW_BOTTOM (w); - + memset (&gcv, ~0, sizeof (XGCValues)); - + tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, div_face); tmp_color = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel)); - + /* First, get the GC's. */ top_shadow_pixel = tmp_color.pixel; bottom_shadow_pixel = tmp_color.pixel; background_pixel = tmp_color.pixel; - + x_generate_shadow_pixels (f, &top_shadow_pixel, &bottom_shadow_pixel, background_pixel, ef->core.background_pixel); - + tmp_pixel = WINDOW_FACE_CACHEL_FOREGROUND (w, div_face); tmp_color = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel)); gcv.background = tmp_color.pixel; @@ -1440,11 +1417,11 @@ x_output_vertical_divider (struct window *w, int clear) mask = GCForeground | GCBackground | GCGraphicsExposures; /* If we can't distinguish one of the shadows (the color is the same as the - background), it's better to use a pixmap to generate a dithered gray. */ + background), it's better to use a pixmap to generate a dithrered gray. */ if (top_shadow_pixel == background_pixel || bottom_shadow_pixel == background_pixel) use_pixmap = 1; - + if (use_pixmap) { if (DEVICE_X_GRAY_PIXMAP (d) == None) @@ -1453,7 +1430,7 @@ x_output_vertical_divider (struct window *w, int clear) XCreatePixmapFromBitmapData (dpy, x_win, (char *) gray_bits, gray_width, gray_height, 1, 0, 1); } - + tmp_pixel = WINDOW_FACE_CACHEL_BACKGROUND (w, div_face); tmp_color = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel)); gcv.foreground = tmp_color.pixel; @@ -1462,11 +1439,11 @@ x_output_vertical_divider (struct window *w, int clear) gcv.stipple = DEVICE_X_GRAY_PIXMAP (d); top_shadow_gc = gc_cache_lookup (DEVICE_X_GC_CACHE (d), &gcv, (mask | GCStipple | GCFillStyle)); - + tmp_pixel = WINDOW_FACE_CACHEL_FOREGROUND (w, div_face); tmp_color = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (tmp_pixel)); bottom_shadow_pixel = tmp_color.pixel; - + flip_gcs = (bottom_shadow_pixel == WhitePixelOfScreen (DefaultScreenOfDisplay (dpy))); } @@ -1475,20 +1452,20 @@ x_output_vertical_divider (struct window *w, int clear) gcv.foreground = top_shadow_pixel; top_shadow_gc = gc_cache_lookup (DEVICE_X_GC_CACHE (d), &gcv, mask); } - + gcv.foreground = bottom_shadow_pixel; bottom_shadow_gc = gc_cache_lookup (DEVICE_X_GC_CACHE (d), &gcv, mask); - + if (use_pixmap && flip_gcs) { GC tmp_gc = bottom_shadow_gc; bottom_shadow_gc = top_shadow_gc; top_shadow_gc = tmp_gc; } - + gcv.foreground = background_pixel; background_gc = gc_cache_lookup (DEVICE_X_GC_CACHE (d), &gcv, mask); - + /* possibly revert the GC's in case the shadow thickness is < 0. This will give a depressed look to the divider */ if (shadow_thickness < 0) @@ -1498,8 +1475,8 @@ x_output_vertical_divider (struct window *w, int clear) temp = top_shadow_gc; top_shadow_gc = bottom_shadow_gc; bottom_shadow_gc = temp; - - /* better avoid a Bad Address XLib error ;-) */ + + /* better avoid a Bad Adress XLib error ;-) */ shadow_thickness = - shadow_thickness; } @@ -1509,12 +1486,12 @@ x_output_vertical_divider (struct window *w, int clear) XClearArea (dpy, x_win, x, y1, width, y2 - y1, False); /* Draw the divider line. */ - XFillRectangle (dpy, x_win, background_gc, + XFillRectangle (dpy, x_win, background_gc, x + spacing + shadow_thickness, y1, line_width, y2 - y1); - + /* Draw the shadows around the divider line */ - x_output_shadows (f, x + spacing, y1, + x_output_shadows (f, x + spacing, y1, width - 2 * spacing, y2 - y1, top_shadow_gc, bottom_shadow_gc, background_gc, shadow_thickness); @@ -1679,7 +1656,7 @@ x_output_hline (struct window *w, struct display_line *dl, struct rune *rb) x_output_shadows Draw a shadow around the given area using the given GC's. It is the - callers responsibility to set the GC's appropriately. + callers responsibility to ste the GC's appropriately. ****************************************************************************/ void x_output_shadows (struct frame *f, int x, int y, int width, int height, @@ -1837,27 +1814,27 @@ x_clear_to_window_end (struct window *w, int ypos1, int ypos2) XSETWINDOW (window, w); if (window_is_leftmost (w)) - redisplay_clear_region (window, DEFAULT_INDEX, FRAME_LEFT_BORDER_START (f), + x_clear_region (window, DEFAULT_INDEX, FRAME_LEFT_BORDER_START (f), ypos1, FRAME_BORDER_WIDTH (f), height); if (bounds.left_in - bounds.left_out > 0) - redisplay_clear_region (window, + x_clear_region (window, get_builtin_face_cache_index (w, Vleft_margin_face), bounds.left_out, ypos1, bounds.left_in - bounds.left_out, height); if (bounds.right_in - bounds.left_in > 0) - redisplay_clear_region (window, DEFAULT_INDEX, bounds.left_in, ypos1, + x_clear_region (window, DEFAULT_INDEX, bounds.left_in, ypos1, bounds.right_in - bounds.left_in, height); if (bounds.right_out - bounds.right_in > 0) - redisplay_clear_region (window, + x_clear_region (window, get_builtin_face_cache_index (w, Vright_margin_face), bounds.right_in, ypos1, bounds.right_out - bounds.right_in, height); if (window_is_rightmost (w)) - redisplay_clear_region (window, DEFAULT_INDEX, FRAME_RIGHT_BORDER_START (f), + x_clear_region (window, DEFAULT_INDEX, FRAME_RIGHT_BORDER_START (f), ypos1, FRAME_BORDER_WIDTH (f), height); } } @@ -1997,27 +1974,110 @@ x_redraw_exposed_area (struct frame *f, int x, int y, int width, int height) given face. ****************************************************************************/ static void -x_clear_region (Lisp_Object locale, struct device* d, struct frame* f, face_index findex, - int x, int y, - int width, int height, Lisp_Object fcolor, Lisp_Object bcolor, - Lisp_Object background_pixmap) +x_clear_region (Lisp_Object locale, face_index findex, int x, int y, + int width, int height) { + struct window *w = NULL; + struct frame *f = NULL; + struct device *d; + Lisp_Object background_pixmap; + Display *dpy; Window x_win; - GC gc = NULL; + if (WINDOWP (locale)) + { + w = XWINDOW (locale); + f = XFRAME (w->frame); + } + else if (FRAMEP (locale)) + { + w = NULL; + f = XFRAME (locale); + } + else + abort (); + + d = XDEVICE (f->device); dpy = DEVICE_X_DISPLAY (d); x_win = XtWindow (FRAME_X_TEXT_WIDGET (f)); - if (!UNBOUNDP (background_pixmap)) + /* #### This function is going to have to be made cursor aware. */ + if (width && height) { - gc = x_get_gc (d, Qnil, fcolor, bcolor, background_pixmap, Qnil); - } + GC gc = NULL; - if (gc) - XFillRectangle (dpy, x_win, gc, x, y, width, height); - else - XClearArea (dpy, x_win, x, y, width, height, False); + /* #### This isn't quite right for when this function is called + from the toolbar code. */ + background_pixmap = Qunbound; + + /* Don't use a backing pixmap in the border area */ + if (x >= FRAME_LEFT_BORDER_END (f) + && x < FRAME_RIGHT_BORDER_START (f) + && y >= FRAME_TOP_BORDER_END (f) + && y < FRAME_BOTTOM_BORDER_START (f)) + { + Lisp_Object temp; + + if (w) + { + temp = WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP (w, findex); + + if (IMAGE_INSTANCEP (temp) + && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (temp))) + { + /* #### maybe we could implement such that a string + can be a background pixmap? */ + background_pixmap = temp; + } + } + else + { + temp = FACE_BACKGROUND_PIXMAP (Vdefault_face, locale); + + if (IMAGE_INSTANCEP (temp) + && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (temp))) + { + background_pixmap = temp; + } + } + + if (!UNBOUNDP (background_pixmap) && + XIMAGE_INSTANCE_PIXMAP_DEPTH (background_pixmap) == 0) + { + Lisp_Object fcolor, bcolor; + + if (w) + { + fcolor = WINDOW_FACE_CACHEL_FOREGROUND (w, findex); + bcolor = WINDOW_FACE_CACHEL_BACKGROUND (w, findex); + } + else + { + fcolor = FACE_FOREGROUND (Vdefault_face, locale); + bcolor = FACE_BACKGROUND (Vdefault_face, locale); + } + + gc = x_get_gc (d, Qnil, fcolor, bcolor, background_pixmap, Qnil); + } + else + { + Lisp_Object color = (w ? + WINDOW_FACE_CACHEL_BACKGROUND (w, findex) : + FACE_BACKGROUND (Vdefault_face, locale)); + + if (UNBOUNDP (background_pixmap)) + background_pixmap = Qnil; + + gc = x_get_gc (d, Qnil, color, Qnil, background_pixmap, Qnil); + } + } + + if (gc) + XFillRectangle (dpy, x_win, gc, x, y, width, height); + else + XClearArea (dpy, x_win, x, y, width, height, False); + } } /***************************************************************************** @@ -2052,7 +2112,7 @@ x_output_eol_cursor (struct window *w, struct display_line *dl, int xpos, int defheight, defascent; XSETWINDOW (window, w); - redisplay_clear_region (window, findex, x, y, width, height); + x_clear_region (window, findex, x, y, width, height); if (NILP (w->text_cursor_visible_p)) return;