/*
* Helpers for implementing a rapid-update counter display in Motif.
- * Copyright © 2022 Nick Bowler
+ * Copyright © 2022-2023 Nick Bowler
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Pixmap pixmap;
uint_least32_t render_mask;
+
+ /* Cached width of the widget */
+ uint_least16_t render_width;
+
unsigned char seq[23], num_strings;
/*
xc->widget = w;
for (i = 0; i < nstr; i++) {
- unsigned w, h;
+ unsigned h;
if ((h = XmStringHeight(rt, strings[i])) > height)
height = h + 2*MARGIN;
Drawable d = XtWindow(xc->widget);
unsigned out_x = MARGIN, src_x, w;
- Dimension max_w, h;
+ Dimension max_w;
int i;
- XtVaGetValues(xc->widget, XmNwidth, &max_w,
- (char *)NULL);
- max_w = MAX(MARGIN, max_w) - MARGIN;
-
+ max_w = MAX(MARGIN, xc->render_width) - MARGIN;
xc_foreach_seq(xc, i, out_x, src_x, w, mask) {
if (out_x + w > max_w) {
w = max_w - out_x;
void xcounter_resize_cb(Widget w, void *data, void *cb_data)
{
- xc_queue_render(data, XC_RESIZING);
+ struct xcounter *xc = data;
+ Dimension width;
+
+ XtVaGetValues(xc->widget, XmNwidth, &width, (char *)NULL);
+ xc->render_width = width;
+
+ xc_queue_render(xc, XC_RESIZING);
}
void xcounter_expose_cb(Widget w, void *data, void *cb_data)