diff --git a/src/gtk/mainwindow.c b/src/gtk/mainwindow.c index c01ffe7..a27079d 100644 --- a/src/gtk/mainwindow.c +++ b/src/gtk/mainwindow.c @@ -97,6 +97,12 @@ set_integer_to_config("terminal","model",id); } + static void selecting(GtkWidget *widget, gboolean on, GtkActionGroup **group) + { + trace("Widget %p selection state changed to %s",widget,on ? "Yes" : "No"); + gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],on); + } + static void setup_input_method(GtkWidget *widget, GtkWidget *obj) { GtkWidget *menu = gtk_menu_new(); @@ -212,6 +218,7 @@ g_signal_connect(terminal,"connected",G_CALLBACK(connected),group); g_signal_connect(terminal,"update_config",G_CALLBACK(update_config),0); g_signal_connect(terminal,"model_changed",G_CALLBACK(update_model),0); + g_signal_connect(terminal,"selecting",G_CALLBACK(selecting),group); g_free(path); gtk_widget_grab_focus(terminal); diff --git a/src/gtk/v3270/genmarshal b/src/gtk/v3270/genmarshal index 7a4a76f..835ba71 100644 --- a/src/gtk/v3270/genmarshal +++ b/src/gtk/v3270/genmarshal @@ -5,3 +5,4 @@ VOID:VOID,POINTER VOID:VOID,POINTER,POINTER VOID:VOID,UINT,POINTER BOOL:VOID,UINT,ENUM +VOID:VOID,BOOL diff --git a/src/gtk/v3270/private.h b/src/gtk/v3270/private.h index 2722add..ad77254 100644 --- a/src/gtk/v3270/private.h +++ b/src/gtk/v3270/private.h @@ -72,6 +72,7 @@ G_BEGIN_DECLS SIGNAL_DISCONNECTED, SIGNAL_UPDATE_CONFIG, SIGNAL_MODEL_CHANGED, + SIGNAL_SELECTING, LAST_SIGNAL }; diff --git a/src/gtk/v3270/widget.c b/src/gtk/v3270/widget.c index c07fecb..c089274 100644 --- a/src/gtk/v3270/widget.c +++ b/src/gtk/v3270/widget.c @@ -236,6 +236,14 @@ static void v3270_class_init(v3270Class *klass) pw3270_VOID__VOID_UINT_POINTER, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_STRING); + v3270_widget_signal[SIGNAL_SELECTING] = + g_signal_new( "selecting", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + pw3270_VOID__VOID_BOOL, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); } void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int height) @@ -389,6 +397,11 @@ static void update_model(H3270 *session, const char *name, int model, int rows, g_signal_emit(GTK_WIDGET(session->widget),v3270_widget_signal[SIGNAL_MODEL_CHANGED], 0, (guint) model, name); } +static void set_selection(H3270 *session, unsigned char status) +{ + g_signal_emit(GTK_WIDGET(session->widget),v3270_widget_signal[SIGNAL_SELECTING], 0, status ? TRUE : FALSE); +} + static void v3270_init(v3270 *widget) { trace("%s",__FUNCTION__); @@ -400,11 +413,12 @@ static void v3270_init(v3270 *widget) return; } - widget->host->widget = widget; + widget->host->widget = widget; widget->host->update = v3270_update_char; widget->host->changed = changed; widget->host->set_timer = set_timer; + widget->host->set_selection = set_selection; widget->host->update_luname = update_luname; widget->host->configure = update_screen_size; diff --git a/src/include/lib3270/session.h b/src/include/lib3270/session.h index 6097f50..93f290f 100644 --- a/src/include/lib3270/session.h +++ b/src/include/lib3270/session.h @@ -132,6 +132,7 @@ void (*set_timer)(H3270 *session, unsigned char on); void (*erase)(H3270 *session); void (*cursor)(H3270 *session, LIB3270_CURSOR id); + void (*set_selection)(H3270 *session, unsigned char on); }; diff --git a/src/lib3270/glue.c b/src/lib3270/glue.c index 8f1d324..fea472b 100644 --- a/src/lib3270/glue.c +++ b/src/lib3270/glue.c @@ -170,6 +170,11 @@ static void update_char(H3270 *session, int addr, unsigned char chr, unsigned sh } +static void nop_char(H3270 *session, unsigned char chr) +{ + +} + static void lib3270_session_init(H3270 *hSession, const char *model) { int ovc, ovr; @@ -180,7 +185,8 @@ static void lib3270_session_init(H3270 *hSession, const char *model) hSession->sz = sizeof(H3270); // A few dummy calls to avoid "ifs" - hSession->update = update_char; + hSession->update = update_char; + hSession->set_selection = nop_char; hSession->sock = -1; diff --git a/src/lib3270/selection.c b/src/lib3270/selection.c index 4b78404..2ce2f31 100644 --- a/src/lib3270/selection.c +++ b/src/lib3270/selection.c @@ -175,6 +175,9 @@ LIB3270_EXPORT void lib3270_clear_selection(H3270 *session) session->update(session,a,ea_buf[a].chr,ea_buf[a].attr,a == session->cursor_addr); } } + + session->set_selection(session,0); + } @@ -182,11 +185,14 @@ LIB3270_EXPORT void lib3270_select_to(H3270 *session, int baddr) { CHECK_SESSION_HANDLE(session); - if(session->selected.begin < 0) - session->selected.begin = session->selected.end = session->cursor_addr; - lib3270_set_cursor_address(session,session->selected.end = baddr); + if(session->selected.begin < 0) + { + session->selected.begin = session->cursor_addr; + session->set_selection(session,1); + } + update_selection(session); } -- libgit2 0.21.2