diff lcdemu/main.c @ 0:e7f1035f10d4

lcdemu: initial import from freecalypso-tools
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 14 Mar 2018 18:16:45 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lcdemu/main.c	Wed Mar 14 18:16:45 2018 +0000
@@ -0,0 +1,166 @@
+/*
+ * LCDemu main module
+ */
+
+#include <sys/types.h>
+#include <sys/errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
+#include <X11/Xutil.h>
+#include "globals.h"
+
+main(argc, argv)
+	char **argv;
+{
+	XrmInitialize();
+	process_cmdline(argc, argv);
+	open_display();
+	init_image_conversion();
+	load_resources();
+	create_our_window();
+	set_initial_window_title();
+	set_initial_icon_name();
+	create_mainwin_gc();
+	XMapWindow(mydisplay, mainwindow);
+	XFlush(mydisplay);
+
+	mainloop();
+	/* NOTREACHED */
+}
+
+process_cmdline(argc, argv)
+	char **argv;
+{
+	register char **ap, *opt;
+	char *rhost, *ruser;
+	int len;
+
+	if (argc < 1) {
+		fprintf(stderr, "fc-lcdemu: invalid invokation\n");
+		exit(1);
+	}
+	opt = rindex(argv[0], '/');
+	if (opt)
+		progbasename = opt + 1;
+	else
+		progbasename = argv[0];
+	proginstancename = progbasename;
+	for (ap = argv+1; *ap; ) {
+		if (**ap == '-')
+			opt = *ap++;
+		else
+			break;
+		if (!strcmp(opt, "-display")) {
+			if (!*ap) {
+argreq:				fprintf(stderr, "%s: %s requires an argument\n",
+					progbasename, opt);
+				exit(1);
+			}
+			mydisplayname = *ap++;
+			continue;
+		}
+		if (!strcmp(opt, "-name")) {
+			if (!*ap)
+				goto argreq;
+			proginstancename = *ap++;
+			continue;
+		}
+		if (!strcmp(opt, "-geometry") || !strcmp(opt, "-geom")) {
+			if (!*ap)
+				goto argreq;
+			XrmPutStringResource(&xrmdb_cmdline, "LCDemu.geometry",
+						*ap++);
+			continue;
+		}
+		if (!strcmp(opt, "-iconic")) {
+			XrmPutStringResource(&xrmdb_cmdline, "LCDemu.iconic",
+						"on");
+			continue;
+		}
+		if (!strcmp(opt, "-title")) {
+			if (!*ap)
+				goto argreq;
+			XrmPutStringResource(&xrmdb_cmdline, "LCDemu.title",
+						*ap++);
+			continue;
+		}
+		if (!strcmp(opt, "-borderwidth") || !strcmp(opt, "-bw")) {
+			if (!*ap)
+				goto argreq;
+			XrmPutStringResource(&xrmdb_cmdline, "*borderWidth",
+						*ap++);
+			continue;
+		}
+		if (!strcmp(opt, "-bordercolor") || !strcmp(opt, "-bd")) {
+			if (!*ap)
+				goto argreq;
+			XrmPutStringResource(&xrmdb_cmdline, "*borderColor",
+						*ap++);
+			continue;
+		}
+		if (!strcmp(opt, "-xrm")) {
+			if (!*ap)
+				goto argreq;
+			XrmPutLineResource(&xrmdb_cmdline, *ap++);
+			continue;
+		}
+		fprintf(stderr, "%s: %s: unrecognized option\n", progbasename,
+			opt);
+		exit(1);
+	}
+}
+
+open_display()
+{
+	if (!mydisplayname)
+		mydisplayname = getenv("DISPLAY");
+	if (!mydisplayname) {
+		fprintf(stderr, "%s: no X display available\n", progbasename);
+		exit(1);
+	}
+	mydisplay = XOpenDisplay(mydisplayname);
+	if (!mydisplay) {
+		fprintf(stderr, "%s: unable to open display %s\n", progbasename,
+			mydisplayname);
+		exit(1);
+	}
+}
+
+mainloop()
+{
+	register int i, cc;
+	XEvent event;
+	fd_set readfds;
+	int maxfd;
+	char buf[1024];
+
+	maxfd = ConnectionNumber(mydisplay) + 1;
+	for (;;) {
+		cc = XPending(mydisplay);
+		for (i = 0; i < cc; i++)
+			XNextEvent(mydisplay, &event);
+		XFlush(mydisplay);
+		FD_ZERO(&readfds);
+		FD_SET(0, &readfds);
+		FD_SET(ConnectionNumber(mydisplay), &readfds);
+		i = select(maxfd, &readfds, NULL, NULL, NULL);
+		if (i < 0) {
+			if (errno == EINTR)
+				continue;
+			perror("select");
+			exit(1);
+		}
+		if (FD_ISSET(0, &readfds)) {
+			cc = read(0, buf, sizeof buf);
+			if (cc > 0)
+				input_on_stdin(buf, cc);
+			else
+				exit(0);
+			XFlush(mydisplay);
+		}
+	}
+}