From d7cf40b5d61f623a21e90939344e731b7e9a7c42 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Tue, 17 Apr 2012 18:48:36 +0000 Subject: [PATCH] Incluindo icone padrao --- src/gtk/Makefile.in | 2 +- src/gtk/dialog.c | 14 +++++++++----- src/gtk/mainwindow.c | 389 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/gtk/v3270/clipboard.c | 476 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/gtk/v3270/mouse.c | 20 ++++++++++---------- src/gtk/v3270/selection.c | 476 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/gtk/v3270/sources.mak | 2 +- src/gtk/window.c | 408 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib3270/selection.c | 1 - 9 files changed, 905 insertions(+), 883 deletions(-) delete mode 100644 src/gtk/mainwindow.c delete mode 100644 src/gtk/v3270/clipboard.c create mode 100644 src/gtk/v3270/selection.c create mode 100644 src/gtk/window.c diff --git a/src/gtk/Makefile.in b/src/gtk/Makefile.in index e80bd52..9fad512 100644 --- a/src/gtk/Makefile.in +++ b/src/gtk/Makefile.in @@ -50,7 +50,7 @@ include uiparser/sources.mak #---[ Targets ]---------------------------------------------------------------- -SOURCES=main.c mainwindow.c actions.c fonts.c dialog.c print.c colors.c \ +SOURCES=main.c window.c actions.c fonts.c dialog.c print.c colors.c \ $(foreach SRC, $(V3270_SRC), v3270/$(SRC)) \ $(foreach SRC, $(COMMON_SRC), common/$(SRC)) \ $(foreach SRC, $(UI_PARSER_SRC), uiparser/$(SRC)) diff --git a/src/gtk/dialog.c b/src/gtk/dialog.c index 271ff9b..8695996 100644 --- a/src/gtk/dialog.c +++ b/src/gtk/dialog.c @@ -537,10 +537,11 @@ "USA" ); GtkAboutDialog * dialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); - gchar * filename = g_strdup_printf("%s-logo.png",g_get_application_name()); - gchar * logo = build_data_filename(filename,NULL); + gchar * text = g_strdup_printf("%s-logo.png",g_get_application_name()); + gchar * filename = build_data_filename(text,NULL); - if(logo && g_file_test(filename,G_FILE_TEST_EXISTS)) + trace("[%s]",filename); + if(g_file_test(filename,G_FILE_TEST_EXISTS)) { GError * error = NULL; GdkPixbuf * pix = gdk_pixbuf_new_from_file(filename,&error); @@ -558,10 +559,13 @@ } } - g_free(logo); g_free(filename); + g_free(text); + + text = g_strdup_printf(_("Version %s - Revision %s"),PACKAGE_VERSION,PACKAGE_REVISION); + gtk_about_dialog_set_version(dialog,text); + g_free(text); - gtk_about_dialog_set_version(dialog, PACKAGE_VERSION ); gtk_about_dialog_set_copyright(dialog, "Copyright © 2008 Banco do Brasil S.A." ); gtk_about_dialog_set_comments(dialog, _( "3270 terminal emulator for GTK+" ) ); diff --git a/src/gtk/mainwindow.c b/src/gtk/mainwindow.c deleted file mode 100644 index 35b397c..0000000 --- a/src/gtk/mainwindow.c +++ /dev/null @@ -1,389 +0,0 @@ -/* - * "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 mainwindow.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) - * licinio@bb.com.br (Licínio Luis Branco) - * kraucer@bb.com.br (Kraucer Fernandes Mazuco) - * - */ - -#include "globals.h" -#include "uiparser/parser.h" - -#ifdef DEBUG - #include -#endif - -/*--[ Globals ]--------------------------------------------------------------------------------------*/ - - enum action_group - { - ACTION_GROUP_DEFAULT, - ACTION_GROUP_ONLINE, - ACTION_GROUP_OFFLINE, - ACTION_GROUP_SELECTION, - ACTION_GROUP_CLIPBOARD, - ACTION_GROUP_FILETRANSFER, - ACTION_GROUP_PASTE, - - ACTION_GROUP_MAX - }; - - enum popup_group - { - POPUP_DEFAULT, - POPUP_ONLINE, - POPUP_OFFLINE, - POPUP_SELECTION, - - POPUP_MAX - }; - - static const gchar *groupname[ACTION_GROUP_MAX+1] = { "default", - "online", - "offline", - "selection", - "clipboard", - "filetransfer", - "paste", - NULL - }; - - static const gchar *popupname[POPUP_MAX+1] = { "default", - "online", - "offline", - "selection", - NULL - }; - -/*--[ Implement ]------------------------------------------------------------------------------------*/ - - static void toggle_changed(GtkWidget *widget, LIB3270_TOGGLE id, gboolean toggled, const gchar *name, GtkWindow *toplevel) - { - GtkAction **list = (GtkAction **) g_object_get_data(G_OBJECT(widget),"toggle_actions"); - gchar *nm = g_ascii_strdown(name,-1); - set_boolean_to_config("toggle",nm,toggled); - g_free(nm); - - if(id == LIB3270_TOGGLE_FULL_SCREEN) - { - if(toggled) - gtk_window_fullscreen(GTK_WINDOW(toplevel)); - else - gtk_window_unfullscreen(GTK_WINDOW(toplevel)); - } - - if(list[id]) - gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(list[id]),toggled); - - } - - static gboolean window_state_event(GtkWidget *window, GdkEventWindowState *event, GtkWidget *widget) - { - gboolean fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN ? TRUE : FALSE; - GtkAction **action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"named_actions"); - - // Update fullscreen toggles - if(action[ACTION_FULLSCREEN]) - gtk_action_set_visible(action[ACTION_FULLSCREEN],!fullscreen); - - if(action[ACTION_UNFULLSCREEN]) - gtk_action_set_visible(action[ACTION_UNFULLSCREEN],fullscreen); - - lib3270_set_toggle(v3270_get_session(widget),LIB3270_TOGGLE_FULL_SCREEN,fullscreen); - - return 0; - } - - static gboolean window_destroy(GtkWidget *window, GtkWidget *widget) - { - if(widget) - v3270_disconnect(widget); - } - - static void disconnected(GtkWidget *widget, GtkActionGroup **group) - { - gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],FALSE); - gtk_action_group_set_sensitive(group[ACTION_GROUP_ONLINE],FALSE); - gtk_action_group_set_sensitive(group[ACTION_GROUP_OFFLINE],TRUE); - gtk_window_set_title(GTK_WINDOW(gtk_widget_get_toplevel(widget)),g_get_application_name()); - } - - static void connected(GtkWidget *widget, const gchar *host, GtkActionGroup **group) - { - set_string_to_config("host","uri","%s",host); - gtk_window_set_title(GTK_WINDOW(gtk_widget_get_toplevel(widget)),host); - gtk_action_group_set_sensitive(group[ACTION_GROUP_ONLINE],TRUE); - gtk_action_group_set_sensitive(group[ACTION_GROUP_OFFLINE],FALSE); - gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],TRUE); - } - - static void update_config(GtkWidget *widget, const gchar *name, const gchar *value) - { - set_string_to_config("terminal",name,"%s",value); - } - - static void update_model(GtkWidget *widget, guint id, const gchar *name) - { - trace("Widget %p changed to %s (id=%d)",widget,name,id); - set_integer_to_config("terminal","model",id); - } - - static gboolean popup_menu(GtkWidget *widget, gboolean selected, gboolean online, GdkEventButton *event, GtkWidget **popup) - { - GtkWidget *menu = NULL; - - if(!online) - menu = popup[POPUP_OFFLINE]; - else if(selected && popup[POPUP_SELECTION]) - menu = popup[POPUP_SELECTION]; - else if(popup[POPUP_ONLINE]) - menu = popup[POPUP_ONLINE]; - else - menu = popup[POPUP_DEFAULT]; - - trace("Popup %p on widget %p online=%s selected=%s",menu,widget,online ? "Yes" : "No", selected ? "Yes" : "No"); - - if(!menu) - return FALSE; - - trace("Showing popup \"%s\"",gtk_widget_get_name(menu)); - - gtk_widget_show_all(menu); - gtk_menu_set_screen(GTK_MENU(menu), gtk_widget_get_screen(widget)); - gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button,event->time); - - return TRUE; - } - - static void selecting(GtkWidget *widget, gboolean on, GtkActionGroup **group) - { - GtkAction **action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"named_actions"); - gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],on); - - if(action[ACTION_RESELECT]) - gtk_action_set_sensitive(action[ACTION_RESELECT],!on); - - } - - static void has_text(GtkWidget *widget, gboolean on, GtkActionGroup **group) - { - gtk_action_group_set_sensitive(group[ACTION_GROUP_CLIPBOARD],on); - } - - static void pastenext(GtkWidget *widget, gboolean on, GtkAction **action) - { - gtk_action_set_sensitive(action[ACTION_PASTENEXT],on); - } - - static void setup_input_method(GtkWidget *widget, GtkWidget *obj) - { - GtkWidget *menu = gtk_menu_new(); - gtk_im_multicontext_append_menuitems((GtkIMMulticontext *) v3270_get_im_context(obj) ,GTK_MENU_SHELL(menu)); - gtk_widget_show_all(menu); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget),menu); - } - - static void set_screen_size(GtkCheckMenuItem *item, GtkWidget *widget) - { - if(gtk_check_menu_item_get_active(item)) - { - trace("screen model on widget %p changes to %d",widget,(int) g_object_get_data(G_OBJECT(item),"mode_3270")); - lib3270_set_model(v3270_get_session(widget),(int) g_object_get_data(G_OBJECT(item),"mode_3270")); - } - } - - static void setup_screen_sizes(GtkWidget *widget, GtkWidget *obj) - { - static const gchar * text[] = { "80x24", "80x32", "80x43", "132x27" }; - GtkWidget * menu = gtk_menu_new(); - int model = lib3270_get_model(v3270_get_session(obj))-2; - GSList * group = NULL; - GtkWidget * item; - int f; - - gtk_widget_set_sensitive(widget,TRUE); - - for(f=0;f - * - * 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 - #include "v3270.h" - #include "private.h" - #include - -/*--[ Globals ]--------------------------------------------------------------------------------------*/ - - enum - { - CLIPBOARD_TYPE_TEXT, - }; - - static const GtkTargetEntry targets[] = - { - { "COMPOUND_TEXT", 0, CLIPBOARD_TYPE_TEXT }, - { "UTF8_STRING", 0, CLIPBOARD_TYPE_TEXT }, - }; - -/*--[ Implement ]------------------------------------------------------------------------------------*/ - -static void clipboard_clear(GtkClipboard *clipboard, GObject *obj) -{ - trace("%s widget=%p",__FUNCTION__,obj); - -} - -static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, 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: - if(!widget->clipboard) - lib3270_ring_bell(widget->host); - else - gtk_selection_data_set_text(selection,widget->clipboard,-1); - break; - - default: - g_warning("Unexpected clipboard type %d\n",target); - } -} - -gchar * v3270_get_text(GtkWidget *widget, int offset, int len) -{ - v3270 * terminal; - gchar * text; - char * str; - - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); - - terminal = GTK_V3270(widget); - - str = lib3270_get_text(terminal->host, offset, len); - - if(!str) - return NULL; - - text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); - - free(str); - return text; -} - -/** - * Get lib3270 selection as a g_malloc buffer. - * - * @param widget Widget containing the desired section. - * - * @return NULL if error, otherwise the selected buffer contents (release with g_free). - * - */ -static gchar * v3270_get_selected(v3270 *widget) -{ - gchar *text = lib3270_get_selected(widget->host); - if(text) - { - gchar *str = g_strdup(text); - free(text); - return str; - } - return NULL; -} - -const gchar * v3270_get_selected_text(GtkWidget *widget) -{ - v3270 *terminal; - gchar *text; - - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); - - terminal = GTK_V3270(widget); - - if(terminal->clipboard) - { - g_free(terminal->clipboard); - terminal->clipboard = NULL; - } - - text = v3270_get_selected(terminal); - - if(!text) - { - g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, FALSE); - lib3270_ring_bell(terminal->host); - return NULL; - } - - if(terminal->table) - { - // Convert text to table - gchar **ln = g_strsplit(text,"\n",-1); - int width = lib3270_get_width(terminal->host); - gboolean cols[width]; - int l; - GString * buffer; - - memset(cols,0,sizeof(gboolean)*width); - - // Find column delimiters - for(l=0;ln[l];l++) - { - int c; - gchar * ptr = ln[l]; - GString * buffer; - - for(c=0;cclipboard = g_convert(text, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); - - g_free(text); - - - return terminal->clipboard; -} - -const gchar * v3270_get_copy(GtkWidget *widget) -{ - v3270 *terminal; - - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); - - terminal = GTK_V3270(widget); - - return terminal->clipboard; -} - -const gchar * v3270_copy_append(GtkWidget *widget) -{ - v3270 * terminal; - char * str; - gchar * text; - gchar * clip; - - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); - - terminal = GTK_V3270(widget); - - if(!terminal->clipboard) - return v3270_get_selected_text(widget); - - str = lib3270_get_selected(terminal->host); - - if(!str) - return terminal->clipboard; - - text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); - - free(str); - - clip = g_strconcat(terminal->clipboard,"\n",text,NULL); - - g_free(text); - g_free(terminal->clipboard); - - terminal->clipboard = clip; - - gtk_clipboard_set_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),terminal->clipboard,-1); - - g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); - - return terminal->clipboard; -} - -const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode) -{ - const gchar * text; - GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); - - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); - - GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0); - - text = v3270_get_selected_text(widget); - - if(text) - { - 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); - } - - g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); - } - - return text; - -} - -void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding) -{ - gchar * buffer = NULL; - H3270 * session = v3270_get_session(widget); - const gchar * charset = lib3270_get_charset(session); - gboolean next; - - if(!text) - return; - else if(g_strcasecmp(encoding,charset)) - buffer = g_convert(text, -1, charset, encoding, NULL, NULL, NULL); - else - buffer = g_strdup(text); - - if(!buffer) - { - /* Conversion failed, update special chars and try again */ - int f; - - static const struct _xlat - { - const gchar *from; - const gchar *to; - } xlat[] = - { - { "–", "-" }, - { "→", "->" }, - { "←", "<-" }, - { "©", "(c)" }, - { "↔", "<->" }, - { "™", "(TM)" }, - { "®", "(R)" }, - { "“", "\"" }, - { "”", "\"" }, - { "…", "..." }, - { "•", "*" }, - { "․", "." }, - { "·", "*" }, - - }; - - gchar *string = g_strdup(text); - - // FIXME (perry#1#): Is there any better way for a "sed" here? - for(f=0;fmessage, ln[f]); - - gtk_dialog_run(GTK_DIALOG (dialog)); - gtk_widget_destroy(dialog); - - break; - } - else - { - g_free(str); - } - - } - g_strfreev(ln); - - } - - g_free(string); - } - - if(buffer) - { - /* Remove TABS */ - gchar *ptr; - - for(ptr = buffer;*ptr;ptr++) - { - if(*ptr == '\t') - *ptr = ' '; - } - } - else - { - g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, FALSE); - return; - } - - next = lib3270_paste(session,(unsigned char *) buffer) ? TRUE : FALSE; - - trace("Pastenext is %s",next ? "On" : "Off"); - - g_free(buffer); - - g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, next); - -} - -static void text_received(GtkClipboard *clipboard, const gchar *text, GtkWidget *widget) -{ - v3270_paste_string(widget,text,"UTF-8"); -} - -void v3270_paste(GtkWidget *widget) -{ - gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget); -} - -void v3270_unselect(GtkWidget *widget) -{ - lib3270_unselect(v3270_get_session(widget)); -} - -gboolean v3270_get_selection_bounds(GtkWidget *widget, gint *start, gint *end) -{ - g_return_val_if_fail(GTK_IS_V3270(widget),FALSE); - return lib3270_get_selection_bounds(GTK_V3270(widget)->host,start,end) == 0 ? FALSE : TRUE; -} - -gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboolean all) -{ - char * str; - gchar * utftext; - - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); - - str = lib3270_get_region(GTK_V3270(widget)->host,start_pos,end_pos,all); - if(!str) - return NULL; - - utftext = g_convert(str, -1, "UTF-8", lib3270_get_charset(GTK_V3270(widget)->host), NULL, NULL, NULL); - - free(str); - - return utftext; -} - - void v3270_select_region(GtkWidget *widget, gint start, gint end) - { - g_return_if_fail(GTK_IS_V3270(widget)); - lib3270_select_region(GTK_V3270(widget)->host,start,end); - } - - diff --git a/src/gtk/v3270/mouse.c b/src/gtk/v3270/mouse.c index 460f80a..1318739 100644 --- a/src/gtk/v3270/mouse.c +++ b/src/gtk/v3270/mouse.c @@ -177,41 +177,41 @@ static void update_mouse_pointer(GtkWidget *widget, int baddr) { int id = terminal->pointer; - switch(lib3270_get_selection_flags(terminal->host,baddr) & 0x1f) + switch(lib3270_get_selection_flags(terminal->host,baddr) & 0x8f) { - case 0x10: + case 0x80: id = V3270_CURSOR_MOVE_SELECTION; break; - case 0x12: + case 0x82: id = V3270_CURSOR_SELECTION_TOP; break; - case 0x16: + case 0x86: id = V3270_CURSOR_SELECTION_TOP_RIGHT; break; - case 0x14: + case 0x84: id = V3270_CURSOR_SELECTION_RIGHT; break; - case 0x11: + case 0x81: id = V3270_CURSOR_SELECTION_LEFT; break; - case 0x19: + case 0x89: id = V3270_CURSOR_SELECTION_BOTTOM_LEFT; break; - case 0x18: + case 0x88: id = V3270_CURSOR_SELECTION_BOTTOM; break; - case 0x1c: + case 0x8c: id = V3270_CURSOR_SELECTION_BOTTOM_RIGHT; break; - case 0x13: + case 0x83: id = V3270_CURSOR_SELECTION_TOP_LEFT; break; diff --git a/src/gtk/v3270/selection.c b/src/gtk/v3270/selection.c new file mode 100644 index 0000000..b73f211 --- /dev/null +++ b/src/gtk/v3270/selection.c @@ -0,0 +1,476 @@ +/* + * "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 + #include "v3270.h" + #include "private.h" + #include + +/*--[ Globals ]--------------------------------------------------------------------------------------*/ + + enum + { + CLIPBOARD_TYPE_TEXT, + }; + + static const GtkTargetEntry targets[] = + { + { "COMPOUND_TEXT", 0, CLIPBOARD_TYPE_TEXT }, + { "UTF8_STRING", 0, CLIPBOARD_TYPE_TEXT }, + }; + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + +static void clipboard_clear(GtkClipboard *clipboard, GObject *obj) +{ + trace("%s widget=%p",__FUNCTION__,obj); + +} + +static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, 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: + if(!widget->clipboard) + lib3270_ring_bell(widget->host); + else + gtk_selection_data_set_text(selection,widget->clipboard,-1); + break; + + default: + g_warning("Unexpected clipboard type %d\n",target); + } +} + +gchar * v3270_get_text(GtkWidget *widget, int offset, int len) +{ + v3270 * terminal; + gchar * text; + char * str; + + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + + terminal = GTK_V3270(widget); + + str = lib3270_get_text(terminal->host, offset, len); + + if(!str) + return NULL; + + text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); + + free(str); + return text; +} + +/** + * Get lib3270 selection as a g_malloc buffer. + * + * @param widget Widget containing the desired section. + * + * @return NULL if error, otherwise the selected buffer contents (release with g_free). + * + */ +static gchar * v3270_get_selected(v3270 *widget) +{ + gchar *text = lib3270_get_selected(widget->host); + if(text) + { + gchar *str = g_strdup(text); + free(text); + return str; + } + return NULL; +} + +const gchar * v3270_get_selected_text(GtkWidget *widget) +{ + v3270 *terminal; + gchar *text; + + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + + terminal = GTK_V3270(widget); + + if(terminal->clipboard) + { + g_free(terminal->clipboard); + terminal->clipboard = NULL; + } + + text = v3270_get_selected(terminal); + + if(!text) + { + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, FALSE); + lib3270_ring_bell(terminal->host); + return NULL; + } + + if(terminal->table) + { + // Convert text to table + gchar **ln = g_strsplit(text,"\n",-1); + int width = lib3270_get_width(terminal->host); + gboolean cols[width]; + int l; + GString * buffer; + + memset(cols,0,sizeof(gboolean)*width); + + // Find column delimiters + for(l=0;ln[l];l++) + { + int c; + gchar * ptr = ln[l]; + GString * buffer; + + for(c=0;cclipboard = g_convert(text, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); + + g_free(text); + + + return terminal->clipboard; +} + +const gchar * v3270_get_copy(GtkWidget *widget) +{ + v3270 *terminal; + + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + + terminal = GTK_V3270(widget); + + return terminal->clipboard; +} + +const gchar * v3270_copy_append(GtkWidget *widget) +{ + v3270 * terminal; + char * str; + gchar * text; + gchar * clip; + + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + + terminal = GTK_V3270(widget); + + if(!terminal->clipboard) + return v3270_get_selected_text(widget); + + str = lib3270_get_selected(terminal->host); + + if(!str) + return terminal->clipboard; + + text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); + + free(str); + + clip = g_strconcat(terminal->clipboard,"\n",text,NULL); + + g_free(text); + g_free(terminal->clipboard); + + terminal->clipboard = clip; + + gtk_clipboard_set_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),terminal->clipboard,-1); + + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); + + return terminal->clipboard; +} + +const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode) +{ + const gchar * text; + GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); + + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + + GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0); + + text = v3270_get_selected_text(widget); + + if(text) + { + 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); + } + + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); + } + + return text; + +} + +void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding) +{ + gchar * buffer = NULL; + H3270 * session = v3270_get_session(widget); + const gchar * charset = lib3270_get_charset(session); + gboolean next; + + if(!text) + return; + else if(g_strcasecmp(encoding,charset)) + buffer = g_convert(text, -1, charset, encoding, NULL, NULL, NULL); + else + buffer = g_strdup(text); + + if(!buffer) + { + /* Conversion failed, update special chars and try again */ + int f; + + static const struct _xlat + { + const gchar *from; + const gchar *to; + } xlat[] = + { + { "–", "-" }, + { "→", "->" }, + { "←", "<-" }, + { "©", "(c)" }, + { "↔", "<->" }, + { "™", "(TM)" }, + { "®", "(R)" }, + { "“", "\"" }, + { "”", "\"" }, + { "…", "..." }, + { "•", "*" }, + { "․", "." }, + { "·", "*" }, + + }; + + gchar *string = g_strdup(text); + + // FIXME (perry#1#): Is there any better way for a "sed" here? + for(f=0;fmessage, ln[f]); + + gtk_dialog_run(GTK_DIALOG (dialog)); + gtk_widget_destroy(dialog); + + break; + } + else + { + g_free(str); + } + + } + g_strfreev(ln); + + } + + g_free(string); + } + + if(buffer) + { + /* Remove TABS */ + gchar *ptr; + + for(ptr = buffer;*ptr;ptr++) + { + if(*ptr == '\t') + *ptr = ' '; + } + } + else + { + g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, FALSE); + return; + } + + next = lib3270_paste(session,(unsigned char *) buffer) ? TRUE : FALSE; + + trace("Pastenext is %s",next ? "On" : "Off"); + + g_free(buffer); + + g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, next); + +} + +static void text_received(GtkClipboard *clipboard, const gchar *text, GtkWidget *widget) +{ + v3270_paste_string(widget,text,"UTF-8"); +} + +void v3270_paste(GtkWidget *widget) +{ + gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget); +} + +void v3270_unselect(GtkWidget *widget) +{ + lib3270_unselect(v3270_get_session(widget)); +} + +gboolean v3270_get_selection_bounds(GtkWidget *widget, gint *start, gint *end) +{ + g_return_val_if_fail(GTK_IS_V3270(widget),FALSE); + return lib3270_get_selection_bounds(GTK_V3270(widget)->host,start,end) == 0 ? FALSE : TRUE; +} + +gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboolean all) +{ + char * str; + gchar * utftext; + + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + + str = lib3270_get_region(GTK_V3270(widget)->host,start_pos,end_pos,all); + if(!str) + return NULL; + + utftext = g_convert(str, -1, "UTF-8", lib3270_get_charset(GTK_V3270(widget)->host), NULL, NULL, NULL); + + free(str); + + return utftext; +} + + void v3270_select_region(GtkWidget *widget, gint start, gint end) + { + g_return_if_fail(GTK_IS_V3270(widget)); + lib3270_select_region(GTK_V3270(widget)->host,start,end); + } + + diff --git a/src/gtk/v3270/sources.mak b/src/gtk/v3270/sources.mak index c671b34..f564843 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 clipboard.c accessible.c +V3270_SRC=marshal.c widget.c oia.c iocallback.c keyboard.c draw.c mouse.c selection.c accessible.c diff --git a/src/gtk/window.c b/src/gtk/window.c new file mode 100644 index 0000000..827eac0 --- /dev/null +++ b/src/gtk/window.c @@ -0,0 +1,408 @@ +/* + * "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 mainwindow.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) + * licinio@bb.com.br (Licínio Luis Branco) + * kraucer@bb.com.br (Kraucer Fernandes Mazuco) + * + */ + +#include "globals.h" +#include "uiparser/parser.h" + +#ifdef DEBUG + #include +#endif + +/*--[ Globals ]--------------------------------------------------------------------------------------*/ + + enum action_group + { + ACTION_GROUP_DEFAULT, + ACTION_GROUP_ONLINE, + ACTION_GROUP_OFFLINE, + ACTION_GROUP_SELECTION, + ACTION_GROUP_CLIPBOARD, + ACTION_GROUP_FILETRANSFER, + ACTION_GROUP_PASTE, + + ACTION_GROUP_MAX + }; + + enum popup_group + { + POPUP_DEFAULT, + POPUP_ONLINE, + POPUP_OFFLINE, + POPUP_SELECTION, + + POPUP_MAX + }; + + static const gchar *groupname[ACTION_GROUP_MAX+1] = { "default", + "online", + "offline", + "selection", + "clipboard", + "filetransfer", + "paste", + NULL + }; + + static const gchar *popupname[POPUP_MAX+1] = { "default", + "online", + "offline", + "selection", + NULL + }; + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + + static void toggle_changed(GtkWidget *widget, LIB3270_TOGGLE id, gboolean toggled, const gchar *name, GtkWindow *toplevel) + { + GtkAction **list = (GtkAction **) g_object_get_data(G_OBJECT(widget),"toggle_actions"); + gchar *nm = g_ascii_strdown(name,-1); + set_boolean_to_config("toggle",nm,toggled); + g_free(nm); + + if(id == LIB3270_TOGGLE_FULL_SCREEN) + { + if(toggled) + gtk_window_fullscreen(GTK_WINDOW(toplevel)); + else + gtk_window_unfullscreen(GTK_WINDOW(toplevel)); + } + + if(list[id]) + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(list[id]),toggled); + + } + + static gboolean window_state_event(GtkWidget *window, GdkEventWindowState *event, GtkWidget *widget) + { + gboolean fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN ? TRUE : FALSE; + GtkAction **action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"named_actions"); + + // Update fullscreen toggles + if(action[ACTION_FULLSCREEN]) + gtk_action_set_visible(action[ACTION_FULLSCREEN],!fullscreen); + + if(action[ACTION_UNFULLSCREEN]) + gtk_action_set_visible(action[ACTION_UNFULLSCREEN],fullscreen); + + lib3270_set_toggle(v3270_get_session(widget),LIB3270_TOGGLE_FULL_SCREEN,fullscreen); + + return 0; + } + + static gboolean window_destroy(GtkWidget *window, GtkWidget *widget) + { + if(widget) + v3270_disconnect(widget); + } + + static void disconnected(GtkWidget *widget, GtkActionGroup **group) + { + gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],FALSE); + gtk_action_group_set_sensitive(group[ACTION_GROUP_ONLINE],FALSE); + gtk_action_group_set_sensitive(group[ACTION_GROUP_OFFLINE],TRUE); + gtk_window_set_title(GTK_WINDOW(gtk_widget_get_toplevel(widget)),g_get_application_name()); + } + + static void connected(GtkWidget *widget, const gchar *host, GtkActionGroup **group) + { + set_string_to_config("host","uri","%s",host); + gtk_window_set_title(GTK_WINDOW(gtk_widget_get_toplevel(widget)),host); + gtk_action_group_set_sensitive(group[ACTION_GROUP_ONLINE],TRUE); + gtk_action_group_set_sensitive(group[ACTION_GROUP_OFFLINE],FALSE); + gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],TRUE); + } + + static void update_config(GtkWidget *widget, const gchar *name, const gchar *value) + { + set_string_to_config("terminal",name,"%s",value); + } + + static void update_model(GtkWidget *widget, guint id, const gchar *name) + { + trace("Widget %p changed to %s (id=%d)",widget,name,id); + set_integer_to_config("terminal","model",id); + } + + static gboolean popup_menu(GtkWidget *widget, gboolean selected, gboolean online, GdkEventButton *event, GtkWidget **popup) + { + GtkWidget *menu = NULL; + + if(!online) + menu = popup[POPUP_OFFLINE]; + else if(selected && popup[POPUP_SELECTION]) + menu = popup[POPUP_SELECTION]; + else if(popup[POPUP_ONLINE]) + menu = popup[POPUP_ONLINE]; + else + menu = popup[POPUP_DEFAULT]; + + trace("Popup %p on widget %p online=%s selected=%s",menu,widget,online ? "Yes" : "No", selected ? "Yes" : "No"); + + if(!menu) + return FALSE; + + trace("Showing popup \"%s\"",gtk_widget_get_name(menu)); + + gtk_widget_show_all(menu); + gtk_menu_set_screen(GTK_MENU(menu), gtk_widget_get_screen(widget)); + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button,event->time); + + return TRUE; + } + + static void selecting(GtkWidget *widget, gboolean on, GtkActionGroup **group) + { + GtkAction **action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"named_actions"); + gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],on); + + if(action[ACTION_RESELECT]) + gtk_action_set_sensitive(action[ACTION_RESELECT],!on); + + } + + static void has_text(GtkWidget *widget, gboolean on, GtkActionGroup **group) + { + gtk_action_group_set_sensitive(group[ACTION_GROUP_CLIPBOARD],on); + } + + static void pastenext(GtkWidget *widget, gboolean on, GtkAction **action) + { + gtk_action_set_sensitive(action[ACTION_PASTENEXT],on); + } + + static void setup_input_method(GtkWidget *widget, GtkWidget *obj) + { + GtkWidget *menu = gtk_menu_new(); + gtk_im_multicontext_append_menuitems((GtkIMMulticontext *) v3270_get_im_context(obj) ,GTK_MENU_SHELL(menu)); + gtk_widget_show_all(menu); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget),menu); + } + + static void set_screen_size(GtkCheckMenuItem *item, GtkWidget *widget) + { + if(gtk_check_menu_item_get_active(item)) + { + trace("screen model on widget %p changes to %d",widget,(int) g_object_get_data(G_OBJECT(item),"mode_3270")); + lib3270_set_model(v3270_get_session(widget),(int) g_object_get_data(G_OBJECT(item),"mode_3270")); + } + } + + static void setup_screen_sizes(GtkWidget *widget, GtkWidget *obj) + { + static const gchar * text[] = { "80x24", "80x32", "80x43", "132x27" }; + GtkWidget * menu = gtk_menu_new(); + int model = lib3270_get_model(v3270_get_session(obj))-2; + GSList * group = NULL; + GtkWidget * item; + int f; + + gtk_widget_set_sensitive(widget,TRUE); + + for(f=0;fmessage,filename); + g_error_free(error); + } + + g_free(filename); + g_free(name); + + } + + GtkWidget * create_main_window(const gchar *uri) + { + static const UI_WIDGET_SETUP widget_setup[] = + { + { "inputmethod", setup_input_method }, + { "screensizes", setup_screen_sizes }, + { "fontselect", setup_font_list }, + { NULL, NULL } + }; + + static const struct _widget_config + { + const gchar *key; + void (*set)(GtkWidget *widget, const gchar *str); + } widget_config[] = + { + { "colors", v3270_set_colors }, + { "font-family", v3270_set_font_family } + }; + + GtkWidget * window; + GtkWidget * terminal = v3270_new(); + H3270 * host = v3270_get_session(terminal); + gchar * path = build_data_filename("ui",NULL); + GtkActionGroup **group; + GtkAction **action = g_new0(GtkAction *,ACTION_COUNT); + GtkWidget **popup; + int f; + + gtk_widget_set_tooltip_text(terminal,_( "3270 screen")); + + if(uri) + { + lib3270_set_host(host,uri); + } + else + { + gchar *ptr = get_string_from_config("host","uri",""); + if(*ptr) + lib3270_set_host(host,ptr); + g_free(ptr); + } + + g_object_set_data_full(G_OBJECT(terminal),"toggle_actions",g_new0(GtkAction *,LIB3270_TOGGLE_COUNT),g_free); + g_object_set_data_full(G_OBJECT(terminal),"named_actions",(gpointer) action, (GDestroyNotify) g_free); + + // Initialize terminal config + for(f=0;f #include -- libgit2 0.21.2