bug 6743
[scilab.git] / scilab / modules / action_binding / src / c / dynamic_menus.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2001-2008 - ENPC  - Jean-Philippe Chancelier <jpc@cermics.enpc.fr>
4  * Copyright (C) 2004-2008 - INRIA - Serge STEER <serge.steer@inria.fr>
5  * Copyright (C) 2008-2009 - DIGITEO - Bruno JOFRET
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13 */
14 /*--------------------------------------------------------------------------*/
15 #include <string.h>
16 #include "stack-c.h"
17 #include "MALLOC.h"
18 #include "dynamic_menus.h"
19 #include "sciprint.h"
20 #include "sciprint_full.h"
21 #include "localization.h"
22 #include "Thread_Wrapper.h"
23 /*--------------------------------------------------------------------------*/
24 /*
25  *  Command queue functions
26  *  This function is used to store Scilab command in a queue
27  *
28  *  PUBLIC : int StoreCommand( char *command)
29  *           int C2F(ismenu)()
30  *           int C2F(getmen)(char * btn_cmd,int * lb, int * entry)
31 */
32 /*--------------------------------------------------------------------------*/
33 #ifdef _MSC_VER
34 #define IMPORT_SIGNAL __declspec(dllimport)
35 #else
36 #define IMPORT_SIGNAL extern
37 #endif
38 /*--------------------------------------------------------------------------*/
39 typedef struct commandRec
40 {
41         char              *command;             /* command info one string two integers */
42         int               flag; /* 1 if the command execution cannot be interrupted */
43         struct commandRec *next;
44 } CommandRec;
45 /*--------------------------------------------------------------------------*/
46 /* Extern Signal to say we git a StoreCommand. */
47 IMPORT_SIGNAL __threadSignal LaunchScilab;
48 /*--------------------------------------------------------------------------*/
49 static CommandRec *commandQueue = NULL;
50 static __threadLock commandQueueSingleAccess = __StaticInitLock;
51 /*--------------------------------------------------------------------------*/
52 int StoreCommand (char *command)
53 {
54         return (StoreCommandWithFlag (command, 0));
55 }
56 /*--------------------------------------------------------------------------*/
57 int StorePrioritaryCommand (char *command)
58 {
59         return (StorePrioritaryCommandWithFlag (command, 0));
60 }
61 /*--------------------------------------------------------------------------*/
62 /*
63 * try to execute a command or add it to the end of command queue
64 * flag = 0 : the command is not shown in scilab window
65 * flag = 1 : the command is shown in scilab window (if at prompt) and executed sequentially
66 */
67 int StoreCommandWithFlag (char *command,int flag)
68 {
69         CommandRec *q = NULL, *r = NULL;
70
71         CommandRec *p = (CommandRec *) MALLOC (sizeof (CommandRec));
72         if (p == (CommandRec *) 0)
73         {
74                 sciprint(_("%s: No more memory.\n"),"send_command");
75                 return (1);
76         }
77         p->flag = flag;
78         p->command = (char *) MALLOC ((strlen (command) + 1) * sizeof (char));
79         if (p->command == (char *) 0)
80         {
81                 FREE(p);
82                 sciprint(_("%s: No more memory.\n"),"send_command");
83                 return (1);
84         }
85         strcpy (p->command, command);
86         p->next = NULL;
87         __Lock(&commandQueueSingleAccess);
88         if (commandQueue == NULL)
89         {
90                 commandQueue = p;
91         }
92         else
93         {
94                 q = commandQueue;
95                 while ((r = q->next) != NULL)
96                 {
97                         q = r;
98                 }
99                 q->next = p;
100         }
101         __UnLock(&commandQueueSingleAccess);
102         //**
103         //** We have something to do, awake Scilab !!!!!!
104         //**
105         __Signal(&LaunchScilab);
106         return (0);
107 }
108 /*--------------------------------------------------------------------------*/
109 /*
110 * try to execute a command or add it to the _BEGINNING_ of command queue
111 * flag = 0 : the command is not shown in scilab window
112 * flag = 1 : the command is shown in scilab window (if at prompt) and executed sequentially
113 */
114 int StorePrioritaryCommandWithFlag (char *command,int flag)
115 {
116         CommandRec *p = (CommandRec *) MALLOC (sizeof (CommandRec));
117         if (p == (CommandRec *) 0)
118         {
119                 sciprint(_("%s: No more memory.\n"),"send_command");
120                 return (1);
121         }
122         p->flag = flag;
123         p->command = (char *) MALLOC ((strlen (command) + 1) * sizeof (char));
124         if (p->command == (char *) 0)
125         {
126                 FREE(p);
127                 sciprint(_("%s: No more memory.\n"),"send_command");
128                 return (1);
129         }
130         strcpy (p->command, command);
131         p->next = NULL;
132         __Lock(&commandQueueSingleAccess);
133         if (commandQueue == NULL)
134         {
135                 commandQueue = p;
136         }
137         else
138         {
139                 p->next = commandQueue;
140                 commandQueue = p;
141         }
142         __UnLock(&commandQueueSingleAccess);
143         //**
144         //** We have something to do, awake Scilab !!!!!!
145         //**
146         __Signal(&LaunchScilab);
147         return (0);
148 }
149 /*--------------------------------------------------------------------------*/
150 int isEmptyCommandQueue(void)
151 {
152         int isEmpty = 0;
153         __Lock(&commandQueueSingleAccess);
154         isEmpty = (commandQueue == NULL);
155         __UnLock(&commandQueueSingleAccess);
156         return isEmpty;
157 }
158 /*--------------------------------------------------------------------------*/
159 /*
160 * Gets info on the first queue element
161 * and remove it from the queue
162 */
163 int GetCommand ( char *str)
164 {
165         int flag = 0;
166         __Lock(&commandQueueSingleAccess);
167         if (commandQueue != NULL)
168         {
169                 CommandRec *p = commandQueue;
170
171                 strcpy (str, p->command);
172                 flag = p->flag;
173
174                 commandQueue = p->next;
175                 FREE (p->command);
176                 FREE (p);
177                 if (C2F(iop).ddt == -1) 
178                 {
179                         if (flag == 0) 
180                         { 
181                                 sciprint_full(_("Unqueuing %s - No option.\n"),str); 
182                         }
183                         else
184                         { 
185                                 sciprint_full(_("Unqueuing %s - seq.\n"),str); 
186                         }
187                 }
188         }
189         __UnLock(&commandQueueSingleAccess);
190
191         return flag;
192 }
193 /*--------------------------------------------------------------------------*/
194 int ismenu(void)
195 {
196         /* Do not manage commands while compiling scilab function */
197         return (commandQueue == NULL || (C2F(com).comp[0] != 0)) ? 0 : 1;
198 }
199 /*--------------------------------------------------------------------------*/
200 /* menu/button info for Scilab */
201 int C2F(getmen)(char * btn_cmd,int * lb, int * entry)
202 {
203         int flag = 0;
204         if (ismenu() == 1)
205         {
206                 flag = GetCommand(btn_cmd);
207                 *lb = (int) strlen(btn_cmd);
208                 *entry = 0;  /* This parameter entry seems to be unused. Probably a very old thing... */
209         }
210         else
211         {
212                 flag = 0;
213                 *lb = 0;
214                 *entry = 0;  /* This parameter entry seems to be unused. Probably a very old thing... */
215         }
216         return flag;
217 }
218 /*--------------------------------------------------------------------------*/