FreeCalypso > hg > freecalypso-tools
comparison lcdemu/main.c @ 0:e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Sat, 11 Jun 2016 00:13:35 +0000 | 
| parents | |
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| -1:000000000000 | 0:e7502631a0f9 | 
|---|---|
| 1 /* | |
| 2 * LCDemu main module | |
| 3 */ | |
| 4 | |
| 5 #include <sys/types.h> | |
| 6 #include <sys/errno.h> | |
| 7 #include <stdio.h> | |
| 8 #include <stdlib.h> | |
| 9 #include <string.h> | |
| 10 #include <strings.h> | |
| 11 #include <X11/Xlib.h> | |
| 12 #include <X11/Xresource.h> | |
| 13 #include <X11/Xutil.h> | |
| 14 #include "globals.h" | |
| 15 | |
| 16 main(argc, argv) | |
| 17 char **argv; | |
| 18 { | |
| 19 XrmInitialize(); | |
| 20 process_cmdline(argc, argv); | |
| 21 open_display(); | |
| 22 init_image_conversion(); | |
| 23 load_resources(); | |
| 24 create_our_window(); | |
| 25 set_initial_window_title(); | |
| 26 set_initial_icon_name(); | |
| 27 create_mainwin_gc(); | |
| 28 XMapWindow(mydisplay, mainwindow); | |
| 29 XFlush(mydisplay); | |
| 30 | |
| 31 mainloop(); | |
| 32 /* NOTREACHED */ | |
| 33 } | |
| 34 | |
| 35 process_cmdline(argc, argv) | |
| 36 char **argv; | |
| 37 { | |
| 38 register char **ap, *opt; | |
| 39 char *rhost, *ruser; | |
| 40 int len; | |
| 41 | |
| 42 if (argc < 1) { | |
| 43 fprintf(stderr, "fc-lcdemu: invalid invokation\n"); | |
| 44 exit(1); | |
| 45 } | |
| 46 opt = rindex(argv[0], '/'); | |
| 47 if (opt) | |
| 48 progbasename = opt + 1; | |
| 49 else | |
| 50 progbasename = argv[0]; | |
| 51 proginstancename = progbasename; | |
| 52 for (ap = argv+1; *ap; ) { | |
| 53 if (**ap == '-') | |
| 54 opt = *ap++; | |
| 55 else | |
| 56 break; | |
| 57 if (!strcmp(opt, "-display")) { | |
| 58 if (!*ap) { | |
| 59 argreq: fprintf(stderr, "%s: %s requires an argument\n", | |
| 60 progbasename, opt); | |
| 61 exit(1); | |
| 62 } | |
| 63 mydisplayname = *ap++; | |
| 64 continue; | |
| 65 } | |
| 66 if (!strcmp(opt, "-name")) { | |
| 67 if (!*ap) | |
| 68 goto argreq; | |
| 69 proginstancename = *ap++; | |
| 70 continue; | |
| 71 } | |
| 72 if (!strcmp(opt, "-geometry") || !strcmp(opt, "-geom")) { | |
| 73 if (!*ap) | |
| 74 goto argreq; | |
| 75 XrmPutStringResource(&xrmdb_cmdline, "LCDemu.geometry", | |
| 76 *ap++); | |
| 77 continue; | |
| 78 } | |
| 79 if (!strcmp(opt, "-iconic")) { | |
| 80 XrmPutStringResource(&xrmdb_cmdline, "LCDemu.iconic", | |
| 81 "on"); | |
| 82 continue; | |
| 83 } | |
| 84 if (!strcmp(opt, "-title")) { | |
| 85 if (!*ap) | |
| 86 goto argreq; | |
| 87 XrmPutStringResource(&xrmdb_cmdline, "LCDemu.title", | |
| 88 *ap++); | |
| 89 continue; | |
| 90 } | |
| 91 if (!strcmp(opt, "-borderwidth") || !strcmp(opt, "-bw")) { | |
| 92 if (!*ap) | |
| 93 goto argreq; | |
| 94 XrmPutStringResource(&xrmdb_cmdline, "*borderWidth", | |
| 95 *ap++); | |
| 96 continue; | |
| 97 } | |
| 98 if (!strcmp(opt, "-bordercolor") || !strcmp(opt, "-bd")) { | |
| 99 if (!*ap) | |
| 100 goto argreq; | |
| 101 XrmPutStringResource(&xrmdb_cmdline, "*borderColor", | |
| 102 *ap++); | |
| 103 continue; | |
| 104 } | |
| 105 if (!strcmp(opt, "-xrm")) { | |
| 106 if (!*ap) | |
| 107 goto argreq; | |
| 108 XrmPutLineResource(&xrmdb_cmdline, *ap++); | |
| 109 continue; | |
| 110 } | |
| 111 fprintf(stderr, "%s: %s: unrecognized option\n", progbasename, | |
| 112 opt); | |
| 113 exit(1); | |
| 114 } | |
| 115 } | |
| 116 | |
| 117 open_display() | |
| 118 { | |
| 119 if (!mydisplayname) | |
| 120 mydisplayname = getenv("DISPLAY"); | |
| 121 if (!mydisplayname) { | |
| 122 fprintf(stderr, "%s: no X display available\n", progbasename); | |
| 123 exit(1); | |
| 124 } | |
| 125 mydisplay = XOpenDisplay(mydisplayname); | |
| 126 if (!mydisplay) { | |
| 127 fprintf(stderr, "%s: unable to open display %s\n", progbasename, | |
| 128 mydisplayname); | |
| 129 exit(1); | |
| 130 } | |
| 131 } | |
| 132 | |
| 133 mainloop() | |
| 134 { | |
| 135 register int i, cc; | |
| 136 XEvent event; | |
| 137 fd_set readfds; | |
| 138 int maxfd; | |
| 139 char buf[1024]; | |
| 140 | |
| 141 maxfd = ConnectionNumber(mydisplay) + 1; | |
| 142 for (;;) { | |
| 143 cc = XPending(mydisplay); | |
| 144 for (i = 0; i < cc; i++) | |
| 145 XNextEvent(mydisplay, &event); | |
| 146 XFlush(mydisplay); | |
| 147 FD_ZERO(&readfds); | |
| 148 FD_SET(0, &readfds); | |
| 149 FD_SET(ConnectionNumber(mydisplay), &readfds); | |
| 150 i = select(maxfd, &readfds, NULL, NULL, NULL); | |
| 151 if (i < 0) { | |
| 152 if (errno == EINTR) | |
| 153 continue; | |
| 154 perror("select"); | |
| 155 exit(1); | |
| 156 } | |
| 157 if (FD_ISSET(0, &readfds)) { | |
| 158 cc = read(0, buf, sizeof buf); | |
| 159 if (cc > 0) | |
| 160 input_on_stdin(buf, cc); | |
| 161 else | |
| 162 exit(0); | |
| 163 XFlush(mydisplay); | |
| 164 } | |
| 165 } | |
| 166 } | 
