Commit 981cc52ad3a9bfccb47492491a10477b59ed5427
1 parent
fafae464
Exists in
master
and in
1 other branch
Fixing trace window segfaults on main application.
Showing
5 changed files
with
37 additions
and
18 deletions
Show diff stats
src/include/v3270.h
| @@ -165,7 +165,7 @@ | @@ -165,7 +165,7 @@ | ||
| 165 | #endif // v3270_char | 165 | #endif // v3270_char |
| 166 | 166 | ||
| 167 | LIB3270_EXPORT GtkWidget * v3270_new(void); | 167 | LIB3270_EXPORT GtkWidget * v3270_new(void); |
| 168 | - LIB3270_EXPORT GtkWidget * v3270_new_trace_window(GtkWidget *widget); | 168 | + LIB3270_EXPORT GtkWidget * v3270_new_trace_window(GtkWidget *widget, const gchar *header); |
| 169 | LIB3270_EXPORT GType v3270_get_type(void); | 169 | LIB3270_EXPORT GType v3270_get_type(void); |
| 170 | LIB3270_EXPORT void v3270_reload(GtkWidget * widget); | 170 | LIB3270_EXPORT void v3270_reload(GtkWidget * widget); |
| 171 | LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name); | 171 | LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name); |
src/include/v3270/trace.h
| @@ -50,11 +50,14 @@ | @@ -50,11 +50,14 @@ | ||
| 50 | typedef struct _v3270_traceClass v3270_traceClass; | 50 | typedef struct _v3270_traceClass v3270_traceClass; |
| 51 | 51 | ||
| 52 | LIB3270_EXPORT GtkWidget * v3270_trace_new(); | 52 | LIB3270_EXPORT GtkWidget * v3270_trace_new(); |
| 53 | - LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession); | 53 | + |
| 54 | + LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession, const gchar *header); | ||
| 55 | + | ||
| 54 | LIB3270_EXPORT void v3270_trace_set_session(GtkWidget *widget, H3270 *hSession); | 56 | LIB3270_EXPORT void v3270_trace_set_session(GtkWidget *widget, H3270 *hSession); |
| 55 | LIB3270_EXPORT GType v3270_trace_get_type(void); | 57 | LIB3270_EXPORT GType v3270_trace_get_type(void); |
| 56 | LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args); | 58 | LIB3270_EXPORT void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args); |
| 57 | LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ); | 59 | LIB3270_EXPORT void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ); |
| 60 | + LIB3270_EXPORT void v3270_trace_append_text(GtkWidget *widget, const gchar *text); | ||
| 58 | LIB3270_EXPORT gchar * v3270_trace_get_command(GtkWidget *widget); | 61 | LIB3270_EXPORT gchar * v3270_trace_get_command(GtkWidget *widget); |
| 59 | LIB3270_EXPORT void v3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on); | 62 | LIB3270_EXPORT void v3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on); |
| 60 | LIB3270_EXPORT void v3270_trace_set_font_from_string(GtkWidget *widget, const gchar *name); | 63 | LIB3270_EXPORT void v3270_trace_set_font_from_string(GtkWidget *widget, const gchar *name); |
src/testprogram/testprogram.c
| @@ -91,6 +91,7 @@ static void trace_window_destroy(G_GNUC_UNUSED GtkWidget *widget, H3270 *hSessio | @@ -91,6 +91,7 @@ static void trace_window_destroy(G_GNUC_UNUSED GtkWidget *widget, H3270 *hSessio | ||
| 91 | lib3270_set_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE,0); | 91 | lib3270_set_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE,0); |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | + | ||
| 94 | static void color_scheme_changed(GtkWidget G_GNUC_UNUSED(*widget), const GdkRGBA *colors, GtkWidget *terminal) { | 95 | static void color_scheme_changed(GtkWidget G_GNUC_UNUSED(*widget), const GdkRGBA *colors, GtkWidget *terminal) { |
| 95 | 96 | ||
| 96 | debug("%s=%p",__FUNCTION__,colors); | 97 | debug("%s=%p",__FUNCTION__,colors); |
| @@ -128,7 +129,7 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { | @@ -128,7 +129,7 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { | ||
| 128 | // gchar * filename = NULL; | 129 | // gchar * filename = NULL; |
| 129 | GValue val = G_VALUE_INIT; | 130 | GValue val = G_VALUE_INIT; |
| 130 | 131 | ||
| 131 | - GtkWidget *trace = v3270_new_trace_window(terminal); | 132 | + GtkWidget *trace = v3270_new_trace_window(terminal,NULL); |
| 132 | if(trace) { | 133 | if(trace) { |
| 133 | g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal)); | 134 | g_signal_connect(trace, "destroy", G_CALLBACK(trace_window_destroy), v3270_get_session(terminal)); |
| 134 | lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_SSL_TRACE); | 135 | lib3270_toggle(v3270_get_session(terminal),LIB3270_TOGGLE_SSL_TRACE); |
src/trace/trace.c
| @@ -82,6 +82,8 @@ | @@ -82,6 +82,8 @@ | ||
| 82 | 82 | ||
| 83 | G_DEFINE_TYPE(v3270_trace, v3270_trace, GTK_TYPE_WINDOW); | 83 | G_DEFINE_TYPE(v3270_trace, v3270_trace, GTK_TYPE_WINDOW); |
| 84 | 84 | ||
| 85 | + static void append_text(v3270_trace *hwnd, const gchar *text); | ||
| 86 | + | ||
| 85 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 87 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 86 | 88 | ||
| 87 | const GtkWindowClass * v3270_trace_get_parent_class(void) | 89 | const GtkWindowClass * v3270_trace_get_parent_class(void) |
| @@ -394,9 +396,10 @@ static void destroy(GtkWidget *widget) | @@ -394,9 +396,10 @@ static void destroy(GtkWidget *widget) | ||
| 394 | return g_object_new(V3270_TYPE_TRACE, NULL); | 396 | return g_object_new(V3270_TYPE_TRACE, NULL); |
| 395 | } | 397 | } |
| 396 | 398 | ||
| 397 | - LIB3270_EXPORT GtkWidget * v3270_new_trace_window(GtkWidget *widget) | 399 | + LIB3270_EXPORT GtkWidget * v3270_new_trace_window(GtkWidget *widget, const gchar *header) |
| 398 | { | 400 | { |
| 399 | - return v3270_trace_new_from_session(v3270_get_session(widget)); | 401 | + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); |
| 402 | + return v3270_trace_new_from_session(v3270_get_session(widget), header); | ||
| 400 | } | 403 | } |
| 401 | 404 | ||
| 402 | static void trace_handler(H3270 *hSession, void *userdata, const char *fmt, va_list args) | 405 | static void trace_handler(H3270 *hSession, void *userdata, const char *fmt, va_list args) |
| @@ -425,7 +428,7 @@ static void destroy(GtkWidget *widget) | @@ -425,7 +428,7 @@ static void destroy(GtkWidget *widget) | ||
| 425 | 428 | ||
| 426 | } | 429 | } |
| 427 | 430 | ||
| 428 | - LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession) { | 431 | + LIB3270_EXPORT GtkWidget * v3270_trace_new_from_session(H3270 *hSession, const gchar *header) { |
| 429 | 432 | ||
| 430 | GtkWidget * widget = g_object_new(V3270_TYPE_TRACE, NULL); | 433 | GtkWidget * widget = g_object_new(V3270_TYPE_TRACE, NULL); |
| 431 | void * terminal = lib3270_get_user_data(hSession); | 434 | void * terminal = lib3270_get_user_data(hSession); |
| @@ -441,6 +444,9 @@ static void destroy(GtkWidget *widget) | @@ -441,6 +444,9 @@ static void destroy(GtkWidget *widget) | ||
| 441 | 444 | ||
| 442 | v3270_trace_set_session(widget, hSession); | 445 | v3270_trace_set_session(widget, hSession); |
| 443 | 446 | ||
| 447 | + if(header) | ||
| 448 | + append_text(V3270_TRACE(widget), header); | ||
| 449 | + | ||
| 444 | return widget; | 450 | return widget; |
| 445 | } | 451 | } |
| 446 | 452 | ||
| @@ -450,17 +456,15 @@ static void destroy(GtkWidget *widget) | @@ -450,17 +456,15 @@ static void destroy(GtkWidget *widget) | ||
| 450 | gchar * msg; | 456 | gchar * msg; |
| 451 | }; | 457 | }; |
| 452 | 458 | ||
| 453 | - static gboolean bg_trace_vprintf(struct bg_print_data *data) | 459 | + static void append_text(v3270_trace *hwnd, const gchar *text) |
| 454 | { | 460 | { |
| 455 | - | ||
| 456 | - GtkTextIter itr; | ||
| 457 | - v3270_trace * hwnd = V3270_TRACE(data->widget); | 461 | + GtkTextIter itr; |
| 458 | 462 | ||
| 459 | gtk_text_buffer_get_end_iter(hwnd->text,&itr); | 463 | gtk_text_buffer_get_end_iter(hwnd->text,&itr); |
| 460 | 464 | ||
| 461 | - if(g_utf8_validate(data->msg,strlen(data->msg),NULL)) | 465 | + if(g_utf8_validate(text,strlen(text),NULL)) |
| 462 | { | 466 | { |
| 463 | - gtk_text_buffer_insert(hwnd->text,&itr,data->msg,strlen(data->msg)); | 467 | + gtk_text_buffer_insert(hwnd->text,&itr,text,strlen(text)); |
| 464 | } | 468 | } |
| 465 | else | 469 | else |
| 466 | { | 470 | { |
| @@ -473,11 +477,23 @@ static void destroy(GtkWidget *widget) | @@ -473,11 +477,23 @@ static void destroy(GtkWidget *widget) | ||
| 473 | //GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll)); | 477 | //GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll)); |
| 474 | //gtk_adjustment_set_value(vadj,gtk_adjustment_get_upper(vadj)); | 478 | //gtk_adjustment_set_value(vadj,gtk_adjustment_get_upper(vadj)); |
| 475 | //gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll), vadj); | 479 | //gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(hwnd->scroll), vadj); |
| 480 | + } | ||
| 476 | 481 | ||
| 482 | + static gboolean bg_trace_append_text(struct bg_print_data *data) | ||
| 483 | + { | ||
| 484 | + append_text(V3270_TRACE(data->widget),data->msg); | ||
| 477 | g_free(data->msg); | 485 | g_free(data->msg); |
| 478 | - | ||
| 479 | return FALSE; | 486 | return FALSE; |
| 487 | + } | ||
| 480 | 488 | ||
| 489 | + void v3270_trace_append_text(GtkWidget *widget, const gchar *text) | ||
| 490 | + { | ||
| 491 | + struct bg_print_data * data = g_new0(struct bg_print_data,1); | ||
| 492 | + | ||
| 493 | + data->widget = widget; | ||
| 494 | + data->msg = g_strdup(text); | ||
| 495 | + | ||
| 496 | + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_trace_append_text, data, g_free); | ||
| 481 | } | 497 | } |
| 482 | 498 | ||
| 483 | void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args) | 499 | void v3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args) |
| @@ -487,8 +503,7 @@ static void destroy(GtkWidget *widget) | @@ -487,8 +503,7 @@ static void destroy(GtkWidget *widget) | ||
| 487 | data->widget = widget; | 503 | data->widget = widget; |
| 488 | data->msg = g_strdup_vprintf(fmt,args); | 504 | data->msg = g_strdup_vprintf(fmt,args); |
| 489 | 505 | ||
| 490 | - g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_trace_vprintf, data, g_free); | ||
| 491 | - | 506 | + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_trace_append_text, data, g_free); |
| 492 | } | 507 | } |
| 493 | 508 | ||
| 494 | void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ) | 509 | void v3270_trace_printf(GtkWidget *widget, const char *fmt, ... ) |
src/v3270/iocallback.c
| @@ -144,13 +144,12 @@ gpointer BgCall(struct bgParameter *p) | @@ -144,13 +144,12 @@ gpointer BgCall(struct bgParameter *p) | ||
| 144 | 144 | ||
| 145 | static int static_RunTask(H3270 *hSession, int(*callback)(H3270 *, void *), void *parm) | 145 | static int static_RunTask(H3270 *hSession, int(*callback)(H3270 *, void *), void *parm) |
| 146 | { | 146 | { |
| 147 | +// return callback(hSession,parm); | ||
| 148 | + | ||
| 147 | struct bgParameter p = { TRUE, hSession, -1, callback, parm }; | 149 | struct bgParameter p = { TRUE, hSession, -1, callback, parm }; |
| 148 | 150 | ||
| 149 | trace("%s starts -------------------------------------", __FUNCTION__); | 151 | trace("%s starts -------------------------------------", __FUNCTION__); |
| 150 | 152 | ||
| 151 | -// p.rc = callback(hSession,parm); | ||
| 152 | - | ||
| 153 | - | ||
| 154 | p.running = TRUE; | 153 | p.running = TRUE; |
| 155 | 154 | ||
| 156 | GThread *thread = g_thread_new(PACKAGE_NAME, (GThreadFunc) BgCall, &p); | 155 | GThread *thread = g_thread_new(PACKAGE_NAME, (GThreadFunc) BgCall, &p); |
| @@ -171,6 +170,7 @@ static int static_RunTask(H3270 *hSession, int(*callback)(H3270 *, void *), void | @@ -171,6 +170,7 @@ static int static_RunTask(H3270 *hSession, int(*callback)(H3270 *, void *), void | ||
| 171 | trace("%s ends ---------------------------------------", __FUNCTION__); | 170 | trace("%s ends ---------------------------------------", __FUNCTION__); |
| 172 | 171 | ||
| 173 | return p.rc; | 172 | return p.rc; |
| 173 | + | ||
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | void v3270_register_io_handlers(G_GNUC_UNUSED v3270Class *cls) | 176 | void v3270_register_io_handlers(G_GNUC_UNUSED v3270Class *cls) |