aboutsummaryrefslogtreecommitdiffstats
path: root/lib/gs/examples/distrib_draw.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gs/examples/distrib_draw.erl')
-rw-r--r--lib/gs/examples/distrib_draw.erl116
1 files changed, 116 insertions, 0 deletions
diff --git a/lib/gs/examples/distrib_draw.erl b/lib/gs/examples/distrib_draw.erl
new file mode 100644
index 0000000000..ecb1386c25
--- /dev/null
+++ b/lib/gs/examples/distrib_draw.erl
@@ -0,0 +1,116 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+%% ------------------------------------------------------------
+%% distrib_draw
+%% Shows one way of making two nodes draw on the same
+%% area.
+%%
+%% ------------------------------------------------------------
+
+%% HOW TO USE:
+%% 1) start up two nodes with same cookie.
+%% They can be on any machines.
+%%
+%% sid.ericsson.se> erl -cookie kaka -name hans
+%%
+%% ozzy.ericsson.se> erl -cookie kaka -name greta
+%%
+%%
+%% 2) Make them aware of each other.
+%%
+%% 3) Start up distrib_draw from either node.
+%%
+
+-module(distrib_draw).
+
+-export([start/2,init/0]).
+
+start(Node1,Node2) ->
+ Pid1=spawn(Node1,distrib_draw,init,[]),
+ Pid2=spawn(Node2,distrib_draw,init,[]),
+ Pid1 ! {connect,red,Pid2},
+ Pid2 ! {connect,green,Pid1}.
+
+init() ->
+ process_flag(trap_exit,true),
+ S=gs:start(),
+ receive
+ {connect,Color,Pid} ->
+ link(Pid),
+ gs:window(win,S,[{buttonpress,true},{buttonrelease,true},
+ {configure,true},{title,Color},{map,true}]),
+ gs:canvas(canvas,win,[{bg,grey},{width,300},{height,200}]),
+ draw0(0,0,Color,Pid)
+ after
+ 3000 -> exit(timeout)
+ end.
+
+%% not drawing state
+draw0(X0,Y0,Color,Pid) ->
+ receive
+ {gs,_,buttonpress,_,[1,X,Y|_]} ->
+ gs:config(win,{motion,true}),
+ draw1(X,Y,Color,Pid);
+ {draw,Coords,Col2} ->
+ gs:line(canvas,[{coords,Coords},{width,2},{fg,Col2}]),
+ draw0(X0,Y0,Color,Pid);
+ {gs,_,configure,_,[300,200|_]} ->
+ draw0(X0,Y0,Color,Pid);
+ {gs,_,configure,_,_} ->
+ gs:config(win,[{width,300},{height,200}]),
+ draw0(X0,Y0,Color,Pid);
+ {gs,_,destroy,_,_} ->
+ exit(normal);
+ {'EXIT',_,_} ->
+ exit(normal);
+ _X -> draw1(X0,Y0,Color,Pid)
+ end.
+
+%% i'm now drawing
+draw1(X0,Y0,Color,Pid) ->
+ receive
+ {gs,_,motion,_,[X,Y|_]} ->
+ Pid ! {draw,[{X0,Y0},{X,Y}],Color},
+ gs:line(canvas,[{coords,[{X0,Y0},{X,Y}]},{width,2},{fg,Color}]),
+ draw1(X,Y,Color,Pid);
+ {draw,Coords,Col2} ->
+ gs:line(canvas,[{coords,Coords},{width,2},{fg,Col2}]),
+ draw1(X0,Y0,Color,Pid);
+ {gs,_,buttonrelease,_,[1,X,Y|_]} ->
+ gs:config(win,{motion,false}),
+ draw0(X,Y,Color,Pid);
+ {gs,_,configure,_,[300,200|_]} ->
+ draw0(X0,Y0,Color,Pid);
+ {gs,_,configure,_,_} ->
+ gs:config(win,[{width,300},{height,200}]),
+ draw0(X0,Y0,Color,Pid);
+ {gs,_,destroy,_,_} ->
+ exit(normal);
+ {'EXIT',_,_} ->
+ exit(normal);
+ _X -> draw1(X0,Y0,Color,Pid)
+ end.
+
+%% ------------------------------------------------------------
+%% end of 'distrib_draw'