[comp.sys.sun] xview multiple server application

quasar@ctt.bellcore.com (Laurence R. Brothers) (10/23/89)

Taking my cue from the example on page 83 of the XView 1.0 Reference
Manual: Converting SunView Applications, I wrote a program designed to
open windows on two different machines simultaneously. (source is appended
to this posting). Naturally, I ran xhost + on the appropriate machines
beforehand. 

Curiously enough, the behavior I got was exactly the reverse of expected.
Instead of opening one window on each of two remote machines, the program
opened two (correctly functional) windows on my own machine!!!  Just as a
test, I ran xhost - on the remote machines, and I immediately got the
appropriate errors when I tried to run my program, as if on remote
displays as intended.

In other words, it's as if the client-server relationship suddenly
reversed, though of course it is impossible that my code suddenly migrated
to the remote machines. Instead I suppose that in some sort of strange
loop, my client application is sending two streams of X protocol out to
remote servers, which for reasons of their own are turning around and
beaming the damn things back at me to be interpreted by my local
server....

Any clues? Am I just missing something obvious here? Is my code doing
something stupid? This is version 1.0 FCS Open Windows running on a sun
4/260, incidentally.

-Laurence
 quasar@ctt.bellcore.com

=============================cut here===============================
#include <stdio.h>
#include <string.h>
#include <xview/xview.h>
#include <xview/panel.h>
#include <xview/notify.h>

int death_counter=0;

typedef struct remote_struct {
  Xv_Server server;
  Xv_Screen screen;
  Xv_Window root;
  Frame frame;
  Panel panel;
} Remote;

Remote remotes[2];


quit_proc(item,event)
Panel_item item;
Event *event;
{
  int i = (int)xv_get(item,XV_KEY_DATA,0);
  Remote *r = remotes+i;
  xv_destroy_safe(r->frame);
  death_counter++;
}



init_root(name,i)
int i;
{
  Remote *r = remotes+i;
  char sname[128];

  sprintf(sname,"%s:0",name);

  r->server = xv_find(NULL, SERVER,
		      XV_NAME, sname,
		      0);
  r->screen = xv_get(r->server,SERVER_NTH_SCREEN,0);
  r->root = xv_get(r->server,XV_ROOT);
  r->frame = xv_create(r->root,FRAME,XV_WIDTH,200,
		       FRAME_LABEL,sname,XV_HEIGHT,200,0);
  r->panel = xv_create(r->frame,PANEL,0);
  xv_create(r->panel,PANEL_BUTTON,
	    XV_KEY_DATA,0, i,
	    PANEL_LABEL_STRING, "Good-bye, world",
	    PANEL_NOTIFY_PROC, quit_proc,
	    0);
}

main (argc,argv)
int argc;
char **argv;
{
  xv_init(XV_INIT_ARGS, argc,argv,0);
  init_root("hostname1",0);
  init_root("hostname2",1);
  xv_set(remotes[0].frame,XV_SHOW,TRUE,0);
  xv_set(remotes[1].frame,XV_SHOW,TRUE,0);
  /* use explicit dispatching or xv_main_loop will only raise one of
     the two frames. Is this true or what? When I tried xv_main_loop
     the application refused to terminate on the destruction of the
     frame. 
  */
  while(death_counter < 2) {
   notify_dispatch();
  }
}  
	    Laurence R. Brothers (quasar@ctt.bellcore.com)
Bellcore -- Computer Technology Transfer -- Knowledge-Based Systems Development
	"It's easier to try, than to prove it can't be done."