diff --git a/src/gtk/actions.c b/src/gtk/actions.c index befa242..60ff910 100644 --- a/src/gtk/actions.c +++ b/src/gtk/actions.c @@ -97,13 +97,13 @@ static void reload_action(GtkAction *action, GtkWidget *widget) static void copy_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); - v3270_copy_clipboard(GTK_V3270(widget)); + v3270_copy_clipboard(widget); } static void paste_clipboard_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); - v3270_paste_clipboard(GTK_V3270(widget)); + v3270_paste_clipboard(widget); } static void paste_next_action(GtkAction *action, GtkWidget *widget) @@ -189,7 +189,7 @@ static void lib3270_toggle_action(GtkToggleAction *action,GtkWidget *widget) if(toggle == TOGGLE_GDKDEBUG) gdk_window_set_debug_updates(gtk_toggle_action_get_active(action)); - else + else if(toggle < LIB3270_TOGGLE_COUNT) lib3270_set_toggle(GTK_V3270(widget)->host,toggle,gtk_toggle_action_get_active(action)); } @@ -511,7 +511,8 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash case ACTION_TYPE_TOGGLE: action = GTK_ACTION(gtk_toggle_action_new(nm,NULL,NULL,NULL)); - toggle_action[id] = action; + if(id < LIB3270_TOGGLE_COUNT) + toggle_action[id] = action; g_object_set_data(G_OBJECT(action),"toggle_id",(gpointer) id); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),(lib3270_get_toggle(GTK_V3270(widget)->host,id) != 0)); g_signal_connect(action,"toggled",G_CALLBACK(lib3270_toggle_action),widget); diff --git a/src/gtk/dialog.c b/src/gtk/dialog.c index 1a5d041..2587e59 100644 --- a/src/gtk/dialog.c +++ b/src/gtk/dialog.c @@ -34,17 +34,22 @@ /*--[ Implement ]------------------------------------------------------------------------------------*/ - static int save_dialog(GtkAction *action, GtkWidget *widget, const gchar *title, const gchar *errmsg, gchar *text) + static int save_dialog(GtkAction *action, GtkWidget *widget, const gchar *title, const gchar *errmsg, const gchar *text) { GtkWindow * toplevel = GTK_WINDOW(gtk_widget_get_toplevel(widget)); const gchar * user_title = g_object_get_data(G_OBJECT(action),"title"); + GtkWidget * dialog; - GtkWidget *dialog = gtk_file_chooser_dialog_new( gettext(user_title ? user_title : title), - toplevel, - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL ); + + if(!text) + return; + + dialog = gtk_file_chooser_dialog_new( gettext(user_title ? user_title : title), + toplevel, + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL ); if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) @@ -95,7 +100,7 @@ GtkEntry * host = GTK_ENTRY(gtk_entry_new()); GtkEntry * port = GTK_ENTRY(gtk_entry_new()); GtkToggleButton * checkbox = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_label( _( "Secure connection" ) )); - GtkWidget * dialog = gtk_dialog_new_with_buttons( gettext(title ? title : "Select hostname"), + GtkWidget * dialog = gtk_dialog_new_with_buttons( gettext(title ? title : N_( "Select hostname" )), GTK_WINDOW(gtk_widget_get_toplevel(widget)), GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CONNECT, GTK_RESPONSE_ACCEPT, @@ -104,7 +109,7 @@ gtk_window_set_icon_name(GTK_WINDOW(dialog),GTK_STOCK_HOME); gtk_entry_set_max_length(host,0xFF); - gtk_entry_set_width_chars(host,60); + gtk_entry_set_width_chars(host,50); gtk_entry_set_max_length(port,6); gtk_entry_set_width_chars(port,7); @@ -119,7 +124,7 @@ gtk_container_set_border_width(GTK_CONTAINER(table),5); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),GTK_WIDGET(table),FALSE,FALSE,2); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(table),FALSE,FALSE,2); hostname = cfghost; @@ -157,29 +162,23 @@ switch(gtk_dialog_run(GTK_DIALOG(dialog))) { case GTK_RESPONSE_ACCEPT: - - #warning Work in progress - -/* gtk_widget_set_sensitive(dialog,FALSE); - if(gtk_toggle_button_get_active(checkbox)) - strcpy(buffer,"L:"); - else - *buffer = 0; - - strncat(buffer,gtk_entry_get_text(host),1023); - strncat(buffer,":",1023); - strncat(buffer,gtk_entry_get_text(port),1023); + hostname = g_strconcat( gtk_toggle_button_get_active(checkbox) ? "L:" : "", + gtk_entry_get_text(host), + ":", + gtk_entry_get_text(port), + NULL + ); - if(!lib3270_connect(GTK_V3270(widget)->host,host,1)) + if(!lib3270_connect(v3270_get_session(widget),hostname,1)) { // Connection OK + set_string_to_config("host","uri","%s",hostname); again = FALSE; - set_string_to_config("host","uri","%s",buffer); - SetString("Network","Hostname",buffer); } -*/ + + g_free(hostname); break; case GTK_RESPONSE_REJECT: @@ -203,6 +202,11 @@ { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); + save_dialog( action, + widget, + N_( "Save selection to file" ), + N_( "Can't save selection to file \n%s" ), + v3270_get_selected_text(widget)); } void save_copy_action(GtkAction *action, GtkWidget *widget) diff --git a/src/gtk/v3270/clipboard.c b/src/gtk/v3270/clipboard.c index 6bee43f..d5f9ad1 100644 --- a/src/gtk/v3270/clipboard.c +++ b/src/gtk/v3270/clipboard.c @@ -75,30 +75,45 @@ static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, } } -void v3270_copy_clipboard(v3270 *widget) +const gchar * v3270_get_selected_text(GtkWidget *widget) { - char *text; - GtkClipboard * clipboard = gtk_widget_get_clipboard(GTK_WIDGET(widget),GDK_SELECTION_CLIPBOARD); + v3270 *terminal; + gchar *text; - if(widget->clipboard) + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + + terminal = GTK_V3270(widget); + + if(terminal->clipboard) { - g_free(widget->clipboard); - widget->clipboard = NULL; + g_free(terminal->clipboard); + terminal->clipboard = NULL; } - text = lib3270_get_selected(widget->host); + text = lib3270_get_selected(terminal->host); if(!text) { g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, FALSE); - lib3270_ring_bell(widget->host); - return; + lib3270_ring_bell(terminal->host); + return NULL; } - widget->clipboard = g_convert(text, -1, "UTF-8", lib3270_get_charset(widget->host), NULL, NULL, NULL); + terminal->clipboard = g_convert(text, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); free(text); + return terminal->clipboard; +} + +void v3270_copy_clipboard(GtkWidget *widget) +{ + const gchar * text = v3270_get_selected_text(widget); + GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); + + if(!text) + return; + if(gtk_clipboard_set_with_owner( clipboard, targets, G_N_ELEMENTS(targets), @@ -245,8 +260,8 @@ static void text_received(GtkClipboard *clipboard, const gchar *text, GtkWidget v3270_paste_string(widget,text,"UTF-8"); } -void v3270_paste_clipboard(v3270 *widget) +void v3270_paste_clipboard(GtkWidget *widget) { - gtk_clipboard_request_text(gtk_widget_get_clipboard(GTK_WIDGET(widget),GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget); + gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget); } diff --git a/src/gtk/v3270/v3270.h b/src/gtk/v3270/v3270.h index 15c967d..aaa6f7a 100644 --- a/src/gtk/v3270/v3270.h +++ b/src/gtk/v3270/v3270.h @@ -201,9 +201,10 @@ void v3270_disconnect(GtkWidget *widget); // Clipboard - void v3270_copy_clipboard(v3270 *widget); + const gchar * v3270_get_selected_text(GtkWidget *widget); + void v3270_copy_clipboard(GtkWidget *widget); void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); - void v3270_paste_clipboard(v3270 *widget); + void v3270_paste_clipboard(GtkWidget *widget); G_END_DECLS diff --git a/src/lib3270/host.c b/src/lib3270/host.c index 68b835d..4ee34a6 100644 --- a/src/lib3270/host.c +++ b/src/lib3270/host.c @@ -626,6 +626,9 @@ int lib3270_connect(H3270 *h, const char *n, int wait) if(PCONNECTED) return EBUSY; + if(!n) + return ENOENT; + rc = do_connect(h,n); if(rc) return rc; -- libgit2 0.21.2