diff --git a/src/include/v3270.h b/src/include/v3270.h index 2c6cec0..9b7a362 100644 --- a/src/include/v3270.h +++ b/src/include/v3270.h @@ -237,7 +237,7 @@ void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type, const gchar *title, const gchar *message, const gchar *text); const gchar * v3270_get_session_name(GtkWidget *widget); void v3270_set_session_name(GtkWidget *widget, const gchar *name); - int v3270_set_script(GtkWidget *widget, const gchar id, gboolean on); + int v3270_set_script(GtkWidget *widget, const gchar id); void v3270_set_scaled_fonts(GtkWidget *widget, gboolean on); int v3270_set_session_color_type(GtkWidget *widget, unsigned short colortype); diff --git a/src/testprogram/testprogram.c b/src/testprogram/testprogram.c index 27f9f61..669f240 100644 --- a/src/testprogram/testprogram.c +++ b/src/testprogram/testprogram.c @@ -161,6 +161,8 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { v3270_set_toggle(terminal,LIB3270_TOGGLE_RECONNECT,1); + // v3270_set_script(terminal,'R'); + } int main (int argc, char **argv) { diff --git a/src/v3270/blink.c b/src/v3270/blink.c new file mode 100644 index 0000000..f8c88d1 --- /dev/null +++ b/src/v3270/blink.c @@ -0,0 +1,97 @@ +/* + * "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., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - 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 "private.h" + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + + static gboolean blink_timer_tick(v3270 *widget) + { + gboolean rc = FALSE; + + widget->blink.show = !widget->blink.show; + + if(widget->script) + { + v3270_oia_update_text_field(widget,1,V3270_OIA_SCRIPT,widget->blink.show ? widget->script : ' '); + + rc = TRUE; + } + + if(lib3270_get_secure(widget->host) == LIB3270_SSL_NEGOTIATING) + { + GdkRectangle * r; + cairo_t * cr = v3270_oia_set_update_region(widget,&r,V3270_OIA_SSL); + + v3270_draw_ssl_status(widget,cr,r); + v3270_queue_draw_area(GTK_WIDGET(widget),r->x,r->y,r->width,r->height); + cairo_destroy(cr); + + rc = TRUE; + } + + /* + if(!widget->script.id) + return FALSE; + + update_text_field(widget,1,V3270_OIA_SCRIPT,widget->script.blink ? 'S' : ' '); + widget->script.blink = !widget->script.blink; + + return TRUE; + */ + + return rc; + + } + + static void blink_timer_removed(v3270 *widget) + { + widget->blink.timer = NULL; + widget->blink.show = 1; + } + + void v3270_start_blinking(GtkWidget *widget) + { + g_return_if_fail(GTK_IS_V3270(widget)); + + v3270 * terminal = GTK_V3270(widget); + + if(!terminal->blink.timer) + { + terminal->blink.show = 1; + terminal->blink.timer = g_timeout_source_new(500); + g_source_set_callback(terminal->blink.timer,(GSourceFunc) blink_timer_tick, terminal, (GDestroyNotify) blink_timer_removed); + + g_source_attach(terminal->blink.timer, NULL); + g_source_unref(terminal->blink.timer); + } + + } + diff --git a/src/v3270/draw.c b/src/v3270/draw.c index 414da57..77d21b3 100644 --- a/src/v3270/draw.c +++ b/src/v3270/draw.c @@ -62,7 +62,7 @@ gboolean v3270_draw(GtkWidget * widget, cairo_t * cr) cairo_rectangle(cr, 0,terminal->cursor.rect.y+terminal->font.height,allocation.width,1); cairo_fill(cr); - cairo_rectangle(cr, terminal->cursor.rect.x,0,1,terminal->oia_rect->y-3); + cairo_rectangle(cr, terminal->cursor.rect.x,0,1,terminal->oia.rect->y-3); cairo_fill(cr); } @@ -439,7 +439,7 @@ LIB3270_EXPORT void v3270_reload(GtkWidget *widget) } cairo_set_scaled_font(cr,terminal->font.scaled); - v3270_draw_oia(cr, terminal->host, rect.y, cols, &terminal->font, terminal->color,terminal->oia_rect); + v3270_draw_oia(terminal, cr, rect.y, cols); cairo_destroy(cr); diff --git a/src/v3270/mouse.c b/src/v3270/mouse.c index dc451f5..e83fd1c 100644 --- a/src/v3270/mouse.c +++ b/src/v3270/mouse.c @@ -138,13 +138,13 @@ void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event) static V3270_OIA_FIELD get_field_from_event(v3270 *widget, GdkEventButton *event) { - if(event->y >= widget->oia_rect->y) + if(event->y >= widget->oia.rect->y) { V3270_OIA_FIELD f; for(f=0;fx >= widget->oia_rect[f].x && event->x <= (widget->oia_rect[f].x+widget->oia_rect[f].width)) + if(event->x >= widget->oia.rect[f].x && event->x <= (widget->oia.rect[f].x+widget->oia.rect[f].width)) return f; } } @@ -158,7 +158,7 @@ gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) if(baddr >= 0) { - GTK_V3270(widget)->selected_field = V3270_OIA_FIELD_INVALID; + GTK_V3270(widget)->oia.selected = V3270_OIA_FIELD_INVALID; switch(event->button) { @@ -175,7 +175,7 @@ gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) } else if(event->button == 1 && event->type == GDK_BUTTON_PRESS) { - GTK_V3270(widget)->selected_field = get_field_from_event(GTK_V3270(widget),event); + GTK_V3270(widget)->oia.selected = get_field_from_event(GTK_V3270(widget),event); } return FALSE; @@ -190,13 +190,13 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event) GTK_V3270(widget)->moving = 0; GTK_V3270(widget)->resizing = 0; - if(GTK_V3270(widget)->selected_field != V3270_OIA_FIELD_INVALID && GTK_V3270(widget)->selected_field == get_field_from_event(GTK_V3270(widget),event)) + if(GTK_V3270(widget)->oia.selected != V3270_OIA_FIELD_INVALID && GTK_V3270(widget)->oia.selected == get_field_from_event(GTK_V3270(widget),event)) { gboolean handled = FALSE; g_signal_emit(widget, v3270_widget_signal[SIGNAL_FIELD], 0, lib3270_connected(GTK_V3270(widget)->host) ? TRUE : FALSE, - GTK_V3270(widget)->selected_field, + GTK_V3270(widget)->oia.selected, event, &handled); @@ -205,7 +205,7 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event) } - GTK_V3270(widget)->selected_field = V3270_OIA_FIELD_INVALID; + GTK_V3270(widget)->oia.selected = V3270_OIA_FIELD_INVALID; break; @@ -267,11 +267,11 @@ gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) update_mouse_pointer(widget,baddr); } } - else if(event->y >= terminal->oia_rect->y) + else if(event->y >= terminal->oia.rect->y) { int id = LIB3270_POINTER_PROTECTED; - if(event->x >= terminal->oia_rect[V3270_OIA_SSL].x && event->x <= (terminal->oia_rect[V3270_OIA_SSL].x + terminal->oia_rect[V3270_OIA_SSL].width)) + if(event->x >= terminal->oia.rect[V3270_OIA_SSL].x && event->x <= (terminal->oia.rect[V3270_OIA_SSL].x + terminal->oia.rect[V3270_OIA_SSL].width)) { switch(lib3270_get_secure(terminal->host)) { diff --git a/src/v3270/oia.c b/src/v3270/oia.c index 9d0e5e3..71a2aac 100644 --- a/src/v3270/oia.c +++ b/src/v3270/oia.c @@ -343,45 +343,49 @@ static void draw_xbm(cairo_t *cr, GdkRectangle *rect, int width, int height, uns cairo_restore(cr); } -void v3270_draw_ssl_status(cairo_t *cr, H3270 *host, G_GNUC_UNUSED v3270FontInfo *metrics, GdkRGBA *color, GdkRectangle *rect) +void v3270_draw_ssl_status(v3270 *widget, cairo_t *cr, GdkRectangle *rect) { -#ifdef DEBUG - cairo_set_source_rgb(cr,0.1,0.1,0.1); -#else - gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_BACKGROUND); -#endif + // v3270_draw_ssl_status(cr,terminal->host,&terminal->font,terminal->color,r); + + gdk_cairo_set_source_rgba(cr,widget->color+V3270_COLOR_OIA_BACKGROUND); cairo_translate(cr, rect->x, rect->y); cairo_rectangle(cr, 0, 0, rect->width, rect->height); cairo_fill(cr); - switch(lib3270_get_secure(host)) + if(widget->blink.show) + return; + + switch(lib3270_get_secure(widget->host)) { - case LIB3270_SSL_UNSECURE: /**< No secure connection */ - gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_FOREGROUND); + case LIB3270_SSL_UNDEFINED: // Undefined. + break; + + case LIB3270_SSL_UNSECURE: // No secure connection + gdk_cairo_set_source_rgba(cr,widget->color+V3270_COLOR_OIA_FOREGROUND); draw_xbm(cr,rect,unlocked_width,unlocked_height,unlocked_bits); break; - case LIB3270_SSL_NEGOTIATING: /**< Negotiating SSL */ - gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_STATUS_WARNING); - draw_xbm(cr,rect,negotiated_width,negotiated_height,negotiated_bits); + case LIB3270_SSL_NEGOTIATING: // Negotiating SSL + if(widget->blink.show) + { + gdk_cairo_set_source_rgba(cr,widget->color+V3270_COLOR_OIA_STATUS_WARNING); + draw_xbm(cr,rect,negotiated_width,negotiated_height,negotiated_bits); + } break; - case LIB3270_SSL_NEGOTIATED: /**< Connection secure, no CA or self-signed */ - gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_STATUS_OK); + case LIB3270_SSL_NEGOTIATED: // Connection secure, no CA, self-signed or expired CRL + gdk_cairo_set_source_rgba(cr,widget->color+V3270_COLOR_OIA_STATUS_OK); draw_xbm(cr,rect,locked_width,locked_height,locked_bits); - gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_STATUS_WARNING); + gdk_cairo_set_source_rgba(cr,widget->color+V3270_COLOR_OIA_STATUS_WARNING); draw_xbm(cr,rect,warning_width,warning_height,warning_bits); break; - case LIB3270_SSL_SECURE: /**< Connection secure with CA check */ - gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_STATUS_OK); + case LIB3270_SSL_SECURE: // Connection secure with CA check + gdk_cairo_set_source_rgba(cr,widget->color+V3270_COLOR_OIA_STATUS_OK); draw_xbm(cr,rect,locked_width,locked_height,locked_bits); break; - default: - return; - } @@ -552,7 +556,10 @@ static void draw_insert(cairo_t *cr, H3270 *host, GdkRGBA *color, GdkRectangle * } -void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, v3270FontInfo *metrics, GdkRGBA *color, GdkRectangle *rect) +// v3270_draw_oia(cr, terminal->host, rect.y, cols, &terminal->font, terminal->color,terminal->oia_rect); +// void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, v3270FontInfo *metrics, GdkRGBA *color, GdkRectangle *rect) + +void v3270_draw_oia(v3270 *terminal, cairo_t *cr, int row, int cols) { static const struct _right_fields { @@ -577,80 +584,81 @@ void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, v3270FontInfo * }; int f; - int rCol = metrics->left+(cols*metrics->width); - int lCol = metrics->left+1; + int rCol = terminal->font.left+(cols*terminal->font.width); + int lCol = terminal->font.left+1; row += OIA_TOP_MARGIN; - gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_SEPARATOR); - cairo_rectangle(cr, metrics->left, row, cols*metrics->width, 1); + gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_OIA_SEPARATOR); + cairo_rectangle(cr, terminal->font.left, row, cols*terminal->font.width, 1); cairo_fill(cr); row += 2; - gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_BACKGROUND); - cairo_rectangle(cr, metrics->left, row, cols*metrics->width, metrics->spacing); + gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_OIA_BACKGROUND); + cairo_rectangle(cr, terminal->font.left, row, cols*terminal->font.width, terminal->font.spacing); cairo_fill(cr); for(f=0;f< (int) G_N_ELEMENTS(right);f++) { - GdkRectangle *r = rect+right[f].id; + GdkRectangle *r = terminal->oia.rect+right[f].id; memset(r,0,sizeof(GdkRectangle)); r->x = rCol; r->y = row; - r->width = metrics->width; - r->height = metrics->spacing; - gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_FOREGROUND); - right[f].draw(r,metrics,cr,host,cols,color); - rCol = r->x - (metrics->width/3); + r->width = terminal->font.width; + r->height = terminal->font.spacing; + gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_OIA_FOREGROUND); + right[f].draw(r,&terminal->font,cr,terminal->host,cols,terminal->color); + rCol = r->x - (terminal->font.width/3); } - gdk_cairo_set_source_rgba(cr,color+V3270_COLOR_OIA_FOREGROUND); + gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_OIA_FOREGROUND); - draw_centered_char(cr,metrics,lCol,row,'4'); + draw_centered_char(cr,&terminal->font,lCol,row,'4'); cairo_stroke(cr); - cairo_rectangle(cr, lCol, row, metrics->width+2, metrics->spacing); + cairo_rectangle(cr, lCol, row, terminal->font.width+2, terminal->font.spacing); cairo_stroke(cr); - lCol += (metrics->width+5); + lCol += (terminal->font.width+5); // Undera indicator - rect[V3270_OIA_UNDERA].x = lCol; - rect[V3270_OIA_UNDERA].y = row; - rect[V3270_OIA_UNDERA].width = metrics->width+3; - rect[V3270_OIA_UNDERA].height = metrics->spacing; - draw_undera(cr,host,metrics,color,rect+V3270_OIA_UNDERA); + terminal->oia.rect[V3270_OIA_UNDERA].x = lCol; + terminal->oia.rect[V3270_OIA_UNDERA].y = row; + terminal->oia.rect[V3270_OIA_UNDERA].width = terminal->font.width+3; + terminal->oia.rect[V3270_OIA_UNDERA].height = terminal->font.spacing; + draw_undera(cr,terminal->host,&terminal->font,terminal->color,terminal->oia.rect+V3270_OIA_UNDERA); - lCol += (3 + rect[V3270_OIA_UNDERA].width); + lCol += (3 + terminal->oia.rect[V3270_OIA_UNDERA].width); // Connection indicator - rect[V3270_OIA_CONNECTION].x = lCol; - rect[V3270_OIA_CONNECTION].y = row; - rect[V3270_OIA_CONNECTION].width = metrics->width+3; - rect[V3270_OIA_CONNECTION].height = metrics->spacing; - v3270_draw_connection(cr,host,metrics,color,rect+V3270_OIA_CONNECTION); + terminal->oia.rect[V3270_OIA_CONNECTION].x = lCol; + terminal->oia.rect[V3270_OIA_CONNECTION].y = row; + terminal->oia.rect[V3270_OIA_CONNECTION].width = terminal->font.width+3; + terminal->oia.rect[V3270_OIA_CONNECTION].height = terminal->font.spacing; + v3270_draw_connection(cr,terminal->host,&terminal->font,terminal->color,terminal->oia.rect+V3270_OIA_CONNECTION); - lCol += (4 + rect[V3270_OIA_CONNECTION].width); + lCol += (4 + terminal->oia.rect[V3270_OIA_CONNECTION].width); - memset(rect+V3270_OIA_MESSAGE,0,sizeof(GdkRectangle)); + memset(terminal->oia.rect+V3270_OIA_MESSAGE,0,sizeof(GdkRectangle)); if(lCol < rCol) { - GdkRectangle *r = rect+V3270_OIA_MESSAGE; + GdkRectangle *r = terminal->oia.rect+V3270_OIA_MESSAGE; r->x = lCol; r->y = row; r->width = rCol - lCol; - r->height = metrics->spacing; - draw_status_message(cr,lib3270_get_program_message(host),metrics,color,r); + r->height = terminal->font.spacing; + draw_status_message(cr,lib3270_get_program_message(terminal->host),&terminal->font,terminal->color,r); } cairo_save(cr); - v3270_draw_ssl_status(cr,host,metrics,color,rect+V3270_OIA_SSL); +// v3270_draw_ssl_status(cr,terminal->host,&terminal->font,terminal->color,terminal->oia.rect+V3270_OIA_SSL); + v3270_draw_ssl_status(terminal,cr,terminal->oia.rect+V3270_OIA_SSL); cairo_restore(cr); cairo_save(cr); - draw_insert(cr,host,color,rect+V3270_OIA_INSERT); + draw_insert(cr,terminal->host,terminal->color,terminal->oia.rect+V3270_OIA_INSERT); cairo_restore(cr); } @@ -664,9 +672,9 @@ void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, v3270FontInfo * * @return cairo object for drawing. * */ -static cairo_t * set_update_region(v3270 * terminal, GdkRectangle **r, V3270_OIA_FIELD id) +cairo_t * v3270_oia_set_update_region(v3270 * terminal, GdkRectangle **r, V3270_OIA_FIELD id) { - GdkRectangle * rect = terminal->oia_rect + id; + GdkRectangle * rect = terminal->oia.rect + id; cairo_t * cr = cairo_create(terminal->surface); cairo_set_scaled_font(cr,terminal->font.scaled); @@ -698,7 +706,7 @@ void v3270_update_luname(GtkWidget *widget,const gchar *name) if(terminal->surface) { - cr = set_update_region(terminal,&rect,V3270_OIA_LUNAME); + cr = v3270_oia_set_update_region(terminal,&rect,V3270_OIA_LUNAME); if(name) { @@ -727,7 +735,7 @@ void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id) if(!widget->surface) return; - cr = set_update_region(widget,&rect,V3270_OIA_MESSAGE); + cr = v3270_oia_set_update_region(widget,&rect,V3270_OIA_MESSAGE); draw_status_message(cr,id,&widget->font,widget->color,rect); @@ -789,10 +797,10 @@ void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col, gtk_widget_get_allocation(GTK_WIDGET(terminal), &allocation); v3270_queue_draw_area(GTK_WIDGET(terminal),0,saved.y+terminal->font.height,allocation.width,1); - v3270_queue_draw_area(GTK_WIDGET(terminal),saved.x,0,1,terminal->oia_rect->y-3); + v3270_queue_draw_area(GTK_WIDGET(terminal),saved.x,0,1,terminal->oia.rect->y-3); v3270_queue_draw_area(GTK_WIDGET(terminal),0,terminal->cursor.rect.y+terminal->font.height,allocation.width,1); - v3270_queue_draw_area(GTK_WIDGET(terminal),terminal->cursor.rect.x,0,1,terminal->oia_rect->y-3); + v3270_queue_draw_area(GTK_WIDGET(terminal),terminal->cursor.rect.x,0,1,terminal->oia.rect->y-3); } if(lib3270_get_toggle(session,LIB3270_TOGGLE_CURSOR_POS)) @@ -801,7 +809,7 @@ void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col, GdkRectangle * rect; cairo_t * cr; - cr = set_update_region(terminal,&rect,V3270_OIA_CURSOR_POSITION); + cr = v3270_oia_set_update_region(terminal,&rect,V3270_OIA_CURSOR_POSITION); draw_cursor_position(cr,rect,&terminal->font,row,col); @@ -849,7 +857,7 @@ static void release_timer(struct timer_info *info) for(f=0;f< (int) G_N_ELEMENTS(id);f++) { - GdkRectangle *rect = info->terminal->oia_rect + id[f]; + GdkRectangle *rect = info->terminal->oia.rect + id[f]; cairo_rectangle(cr, rect->x, rect->y, rect->width, rect->height); cairo_fill(cr); v3270_queue_draw_area(GTK_WIDGET(info->terminal),rect->x,rect->y,rect->width,rect->height); @@ -868,7 +876,7 @@ void v3270_draw_shift_status(v3270 *terminal) if(!terminal->surface) return; - cr = set_update_region(terminal,&r,V3270_OIA_SHIFT); + cr = v3270_oia_set_update_region(terminal,&r,V3270_OIA_SHIFT); cairo_translate(cr, r->x, r->y+1); if(r->width > 2 && r->height > 7 && (terminal->keyflags & KEY_FLAG_SHIFT)) @@ -911,7 +919,7 @@ void v3270_draw_shift_status(v3270 *terminal) } -static void update_text_field(v3270 *terminal, gboolean flag, V3270_OIA_FIELD id, const gchar chr) +void v3270_oia_update_text_field(v3270 *terminal, gboolean flag, V3270_OIA_FIELD id, const gchar chr) { GdkRectangle * r; cairo_t * cr; @@ -920,7 +928,7 @@ static void update_text_field(v3270 *terminal, gboolean flag, V3270_OIA_FIELD id if(!terminal->surface) return; - cr = set_update_region(terminal,&r,id); + cr = v3270_oia_set_update_region(terminal,&r,id); cairo_translate(cr, r->x, r->y); if(flag) @@ -938,7 +946,7 @@ static void update_text_field(v3270 *terminal, gboolean flag, V3270_OIA_FIELD id void v3270_draw_alt_status(v3270 *terminal) { #ifdef KEY_FLAG_ALT - update_text_field(terminal,terminal->keyflags & KEY_FLAG_ALT,V3270_OIA_ALT,'A'); + v3270_oia_update_text_field(terminal,terminal->keyflags & KEY_FLAG_ALT,V3270_OIA_ALT,'A'); #endif // KEY_FLAG_ALT } @@ -950,7 +958,7 @@ void v3270_draw_ins_status(v3270 *terminal) if(!terminal->surface) return; - cr = set_update_region(terminal,&r,V3270_OIA_INSERT); + cr = v3270_oia_set_update_region(terminal,&r,V3270_OIA_INSERT); draw_insert(cr,terminal->host,terminal->color,r); @@ -976,13 +984,9 @@ static gboolean update_timer(struct timer_info *info) time_t seconds = now - info->start; char buffer[7]; - rect = info->terminal->oia_rect + V3270_OIA_TIMER; + rect = info->terminal->oia.rect + V3270_OIA_TIMER; -#ifdef DEBUG - cairo_set_source_rgb(cr,0.1,0.1,0.1); -#else gdk_cairo_set_source_rgba(cr,info->terminal->color+V3270_COLOR_OIA_BACKGROUND); -#endif cairo_rectangle(cr, rect->x, rect->y, rect->width, rect->height); cairo_fill(cr); @@ -1008,7 +1012,7 @@ static gboolean update_timer(struct timer_info *info) #ifdef HAVE_LIBM - rect = info->terminal->oia_rect + V3270_OIA_SPINNER; + rect = info->terminal->oia.rect + V3270_OIA_SPINNER; #ifdef DEBUG cairo_set_source_rgb(cr,0.1,0.1,0.1); @@ -1075,19 +1079,18 @@ void v3270_stop_timer(GtkWidget *widget) } -void v3270_update_ssl(H3270 *session, G_GNUC_UNUSED LIB3270_SSL_STATE state) +void v3270_blink_ssl(v3270 *terminal) { - v3270 * terminal = GTK_V3270(lib3270_get_user_data(session)); - cairo_t * cr; - GdkRectangle * r; + if(terminal->surface) + { + GdkRectangle * r; + cairo_t * cr = v3270_oia_set_update_region(terminal,&r,V3270_OIA_SSL); - if(!terminal->surface) - return; + v3270_draw_ssl_status(terminal,cr,r); + v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); + cairo_destroy(cr); - cr = set_update_region(terminal,&r,V3270_OIA_SSL); - v3270_draw_ssl_status(cr,terminal->host,&terminal->font,terminal->color,r); - v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); - cairo_destroy(cr); + } } @@ -1105,7 +1108,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) { case LIB3270_FLAG_BOXSOLID: debug("%s LIB3270_FLAG_BOXSOLID",__FUNCTION__); - cr = set_update_region(terminal,&r,V3270_OIA_CONNECTION); + cr = v3270_oia_set_update_region(terminal,&r,V3270_OIA_CONNECTION); v3270_draw_connection(cr,terminal->host,&terminal->font,terminal->color,r); cairo_destroy(cr); v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); @@ -1113,7 +1116,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) case LIB3270_FLAG_UNDERA: debug("%s LIB3270_FLAG_UNDERA",__FUNCTION__); - cr = set_update_region(terminal,&r,V3270_OIA_UNDERA); + cr = v3270_oia_set_update_region(terminal,&r,V3270_OIA_UNDERA); debug("%s LIB3270_FLAG_UNDERA",__FUNCTION__); draw_undera(cr,terminal->host,&terminal->font,terminal->color,r); debug("%s LIB3270_FLAG_UNDERA",__FUNCTION__); @@ -1125,19 +1128,19 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) case LIB3270_FLAG_TYPEAHEAD: debug("%s LIB3270_FLAG_TYPEAHEAD",__FUNCTION__); - update_text_field(terminal,on,V3270_OIA_TYPEAHEAD,'T'); + v3270_oia_update_text_field(terminal,on,V3270_OIA_TYPEAHEAD,'T'); break; #ifdef HAVE_PRINTER case LIB3270_FLAG_PRINTER: debug("%s LIB3270_FLAG_PRINTER",__FUNCTION__); - update_text_field(terminal,on,V3270_OIA_PRINTER,'P'); + v3270_oia_update_text_field(terminal,on,V3270_OIA_PRINTER,'P'); break; #endif // HAVE_PRINTER /* case LIB3270_FLAG_SCRIPT: - update_text_field(terminal,on,V3270_OIA_SCRIPT,terminal->script_id); + v3270_oia_update_text_field(terminal,on,V3270_OIA_SCRIPT,terminal->script_id); break; */ @@ -1148,55 +1151,20 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) debug("%s",__FUNCTION__); } -static gboolean blink_script(v3270 *widget) -{ - if(!widget->script.id) - return FALSE; - - update_text_field(widget,1,V3270_OIA_SCRIPT,widget->script.blink ? 'S' : ' '); - widget->script.blink = !widget->script.blink; - - return TRUE; -} - -static void release_script(v3270 *widget) -{ - widget->script.timer = NULL; - widget->script.id = 0; -} -int v3270_set_script(GtkWidget *widget, const gchar id, gboolean on) +int v3270_set_script(GtkWidget *widget, const gchar id) { - v3270 *terminal; g_return_val_if_fail(GTK_IS_V3270(widget),EINVAL); - terminal = GTK_V3270(widget); + v3270 * terminal = GTK_V3270(widget); - if(terminal->script.id && id != terminal->script.id) + if(id && terminal->script) return EBUSY; - terminal->script.id = on ? id : 0; - update_text_field(terminal,on,V3270_OIA_SCRIPT,'S'); + terminal->script = id; - if(on) - { - if(!terminal->script.timer) - { - terminal->script.timer = g_timeout_source_new(500); - g_source_set_callback(terminal->script.timer,(GSourceFunc) blink_script, terminal, (GDestroyNotify) release_script); - - g_source_attach(terminal->script.timer, NULL); - g_source_unref(terminal->script.timer); - } - } - else if(terminal->script.timer) - { - if(terminal->script.timer->ref_count < 2) - g_source_destroy(terminal->script.timer); - - if(terminal->timer) - g_source_unref(terminal->script.timer); - } + if(terminal->script) + v3270_start_blinking(widget); return 0; } diff --git a/src/v3270/private.h b/src/v3270/private.h index caae68c..0a3220b 100644 --- a/src/v3270/private.h +++ b/src/v3270/private.h @@ -142,14 +142,12 @@ G_BEGIN_DECLS struct { - char * text; /**< Clipboard contents (lib3270 charset) */ - int baddr; /**< Selection addr */ + char * text; /**< Clipboard contents (lib3270 charset) */ + int baddr; /**< Selection addr */ } selection; LIB3270_POINTER pointer_id; - unsigned char pointer; /**< Mouse pointer ID */ - - V3270_OIA_FIELD selected_field; /**< Clicked OIA field */ + unsigned char pointer; /**< Mouse pointer ID */ // Font info cairo_surface_t * surface; @@ -159,10 +157,14 @@ G_BEGIN_DECLS gint minimum_height; // Colors - GdkRGBA color[V3270_COLOR_COUNT]; /**< Terminal widget colors */ + GdkRGBA color[V3270_COLOR_COUNT]; /**< Terminal widget colors */ - // Regions - GdkRectangle oia_rect[V3270_OIA_FIELD_COUNT]; + // OIA + struct + { + GdkRectangle rect[V3270_OIA_FIELD_COUNT]; + V3270_OIA_FIELD selected; /**< Clicked OIA field */ + } oia; struct { @@ -189,13 +191,24 @@ G_BEGIN_DECLS GSource * timer; /**< Auto disconnect timer */ } activity; + char script; /**< @brief Script ID */ + + // Blink + struct + { + int show : 1; /**< @brief Show element? */ + GSource * timer; /**< @brief Timer source. */ + } blink; + + /* // Scripting struct { int blink : 1; - gchar id; /**< Script indicator */ + gchar id; ///< Script indicator GSource * timer; } script; + */ }; @@ -229,9 +242,12 @@ G_BEGIN_DECLS G_GNUC_INTERNAL guint v3270_widget_signal[LAST_SIGNAL]; G_GNUC_INTERNAL GdkCursor * v3270_cursor[LIB3270_POINTER_COUNT]; -// G_GNUC_INTERNAL GParamSpec * v3270_properties[PROP_LAST]; G_GNUC_INTERNAL const gchar * v3270_default_colors; G_GNUC_INTERNAL const gchar * v3270_default_font; + G_GNUC_INTERNAL void v3270_start_blinking(GtkWidget *widget); + + G_GNUC_INTERNAL void v3270_oia_update_text_field(v3270 *terminal, gboolean flag, V3270_OIA_FIELD id, const gchar chr); + G_GNUC_INTERNAL cairo_t * v3270_oia_set_update_region(v3270 * terminal, GdkRectangle **r, V3270_OIA_FIELD id); G_GNUC_INTERNAL struct _v3270_properties { @@ -256,10 +272,11 @@ G_BEGIN_DECLS /*--[ Prototipes ]-----------------------------------------------------------------------------------*/ -const GtkWidgetClass * v3270_get_parent_class(void); +const GtkWidgetClass * v3270_get_parent_class(void); G_GNUC_INTERNAL gboolean v3270_draw(GtkWidget * widget, cairo_t * cr); -G_GNUC_INTERNAL void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, v3270FontInfo *metrics, GdkRGBA *color, GdkRectangle *rect); + +G_GNUC_INTERNAL void v3270_draw_oia(v3270 *terminal, cairo_t *cr, int row, int cols); G_GNUC_INTERNAL void v3270_update_mouse_pointer(GtkWidget *widget); #if ! GTK_CHECK_VERSION(2,18,0) @@ -302,7 +319,8 @@ G_GNUC_INTERNAL void v3270_start_timer(GtkWidget *terminal); G_GNUC_INTERNAL void v3270_stop_timer(GtkWidget *terminal); G_GNUC_INTERNAL void v3270_draw_connection(cairo_t *cr, H3270 *host, v3270FontInfo *metrics, GdkRGBA *color, const GdkRectangle *rect); -G_GNUC_INTERNAL void v3270_draw_ssl_status(cairo_t *cr, H3270 *host, v3270FontInfo *metrics, GdkRGBA *color, GdkRectangle *rect); + +G_GNUC_INTERNAL void v3270_draw_ssl_status(v3270 *widget, cairo_t *cr, GdkRectangle *rect); G_GNUC_INTERNAL void v3270_update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor); @@ -313,7 +331,8 @@ G_GNUC_INTERNAL void v3270_update_cursor_rect(v3270 *widget, GdkRectangle *re G_GNUC_INTERNAL void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id); G_GNUC_INTERNAL void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col, unsigned char c, unsigned short attr); G_GNUC_INTERNAL void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on); -G_GNUC_INTERNAL void v3270_update_ssl(H3270 *session, LIB3270_SSL_STATE state); + +G_GNUC_INTERNAL void v3270_blink_ssl(v3270 *terminal); G_GNUC_INTERNAL void v3270_update_luname(GtkWidget *widget,const gchar *name); G_GNUC_INTERNAL void v3270_init_properties(GObjectClass * gobject_class); diff --git a/src/v3270/widget.c b/src/v3270/widget.c index c4e6df4..001bb53 100644 --- a/src/v3270/widget.c +++ b/src/v3270/widget.c @@ -230,9 +230,9 @@ void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type , const gchar *t gboolean v3270_query_tooltip(GtkWidget *widget, gint x, gint y, G_GNUC_UNUSED gboolean keyboard_tooltip, GtkTooltip *tooltip) { - if(y >= GTK_V3270(widget)->oia_rect->y) + if(y >= GTK_V3270(widget)->oia.rect->y) { - GdkRectangle *rect = GTK_V3270(widget)->oia_rect; + GdkRectangle *rect = GTK_V3270(widget)->oia.rect; if(x >= rect[V3270_OIA_SSL].x && x <= (rect[V3270_OIA_SSL].x + rect[V3270_OIA_SSL].width)) { @@ -923,6 +923,13 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title } + static void update_ssl(H3270 *session, G_GNUC_UNUSED LIB3270_SSL_STATE state) + { + v3270_blink_ssl(GTK_V3270(lib3270_get_user_data(session))); + if(state == LIB3270_SSL_NEGOTIATING) + v3270_start_blinking(GTK_WIDGET(lib3270_get_user_data(session))); + } + const gchar * v3270_default_font = "monospace"; static void v3270_init(v3270 *widget) @@ -961,10 +968,9 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title cbk->changed = changed; cbk->ctlr_done = ctlr_done; cbk->message = message; - cbk->update_ssl = v3270_update_ssl; + cbk->update_ssl = update_ssl; cbk->print = emit_print_signal; - // Reset timer widget->activity.timestamp = time(0); widget->activity.disconnect = 0; @@ -1058,11 +1064,11 @@ static void v3270_destroy(GtkObject *widget) g_source_unref(terminal->timer); } - if(terminal->script.timer) + if(terminal->blink.timer) { - g_source_destroy(terminal->script.timer); - while(terminal->script.timer) - g_source_unref(terminal->script.timer); + g_source_destroy(terminal->blink.timer); + while(terminal->blink.timer) + g_source_unref(terminal->blink.timer); } if(terminal->cursor.timer) -- libgit2 0.21.2