-/* xscreensaver, Copyright (c) 1999, 2001 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1999-2015 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* And keep in mind that this program emulates the
* behavior of the computer screens that were visible
* in the movies -- not the behavior of the effects in
- * the title sequences.
+ * the title sequences. "GLMatrix" does that.
*
* ==========================================================
*
#endif
#include "screenhack.h"
+#include "textclient.h"
#include "xpm-pixmap.h"
#include <stdio.h>
#include <sys/wait.h>
-#ifdef HAVE_COCOA
+#ifdef HAVE_JWXYZ
# define HAVE_XPM
#else
# define DO_XBM /* only do mono bitmaps under real X11 */
#endif
+#ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h>
+#endif
+
#if defined(HAVE_GDK_PIXBUF) || defined(HAVE_XPM)
# include "images/matrix1.xpm"
# include "images/matrix2.xpm"
# include "images/matrix2b.xbm"
#endif /* DO_XBM */
-#ifndef HAVE_COCOA
-# include <X11/Xatom.h>
-# include <X11/Intrinsic.h>
-#endif
-
-#ifdef HAVE_FORKPTY
-# include <sys/ioctl.h>
-# ifdef HAVE_PTY_H
-# include <pty.h>
-# endif
-# ifdef HAVE_UTIL_H
-# include <util.h>
-# endif
-#endif /* HAVE_FORKPTY */
-
#define CHAR_COLS 16
#define CHAR_ROWS 13
#define CHAR_MAPS 3
m_mode mode;
m_mode def_mode; /* Mode to return to after trace etc. */
- pid_t pid;
- FILE *pipe;
- XtInputId pipe_id;
- Bool input_available_p;
- Time subproc_relaunch_delay;
+ text_data *tc;
char buf [BUF_SIZE*2+1]; /* ring buffer */
-
Bool do_fill_buff;
int buf_done;
int buf_pos;
}
}
-static void
-subproc_cb (XtPointer closure, int *source, XtInputId *id)
-{
- m_state *state = (m_state *) closure;
- state->input_available_p = True;
-}
-
-static void
-launch_text_generator (m_state *state)
-{
- XtAppContext app = XtDisplayToApplicationContext (state->dpy);
- char *oprogram = get_string_resource (state->dpy, "program", "Program");
- char *program = (char *) malloc (strlen (oprogram) + 10);
- strcpy (program, "( ");
- strcat (program, oprogram);
- strcat (program, " ) 2>&1");
-
- if ((state->pipe = popen (program, "r")))
- {
- state->pipe_id =
- XtAppAddInput (app, fileno (state->pipe),
- (XtPointer) (XtInputReadMask | XtInputExceptMask),
- subproc_cb, (XtPointer) state);
- }
- else
- {
- perror (program);
- }
-}
-
-
-static void
-relaunch_generator_timer (XtPointer closure, XtIntervalId *id)
-{
- m_state *state = (m_state *) closure;
- launch_text_generator (state);
-}
/* When the subprocess has generated some output, this reads as much as it
can into s->buf at s->buf_tail.
*/
-
static void
fill_input (m_state *s)
{
- XtAppContext app = XtDisplayToApplicationContext (s->dpy);
int n = 0;
int loadBytes;
if(s->buf_done > s->buf_pos){
else{
loadBytes = ((BUF_SIZE - s->buf_pos) + s->buf_done) - 1;
}
- if (! s->pipe) return;
- if (! s->input_available_p) return;
- s->input_available_p = False;
-
- if (loadBytes > 0){
- n = read (fileno (s->pipe),
- (void *) (s->buf+s->buf_pos),
- loadBytes);
- }
+
+ if (!s->tc)
+ return;
+
+ if (loadBytes > 0)
+ {
+ int c = textclient_getc (s->tc);
+ n = (c > 0 ? 1 : -1);
+ s->buf [s->buf_pos] = (char) c;
+ }
+
+
if (n > 0)
{
s->do_fill_buff = False;
/* Couldn't read anything from the buffer */
/* Assume EOF has been reached, so start again */
s->do_fill_buff = True;
- XtRemoveInput (s->pipe_id);
- s->pipe_id = 0;
- pclose (s->pipe);
- s->pipe = 0;
-
- /* Set up a timer to re-launch the subproc in a bit. */
- XtAppAddTimeOut (app, s->subproc_relaunch_delay,
- relaunch_generator_timer,
- (XtPointer) s);
}
}
-
static void cursor_on_timer (XtPointer closure, XtIntervalId *id);
static void cursor_off_timer (XtPointer closure, XtIntervalId *id);
init_trace (m_state *state)
{
char *s = get_string_resource (state->dpy, "tracePhone", "TracePhone");
- char *s2, *s3;
- int i;
+ const char *s2;
+ signed char *s3;
if (!s)
goto FAIL;
state->tracing = (signed char *) malloc (strlen (s) + 1);
- s3 = (char *) state->tracing;
+ s3 = state->tracing;
for (s2 = s; *s2; s2++)
if (*s2 >= '0' && *s2 <= '9')
- *s3++ = *s2;
+ *s3++ = -*s2;
*s3 = 0;
- if (s3 == (char *) state->tracing)
+ if (s3 == state->tracing)
goto FAIL;
- for (i = 0; i < strlen((char *) state->tracing); i++)
- state->tracing[i] = -state->tracing[i];
-
state->glyph_map = decimal_encoding;
state->nglyphs = countof(decimal_encoding);
set_mode (state, ASCII);
state->def_mode = ASCII;
state->use_pipe_p = True;
- launch_text_generator (state);
+ state->tc = textclient_open (dpy);
}
else if (!mode || !*mode || !strcasecmp(mode, "matrix"))
set_mode (state, MATRIX);
AGAIN:
c = ((unsigned char *) state->typing)[0];
- c1 = ((unsigned char *) state->typing)[1];
+ c1 = c ? ((unsigned char *) state->typing)[1] : 0;
state->typing_delay = (!c || c1 == '\n'
? state->typing_line_delay
free (state->feeders);
state->feeders = nfeeders;
}
+ if (state->tc)
+ textclient_reshape (state->tc,
+ state->xgwa.width,
+ state->xgwa.height,
+ state->grid_width - 2,
+ state->grid_height - 1,
+ 0);
}
static Bool
return True;
default:
- return False;
+ break;
}
}
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ set_mode (state, DRAIN_MATRIX);
+ return True;
+ }
+
return False;
}
xmatrix_free (Display *dpy, Window window, void *closure)
{
m_state *state = (m_state *) closure;
-
+ if (state->tc)
+ textclient_close (state->tc);
if (state->cursor_timer)
XtRemoveTimeOut (state->cursor_timer);
"*trace: True",
"*knockKnock: True",
"*usePipe: False",
- "*program: xscreensaver-text",
- "*geometry: 800x600",
+ "*usePty: False",
+ "*program: xscreensaver-text --latin1",
+ "*geometry: 960x720",
0
};