OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [MW_0_8_9PRE7/] [mw/] [src/] [demos/] [vnc/] [vncviewer/] [listen.c] - Rev 1765

Compare with Previous | Blame | View Log

/*
 *  Copyright (C) 1997, 1998 Olivetti & Oracle Research Laboratory
 *
 *  This is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This software is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this software; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
 *  USA.
 */
 
/*
 * listen.c - listen for incoming connections
 */
 
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <vncviewer.h>
 
#define FLASHWIDTH 50	/* pixels */
#define FLASHDELAY 1	/* seconds */
 
static Font flashFont;
 
static void getFlashFont(Display *d);
static void flashDisplay(Display *d, char *user);
 
void
listenForIncomingConnections()
{
    Display *d;
    XEvent ev;
    int listenSocket, flashSocket, sock;
    fd_set fds;
    char flashUser[256];
    int n;
 
    if (!(d = XOpenDisplay(displayname))) {
	fprintf(stderr,"%s: unable to open display %s\n",
		programName, XDisplayName(displayname));
	exit(1);
    }
 
    getFlashFont(d);
 
    listenSocket = ListenAtTcpPort(listenPort);
    flashSocket = ListenAtTcpPort(flashPort);
 
    if ((listenSocket < 0) || (flashSocket < 0)) exit(1);
 
    fprintf(stderr,"%s: Listening on port %d (flash port %d)\n",
	    programName,listenPort,flashPort);
 
    while (True) {
 
	/* reap any zombies */
	int status, pid;
	while ((pid= wait3(&status, WNOHANG, (struct rusage *)0))>0);
 
	/* discard any X events */
	while (XCheckIfEvent(d, &ev, AllXEventsPredicate, NULL))
	    ;
 
	FD_ZERO(&fds); 
 
	FD_SET(flashSocket, &fds);
	FD_SET(listenSocket, &fds);
	FD_SET(ConnectionNumber(d), &fds);
 
	select(FD_SETSIZE, &fds, NULL, NULL, NULL);
 
	if (FD_ISSET(flashSocket, &fds)) {
 
	    sock = AcceptTcpConnection(flashSocket);
	    if (sock < 0) exit(1);
	    n = read(sock, flashUser, 255);
	    if (n > 0) {
		flashUser[n] = 0;
		flashDisplay(d, flashUser);
	    } else {
		flashDisplay(d, NULL);
	    }
	    close(sock);
	}
 
	if (FD_ISSET(listenSocket, &fds)) {
	    rfbsock = AcceptTcpConnection(listenSocket);
	    if (rfbsock < 0) exit(1);
 
	    XCloseDisplay(d);
 
	    /* Now fork off a new process to deal with it... */
 
	    switch (fork()) {
 
	    case -1: 
		perror("fork"); 
		exit(1);
 
	    case 0:
		/* child - return to caller */
		close(listenSocket);
		close(flashSocket);
		return;
 
	    default:
		/* parent - go round and listen again */
		close(rfbsock); 
		if (!(d = XOpenDisplay(displayname))) {
		    fprintf(stderr,"%s: unable to open display \"%s\"\r\n",
			    programName, XDisplayName (displayname));
		    exit(1);
		}
		getFlashFont(d);
		break;
	    }
	}
    }
}
 
 
/*
 * getFlashFont
 */
 
static void
getFlashFont(Display *d)
{
    char fontName[256];
    char **fontNames;
    int nFontNames;
 
    sprintf(fontName,"-*-courier-bold-r-*-*-%d-*-*-*-*-*-iso8859-1",
	    FLASHWIDTH);
    fontNames = XListFonts(d, fontName, 1, &nFontNames);
    if (nFontNames == 1) {
	XFreeFontNames(fontNames);
    } else {
	sprintf(fontName,"fixed");
    }
    flashFont = XLoadFont(d, fontName);
}
 
 
/*
 * flashDisplay
 */
 
static void
flashDisplay(Display *d, char *user)
{
    Window w1, w2, w3, w4;
    XSetWindowAttributes attr;
 
    XBell(d, 100);
 
    XForceScreenSaver(d, ScreenSaverReset);
 
    attr.background_pixel = BlackPixel(d, DefaultScreen(d));
    attr.override_redirect = 1;
    attr.save_under = True;
 
    w1 = XCreateWindow(d, DefaultRootWindow(d), 0, 0,
		       WidthOfScreen(DefaultScreenOfDisplay(d)), 
		       FLASHWIDTH, 0, 
		       CopyFromParent, CopyFromParent, CopyFromParent, 
		       CWBackPixel|CWOverrideRedirect|CWSaveUnder,
		       &attr);
 
    w2 = XCreateWindow(d, DefaultRootWindow(d), 0, 0, FLASHWIDTH,
		       HeightOfScreen(DefaultScreenOfDisplay(d)), 0,
		       CopyFromParent, CopyFromParent, CopyFromParent, 
		       CWBackPixel|CWOverrideRedirect|CWSaveUnder,
		       &attr);
 
    w3 = XCreateWindow(d, DefaultRootWindow(d), 
		       WidthOfScreen(DefaultScreenOfDisplay(d))-FLASHWIDTH, 
		       0, FLASHWIDTH, 
		       HeightOfScreen(DefaultScreenOfDisplay(d)), 0, 
		       CopyFromParent, CopyFromParent, CopyFromParent, 
		       CWBackPixel|CWOverrideRedirect|CWSaveUnder,
		       &attr);
 
    w4 = XCreateWindow(d, DefaultRootWindow(d), 0,
		       HeightOfScreen(DefaultScreenOfDisplay(d))-FLASHWIDTH, 
		       WidthOfScreen(DefaultScreenOfDisplay(d)), 
		       FLASHWIDTH, 0, 
		       CopyFromParent, CopyFromParent, CopyFromParent, 
		       CWBackPixel|CWOverrideRedirect|CWSaveUnder,
		       &attr);
 
    XMapWindow(d, w1);
    XMapWindow(d, w2);
    XMapWindow(d, w3);
    XMapWindow(d, w4);
 
    if (user) {
	GC gc;
	XGCValues gcv;
 
	gcv.foreground = WhitePixel(d, DefaultScreen(d));
	gcv.font = flashFont;
	gc = XCreateGC(d, w1, GCForeground|GCFont, &gcv);
	XDrawString(d, w1, gc,
		    WidthOfScreen(DefaultScreenOfDisplay(d)) / 2 - FLASHWIDTH,
		    (FLASHWIDTH * 3 / 4), user, strlen(user));
    }
    XFlush(d);
 
    sleep(FLASHDELAY);
 
    XDestroyWindow(d, w1);
    XDestroyWindow(d, w2);
    XDestroyWindow(d, w3);
    XDestroyWindow(d, w4);
    XFlush(d);
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.