Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/ui-hlp/messg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui-hlp/messg.c')
-rw-r--r--src/ui-hlp/messg.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/src/ui-hlp/messg.c b/src/ui-hlp/messg.c
new file mode 100644
index 0000000..2a66fe2
--- /dev/null
+++ b/src/ui-hlp/messg.c
@@ -0,0 +1,145 @@
+#ifdef _plan9_
+#include <u.h>
+#include <libc.h>
+#else
+#include <stdlib.h>
+#include <string.h>
+#endif
+#include <filter.h>
+#include <fractal.h>
+#include <timers.h>
+#include <ui_helper.h>
+#include <xerror.h>
+#include <misc-f.h>
+#include "grlib.h"
+#define EXPIRETIME 4000000
+static void
+getpos(uih_context * c, int *x, int *y, int *w, int *h, void *data)
+{
+ int n = (int) data;
+ if (c->messg.message[n] != NULL) {
+ int he = xtextheight(c->font);
+ *y = c->messg.messagestart + he * n;
+ *h = he;
+ *w = xtextwidth(c->font, c->messg.message[n]);
+ *x = (c->image->width - *w) / 2;
+ } else {
+ *w = *h = *x = *y = 0;
+ }
+}
+
+static void draw(uih_context * c, void *data)
+{
+ int x, y, w;
+ int n = (int) data;
+ if (c->messg.message[n] != NULL) {
+ int h = xtextheight(c->font);
+ y = c->messg.messagestart + h * n;
+ w = xtextwidth(c->font, c->messg.message[n]);
+ x = (c->image->width - w) / 2;
+ if (c->messg.messagetype[n])
+ xprint(c->image, c->font, x, y, c->messg.message[n],
+ (c->image->flags & AAIMAGE) ? BGCOLOR(c) : SELCOLOR(c),
+ BGCOLOR(c), 0);
+ else
+ xprint(c->image, c->font, x, y, c->messg.message[n],
+ (c->image->flags & AAIMAGE) ? BGCOLOR(c) : FGCOLOR(c),
+ BGCOLOR(c), 0);
+ }
+}
+
+void uih_rmmessage(uih_context * c, int pid)
+{
+ int i;
+ for (i = 0; i < NMESSAGES && c->messg.pid[i] != pid; i++);
+ if (i == NMESSAGES)
+ return;
+ if (c->messg.message[i] == NULL)
+ return;
+ free(c->messg.message[i]);
+ tl_remove_timer(c->messg.messagetimer[i]);
+ tl_free_timer(c->messg.messagetimer[i]);
+ c->messg.message[i] = NULL;
+ for (; i < NMESSAGES - 1; i++) {
+ c->messg.message[i] = c->messg.message[i + 1];
+ c->messg.messagetimer[i] = c->messg.messagetimer[i + 1];
+ c->messg.messagetype[i] = c->messg.messagetype[i + 1];
+ c->messg.pid[i] = c->messg.pid[i + 1];
+ }
+ c->messg.message[NMESSAGES - 1] = NULL;
+ c->display = 1;
+}
+
+void uih_scrollup(uih_context * c)
+{
+ uih_rmmessage(c, c->messg.pid[0]);
+}
+
+void uih_clearmessages(uih_context * c)
+{
+ while (c->messg.message[0] != NULL)
+ uih_scrollup(c);
+}
+
+void uih_initmessages(uih_context * c)
+{
+ int i;
+ for (i = 0; i < NMESSAGES; i++) {
+ c->messg.message[i] = NULL;
+ c->messg.w[i] = uih_registerw(c, getpos, draw, (void *) i, 0);
+ }
+ c->messg.messagestart = 0;
+}
+
+void uih_destroymessages(uih_context * c)
+{
+ int i;
+ uih_clearmessages(c);
+ for (i = 0; i < NMESSAGES; i++)
+ uih_removew(c, c->messg.w[i]);
+}
+
+static int uih_message1(uih_context * c, CONST char *message, int type)
+{
+ static int pid;
+ int i;
+ for (i = 0; i < NMESSAGES && c->messg.message[i] != NULL; i++);
+ if (i == NMESSAGES)
+ uih_scrollup(c), i--;
+ c->messg.message[i] = mystrdup(message);
+ c->messg.messagetype[i] = type;
+ c->messg.messagetimer[i] = tl_create_timer();
+ tl_reset_timer(c->messg.messagetimer[i]);
+ tl_set_interval(c->messg.messagetimer[i], 1);;
+ tl_slowdown_timer(c->messg.messagetimer[i], EXPIRETIME);;
+ tl_set_handler(c->messg.messagetimer[i],
+ (void (*)(void *)) uih_scrollup, c);
+ tl_add_timer(syncgroup, c->messg.messagetimer[i]);
+ /*tl_remove_timer (c->messg.messagetimer[i]); */
+ c->messg.pid[i] = ++pid;
+ c->display = 1;
+ return (pid);
+}
+
+int uih_message(uih_context * c, CONST char *message)
+{
+ if (c->inhibittextoutput)
+ return 0;
+
+ return (uih_message1(c, message, 0));
+}
+
+int uih_error(uih_context * c, CONST char *error)
+{
+ char str[256];
+ sprintf(str, "Error: %s", error);
+ c->errstring = error;
+ return (uih_message1(c, str, 1));
+}
+
+void uih_printmessages(uih_context * c)
+{
+ int i;
+ for (i = 0; i < NMESSAGES && c->messg.message[i] != NULL; i++)
+ x_message(c->messg.message[i], stderr);
+}