[comp.windows.x] interprocess communication in X

slehar@park.bu.edu (Steve Lehar) (02/15/91)

I wrote an X program to work something like "talk" except that you can
send sketches to the other window  by dragging the mouse.  The program
ran VERY slowly presumably because one cpu had to manage  both windows
on two machines.  To get around this problem, I tried the following...

  open a pair of pipes
  fork() into two processes
  open an xwindow (in each process)
  exchange display, window & gc identifiers through the pipes
  event loop:
    if event == mouse drag, then
      draw a line on this window
      draw a line on the other window (using piped identifiers)
    .
    .
    .
  end loop

That  way each process would  pay  attention  only  to it's own window
input,  but would send  output to both.   The  technique works fine if
both windows are on the same display, but if I try sending  to another
display on  another machine,   the graphics  only  appears locally and
never arrives in the other window, although that window does appear.

To get around the problem, I tried something else.  Instead of drawing
on the other window, I sent a  ClientMessage to  the other window with
the coordinates to draw, so the loop now looked like this...

  event loop:
    if event == mouse drag, then
      draw a line on this window
      send a ClientMessage to the other window with line coordinates

    if event == ClientMessage, then
      draw a line on this window using the ClientMessage coordinates
    .
    .
    .
  end loop

Now each  process was only drawing  on  it's own window, although they
still  exchanged  display and  window id's  in   order to   target the
ClientMessage  properly.  Again, the system worked   fine on a  single
display, but would not work on different displays.  The remote display
RECEIVED THE CLIENT MESSAGE with  the   proper coordinates, but  still
could not display them on it's own window!

My suspicion   is that  the  fork()  screws  up  the  xwindow pointers
somehow.  Is this true? Should a  fork() NEVER be used  in an x window
application?  And if   this is the  case,  how  do  you  get  separate
processes to communicate through X?  I  have  consulted  a number of X
books on this question without success.  Anyone know the answer?
--
(O)((O))(((O)))((((O))))(((((O)))))(((((O)))))((((O))))(((O)))((O))(O)
(O)((O))(((               slehar@park.bu.edu               )))((O))(O)
(O)((O))(((    Steve Lehar Boston University Boston MA     )))((O))(O)
(O)((O))(((    (617) 424-7035 (H)   (617) 353-6741 (W)     )))((O))(O)
(O)((O))(((O)))((((O))))(((((O)))))(((((O)))))((((O))))(((O)))((O))(O)