Commit 54bdc4f343727654eb1ea3ec9a2628d9de59cdc9

Authored by Perry Werneck
1 parent 8075dae7
Exists in master and in 1 other branch develop

Adjustment to try to identify print dialog randomic segfaults.

src/dialogs/print/convenience.c
@@ -50,15 +50,19 @@ @@ -50,15 +50,19 @@
50 GtkPrintOperation * operation = v3270_print_operation_new(widget, mode); 50 GtkPrintOperation * operation = v3270_print_operation_new(widget, mode);
51 51
52 gtk_print_operation_set_show_progress(operation,TRUE); 52 gtk_print_operation_set_show_progress(operation,TRUE);
  53 + gtk_print_operation_set_allow_async(operation,FALSE);
  54 +
  55 + GtkPrintOperationResult result = GTK_PRINT_OPERATION_RESULT_ERROR;
53 56
54 if(error) 57 if(error)
55 { 58 {
56 - gtk_print_operation_run( 59 + result =
  60 + gtk_print_operation_run(
57 operation, 61 operation,
58 GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, 62 GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
59 GTK_WINDOW(gtk_widget_get_toplevel(widget)), 63 GTK_WINDOW(gtk_widget_get_toplevel(widget)),
60 error 64 error
61 - ); 65 + );
62 66
63 rc = (*error == NULL ? 0 : -1); 67 rc = (*error == NULL ? 0 : -1);
64 68
@@ -67,12 +71,13 @@ @@ -67,12 +71,13 @@
67 { 71 {
68 GError *err = NULL; 72 GError *err = NULL;
69 73
70 - gtk_print_operation_run( 74 + result =
  75 + gtk_print_operation_run(
71 operation, 76 operation,
72 GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, 77 GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
73 GTK_WINDOW(gtk_widget_get_toplevel(widget)), 78 GTK_WINDOW(gtk_widget_get_toplevel(widget)),
74 &err 79 &err
75 - ); 80 + );
76 81
77 if(err) 82 if(err)
78 { 83 {
@@ -89,7 +94,36 @@ @@ -89,7 +94,36 @@
89 } 94 }
90 } 95 }
91 96
  97 + switch(result)
  98 + {
  99 + case GTK_PRINT_OPERATION_RESULT_ERROR:
  100 + g_message("Error on print operation");
  101 + rc = -1;
  102 + break;
  103 +
  104 + case GTK_PRINT_OPERATION_RESULT_APPLY:
  105 + g_message("The print settings should be stored.");
  106 + rc = 0;
  107 + break;
  108 +
  109 + case GTK_PRINT_OPERATION_RESULT_CANCEL:
  110 + g_message("The print operation has been canceled, the print settings should not be stored.");
  111 + rc = 0;
  112 + break;
  113 +
  114 + case GTK_PRINT_OPERATION_RESULT_IN_PROGRESS:
  115 + g_message("The print operation is running");
  116 + rc = 0;
  117 + break;
  118 +
  119 + default:
  120 + g_message("Unexpected status %d in print operation",(int) result);
  121 +
  122 + }
  123 +
  124 + debug("%s(%p)",__FUNCTION__,operation);
92 g_object_unref(operation); 125 g_object_unref(operation);
  126 + debug("%s(%p)",__FUNCTION__,operation);
93 127
94 return rc; 128 return rc;
95 129
src/dialogs/print/draw.c
@@ -114,7 +114,7 @@ @@ -114,7 +114,7 @@
114 size_t col; 114 size_t col;
115 rect.x = operation->font.info.margin.left; 115 rect.x = operation->font.info.margin.left;
116 116
117 - debug("Drawing: %u row=%u selection=%p pos=%u", (unsigned int) drawing, row, selection, (unsigned int) pos); 117 +// debug("Drawing: %u row=%u selection=%p pos=%u", (unsigned int) drawing, row, selection, (unsigned int) pos);
118 118
119 for(col = 0; col < selection->bounds.width;col++) 119 for(col = 0; col < selection->bounds.width;col++)
120 { 120 {
src/dialogs/print/print.c
@@ -68,16 +68,24 @@ @@ -68,16 +68,24 @@
68 68
69 static void dispose(GObject *object) 69 static void dispose(GObject *object)
70 { 70 {
71 - debug("%s",__FUNCTION__); 71 +
  72 + debug("%s(%p)",__FUNCTION__,object);
  73 + g_message("%s(%p)",__FUNCTION__,object);
72 74
73 V3270PrintOperation * operation = GTK_V3270_PRINT_OPERATION(object); 75 V3270PrintOperation * operation = GTK_V3270_PRINT_OPERATION(object);
74 76
  77 + debug("%s.operation->font.info.scaled=%p",__FUNCTION__,operation->font.info.scaled);
  78 + g_message("%s.operation->font.info.scaled=%p",__FUNCTION__,operation->font.info.scaled);
75 if(operation->font.info.scaled) 79 if(operation->font.info.scaled)
76 cairo_scaled_font_destroy(operation->font.info.scaled); 80 cairo_scaled_font_destroy(operation->font.info.scaled);
77 81
  82 + debug("%s.operation->font.name=%p",__FUNCTION__,operation->font.name);
  83 + g_message("%s.operation->font.name=%p",__FUNCTION__,operation->font.name);
78 if(operation->font.name) 84 if(operation->font.name)
79 g_free(operation->font.name); 85 g_free(operation->font.name);
80 86
  87 + debug("%s.operation->contents.dynamic=%p",__FUNCTION__,operation->font.name);
  88 + g_message("%s.operation->contents.dynamic=%p",__FUNCTION__,operation->font.name);
81 if(operation->contents.dynamic) 89 if(operation->contents.dynamic)
82 { 90 {
83 #pragma GCC diagnostic push 91 #pragma GCC diagnostic push
@@ -85,14 +93,18 @@ @@ -85,14 +93,18 @@
85 #pragma GCC diagnostic ignored "-Wcast-function-type" 93 #pragma GCC diagnostic ignored "-Wcast-function-type"
86 #endif // _WIN32 94 #endif // _WIN32
87 95
88 - g_list_free_full(operation->contents.dynamic,(GDestroyNotify) lib3270_free); 96 + g_list_free_full(operation->contents.dynamic,g_free);
89 operation->contents.dynamic = NULL; 97 operation->contents.dynamic = NULL;
90 98
91 #pragma GCC diagnostic pop 99 #pragma GCC diagnostic pop
92 } 100 }
93 operation->contents.selection = NULL; 101 operation->contents.selection = NULL;
94 102
  103 + debug("%s: Calling parent dispose",__FUNCTION__);
  104 + g_message("%s: Calling parent dispose",__FUNCTION__);
95 G_OBJECT_CLASS(V3270PrintOperation_parent_class)->dispose(object); 105 G_OBJECT_CLASS(V3270PrintOperation_parent_class)->dispose(object);
  106 + debug("%s: Dispose is complete",__FUNCTION__);
  107 + g_message("%s: Dispose is complete",__FUNCTION__);
96 108
97 109
98 } 110 }
@@ -181,7 +193,40 @@ @@ -181,7 +193,40 @@
181 return GTK_WIDGET(GTK_V3270_PRINT_OPERATION(operation)->widget); 193 return GTK_WIDGET(GTK_V3270_PRINT_OPERATION(operation)->widget);
182 } 194 }
183 195
184 -GtkPrintOperation * v3270_print_operation_new(GtkWidget *widget, LIB3270_CONTENT_OPTION mode) 196 +
  197 +static GList * get_selection(H3270 *hSession, int all)
  198 +{
  199 + lib3270_selection * selection = lib3270_get_selection(hSession,0,all);
  200 +
  201 + if(selection)
  202 + {
  203 + GList * rc = g_new0(GList,1);
  204 +
  205 + size_t sz = sizeof(lib3270_selection) + (sizeof(lib3270_selection_element) * ((selection->bounds.width * selection->bounds.height)+1));
  206 +
  207 + debug(
  208 + "width=%u height=%u length=%u (sz=%u, szHeader=%u, szElement=%u)",
  209 + selection->bounds.width,
  210 + selection->bounds.height,
  211 + (selection->bounds.width * selection->bounds.height),
  212 + sz,
  213 + sizeof(lib3270_selection),
  214 + sizeof(lib3270_selection_element)
  215 + );
  216 +
  217 + rc->data = g_malloc0(sz);
  218 + memcpy(rc->data,selection,sz);
  219 +
  220 + lib3270_free(selection);
  221 +
  222 + return rc;
  223 + }
  224 +
  225 + g_warning("Error getting selection");
  226 + return NULL;
  227 +}
  228 +
  229 +GtkPrintOperation * v3270_print_operation_new(GtkWidget *widget, LIB3270_CONTENT_OPTION mode)
185 { 230 {
186 g_return_val_if_fail(GTK_IS_V3270(widget),NULL); 231 g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
187 232
@@ -198,8 +243,7 @@ GtkPrintOperation * v3270_print_operation_new(GtkWidget *widget, LIB3270_CONTENT @@ -198,8 +243,7 @@ GtkPrintOperation * v3270_print_operation_new(GtkWidget *widget, LIB3270_CONTENT
198 { 243 {
199 case LIB3270_CONTENT_ALL: 244 case LIB3270_CONTENT_ALL:
200 debug("%s","LIB3270_CONTENT_ALL"); 245 debug("%s","LIB3270_CONTENT_ALL");
201 - operation->contents.dynamic = g_new0(GList,1);  
202 - operation->contents.dynamic->data = (gpointer) lib3270_get_selection(operation->session,0,1); 246 + operation->contents.dynamic = get_selection(operation->session,1);
203 operation->contents.selection = operation->contents.dynamic; 247 operation->contents.selection = operation->contents.dynamic;
204 break; 248 break;
205 249
@@ -210,8 +254,7 @@ GtkPrintOperation * v3270_print_operation_new(GtkWidget *widget, LIB3270_CONTENT @@ -210,8 +254,7 @@ GtkPrintOperation * v3270_print_operation_new(GtkWidget *widget, LIB3270_CONTENT
210 254
211 case LIB3270_CONTENT_SELECTED: 255 case LIB3270_CONTENT_SELECTED:
212 debug("%s","LIB3270_CONTENT_SELECTED"); 256 debug("%s","LIB3270_CONTENT_SELECTED");
213 - operation->contents.dynamic = g_new0(GList,1);  
214 - operation->contents.dynamic->data = (gpointer) lib3270_get_selection(operation->session,0,0); 257 + operation->contents.dynamic = get_selection(operation->session,0);
215 operation->contents.selection = operation->contents.dynamic; 258 operation->contents.selection = operation->contents.dynamic;
216 break; 259 break;
217 } 260 }