diff --git a/src/include/pw3270/v3270.h b/src/include/pw3270/v3270.h index 0e5e58f..7149e50 100644 --- a/src/include/pw3270/v3270.h +++ b/src/include/pw3270/v3270.h @@ -216,6 +216,7 @@ // Cut & Paste LIB3270_EXPORT gboolean v3270_get_selection_bounds(GtkWidget *widget, gint *start, gint *end); LIB3270_EXPORT void v3270_unselect(GtkWidget *widget); + LIB3270_EXPORT void v3270_select_all(GtkWidget *widget); LIB3270_EXPORT void v3270_paste(GtkWidget *widget); LIB3270_EXPORT void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); LIB3270_EXPORT void v3270_select_region(GtkWidget *widget, gint start, gint end); diff --git a/src/pw3270/actions.c b/src/pw3270/actions.c index 3c38169..d79d0f1 100644 --- a/src/pw3270/actions.c +++ b/src/pw3270/actions.c @@ -390,7 +390,7 @@ static void action_reset_toggle(GtkAction *action, GtkWidget *widget) static void action_select_all(GtkAction *action, GtkWidget *widget) { trace_action(action,widget); - lib3270_select_all(v3270_get_session(widget)); + v3270_select_all(widget); } static void action_select_field(GtkAction *action, GtkWidget *widget) diff --git a/src/pw3270/filetransfer.c b/src/pw3270/filetransfer.c index 076c281..a67902d 100644 --- a/src/pw3270/filetransfer.c +++ b/src/pw3270/filetransfer.c @@ -236,7 +236,7 @@ static void ft_state_changed(H3270FT *ft, LIB3270_FT_STATE state) gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION options, const gchar *local, const gchar *remote, int lrecl, int blksize, int primspace, int secspace, int dft) { - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + g_return_val_if_fail(GTK_IS_V3270(widget),0); H3270FT * ft = lib3270_ft_new(v3270_get_session(widget),options,local,remote,lrecl,blksize,primspace,secspace,dft); diff --git a/src/pw3270/v3270/draw.c b/src/pw3270/v3270/draw.c index 690218a..689358f 100644 --- a/src/pw3270/v3270/draw.c +++ b/src/pw3270/v3270/draw.c @@ -337,7 +337,7 @@ void v3270_reload(GtkWidget *widget) cairo_t * cr; - if(!gtk_widget_get_realized(widget)) + if(!(gtk_widget_get_realized(widget) && terminal->drawing)) return; // Create new terminal image @@ -405,7 +405,7 @@ void v3270_update_char(H3270 *session, int addr, unsigned char chr, unsigned sho GdkRectangle rect; int rows,cols; - if(!gtk_widget_get_realized(GTK_WIDGET(terminal))) + if(!(gtk_widget_get_realized(GTK_WIDGET(terminal)) && terminal->drawing)) return; if(!terminal->surface) @@ -432,9 +432,7 @@ void v3270_update_char(H3270 *session, int addr, unsigned char chr, unsigned sho if(cursor) v3270_update_cursor_rect(terminal,&rect,chr,attr); -// #ifndef _WIN32 - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),rect.x,rect.y,rect.width,rect.height); -// #endif // WIN32 + v3270_queue_draw_area(GTK_WIDGET(terminal),rect.x,rect.y,rect.width,rect.height); } @@ -470,3 +468,11 @@ void v3270_update_cursor_rect(v3270 *widget, GdkRectangle *rect, unsigned char c v3270_update_cursor_surface(widget,chr,attr); } +void v3270_queue_draw_area(GtkWidget *widget, gint x, gint y, gint width, gint height) +{ + if(GTK_V3270(widget)->drawing && gtk_widget_get_realized(widget)) + { + gtk_widget_queue_draw_area(widget,x,y,width,height); + } + +} diff --git a/src/pw3270/v3270/hostselect.c b/src/pw3270/v3270/hostselect.c index 3d12df1..6ac1bce 100644 --- a/src/pw3270/v3270/hostselect.c +++ b/src/pw3270/v3270/hostselect.c @@ -429,7 +429,7 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) LIB3270_EXPORT int v3270_host_select_apply(V3270HostSelectWidget *widget) { - g_return_if_fail(GTK_IS_V3270HostSelectWidget(widget)); + g_return_val_if_fail(GTK_IS_V3270HostSelectWidget(widget),0); lib3270_set_hostname(widget->hSession,gtk_entry_get_text(widget->entry[ENTRY_HOSTNAME])); lib3270_set_srvcname(widget->hSession,gtk_entry_get_text(widget->entry[ENTRY_SRVCNAME])); diff --git a/src/pw3270/v3270/mouse.c b/src/pw3270/v3270/mouse.c index be9767d..95666b3 100644 --- a/src/pw3270/v3270/mouse.c +++ b/src/pw3270/v3270/mouse.c @@ -71,9 +71,11 @@ static void single_click(v3270 *widget, int baddr) { case 0x00: // Unselected area, move cursor and remove selection + v3270_disable_updates(widget); lib3270_set_cursor_address(widget->host,baddr); lib3270_unselect(widget->host); widget->selecting = 1; + v3270_enable_updates(widget); break; diff --git a/src/pw3270/v3270/oia.c b/src/pw3270/v3270/oia.c index f0a67c7..bba95be 100644 --- a/src/pw3270/v3270/oia.c +++ b/src/pw3270/v3270/oia.c @@ -714,7 +714,7 @@ void v3270_update_luname(GtkWidget *widget,const gchar *name) cairo_destroy(cr); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),rect->x,rect->y,rect->width,rect->height); + v3270_queue_draw_area(GTK_WIDGET(terminal),rect->x,rect->y,rect->width,rect->height); } #if GTK_CHECK_VERSION(2,26,0) @@ -739,7 +739,7 @@ void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id) cairo_destroy(cr); - gtk_widget_queue_draw_area(GTK_WIDGET(widget),rect->x,rect->y,rect->width,rect->height); + v3270_queue_draw_area(GTK_WIDGET(widget),rect->x,rect->y,rect->width,rect->height); if(widget->accessible) v3270_acessible_set_state(widget->accessible,id); @@ -780,28 +780,28 @@ void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col, terminal->cursor.rect.height = terminal->font.height+terminal->font.descent; terminal->cursor.show |= 1; - gtk_widget_queue_draw_area( GTK_WIDGET(terminal), saved.x, - saved.y, - saved.width, - saved.height); + v3270_queue_draw_area( GTK_WIDGET(terminal), saved.x, + saved.y, + saved.width, + saved.height); v3270_update_cursor_surface(terminal,c,attr); - gtk_widget_queue_draw_area( GTK_WIDGET(terminal), - terminal->cursor.rect.x,terminal->cursor.rect.y, - terminal->cursor.rect.width,terminal->cursor.rect.height); + v3270_queue_draw_area( GTK_WIDGET(terminal), + terminal->cursor.rect.x,terminal->cursor.rect.y, + terminal->cursor.rect.width,terminal->cursor.rect.height); if(lib3270_get_toggle(session,LIB3270_TOGGLE_CROSSHAIR)) { GtkAllocation allocation; gtk_widget_get_allocation(GTK_WIDGET(terminal), &allocation); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),0,saved.y+terminal->font.height,allocation.width,1); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),saved.x,0,1,terminal->oia_rect->y-3); + 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); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),0,terminal->cursor.rect.y+terminal->font.height,allocation.width,1); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),terminal->cursor.rect.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); } if(lib3270_get_toggle(session,LIB3270_TOGGLE_CURSOR_POS)) @@ -816,7 +816,7 @@ void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col, cairo_destroy(cr); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),rect->x,rect->y,rect->width,rect->height); + v3270_queue_draw_area(GTK_WIDGET(terminal),rect->x,rect->y,rect->width,rect->height); } if(terminal->accessible) @@ -862,7 +862,7 @@ static void release_timer(struct timer_info *info) GdkRectangle *rect = info->terminal->oia_rect + id[f]; cairo_rectangle(cr, rect->x, rect->y, rect->width, rect->height); cairo_fill(cr); - gtk_widget_queue_draw_area(GTK_WIDGET(info->terminal),rect->x,rect->y,rect->width,rect->height); + v3270_queue_draw_area(GTK_WIDGET(info->terminal),rect->x,rect->y,rect->width,rect->height); } cairo_destroy(cr); } @@ -919,7 +919,7 @@ void v3270_draw_shift_status(v3270 *terminal) } cairo_destroy(cr); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); + v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); } @@ -943,7 +943,7 @@ static void update_text_field(v3270 *terminal, gboolean flag, V3270_OIA_FIELD id } cairo_destroy(cr); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); + v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); } void v3270_draw_alt_status(v3270 *terminal) @@ -966,7 +966,7 @@ void v3270_draw_ins_status(v3270 *terminal) draw_insert(cr,terminal->host,terminal->color,r); cairo_destroy(cr); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); + v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); } @@ -1010,7 +1010,7 @@ static gboolean update_timer(struct timer_info *info) cairo_stroke(cr); info->last = now; - gtk_widget_queue_draw_area(GTK_WIDGET(info->terminal),rect->x,rect->y,rect->width,rect->height); + v3270_queue_draw_area(GTK_WIDGET(info->terminal),rect->x,rect->y,rect->width,rect->height); } #ifdef HAVE_LIBM @@ -1030,7 +1030,7 @@ static gboolean update_timer(struct timer_info *info) info->step = draw_spinner(cr, rect, info->terminal->color, info->step); - gtk_widget_queue_draw_area(GTK_WIDGET(info->terminal),rect->x,rect->y,rect->width,rect->height); + v3270_queue_draw_area(GTK_WIDGET(info->terminal),rect->x,rect->y,rect->width,rect->height); #endif // HAVE_LIBM @@ -1090,7 +1090,7 @@ void v3270_update_ssl(H3270 *session, LIB3270_SSL_STATE state) cr = set_update_region(terminal,&r,V3270_OIA_SSL); v3270_draw_ssl_status(cr,terminal->host,&terminal->font,terminal->color,r); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); + v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); cairo_destroy(cr); } @@ -1102,7 +1102,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) v3270 *terminal = GTK_V3270(session->user_data); - if(!terminal->surface) + if(!(terminal->surface && terminal->drawing)) return; switch(id) @@ -1111,7 +1111,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) debug("%s",__FUNCTION__); cr = set_update_region(terminal,&r,V3270_OIA_CONNECTION); v3270_draw_connection(cr,terminal->host,&terminal->font,terminal->color,r); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); + v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); cairo_destroy(cr); break; @@ -1119,7 +1119,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) debug("%s",__FUNCTION__); cr = set_update_region(terminal,&r,V3270_OIA_UNDERA); draw_undera(cr,terminal->host,&terminal->font,terminal->color,r); - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); + v3270_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height); cairo_destroy(cr); break; diff --git a/src/pw3270/v3270/private.h b/src/pw3270/v3270/private.h index 0461dd0..c9590e1 100644 --- a/src/pw3270/v3270/private.h +++ b/src/pw3270/v3270/private.h @@ -127,6 +127,7 @@ G_BEGIN_DECLS int resizing : 1; /**< Resizing selected region */ int table : 1; /**< Copy mode is table */ int scaled_fonts : 1; /**< Use scaled fonts */ + int drawing : 1; /**< Draw widget? */ #if GTK_CHECK_VERSION(3,0,0) @@ -290,6 +291,10 @@ void v3270_update_ssl(H3270 *session, LIB3270_SSL_STATE state); G_GNUC_INTERNAL void v3270_update_luname(GtkWidget *widget,const gchar *name); G_GNUC_INTERNAL void v3270_init_properties(GObjectClass * gobject_class); +G_GNUC_INTERNAL void v3270_queue_draw_area(GtkWidget *widget, gint x, gint y, gint width, gint height); + +G_GNUC_INTERNAL void v3270_disable_updates(GtkWidget *widget); +G_GNUC_INTERNAL void v3270_enable_updates(GtkWidget *widget); // Keyboard & Mouse gboolean v3270_key_press_event(GtkWidget *widget, GdkEventKey *event); diff --git a/src/pw3270/v3270/selection.c b/src/pw3270/v3270/selection.c index c0ea9a7..3e80dfe 100644 --- a/src/pw3270/v3270/selection.c +++ b/src/pw3270/v3270/selection.c @@ -484,7 +484,9 @@ void v3270_paste(GtkWidget *widget) void v3270_unselect(GtkWidget *widget) { + v3270_disable_updates(widget); lib3270_unselect(v3270_get_session(widget)); + v3270_enable_updates(widget); } gboolean v3270_get_selection_bounds(GtkWidget *widget, gint *start, gint *end) @@ -517,4 +519,12 @@ gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboole lib3270_select_region(GTK_V3270(widget)->host,start,end); } +void v3270_select_all(GtkWidget *widget) +{ + g_return_if_fail(GTK_IS_V3270(widget)); + v3270_disable_updates(widget); + lib3270_select_all(v3270_get_session(widget)); + v3270_enable_updates(widget); +} + diff --git a/src/pw3270/v3270/widget.c b/src/pw3270/v3270/widget.c index e3f75f3..5c672a3 100644 --- a/src/pw3270/v3270/widget.c +++ b/src/pw3270/v3270/widget.c @@ -109,9 +109,9 @@ static void v3270_cursor_draw(v3270 *widget) 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); + v3270_queue_draw_area( GTK_WIDGET(widget), + widget->cursor.rect.x,widget->cursor.rect.y, + widget->cursor.rect.width,widget->cursor.rect.height); } @@ -985,6 +985,9 @@ static void v3270_init(v3270 *widget) // Setup auto disconnect timer widget->cursor.timer = NULL; + // Enable drawing + widget->drawing = 1; + trace("%s",__FUNCTION__); } @@ -1100,10 +1103,10 @@ static gboolean timer_tick(v3270 *widget) if(lib3270_get_toggle(widget->host,LIB3270_TOGGLE_CURSOR_BLINK)) { widget->cursor.show ^= 1; - gtk_widget_queue_draw_area(GTK_WIDGET(widget), widget->cursor.rect.x, - widget->cursor.rect.y, - widget->cursor.rect.width, - widget->cursor.rect.height ); + v3270_queue_draw_area(GTK_WIDGET(widget), widget->cursor.rect.x, + widget->cursor.rect.y, + widget->cursor.rect.width, + widget->cursor.rect.height ); } return TRUE; @@ -1485,7 +1488,10 @@ const gchar * v3270_get_font_family(GtkWidget *widget) void v3270_disconnect(GtkWidget *widget) { g_return_if_fail(GTK_IS_V3270(widget)); + v3270_disable_updates(widget); + lib3270_unselect(GTK_V3270(widget)->host); lib3270_disconnect(GTK_V3270(widget)->host); + v3270_enable_updates(widget); } H3270 * v3270_get_session(GtkWidget *widget) @@ -1595,8 +1601,8 @@ gboolean v3270_get_toggle(GtkWidget *widget, LIB3270_TOGGLE ix) **/ const gchar * v3270_set_url(GtkWidget *widget, const gchar *uri) { - g_return_if_fail(GTK_IS_V3270(widget)); - g_return_if_fail(uri != NULL); + g_return_val_if_fail(GTK_IS_V3270(widget),""); + g_return_val_if_fail(uri != NULL,""); return lib3270_set_url(GTK_V3270(widget)->host,uri); } @@ -1687,3 +1693,18 @@ GtkWidget * v3270_get_default_widget(void) return GTK_WIDGET(hSession->user_data); } + +void v3270_disable_updates(GtkWidget *widget) +{ + GTK_V3270(widget)->drawing = 0; +} + +void v3270_enable_updates(GtkWidget *widget) +{ + if(gtk_widget_get_realized(widget)) + { + GTK_V3270(widget)->drawing = 1; + v3270_reload(widget); + gtk_widget_queue_draw(widget); + } +} diff --git a/src/pw3270/window.c b/src/pw3270/window.c index f9bc830..1163b66 100644 --- a/src/pw3270/window.c +++ b/src/pw3270/window.c @@ -233,7 +233,7 @@ const gchar * pw3270_set_url(GtkWidget *widget, const gchar *uri) { - g_return_if_fail(GTK_IS_PW3270(widget)); + g_return_val_if_fail(GTK_IS_PW3270(widget),""); return v3270_set_url(GTK_PW3270(widget)->terminal,uri); } -- libgit2 0.21.2