aboutsummaryrefslogtreecommitdiff
path: root/draw.c
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2024-01-03 00:35:20 -0500
committerB. Watson <urchlay@slackware.uk>2024-01-03 00:35:20 -0500
commitba9e5e94e3c0622a0dc5a91dcb0fe671cb35c07c (patch)
treef1049a0583a3d4dd24521fa5e6fd355c1493c813 /draw.c
downloadhcalc-ba9e5e94e3c0622a0dc5a91dcb0fe671cb35c07c.tar.gz
initial commit
Diffstat (limited to 'draw.c')
-rw-r--r--draw.c150
1 files changed, 150 insertions, 0 deletions
diff --git a/draw.c b/draw.c
new file mode 100644
index 0000000..6f009af
--- /dev/null
+++ b/draw.c
@@ -0,0 +1,150 @@
+/* Copyright 1998 DJ Delorie <dj@delorie.com>
+ Distributed under the terms of the GNU GPL
+ http://www.delorie.com/store/hcalc/
+ Revisions copyright 2007,
+ Theodore Kilgore <kilgota@auburn.edu>
+ More revisions copyright 2023, B. Watson <urchlay@slackware.uk>
+*/
+#include "hcalc.h"
+#include <string.h>
+
+static unsigned int shown_offsets[15];
+static int shown_bitmask;
+static int show_bits;
+int scale_factor;
+
+#define BASE_CHARS_LEFT 6
+#define BASE_CHARS_TOP 6
+#define BASE_CHAR_WIDTH 5
+#define BASE_CHAR_HEIGHT 7
+#define BASE_BITS_LEFT_X 92
+#define BASE_BITS_TOP_1 6
+#define BASE_BITS_BOT_1 10
+#define BASE_BITS_TOP_0 10
+#define BASE_BITS_BOT_0 12
+
+#define CHARS_LEFT (BASE_CHARS_LEFT * scale_factor)
+#define CHARS_TOP (BASE_CHARS_TOP * scale_factor)
+#define CHAR_WIDTH (BASE_CHAR_WIDTH * scale_factor)
+#define CHAR_HEIGHT (BASE_CHAR_HEIGHT * scale_factor)
+#define BITS_LEFT_X (BASE_BITS_LEFT_X * scale_factor)
+#define BITS_TOP_1 (BASE_BITS_TOP_1 * scale_factor)
+#define BITS_BOT_1 (BASE_BITS_BOT_1 * scale_factor)
+#define BITS_TOP_0 (BASE_BITS_TOP_0 * scale_factor)
+#define BITS_BOT_0 (BASE_BITS_BOT_0 * scale_factor)
+
+void
+redraw_chars()
+{
+ int i;
+ for (i=0; i<15; i++)
+ {
+ XCopyArea(display, chars, window, gc,
+ shown_offsets[i], 0, CHAR_WIDTH, CHAR_HEIGHT,
+ CHARS_LEFT+BITS_TOP_1*i, CHARS_TOP);
+ }
+}
+
+void
+redraw()
+{
+ XCopyArea(display, face, window, gc, 0, 0, widths[winsize], heights[winsize], 0, 0);
+
+ if (show_bits)
+ {
+ int i, x;
+ XSetForeground(display, gc, bit_off);
+ for (i=0; i<32; i++)
+ {
+ x = BITS_LEFT_X - (BITS_TOP_1/3)*i - (BITS_TOP_1)/2*(i/4);
+ if (!(shown_bitmask & (1<<i)))
+ XDrawLine(display, window, gc, x, BITS_TOP_0, x, BITS_BOT_0);
+ }
+ XSetForeground(display, gc, bit_on);
+ for (i=0; i<32; i++)
+ {
+ x = BITS_LEFT_X - scale_factor*2*i - scale_factor*3*(i/4);
+ if (shown_bitmask & (1<<i))
+ XDrawLine(display, window, gc, x, BITS_TOP_1, x, BITS_BOT_1);
+ }
+ }
+ else
+ redraw_chars();
+}
+
+void
+set_bits(int b)
+{
+ shown_bitmask = b;
+ show_bits = 1;
+ redraw();
+}
+
+void
+set_string(char *s)
+{
+ char tmp[16];
+ int i;
+ sprintf(tmp, "%15.15s", s);
+ for (i=0; i<15; i++)
+ shown_offsets[i] = char_to_x[(int)tmp[i]];
+ if (show_bits == 0)
+ redraw_chars();
+ else
+ {
+ show_bits = 0;
+ redraw();
+ }
+}
+
+void
+send_current_display()
+{
+ char tmp[40], *tp=tmp;
+ int i;
+ XEvent e;
+
+ if (show_bits)
+ {
+ for (i=31; i>0; i--)
+ if (shown_bitmask & (1<<i))
+ break;
+ for (; i>=0; i--)
+ {
+ if (shown_bitmask & (1<<i))
+ *tp++ = '1';
+ else
+ *tp++ = '0';
+ }
+ }
+ else
+ {
+ for (i=0; i<15; i++)
+ {
+ char c = charmap[shown_offsets[i]/BITS_TOP_1];
+ if (c != ' ' && c != ',')
+ *tp++ = c;
+ }
+ }
+
+ *tp = 0;
+
+ e.type = SelectionNotify;
+ e.xselection.display = display;
+ e.xselection.requestor = event.xselectionrequest.requestor;
+ e.xselection.selection = event.xselectionrequest.selection;
+ e.xselection.target = event.xselectionrequest.target;
+ e.xselection.property = event.xselectionrequest.property;
+ e.xselection.time = event.xselectionrequest.time;
+
+ if (event.xselectionrequest.target != XA_STRING)
+ {
+ e.xselection.property = None;
+ }
+ else
+ {
+ XChangeProperty(display, e.xselection.requestor, e.xselection.property,
+ XA_STRING, 8, PropModeReplace, (unsigned char *)tmp, strlen(tmp));
+ }
+ XSendEvent(display, e.xselection.requestor, False, 0, &e);
+}