From 52166de6805d0631efc88efca9c7dfc6158885a8 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Thu, 8 Mar 2012 19:53:15 +0000 Subject: [PATCH] Implementando seleção por mouse (work in progress) --- src/gtk/v3270/draw.c | 17 +++++++++++++---- src/gtk/v3270/mouse.c | 33 +++++++++++++++++++++++++++++---- src/gtk/v3270/widget.c | 18 ++++++++++++++++++ src/lib3270/telnet.c | 2 +- 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/src/gtk/v3270/draw.c b/src/gtk/v3270/draw.c index 899976f..c623dd6 100644 --- a/src/gtk/v3270/draw.c +++ b/src/gtk/v3270/draw.c @@ -364,13 +364,22 @@ void v3270_update_cursor_surface(v3270 *widget,unsigned char chr,unsigned short { GdkRectangle rect = widget->cursor.rect; cairo_t * cr = cairo_create(widget->cursor.surface); - GdkColor * fg = widget->color+((attr & 0x00F0) >> 4); + GdkColor * fg; GdkColor * bg; - if(attr & LIB3270_ATTR_FIELD) - bg = widget->color+(attr & 0x0003)+V3270_COLOR_FIELD; + if(attr & LIB3270_ATTR_SELECTED) + { + fg = widget->color+V3270_COLOR_SELECTED_FG; + bg = widget->color+V3270_COLOR_SELECTED_BG; + } else - bg = widget->color+(attr & 0x000F); + { + fg = widget->color+((attr & 0x00F0) >> 4); + if(attr & LIB3270_ATTR_FIELD) + bg = widget->color+(attr & 0x0003)+V3270_COLOR_FIELD; + else + bg = widget->color+(attr & 0x000F); + } cairo_set_scaled_font(cr,widget->font_scaled); diff --git a/src/gtk/v3270/mouse.c b/src/gtk/v3270/mouse.c index aae0191..f4e1f4c 100644 --- a/src/gtk/v3270/mouse.c +++ b/src/gtk/v3270/mouse.c @@ -52,6 +52,30 @@ static int decode_position(v3270 *widget, gdouble x, gdouble y) return -1; } +static void button_1_press(GtkWidget *widget, GdkEventType type, int baddr) +{ + GTK_V3270(widget)->selecting = 1; + + switch(type) + { + case GDK_BUTTON_PRESS: // Single click - Just move cursor + lib3270_set_cursor_address(GTK_V3270(widget)->host,baddr); + lib3270_clear_selection(GTK_V3270(widget)->host); + break; + + case GDK_2BUTTON_PRESS: // Double click - Select work + break; + + case GDK_3BUTTON_PRESS: // Triple clock - Select field + break; + +#ifdef DEBUG + default: + trace("Unexpected button 1 type %d",type); +#endif + } +} + gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) { int baddr = decode_position(GTK_V3270(widget),event->x,event->y); @@ -59,14 +83,15 @@ gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) if(baddr < 0) return FALSE; - trace("%s button=%d type=%d",__FUNCTION__,event->button,event->type); +// trace("%s button=%d type=%d",__FUNCTION__,event->button,event->type); switch(event->button) { case 1: - lib3270_set_cursor_address(GTK_V3270(widget)->host,baddr); - GTK_V3270(widget)->selecting = 1; - lib3270_clear_selection(GTK_V3270(widget)->host); + button_1_press(widget,event->type,baddr); +// lib3270_set_cursor_address(GTK_V3270(widget)->host,baddr); +// GTK_V3270(widget)->selecting = 1; +// lib3270_clear_selection(GTK_V3270(widget)->host); break; default: diff --git a/src/gtk/v3270/widget.c b/src/gtk/v3270/widget.c index c089274..8eb3327 100644 --- a/src/gtk/v3270/widget.c +++ b/src/gtk/v3270/widget.c @@ -78,6 +78,20 @@ static void v3270_destroy (GtkObject * object); /*--[ Implement ]------------------------------------------------------------------------------------*/ +static void v3270_cursor_draw(v3270 *widget) +{ + int pos = lib3270_get_cursor_address(widget->host); + unsigned char c; + unsigned short attr; + + lib3270_get_contents(widget->host,pos,pos,&c,&attr); + v3270_update_cursor_surface(widget,c,attr); + gtk_widget_queue_draw_area( GTK_WIDGET(widget), + widget->cursor.rect.x,widget->cursor.rect.y, + widget->cursor.rect.width,widget->cursor.rect.height); + +} + static void v3270_toggle_changed(v3270 *widget,LIB3270_TOGGLE toggle_id, gboolean toggle_state,const gchar *toggle_name) { trace("%s: toggle %d (%s)=%s",__FUNCTION__,toggle_id,toggle_name,toggle_state ? "Yes" : "No"); @@ -94,6 +108,10 @@ static void v3270_toggle_changed(v3270 *widget,LIB3270_TOGGLE toggle_id, gboolea widget->cursor.show |= 1; break; + case LIB3270_TOGGLE_INSERT: + v3270_cursor_draw(widget); + break; + default: return; diff --git a/src/lib3270/telnet.c b/src/lib3270/telnet.c index 5debf0b..fb708e1 100644 --- a/src/lib3270/telnet.c +++ b/src/lib3270/telnet.c @@ -395,7 +395,7 @@ void popup_a_sockerr(H3270 *session, char *fmt, ...) #if defined(_WIN32) const char *msg = win32_strerror(socket_errno()); #else - const char *msg = strerror(errno) + const char *msg = strerror(errno); #endif // WIN32 va_list args; char buffer[4096]; -- libgit2 0.21.2