diff --git a/src/gtk/actions.c b/src/gtk/actions.c index c4822ab..18cbc3c 100644 --- a/src/gtk/actions.c +++ b/src/gtk/actions.c @@ -60,6 +60,12 @@ static void activate_action(GtkAction *action, GtkWidget *widget) gtk_widget_activate(widget); } +static void copy_action(GtkAction *action, GtkWidget *widget) +{ + trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); + v3270_copy(GTK_V3270(widget)); +} + void ui_connect_action(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id) { #undef DECLARE_LIB3270_ACTION @@ -92,6 +98,7 @@ void ui_connect_action(GtkAction *action, GtkWidget *widget, const gchar *name, { { "activate", activate_action }, { "connect", connect_action }, + { "copy", copy_action }, { "disconnect", disconnect_action }, }; diff --git a/src/gtk/v3270/clipboard.c b/src/gtk/v3270/clipboard.c new file mode 100644 index 0000000..d2fdeeb --- /dev/null +++ b/src/gtk/v3270/clipboard.c @@ -0,0 +1,88 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA, 02111-1307, USA + * + * Este programa está nomeado como clipboard.c e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include + #include + #include "v3270.h" + #include "private.h" + +/*--[ Globals ]--------------------------------------------------------------------------------------*/ + + enum + { + CLIPBOARD_TYPE_TEXT, + }; + + static const GtkTargetEntry targets[] = + { + { "STRING", 0, CLIPBOARD_TYPE_TEXT }, + { "text/plain", 0, CLIPBOARD_TYPE_TEXT }, + }; + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + +static void clipboard_clear(GtkClipboard *clipboard, GObject *obj) +{ + trace("%s widget=%p",__FUNCTION__,obj); + +} + +void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection_data, guint target, GObject *obj) +{ + v3270 *widget = GTK_V3270(obj); + + trace("%s: widget=%p target=\"%s\"",__FUNCTION__,obj,targets[target].target); + + switch(target) + { + case CLIPBOARD_TYPE_TEXT: + gtk_clipboard_set_text(clipboard,"TESTE",-1); + break; + + default: + g_warning("Unexpected clipboard type %d\n",target); + } +} + +gboolean v3270_copy(v3270 *widget) +{ + GtkClipboard *clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); + if(gtk_clipboard_set_with_owner( clipboard, + targets, + G_N_ELEMENTS(targets), + (GtkClipboardGetFunc) clipboard_get, + (GtkClipboardClearFunc) clipboard_clear, + G_OBJECT(widget) + )) + { + gtk_clipboard_set_can_store(clipboard,targets,1); + trace("%s: Clipboard set",__FUNCTION__); + } +} + diff --git a/src/gtk/v3270/private.h b/src/gtk/v3270/private.h index 59023e3..9f19af4 100644 --- a/src/gtk/v3270/private.h +++ b/src/gtk/v3270/private.h @@ -121,6 +121,10 @@ void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id); void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col, unsigned char c, unsigned short attr); void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on); +// Clipboard +void v3270_clipboard_set(v3270 *widget); +void v3270_clipboard_clear(v3270 *widget); + // Keyboard & Mouse gboolean v3270_key_press_event(GtkWidget *widget, GdkEventKey *event); gboolean v3270_key_release_event(GtkWidget *widget, GdkEventKey *event); diff --git a/src/gtk/v3270/sources.mak b/src/gtk/v3270/sources.mak index a8196f3..4019ebe 100644 --- a/src/gtk/v3270/sources.mak +++ b/src/gtk/v3270/sources.mak @@ -1,2 +1,2 @@ -V3270_SRC=marshal.c widget.c oia.c iocallback.c keyboard.c draw.c mouse.c +V3270_SRC=marshal.c widget.c oia.c iocallback.c keyboard.c draw.c mouse.c clipboard.c diff --git a/src/gtk/v3270/v3270.h b/src/gtk/v3270/v3270.h index 7925c9c..7f20385 100644 --- a/src/gtk/v3270/v3270.h +++ b/src/gtk/v3270/v3270.h @@ -198,6 +198,9 @@ int v3270_connect(GtkWidget *widget, const gchar *host); void v3270_disconnect(GtkWidget *widget); + // Clipboard + gboolean v3270_copy(v3270 *widget); + G_END_DECLS #endif // V3270_H_INCLUDED diff --git a/src/lib3270/selection.c b/src/lib3270/selection.c index 4d66093..e2c23b0 100644 --- a/src/lib3270/selection.c +++ b/src/lib3270/selection.c @@ -172,6 +172,9 @@ LIB3270_ACTION(unselect) CHECK_SESSION_HANDLE(hSession); + if(!hSession->selected) + return; + hSession->selected = 0; for(a = 0; a < hSession->rows*hSession->cols; a++) diff --git a/ui/default.xml b/ui/default.xml index d0db751..4f14233 100644 --- a/ui/default.xml +++ b/ui/default.xml @@ -66,7 +66,7 @@ - + -- libgit2 0.21.2