Commit 925acbf87ecfe2ab76681ffb12b332eb5e4458eb

Authored by perry.werneck@gmail.com
1 parent 5a3042e8

Implementando métodos para que um script rexx possa alterar o clipboard salvo

src/include/lib3270.h
... ... @@ -960,6 +960,7 @@
960 960 LIB3270_EXPORT void * lib3270_malloc(int len);
961 961 LIB3270_EXPORT void * lib3270_realloc(void *p, int len);
962 962 LIB3270_EXPORT void * lib3270_replace(void **p, void *ptr);
  963 + LIB3270_EXPORT void * lib3270_strdup(const char *str);
963 964  
964 965 /**
965 966 * Release allocated memory.
... ...
src/include/pw3270/v3270.h
... ... @@ -172,6 +172,7 @@
172 172 LIB3270_EXPORT void v3270_copy_append(GtkWidget *widget);
173 173 LIB3270_EXPORT gchar * v3270_get_selected(GtkWidget *widget, gboolean cut);
174 174 LIB3270_EXPORT gchar * v3270_get_copy(GtkWidget *widget);
  175 + LIB3270_EXPORT void v3270_set_copy(GtkWidget *widget, const gchar *text);
175 176  
176 177 LIB3270_EXPORT int v3270_run_script(GtkWidget *widget, const gchar *script);
177 178  
... ...
src/lib3270/util.c
... ... @@ -929,6 +929,21 @@ LIB3270_EXPORT void * lib3270_malloc(int len)
929 929 return r;
930 930 }
931 931  
  932 +LIB3270_EXPORT void * lib3270_strdup(const char *str)
  933 +{
  934 + char *r;
  935 +
  936 + r = strdup(str);
  937 + if (r == (char *)NULL)
  938 + {
  939 + Error(NULL,"Out of memory in %s",__FUNCTION__);
  940 + return 0;
  941 + }
  942 +
  943 + return r;
  944 +}
  945 +
  946 +
932 947 LIB3270_EXPORT char * lib3270_get_resource_string(H3270 *hSession, const char *first_element, ...)
933 948 {
934 949 #ifdef ANDROID
... ...
src/plugins/rx3270/pluginmain.cc
... ... @@ -94,6 +94,9 @@
94 94 int get_field_start(int baddr = -1);
95 95 int get_field_len(int baddr = -1);
96 96  
  97 + int set_copy(const char *text);
  98 + char * get_copy(void);
  99 +
97 100 private:
98 101 H3270 *hSession;
99 102  
... ... @@ -244,6 +247,17 @@
244 247 return lib3270_get_field_len(hSession,baddr);
245 248 }
246 249  
  250 + int plugin::set_copy(const char *text)
  251 + {
  252 + v3270_set_copy(GTK_WIDGET(lib3270_get_widget(hSession)),text);
  253 + return 0;
  254 + }
  255 +
  256 + char * plugin::get_copy(void)
  257 + {
  258 + return v3270_get_copy(GTK_WIDGET(lib3270_get_widget(hSession)));
  259 + }
  260 +
247 261 static int REXXENTRY Rexx_IO_exit(RexxExitContext *context, int exitnumber, int subfunction, PEXIT parmBlock)
248 262 {
249 263 trace("%s call with ExitNumber: %d Subfunction: %d",__FUNCTION__,(int) exitnumber, (int) subfunction);
... ...
src/plugins/rx3270/rx3270.cc
... ... @@ -154,6 +154,17 @@ void rx3270::set_plugin(void)
154 154 plugin = true;
155 155 }
156 156  
  157 +int rx3270::set_copy(const char *text)
  158 +{
  159 + return EINVAL;
  160 +}
  161 +
  162 +char * rx3270::get_copy(void)
  163 +{
  164 + errno = EINVAL;
  165 + return NULL;
  166 +}
  167 +
157 168  
158 169  
159 170  
... ...
src/plugins/rx3270/rx3270.h
... ... @@ -171,6 +171,9 @@
171 171 virtual int get_field_start(int baddr = -1) = 0;
172 172 virtual int get_field_len(int baddr = -1) = 0;
173 173  
  174 + virtual int set_copy(const char *text);
  175 + virtual char * get_copy(void);
  176 +
174 177 };
175 178  
176 179 rx3270 * create_lib3270_instance(void);
... ...
src/pw3270/v3270/selection.c
... ... @@ -244,6 +244,41 @@ gchar * v3270_get_copy(GtkWidget *widget)
244 244 return NULL;
245 245 }
246 246  
  247 +void v3270_set_copy(GtkWidget *widget, const gchar *text)
  248 +{
  249 + v3270 * terminal;
  250 + gchar * isotext;
  251 +
  252 + g_return_if_fail(GTK_IS_V3270(widget));
  253 +
  254 + terminal = GTK_V3270(widget);
  255 + v3270_clear_clipboard(terminal);
  256 +
  257 + if(!text)
  258 + {
  259 + /* No string, signal clipboard clear and return */
  260 + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, FALSE);
  261 + return;
  262 + }
  263 +
  264 + /* Received text, replace the selection buffer */
  265 + terminal->table = 0;
  266 + isotext = g_convert(text, -1, lib3270_get_charset(terminal->host), "UTF-8", NULL, NULL, NULL);
  267 +
  268 + if(!isotext)
  269 + {
  270 + /* No string, signal clipboard clear and return */
  271 + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, FALSE);
  272 + return;
  273 + }
  274 +
  275 + terminal->selection.text = lib3270_strdup(isotext);
  276 +
  277 + g_free(isotext);
  278 +
  279 + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE);
  280 +}
  281 +
247 282 static void update_system_clipboard(GtkWidget *widget)
248 283 {
249 284 if(GTK_V3270(widget)->selection.text)
... ...