📄 rxvtlib_scrollbar.c
字号:
if (o->scrollbarGC == None) { XGCValues gcvalue;#ifdef XTERM_SCROLLBAR sb_width = SB_WIDTH - 1; gcvalue.stipple = XCreateBitmapFromData (o->Xdisplay, o->scrollBar.win, o->sb_bits, 12, 2); if (!gcvalue.stipple) { print_error ("can't create bitmap"); o->killed = EXIT_FAILURE | DO_EXIT; return 0; } gcvalue.fill_style = FillOpaqueStippled; gcvalue.foreground = o->PixColors[Color_fg]; gcvalue.background = o->PixColors[Color_bg]; o->scrollbarGC = XCreateGC (o->Xdisplay, o->scrollBar.win, GCForeground | GCBackground | GCFillStyle | GCStipple, &gcvalue); gcvalue.foreground = o->PixColors[Color_border]; o->ShadowGC = XCreateGC (o->Xdisplay, o->scrollBar.win, GCForeground, &gcvalue);#else /* XTERM_SCROLLBAR */ sb_width = SB_WIDTH; gcvalue.foreground = o->PixColors[Color_trough]; if (o->sb_shadow) { XSetWindowBackground (o->Xdisplay, o->scrollBar.win, gcvalue.foreground); XClearWindow (o->Xdisplay, o->scrollBar.win); } gcvalue.foreground = (o->Xdepth <= 2 ? o->PixColors[Color_fg] : o->PixColors[Color_scroll]); o->scrollbarGC = XCreateGC (o->Xdisplay, o->scrollBar.win, GCForeground, &gcvalue); gcvalue.foreground = o->PixColors[Color_topShadow]; o->topShadowGC = XCreateGC (o->Xdisplay, o->scrollBar.win, GCForeground, &gcvalue); gcvalue.foreground = o->PixColors[Color_bottomShadow]; o->botShadowGC = XCreateGC (o->Xdisplay, o->scrollBar.win, GCForeground, &gcvalue);#endif /* XTERM_SCROLLBAR */ } if (update) { int top = (o->TermWin.nscrolled - o->TermWin.view_start); int bot = top + (o->TermWin.nrow - 1); int len = max ((o->TermWin.nscrolled + (o->TermWin.nrow - 1)), 1); int adj = ((bot - top) * scrollbar_size()) % len; o->scrollBar.top = (o->scrollBar.beg + (top * scrollbar_size ()) / len); scrollbar_len = (((bot - top) * scrollbar_size()) / len + SCROLL_MINHEIGHT + ((adj > 0) ? 1 : 0)); o->scrollBar.bot = (o->scrollBar.top + scrollbar_len); /* no change */ if ((o->scrollBar.top == last_top) && (o->scrollBar.bot == last_bot) && ((o->scrollBar.state == last_state) || (!scrollbar_isUpDn()))) return 0; }/* instead of XClearWindow (Xdisplay, scrollBar.win); */#ifdef XTERM_SCROLLBAR xsb = (o->Options & Opt_scrollBar_right) ? 1 : 0;#endif if (last_top < o->scrollBar.top) XClearArea (o->Xdisplay, o->scrollBar.win, o->sb_shadow + xsb, last_top, sb_width, (o->scrollBar.top - last_top), False); if (o->scrollBar.bot < last_bot) XClearArea (o->Xdisplay, o->scrollBar.win, o->sb_shadow + xsb, o->scrollBar.bot, sb_width, (last_bot - o->scrollBar.bot), False); last_top = o->scrollBar.top; last_bot = o->scrollBar.bot;/* scrollbar slider */#ifdef XTERM_SCROLLBAR XFillRectangle (o->Xdisplay, o->scrollBar.win, o->scrollbarGC, xsb + 1, o->scrollBar.top, sb_width - 2, scrollbar_len); XDrawLine (o->Xdisplay, o->scrollBar.win, o->ShadowGC, xsb ? 0 : o->sb_width, o->scrollBar.beg, xsb ? 0 : sb_width, o->scrollBar.end);#else#ifdef SB_BORDER { int xofs; if (o->Options & Opt_scrollBar_right) xofs = 0; else xofs = (o->sb_shadow) ? SB_WIDTH : SB_WIDTH - 1; XDrawLine (o->Xdisplay, o->scrollBar.win, o->botShadowGC, xofs, 0, xofs, o->scrollBar.end + SB_WIDTH); }#endif XFillRectangle (o->Xdisplay, o->scrollBar.win, o->scrollbarGC, o->sb_shadow, o->scrollBar.top, sb_width, scrollbar_len); if (o->sb_shadow) /* trough shadow */ rxvtlib_Draw_Shadow (o, o->scrollBar.win, o->botShadowGC, o->topShadowGC, 0, 0, (sb_width + 2 * o->sb_shadow), (o->scrollBar.end + (sb_width + 1) + o->sb_shadow));/* shadow for scrollbar slider */ rxvtlib_Draw_Shadow (o, o->scrollBar.win, o->topShadowGC, o->botShadowGC, o->sb_shadow, o->scrollBar.top, sb_width, scrollbar_len);/* * Redraw scrollbar arrows */ rxvtlib_Draw_button (o, o->sb_shadow, o->sb_shadow, (scrollbar_isUp ()? -1 : +1), UP); rxvtlib_Draw_button (o, o->sb_shadow, (o->scrollBar.end + 1), (scrollbar_isDn ()? -1 : +1), DN);#endif /* XTERM_SCROLLBAR */ last_top = o->scrollBar.top; last_bot = o->scrollBar.bot; last_state = o->scrollBar.state;#else /* NEXT_SCROLLBAR */ Pixmap buffer; int height = o->scrollBar.end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING; if (o->blackGC == NULL) rxvtlib_init_scrollbar_stuff (o); if (o->killed) return 0; if (update) { int top = (o->TermWin.nscrolled - o->TermWin.view_start); int bot = top + (o->TermWin.nrow - 1); int len = max ((o->TermWin.nscrolled + (o->TermWin.nrow - 1)), 1); int adj = ((bot - top) * scrollbar_size()) % len; o->scrollBar.top = (o->scrollBar.beg + (top * scrollbar_size ()) / len); scrollbar_len = (((bot - top) * scrollbar_size()) / len + SCROLL_MINHEIGHT + ((adj > 0) ? 1 : 0)); o->scrollBar.bot = (o->scrollBar.top + scrollbar_len); /* no change */ if ((o->scrollBar.top == last_top) && (o->scrollBar.bot == last_bot) && ((o->scrollBar.state == last_state) || (!scrollbar_isUpDn()))) return 0; }/* create double buffer */ buffer = XCreatePixmap (o->Xdisplay, o->scrollBar.win, SB_WIDTH + 1, height, o->Xdepth); last_top = o->scrollBar.top; last_bot = o->scrollBar.bot; last_state = o->scrollBar.state;/* draw the background */ XFillRectangle (o->Xdisplay, buffer, o->grayGC, 0, 0, SB_WIDTH + 1, height); XDrawRectangle(o->Xdisplay, buffer, o->blackGC, 0, -SB_BORDER_WIDTH, SB_WIDTH, height + SB_BORDER_WIDTH); if (o->TermWin.nscrolled > 0) { XFillRectangle(o->Xdisplay, buffer, o->stippleGC, SB_LEFT_PADDING, SB_PADDING, SB_BUTTON_WIDTH, height - SB_BUTTON_TOTAL_HEIGHT - SB_PADDING); XFillRectangle(o->Xdisplay, buffer, o->grayGC, SB_LEFT_PADDING, o->scrollBar.top + SB_PADDING, SB_BUTTON_WIDTH, scrollbar_len); rxvtlib_drawBevel(o, buffer, SB_BUTTON_BEVEL_X, o->scrollBar.top + SB_PADDING, SB_BUTTON_WIDTH, scrollbar_len); rxvtlib_drawBevel(o, buffer, SB_BUTTON_BEVEL_X, height - SB_BUTTON_BOTH_HEIGHT, SB_BUTTON_WIDTH, SB_BUTTON_HEIGHT); rxvtlib_drawBevel(o, buffer, SB_BUTTON_BEVEL_X, height - SB_BUTTON_SINGLE_HEIGHT, SB_BUTTON_WIDTH, SB_BUTTON_HEIGHT); XCopyArea (o->Xdisplay, o->dimple, buffer, o->whiteGC, 0, 0, SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT, (SB_WIDTH - SCROLLER_DIMPLE_WIDTH) / 2, o->scrollBar.top + SB_BEVEL_WIDTH_UPPER_LEFT + (scrollbar_len - SCROLLER_DIMPLE_HEIGHT) / 2); if (scrollbar_isUp ()) XCopyArea(o->Xdisplay, o->upArrowHi, buffer, o->whiteGC, 0, 0, ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X, height - (SB_BUTTON_BOTH_HEIGHT - SB_BEVEL_WIDTH_UPPER_LEFT)); else XCopyArea(o->Xdisplay, o->upArrow, buffer, o->whiteGC, 0, 0, ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X, height - (SB_BUTTON_BOTH_HEIGHT - SB_BEVEL_WIDTH_UPPER_LEFT)); if (scrollbar_isDn ()) XCopyArea(o->Xdisplay, o->downArrowHi, buffer, o->whiteGC, 0, 0, ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X, height - (SB_BUTTON_SINGLE_HEIGHT - SB_BEVEL_WIDTH_UPPER_LEFT)); else XCopyArea(o->Xdisplay, o->downArrow, buffer, o->whiteGC, 0, 0, ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X, height - (SB_BUTTON_SINGLE_HEIGHT - SB_BEVEL_WIDTH_UPPER_LEFT)); } else { XFillRectangle(o->Xdisplay, buffer, o->stippleGC, SB_LEFT_PADDING, SB_PADDING, SB_BUTTON_WIDTH, height - SB_MARGIN_SPACE); } if (o->Options & Opt_scrollBar_right) XCopyArea (o->Xdisplay, buffer, o->scrollBar.win, o->grayGC, 0, 0, SB_WIDTH + SB_BORDER_WIDTH, height, 0, 0); else XCopyArea (o->Xdisplay, buffer, o->scrollBar.win, o->grayGC, 0, 0, SB_WIDTH + SB_BORDER_WIDTH, height, -SB_BORDER_WIDTH, 0); XFreePixmap (o->Xdisplay, buffer);#endif /* ! NEXT_SCROLLBAR */ return 1;}/* EXTPROTO */int rxvtlib_scrollbar_mapping (rxvtlib *o, int map){ int change = 0; if (map && !scrollbar_visible ()) { o->scrollBar.state = 1; if (o->scrollBar.win == 0) return 0; XMapWindow (o->Xdisplay, o->scrollBar.win); change = 1; } else if (!map && scrollbar_visible ()) { o->scrollBar.state = 0; XUnmapWindow (o->Xdisplay, o->scrollBar.win); change = 1; } return change;}/* EXTPROTO */void rxvtlib_map_scrollBar (rxvtlib *o, int map){ if (rxvtlib_scrollbar_mapping (o, map)) { rxvtlib_resize_all_windows (o); rxvtlib_scr_touch (o); }}/*----------------------- end-of-file (C source) -----------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -