Commit e812d17c2a22568a0c6f96b39542a13d9deb84e6
1 parent
5abb8018
Exists in
master
and in
5 other branches
Iniciando implementação da action que seleciona e executa um plugin rexx
Showing
3 changed files
with
141 additions
and
1 deletions
Show diff stats
src/include/pw3270.h
@@ -71,6 +71,11 @@ | @@ -71,6 +71,11 @@ | ||
71 | LIB3270_EXPORT void pw3270_set_session_options(GtkWidget *widget, LIB3270_OPTION options); | 71 | LIB3270_EXPORT void pw3270_set_session_options(GtkWidget *widget, LIB3270_OPTION options); |
72 | LIB3270_EXPORT int pw3270_set_session_color_type(GtkWidget *widget, unsigned short color_type); | 72 | LIB3270_EXPORT int pw3270_set_session_color_type(GtkWidget *widget, unsigned short color_type); |
73 | 73 | ||
74 | + LIB3270_EXPORT gchar * pw3270_get_filename(GtkWidget *widget, const gchar *group, const gchar *key, GtkFileFilter **filter, const gchar *title); | ||
75 | + | ||
76 | + LIB3270_EXPORT gchar * pw3270_get_string(GtkWidget *widget, const gchar *group, const gchar *key, const gchar *def); | ||
77 | + LIB3270_EXPORT void pw3270_set_string(GtkWidget *widget, const gchar *group, const gchar *key, const gchar *val); | ||
78 | + | ||
74 | LIB3270_EXPORT gint pw3270_get_integer(GtkWidget *widget, const gchar *group, const gchar *key, gint def); | 79 | LIB3270_EXPORT gint pw3270_get_integer(GtkWidget *widget, const gchar *group, const gchar *key, gint def); |
75 | LIB3270_EXPORT void pw3270_set_integer(GtkWidget *widget, const gchar *group, const gchar *key, gint val); | 80 | LIB3270_EXPORT void pw3270_set_integer(GtkWidget *widget, const gchar *group, const gchar *key, gint val); |
76 | 81 |
src/plugins/rx3270/pluginmain.cc
@@ -27,8 +27,17 @@ | @@ -27,8 +27,17 @@ | ||
27 | * | 27 | * |
28 | */ | 28 | */ |
29 | 29 | ||
30 | + #define ENABLE_NLS | ||
31 | + #define GETTEXT_PACKAGE PACKAGE_NAME | ||
32 | + | ||
30 | #include "rx3270.h" | 33 | #include "rx3270.h" |
34 | + | ||
35 | + #include <libintl.h> | ||
36 | + #include <glib/gi18n.h> | ||
37 | + #include <gtk/gtk.h> | ||
38 | + | ||
31 | #include <string.h> | 39 | #include <string.h> |
40 | + #include <pw3270.h> | ||
32 | #include <pw3270/plugin.h> | 41 | #include <pw3270/plugin.h> |
33 | #include <pw3270/v3270.h> | 42 | #include <pw3270/v3270.h> |
34 | #include <lib3270/actions.h> | 43 | #include <lib3270/actions.h> |
@@ -72,12 +81,16 @@ | @@ -72,12 +81,16 @@ | ||
72 | 81 | ||
73 | }; | 82 | }; |
74 | 83 | ||
75 | - static plugin * session = NULL; | 84 | +/*--[ Globals ]--------------------------------------------------------------------------------------*/ |
85 | + | ||
86 | + static plugin * session = NULL; | ||
87 | + static GMutex mutex; | ||
76 | 88 | ||
77 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 89 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
78 | 90 | ||
79 | LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window) | 91 | LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window) |
80 | { | 92 | { |
93 | + g_mutex_init(&mutex); | ||
81 | session = new plugin(lib3270_get_default_session_handle()); | 94 | session = new plugin(lib3270_get_default_session_handle()); |
82 | session->set_plugin(); | 95 | session->set_plugin(); |
83 | trace("%s: Rexx object is %p",__FUNCTION__,session); | 96 | trace("%s: Rexx object is %p",__FUNCTION__,session); |
@@ -91,6 +104,7 @@ | @@ -91,6 +104,7 @@ | ||
91 | delete session; | 104 | delete session; |
92 | session = NULL; | 105 | session = NULL; |
93 | } | 106 | } |
107 | + g_mutex_clear(&mutex); | ||
94 | return 0; | 108 | return 0; |
95 | } | 109 | } |
96 | 110 | ||
@@ -203,12 +217,79 @@ | @@ -203,12 +217,79 @@ | ||
203 | extern "C" | 217 | extern "C" |
204 | { | 218 | { |
205 | 219 | ||
220 | + static void call_rexx_script(const gchar *filename) | ||
221 | + { | ||
222 | + | ||
223 | + } | ||
224 | + | ||
206 | LIB3270_EXPORT void pw3270_action_rexx_activated(GtkAction *action, GtkWidget *widget) | 225 | LIB3270_EXPORT void pw3270_action_rexx_activated(GtkAction *action, GtkWidget *widget) |
207 | { | 226 | { |
227 | + gchar *filename = (gchar *) g_object_get_data(G_OBJECT(action),"src"); | ||
228 | + | ||
208 | lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p",gtk_action_get_name(action),widget); | 229 | lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p",gtk_action_get_name(action),widget); |
209 | 230 | ||
231 | + if(!g_mutex_trylock(&mutex)) | ||
232 | + { | ||
233 | + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | ||
234 | + GTK_DIALOG_DESTROY_WITH_PARENT, | ||
235 | + GTK_MESSAGE_ERROR, | ||
236 | + GTK_BUTTONS_CANCEL, | ||
237 | + "%s", _( "Can't start script" )); | ||
238 | + | ||
239 | + gtk_window_set_title(GTK_WINDOW(dialog),_( "System busy" )); | ||
240 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",_( "Please, try again in a few moments" )); | ||
241 | + | ||
242 | + gtk_dialog_run(GTK_DIALOG (dialog)); | ||
243 | + gtk_widget_destroy(dialog); | ||
244 | + return; | ||
245 | + } | ||
246 | + | ||
247 | + gtk_action_set_sensitive(action,FALSE); | ||
210 | 248 | ||
249 | + if(filename) | ||
250 | + { | ||
251 | + // Has filename, call it directly | ||
252 | + call_rexx_script(filename); | ||
253 | + } | ||
254 | + else | ||
255 | + { | ||
256 | + // No filename, ask user | ||
257 | + static const struct _list | ||
258 | + { | ||
259 | + const gchar *name; | ||
260 | + const gchar *pattern; | ||
261 | + } list[] = | ||
262 | + { | ||
263 | + { N_( "Rexx script file" ), "*.rex" }, | ||
264 | + { N_( "Rexx class file" ), "*.cls" } | ||
265 | + }; | ||
266 | + | ||
267 | + GtkFileFilter * filter[G_N_ELEMENTS(list)+1]; | ||
268 | + unsigned int f; | ||
269 | + | ||
270 | + memset(filter,0,sizeof(filter)); | ||
271 | + | ||
272 | + for(f=0;f<G_N_ELEMENTS(list);f++) | ||
273 | + { | ||
274 | + filter[f] = gtk_file_filter_new(); | ||
275 | + gtk_file_filter_set_name(filter[f],gettext(list[f].name)); | ||
276 | + gtk_file_filter_add_pattern(filter[f],list[f].pattern); | ||
277 | + } | ||
278 | + | ||
279 | + filename = pw3270_get_filename(widget,"rexx","script",filter,_( "Select Rexx script to run" )); | ||
280 | + | ||
281 | + if(filename) | ||
282 | + { | ||
283 | + call_rexx_script(filename); | ||
284 | + g_free(filename); | ||
285 | + } | ||
286 | + | ||
287 | + } | ||
288 | + | ||
289 | + gtk_action_set_sensitive(action,TRUE); | ||
290 | + g_mutex_unlock(&mutex); | ||
211 | 291 | ||
212 | } | 292 | } |
213 | 293 | ||
214 | } | 294 | } |
295 | + |
src/pw3270/tools.c
@@ -105,11 +105,21 @@ LIB3270_EXPORT gint pw3270_get_integer(GtkWidget *widget, const gchar *group, co | @@ -105,11 +105,21 @@ LIB3270_EXPORT gint pw3270_get_integer(GtkWidget *widget, const gchar *group, co | ||
105 | return get_integer_from_config(group, key, def); | 105 | return get_integer_from_config(group, key, def); |
106 | } | 106 | } |
107 | 107 | ||
108 | +LIB3270_EXPORT gchar * pw3270_get_string(GtkWidget *widget, const gchar *group, const gchar *key, const gchar *def) | ||
109 | +{ | ||
110 | + return get_string_from_config(group, key, def); | ||
111 | +} | ||
112 | + | ||
108 | LIB3270_EXPORT void pw3270_set_integer(GtkWidget *widget, const gchar *group, const gchar *key, gint val) | 113 | LIB3270_EXPORT void pw3270_set_integer(GtkWidget *widget, const gchar *group, const gchar *key, gint val) |
109 | { | 114 | { |
110 | set_integer_to_config(group, key, val); | 115 | set_integer_to_config(group, key, val); |
111 | } | 116 | } |
112 | 117 | ||
118 | +LIB3270_EXPORT void pw3270_set_string(GtkWidget *widget, const gchar *group, const gchar *key, const gchar *val) | ||
119 | +{ | ||
120 | + set_string_to_config(group, key, val); | ||
121 | +} | ||
122 | + | ||
113 | LIB3270_EXPORT gint pw3270_get_boolean(GtkWidget *widget, const gchar *group, const gchar *key, gint def) | 123 | LIB3270_EXPORT gint pw3270_get_boolean(GtkWidget *widget, const gchar *group, const gchar *key, gint def) |
114 | { | 124 | { |
115 | return get_boolean_from_config(group, key, def); | 125 | return get_boolean_from_config(group, key, def); |
@@ -131,3 +141,47 @@ LIB3270_EXPORT gboolean pw3270_set_toggle_by_name(GtkWidget *widget, const gchar | @@ -131,3 +141,47 @@ LIB3270_EXPORT gboolean pw3270_set_toggle_by_name(GtkWidget *widget, const gchar | ||
131 | lib3270_set_toggle(hSession,id,(int) flag); | 141 | lib3270_set_toggle(hSession,id,(int) flag); |
132 | return TRUE; | 142 | return TRUE; |
133 | } | 143 | } |
144 | + | ||
145 | +LIB3270_EXPORT gchar * pw3270_get_filename(GtkWidget *widget, const gchar *group, const gchar *key, GtkFileFilter **filter, const gchar *title) | ||
146 | +{ | ||
147 | + gchar * filename = NULL; | ||
148 | + gchar * ptr; | ||
149 | + GtkWidget * dialog = gtk_file_chooser_dialog_new( title, | ||
150 | + GTK_WINDOW(gtk_widget_get_toplevel(widget)), | ||
151 | + GTK_FILE_CHOOSER_ACTION_OPEN, | ||
152 | + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | ||
153 | + GTK_STOCK_EXECUTE, GTK_RESPONSE_ACCEPT, | ||
154 | + NULL ); | ||
155 | + | ||
156 | + if(filter) | ||
157 | + { | ||
158 | + int f; | ||
159 | + | ||
160 | + for(f=0;filter[f];f++) | ||
161 | + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter[f]); | ||
162 | + } | ||
163 | + | ||
164 | + gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(dialog),FALSE); | ||
165 | + | ||
166 | + ptr = pw3270_get_string(widget,group,key,NULL); | ||
167 | + if(ptr) | ||
168 | + { | ||
169 | + gtk_file_chooser_set_uri(GTK_FILE_CHOOSER(dialog),ptr); | ||
170 | + g_free(ptr); | ||
171 | + } | ||
172 | + | ||
173 | + if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) | ||
174 | + { | ||
175 | + gchar *uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog)); | ||
176 | + | ||
177 | + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); | ||
178 | + | ||
179 | + pw3270_set_string(widget,group,key,uri); | ||
180 | + g_free(uri); | ||
181 | + | ||
182 | + } | ||
183 | + | ||
184 | + gtk_widget_destroy(dialog); | ||
185 | + | ||
186 | + return filename; | ||
187 | +} |