summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pixmap.c12
-rw-r--r--src/pixmap.h2
-rw-r--r--src/scrollbar.c35
-rw-r--r--src/scrollbar.h3
-rw-r--r--src/term.c11
5 files changed, 42 insertions, 21 deletions
diff --git a/src/pixmap.c b/src/pixmap.c
index c693709..5da5618 100644
--- a/src/pixmap.c
+++ b/src/pixmap.c
@@ -458,20 +458,16 @@ redraw_image(unsigned char which) {
scr_touch();
break;
case image_up:
- render_simage(images[image_up].current, scrollbar_get_uparrow_win(), scrollbar_arrow_width(), scrollbar_arrow_width(), image_up, 0);
- scrollbar_show(0);
+ scrollbar_draw_uparrow(IMAGE_STATE_CURRENT, MODE_MASK);
break;
case image_down:
- render_simage(images[image_down].current, scrollbar_get_downarrow_win(), scrollbar_arrow_width(), scrollbar_arrow_width(), image_down, 0);
- scrollbar_show(0);
+ scrollbar_draw_downarrow(IMAGE_STATE_CURRENT, MODE_MASK);
break;
case image_sb:
- render_simage(images[image_sb].current, scrollbar_get_win(), scrollbar_trough_width(), scrollbar_trough_height(), image_sb, 0);
- scrollbar_show(0);
+ scrollbar_draw_trough(IMAGE_STATE_CURRENT, MODE_MASK);
break;
case image_sa:
- render_simage(images[image_sa].current, scrollbar_get_anchor_win(), scrollbar_anchor_width(), scrollbar_anchor_height(), image_sa, 0);
- scrollbar_show(0);
+ scrollbar_draw_anchor(IMAGE_STATE_CURRENT, MODE_MASK);
break;
default:
D_PIXMAP(("redraw_image(): Bad value %u\n", which));
diff --git a/src/pixmap.h b/src/pixmap.h
index da13ea0..0e205ce 100644
--- a/src/pixmap.h
+++ b/src/pixmap.h
@@ -102,7 +102,7 @@ enum {
#define image_mode_is(which, bit) (images[which].mode & (bit))
#define image_mode_fallback(which) do {if (image_mode_is((which), ALLOW_IMAGE)) {image_set_mode((which), MODE_IMAGE);} else {image_set_mode((which), MODE_SOLID);}} while (0)
#define redraw_all_images() do {render_simage(images[image_bg].current, TermWin.vt, TermWin_TotalWidth(), TermWin_TotalHeight(), image_bg, 0); \
- scr_touch(); scrollbar_show(0); if (image_mode_any(MODE_AUTO)) enl_ipc_sync();} while (0)
+ scr_touch(); scrollbar_draw(MODE_MASK); if (image_mode_any(MODE_AUTO)) enl_ipc_sync();} while (0)
/* Elements of an simage to be reset */
#define RESET_NONE (0UL)
diff --git a/src/scrollbar.c b/src/scrollbar.c
index ff4cc12..fb32eec 100644
--- a/src/scrollbar.c
+++ b/src/scrollbar.c
@@ -379,7 +379,12 @@ scrollbar_draw_uparrow(unsigned char image_state, unsigned char force_modes) {
}
if (!image_mode_is(image_up, MODE_MASK)) {
/* Solid mode. Redraw every time since it's cheap. */
- XFillRectangle(Xdisplay, scrollbar.up_win, gc_scrollbar, 0, 0, scrollbar_arrow_width(), scrollbar_arrow_height());
+ if (Options & Opt_scrollbar_floating) {
+ XSetWindowBackground(Xdisplay, scrollbar.up_win, PixColors[bgColor]);
+ XClearWindow(Xdisplay, scrollbar.up_win);
+ } else {
+ XFillRectangle(Xdisplay, scrollbar.up_win, gc_scrollbar, 0, 0, scrollbar_arrow_width(), scrollbar_arrow_height());
+ }
if (image_state == IMAGE_STATE_CLICKED) {
scrollbar_set_uparrow_pressed(1);
draw_uparrow_clicked(scrollbar.up_win, gc_top, gc_bottom, 0, 0, scrollbar_arrow_width() - 1, scrollbar_get_shadow());
@@ -436,7 +441,12 @@ scrollbar_draw_downarrow(unsigned char image_state, unsigned char force_modes) {
}
if (!image_mode_is(image_down, MODE_MASK)) {
/* Solid mode. Redraw every time since it's cheap. */
- XFillRectangle(Xdisplay, scrollbar.dn_win, gc_scrollbar, 0, 0, scrollbar_arrow_width(), scrollbar_arrow_height());
+ if (Options & Opt_scrollbar_floating) {
+ XSetWindowBackground(Xdisplay, scrollbar.dn_win, PixColors[bgColor]);
+ XClearWindow(Xdisplay, scrollbar.dn_win);
+ } else {
+ XFillRectangle(Xdisplay, scrollbar.dn_win, gc_scrollbar, 0, 0, scrollbar_arrow_width(), scrollbar_arrow_height());
+ }
if (image_state == IMAGE_STATE_CLICKED) {
scrollbar_set_downarrow_pressed(1);
draw_downarrow_clicked(scrollbar.dn_win, gc_top, gc_bottom, 0, 0, scrollbar_arrow_width() - 1, scrollbar_get_shadow());
@@ -503,7 +513,12 @@ scrollbar_draw_anchor(unsigned char image_state, unsigned char force_modes) {
#endif /* XTERM_SCROLLBAR */
#if defined(MOTIF_SCROLLBAR) || defined(NEXT_SCROLLBAR)
if (scrollbar.type == SCROLLBAR_MOTIF || scrollbar.type == SCROLLBAR_NEXT) {
- XFillRectangle(Xdisplay, scrollbar.sa_win, gc_scrollbar, 0, 0, scrollbar_anchor_width(), scrollbar_anchor_height());
+ if (Options & Opt_scrollbar_floating) {
+ XSetWindowBackground(Xdisplay, scrollbar.sa_win, PixColors[bgColor]);
+ XClearWindow(Xdisplay, scrollbar.sa_win);
+ } else {
+ XFillRectangle(Xdisplay, scrollbar.sa_win, gc_scrollbar, 0, 0, scrollbar_anchor_width(), scrollbar_anchor_height());
+ }
if (scrollbar_anchor_is_pressed()) {
draw_shadow(scrollbar.sa_win, gc_bottom, gc_top, 0, 0, scrollbar_anchor_width(), scrollbar_anchor_height(), scrollbar_get_shadow());
} else {
@@ -929,6 +944,20 @@ scrollbar_reposition_and_draw(unsigned char force_modes)
scrollbar.init = 1;
}
+void
+scrollbar_reposition_and_always_draw(void)
+{
+ D_SCROLLBAR(("scrollbar_reposition_and_always_draw()\n"));
+ scrollbar_draw_trough(IMAGE_STATE_CURRENT, MODE_MASK);
+ scrollbar_move_uparrow();
+ scrollbar_draw_uparrow(IMAGE_STATE_CURRENT, MODE_MASK);
+ scrollbar_move_downarrow();
+ scrollbar_draw_downarrow(IMAGE_STATE_CURRENT, MODE_MASK);
+ scrollbar_anchor_update_position(1);
+ scrollbar_draw_anchor(IMAGE_STATE_CURRENT, MODE_MASK);
+ scrollbar.init = 1;
+}
+
unsigned char
scrollbar_show(short mouseoffset)
{
diff --git a/src/scrollbar.h b/src/scrollbar.h
index 3b3cb17..f703c7a 100644
--- a/src/scrollbar.h
+++ b/src/scrollbar.h
@@ -86,7 +86,7 @@
#define map_scrollbar(show) do {PrivMode(show, PrivMode_scrollbar); if (scrollbar_mapping(show)) {scr_touch(); parent_resize();} } while (0)
#define scrollbar_map_arrows() do {XMapWindow(Xdisplay, scrollbar.up_win); XMapWindow(Xdisplay, scrollbar.dn_win);} while (0)
#define scrollbar_unmap_arrows() do {XUnmapWindow(Xdisplay, scrollbar.up_win); XUnmapWindow(Xdisplay, scrollbar.dn_win);} while (0)
-#define scrollbar_get_shadow() (((scrollbar.type == SCROLLBAR_XTERM) || (Options & Opt_scrollbar_floating)) ? (0) : (scrollbar.shadow))
+#define scrollbar_get_shadow() ((scrollbar.type == SCROLLBAR_XTERM) ? (0) : (scrollbar.shadow))
#define scrollbar_set_shadow(s) (scrollbar.shadow = (s))
#define scrollbar_get_type() (scrollbar.type)
#define scrollbar_set_type(t) (scrollbar.type = (t))
@@ -150,6 +150,7 @@ extern unsigned char scrollbar_set_focus(short has_focus);
extern unsigned char scrollbar_anchor_update_position(short mouseoffset);
extern void scrollbar_draw(unsigned char force_modes);
extern void scrollbar_reposition_and_draw(unsigned char force_modes);
+extern void scrollbar_reposition_and_always_draw(void);
extern unsigned char scrollbar_show(short);
_XFUNCPROTOEND
diff --git a/src/term.c b/src/term.c
index 888fe26..421245d 100644
--- a/src/term.c
+++ b/src/term.c
@@ -1881,18 +1881,13 @@ xterm_seq(int op, const char *str)
case 11:
nstr = (char *) strsep(&tnstr, ";");
OPT_SET_OR_TOGGLE(nstr, Options, Opt_scrollbar_right);
- scrollbar_reset();
- map_scrollbar(0);
- map_scrollbar(1);
- scrollbar_show(0);
+ scr_touch();
+ parent_resize();
break;
case 12:
nstr = (char *) strsep(&tnstr, ";");
OPT_SET_OR_TOGGLE(nstr, Options, Opt_scrollbar_floating);
- scrollbar_reset();
- map_scrollbar(0);
- map_scrollbar(1);
- scrollbar_show(0);
+ scrollbar_reposition_and_always_draw();
break;
case 13:
nstr = (char *) strsep(&tnstr, ";");