diff lcdemu/window.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/window.c	Wed Mar 14 18:16:45 2018 +0000
@@ -0,0 +1,157 @@
+/*
+ * LCDemu based on HECterm by the same author
+ * X11 window creation functions
+ */
+
+#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"
+
+extern char *xrm_lookup();
+
+create_our_window()
+{
+	XrmQuark instquarks[3], classquarks[3];
+	register char *cp;
+	register int i, geomask;
+	int pixwidth, pixheight, xpos, ypos;
+	XSetWindowAttributes xswa;
+	u_long xswamask;
+	XColor bdcolor;
+	XClassHint xclasshint;
+	XWMHints wmhints;
+	XSizeHints wm_normal_hints;
+
+	/* Determine our geometry */
+	instquarks[0] = xrmquark_topinstance;
+	classquarks[0] = xrmquark_topclass;
+	classquarks[1] = instquarks[1] = XrmStringToQuark("geometry");
+	instquarks[2] = classquarks[2] = NULLQUARK;
+	cp = xrm_lookup(instquarks, classquarks);
+	if (cp) {
+		geomask = XParseGeometry(cp, &xpos, &ypos, &pixwidth,
+					&pixheight);
+		free(cp);
+	} else
+		geomask = 0;
+	if (!(geomask & WidthValue))
+		pixwidth = 176;
+	if (!(geomask & HeightValue))
+		pixheight = 220;
+	if (!(geomask & XValue))
+		xpos = 0;
+	else if (geomask & XNegative)
+		xpos += DisplayWidth(mydisplay, DefaultScreen(mydisplay)) -
+			pixwidth;
+	if (!(geomask & YValue))
+		ypos = 0;
+	else if (geomask & YNegative)
+		ypos += DisplayHeight(mydisplay, DefaultScreen(mydisplay)) -
+			pixheight;
+	/* fill out XSetWindowAttributes */
+	xswa.event_mask = 0;	/* not interested in any events */
+	xswamask = CWEventMask;
+	/* border color */
+	classquarks[1] = instquarks[1] = XrmStringToQuark("borderColor");
+	cp = xrm_lookup(instquarks, classquarks);
+	if (cp) {
+		i = XParseColor(mydisplay, DefaultColormap(mydisplay,
+			DefaultScreen(mydisplay)), cp, &bdcolor);
+		free(cp);
+		if (i) {
+			i = XAllocColor(mydisplay, DefaultColormap(mydisplay,
+				DefaultScreen(mydisplay)), &bdcolor);
+			if (i) {
+				xswa.border_pixel = bdcolor.pixel;
+				xswamask |= CWBorderPixel;
+			}
+		}
+	}
+	/* border width */
+	classquarks[1] = instquarks[1] = XrmStringToQuark("borderWidth");
+	cp = xrm_lookup(instquarks, classquarks);
+	if (cp) {
+		i = atoi(cp);
+		free(cp);
+	} else
+		i = 2;
+	/* go for it! */
+	mainwindow = XCreateWindow(mydisplay, DefaultRootWindow(mydisplay),
+			xpos, ypos, pixwidth, pixheight, i, CopyFromParent,
+			InputOutput, CopyFromParent, xswamask, &xswa);
+	/* set window manager properties */
+	xclasshint.res_name = proginstancename;
+	xclasshint.res_class = "LEDemu";
+	XSetClassHint(mydisplay, mainwindow, &xclasshint);
+	wmhints.flags = InputHint | StateHint;
+	wmhints.input = False;
+	classquarks[1] = instquarks[1] = XrmStringToQuark("iconic");
+	cp = xrm_lookup(instquarks, classquarks);
+	if (cp) {
+		i = parse_boolean_resource(cp);
+		free(cp);
+	} else
+		i = 0;
+	wmhints.initial_state = i ? IconicState : NormalState;
+	XSetWMHints(mydisplay, mainwindow, &wmhints);
+	if (geomask & (WidthValue|HeightValue))
+		wm_normal_hints.flags = USSize;
+	else
+		wm_normal_hints.flags = PSize;
+	if (geomask & (XValue|YValue))
+		wm_normal_hints.flags |= USPosition;
+	XSetWMNormalHints(mydisplay, mainwindow, &wm_normal_hints);
+}
+
+set_initial_window_title()
+{
+	XrmQuark instquarks[3], classquarks[3];
+	register char *cp;
+	char buf[256];
+
+	instquarks[0] = xrmquark_topinstance;
+	classquarks[0] = xrmquark_topclass;
+	instquarks[1] = XrmStringToQuark("title");
+	classquarks[1] = XrmStringToQuark("Title");
+	instquarks[2] = classquarks[2] = NULLQUARK;
+	cp = xrm_lookup(instquarks, classquarks);
+	if (cp) {
+		XStoreName(mydisplay, mainwindow, cp);
+		free(cp);
+		return;
+	}
+	XStoreName(mydisplay, mainwindow, "Emulated LCD");
+}
+
+set_initial_icon_name()
+{
+	XrmQuark instquarks[3], classquarks[3];
+	register char *cp;
+
+	instquarks[0] = xrmquark_topinstance;
+	classquarks[0] = xrmquark_topclass;
+	instquarks[1] = XrmStringToQuark("iconName");
+	classquarks[1] = XrmStringToQuark("IconName");
+	instquarks[2] = classquarks[2] = NULLQUARK;
+	cp = xrm_lookup(instquarks, classquarks);
+	if (cp) {
+		XSetIconName(mydisplay, mainwindow, cp);
+		free(cp);
+		return;
+	}
+	XSetIconName(mydisplay, mainwindow, proginstancename);
+}
+
+create_mainwin_gc()
+{
+	XGCValues xgcval;
+
+	xgcval.graphics_exposures = False;
+	mainwingc = XCreateGC(mydisplay, mainwindow, GCGraphicsExposures,
+				&xgcval);
+}