Remove graphics.h file.
[scilab.git] / scilab / modules / graphics / src / c / Actions.c
1 /*------------------------------------------------------------------------
2  *    Graphic library
3  *    Copyright (C) 1998-2001 Enpc/Jean-Philippe Chancelier
4  *    jpc@cermics.enpc.fr 
5  --------------------------------------------------------------------------*/
6
7 #include <stdio.h>
8 #include <string.h>
9
10 #include "math_graphics.h"
11 #include "GetProperty.h"
12 #include "SetProperty.h"
13 #include "DrawObjects.h"
14 #include "Xcall1.h"
15 #include "WindowList.h"
16 #include "MALLOC.h"
17 #include "Xcall1.h"
18 #include "sciprint.h"
19
20 extern int xinitxend_flag;
21
22 /********************************************************
23  * the functions in this file are called from 
24  * callback ( see jpc_SGraph.c ) for the XWindow version 
25  * Nov 1998 : we must be sure that during the evaluation of 
26  *            scig_xxx an other function scig_yyy won't be 
27  *            run. This is possible since during the execution of 
28  *            one scig_xxx function a sciprint can be performed 
29  *            and it will lead to an event check which can 
30  *            produce a call to an other scig_yyy function 
31  *            flag scig_buzy  is used to check for that 
32  *            
33  ********************************************************/
34 extern int sciSwitchWindow  __PARAMS((int *winnum));/* NG */
35 extern void sciGetIdFigure __PARAMS((int *vect, int *id, int *iflag));/* NG */
36 extern int C2F(syncexec)(char *str, int *ns, int *ierr, int *seq, long int str_len) ;
37 #if !defined(_MSC_VER)
38 extern int WithBackingStore();
39 #endif
40 static int scig_buzy = 0;
41
42 int I3dRotation(void) ;
43
44 typedef int (*Scig_handler) __PARAMS((int));
45
46 void reset_scig_handler(void);
47 int scig_handler_none(int win_num);
48
49 /********************************************************
50  * A handler which can be dynamically set to custiomize 
51  * action of scig_xxx functions 
52  ********************************************************/
53
54 int scig_handler_none(int win_num) {
55         return win_num;
56 };
57
58 Scig_handler scig_handler = scig_handler_none;
59
60
61 /********************************************************
62  * Basic Replay : redraw recorded graphics 
63  ********************************************************/
64
65 void scig_replay(integer win_num)
66 {
67   /* Modification Allan CORNET Mai 2004 */
68   integer verb=0,cur,pix,na,backing;
69   char name[4];
70   if ( scig_buzy  == 1 ) return ;
71   scig_buzy =1;
72   GetDriver1(name,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
73   C2F(dr)("xget","window",&verb,&cur,&na,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);  
74   C2F(dr)("xset","window",&win_num,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
75   C2F(dr)("xget","pixmap",&verb,&pix,&na,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);  
76
77 #if defined(_MSC_VER)
78   backing = 0;
79 #else
80   backing = WithBackingStore();
81 #endif
82   if (backing) 
83     {
84       C2F(dr)("xset","wshow",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);    
85     }
86   else 
87     {
88       if (pix == 0) 
89         {
90           if ( (GetDriver()) != 'R') C2F(SetDriver)("Rec",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
91           C2F(dr)("xclear","v",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
92           sciRedrawFigure();
93           C2F(dr)("xset","wshow",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
94         }
95       else
96         {
97           C2F(dr)("xset","wshow",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);    
98         }
99     }
100
101   C2F(dr)("xset","window",&cur,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
102   C2F(dr)("xsetdr",name, PI0, PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
103   scig_buzy = 0;
104 }
105
106
107 void scig_erase(integer win_num)
108 {
109   integer verb=0,cur,na;
110   char name[4];
111   if ( scig_buzy  == 1 ) return ;
112   scig_buzy =1;
113   GetDriver1(name,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
114   if ( (GetDriver()) !='R') 
115     C2F(SetDriver)("Rec",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
116   C2F(dr)("xget","window",&verb,&cur,&na,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);  
117   C2F(dr)("xset","window",&win_num,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
118   sciXbasc() ;
119   C2F(dr)("xclear","v",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
120   C2F(dr)("xstart","v",&win_num,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
121   C2F(dr)("xset","window",&cur,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
122   C2F(dr)("xsetdr",name, PI0, PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
123   scig_buzy = 0;
124 }
125
126
127
128 int scig_2dzoom(integer win_num)
129 {
130   char name[4];
131   int ret;
132   integer verb=0,cur,na;
133
134   if ( scig_buzy  == 1 ) return 0; ;
135   scig_buzy =1;
136   GetDriver1(name,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
137
138   C2F(dr)("xget","window",&verb,&cur,&na,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);  
139   C2F(dr)("xset","window",&win_num,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
140   ret=zoom();
141   if (cur != win_num)
142           C2F(dr)("xset","window",&cur,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
143   C2F(dr)("xsetdr",name, PI0, PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
144
145   scig_buzy = 0;
146   return ret;
147 }
148
149 void scig_unzoom(integer win_num)
150 {
151   integer verb=0,cur,na;
152   char name[4];
153   if ( scig_buzy  == 1 ) return ;
154   scig_buzy =1;
155   GetDriver1(name,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
156   C2F(dr)("xget","window",&verb,&cur,&na,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);  
157   C2F(dr)("xset","window",&win_num,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
158   unzoom();
159   if (cur != win_num)
160         C2F(dr)("xset","window",&cur,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
161   C2F(dr)("xsetdr",name, PI0, PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
162   scig_buzy = 0;
163 }
164
165 int scig_3drot(integer win_num)
166 {
167   integer verb=0,cur,na,ret;
168   char name[4];
169   if ( scig_buzy  == 1 ) return 0;
170   scig_buzy =1;
171   GetDriver1(name,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
172
173   C2F(dr)("xget","window",&verb,&cur,&na,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);  
174   C2F(dr)("xset","window",&win_num,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
175   ret=I3dRotation();
176   if (cur != win_num)
177         C2F(dr)("xset","window",&cur,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
178   C2F(dr)("xsetdr",name, PI0, PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
179   scig_buzy = 0;
180   return ret;
181 }
182
183 void scig_sel(integer win_num)
184 {
185   char c ;
186   int v=1;
187   if ((c=GetDriver())=='R' || c == 'X' || c == 'W')
188     {
189       C2F(dr)("xset","window",&win_num,&v,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
190       sciSwitchWindow(&win_num) ;
191     }
192 }
193
194 void scig_loadsg(int win_num, char *filename)
195 {
196   integer verb = 0 ;
197   int cur = 0 ;
198   int narg = 0 ;
199   int ierr = 0 ;
200   int seq = 1 ;
201   char * macroCall = NULL ;
202   /* the sting is "xload('(1)')" where (1) is filemame */
203   /* Consequently we have 9 fixed character and two variable strings. */
204   int macroCallLength = 9 + strlen(filename) ;
205
206   if ( scig_buzy  == 1 ) { return ; }
207   scig_buzy  = 1 ;
208
209   C2F(dr)("xget","window",&verb,&cur,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
210   C2F(dr)("xset","window",&win_num,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
211   
212   macroCall = MALLOC( (macroCallLength+1) * sizeof(char) ) ; /* +1 for the \0 terminating character */
213   sprintf(macroCall,"xload('%s')",filename);
214
215   C2F(syncexec)(macroCall,&macroCallLength,&ierr,&seq, macroCallLength );
216
217   FREE( macroCall ) ;
218   if(ierr != 0) { sciprint("Wrong plot file : %s\r\n",filename) ; }
219
220   C2F(dr)("xset","window",&cur,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
221   scig_buzy = 0;
222 }
223
224 void scig_savesg( int win_num, char * filename )
225 {
226   integer ierr ;
227   integer seq = 1 ;
228   char * macroCall = NULL ;
229
230   /* the sting is "xsave('(1)',(2))" where (1) is filemame and (2) the string */
231   /* corresponding of win_num. Consequently we have 10 fixed character and two variable strings. */
232   int macroCallLength = 10 + strlen(filename) + GET_NB_DIGITS(win_num) ;
233
234   macroCall = MALLOC( (macroCallLength+1) * sizeof(char) ) ; /* +1 for the \0 terminating character */
235
236   sprintf( macroCall, "xsave('%s',%d)", filename, win_num ) ; /* call xsave macro */
237   C2F(syncexec)(macroCall,&macroCallLength,&ierr,&seq, macroCallLength );
238   FREE( macroCall ) ;
239 }