FreeCalypso > hg > freecalypso-ui-dev
view 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 source
/* * 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); } } }