aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2022-09-03 13:23:07 +0200
committerPřemysl Eric Janouch <p@janouch.name>2022-09-03 13:23:07 +0200
commitdad95ef444cd8599707d20ed436aaf8e38fab25a (patch)
treeb5ce678b4cab9339ea9e7836da4f6f29748b2040
parent7e74d1a80ad391aae2b9e924e9be825320eb55a0 (diff)
downloadnncmpp-dad95ef444cd8599707d20ed436aaf8e38fab25a.tar.gz
nncmpp-dad95ef444cd8599707d20ed436aaf8e38fab25a.tar.xz
nncmpp-dad95ef444cd8599707d20ed436aaf8e38fab25a.zip
X11: render partially visible list items
-rw-r--r--nncmpp.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/nncmpp.c b/nncmpp.c
index b966ef0..d9466a0 100644
--- a/nncmpp.c
+++ b/nncmpp.c
@@ -2105,7 +2105,7 @@ app_sublayout_list (struct widget *list)
{
struct tab *tab = g.active_tab;
int to_show = MIN ((int) tab->item_count - tab->item_top,
- list->height / g.ui_vunit);
+ ceil ((double) list->height / g.ui_vunit));
struct layout l = {};
for (int row = 0; row < to_show; row++)
@@ -2845,9 +2845,8 @@ app_process_left_mouse_click (struct widget *w, int x, int y, int modifiers)
else if (tab->item_mark < 0)
tab->item_mark = tab->item_selected;
- // TODO: Probably will need to fix up item->top
- // for partially visible items in X11.
tab->item_selected = row_index + tab->item_top;
+ app_ensure_selection_visible ();
app_invalidate ();
if (modifiers & APP_KEYMOD_DOUBLE_CLICK)
@@ -2858,7 +2857,7 @@ app_process_left_mouse_click (struct widget *w, int x, int y, int modifiers)
{
struct tab *tab = g.active_tab;
int visible_items = app_visible_items ();
- tab->item_top = (float) y / w->height
+ tab->item_top = (double) y / w->height
* (int) tab->item_count - visible_items / 2;
app_invalidate ();
break;
@@ -5818,17 +5817,22 @@ x11_make_scrollbar (chtype attrs)
return w;
}
-// TODO: Handle partial items, otherwise this is the same as tui_render_list().
static void
x11_render_list (struct widget *self)
{
- x11_render_padding (self);
+ // We could do that for all widgets, but it would be kind-of pointless.
+ XRenderSetPictureClipRectangles (g.dpy, g.x11_pixmap_picture, 0, 0,
+ &(XRectangle) { self->x, self->y, self->width, self->height }, 1);
+ x11_render_padding (self);
LIST_FOR_EACH (struct widget, w, self->on_sublayout (self))
{
w->on_render (w);
free (w);
}
+
+ XRenderChangePicture (g.dpy, g.x11_pixmap_picture, CPClipMask,
+ &(XRenderPictureAttributes) { .clip_mask = None });
}
static struct widget *