Commit f146758200b3446c953617eed6aea7050ac7578c
1 parent
0bbb8fbb
Exists in
master
and in
1 other branch
Working on the new smart-paste feature.
Showing
2 changed files
with
40 additions
and
4 deletions
Show diff stats
src/include/clipboard.h
@@ -60,6 +60,8 @@ | @@ -60,6 +60,8 @@ | ||
60 | { | 60 | { |
61 | unsigned int length; ///< @brief Length of the data block. | 61 | unsigned int length; ///< @brief Length of the data block. |
62 | unsigned int build; ///< @brief V3270 build id. | 62 | unsigned int build; ///< @brief V3270 build id. |
63 | + unsigned int rows; ///< @brief Terminal rows. | ||
64 | + unsigned int cols; ///< @brief Terminal cols. | ||
63 | }; | 65 | }; |
64 | 66 | ||
65 | /// @brief Header of a list of fields. | 67 | /// @brief Header of a list of fields. |
src/selection/datablock.c
@@ -35,7 +35,7 @@ | @@ -35,7 +35,7 @@ | ||
35 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 35 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
36 | 36 | ||
37 | /// @brief Get a list of all selected and unprotected contents. | 37 | /// @brief Get a list of all selected and unprotected contents. |
38 | -static GList * getUnprotected(const lib3270_selection *selection) | 38 | +static GList * getUnprotected(H3270 *hSession, const lib3270_selection *selection) |
39 | { | 39 | { |
40 | GList * list = NULL; | 40 | GList * list = NULL; |
41 | unsigned int row; | 41 | unsigned int row; |
@@ -48,14 +48,14 @@ static GList * getUnprotected(const lib3270_selection *selection) | @@ -48,14 +48,14 @@ static GList * getUnprotected(const lib3270_selection *selection) | ||
48 | // Find selected and unprotected entries. | 48 | // Find selected and unprotected entries. |
49 | while(col < selection->bounds.width) | 49 | while(col < selection->bounds.width) |
50 | { | 50 | { |
51 | - if((element[col].attribute.visual & LIB3270_ATTR_SELECTED) && !(element[col].attribute.field & LIB3270_FIELD_ATTRIBUTE_PROTECT)) | 51 | + if((element[col].attribute.visual & LIB3270_ATTR_SELECTED) && !((element[col].attribute.field & LIB3270_FIELD_ATTRIBUTE_PROTECT) || (element[col].attribute.visual & LIB3270_ATTR_MARKER))) |
52 | { | 52 | { |
53 | // Element is selected and not protected, get the length. | 53 | // Element is selected and not protected, get the length. |
54 | unsigned short start = col; | 54 | unsigned short start = col; |
55 | unsigned short length = 0; | 55 | unsigned short length = 0; |
56 | while(col < selection->bounds.width) | 56 | while(col < selection->bounds.width) |
57 | { | 57 | { |
58 | - if( !(element[col].attribute.visual & LIB3270_ATTR_SELECTED) || (element[col].attribute.field & LIB3270_FIELD_ATTRIBUTE_PROTECT)) | 58 | + if( !(element[col].attribute.visual & (LIB3270_ATTR_SELECTED|LIB3270_ATTR_MARKER)) || (element[col].attribute.field & LIB3270_FIELD_ATTRIBUTE_PROTECT)) |
59 | break; | 59 | break; |
60 | 60 | ||
61 | col++; | 61 | col++; |
@@ -69,6 +69,22 @@ static GList * getUnprotected(const lib3270_selection *selection) | @@ -69,6 +69,22 @@ static GList * getUnprotected(const lib3270_selection *selection) | ||
69 | (unsigned int) length | 69 | (unsigned int) length |
70 | ); | 70 | ); |
71 | 71 | ||
72 | + struct SelectionFieldHeader * field = (struct SelectionFieldHeader *) g_malloc0(sizeof(struct SelectionFieldHeader) + length); | ||
73 | + | ||
74 | + field->baddr = lib3270_translate_to_address(hSession,row + selection->bounds.row,start + selection->bounds.col); | ||
75 | + field->length = length; | ||
76 | + | ||
77 | + // Copy string | ||
78 | + unsigned char *ptr = (unsigned char *) (field+1); | ||
79 | + unsigned short ix; | ||
80 | + for(ix=0;ix < field->length; ix++) | ||
81 | + { | ||
82 | + ptr[ix] = element[start+ix].chr; | ||
83 | + } | ||
84 | + | ||
85 | + // Add allocated block in the list | ||
86 | + list = g_list_append(list, (gpointer) field); | ||
87 | + | ||
72 | } | 88 | } |
73 | else | 89 | else |
74 | { | 90 | { |
@@ -94,6 +110,7 @@ gchar * v3270_get_copy_as_data_block(v3270 * terminal) | @@ -94,6 +110,7 @@ gchar * v3270_get_copy_as_data_block(v3270 * terminal) | ||
94 | // Initialize header. | 110 | // Initialize header. |
95 | header->build = BUILD_DATE; | 111 | header->build = BUILD_DATE; |
96 | header->length = sizeof(struct SelectionHeader); | 112 | header->length = sizeof(struct SelectionHeader); |
113 | + lib3270_get_screen_size(terminal->host, &header->rows, &header->cols); | ||
97 | 114 | ||
98 | // Insert elements. | 115 | // Insert elements. |
99 | for(element = terminal->selection.blocks; element; element = element->next) | 116 | for(element = terminal->selection.blocks; element; element = element->next) |
@@ -115,8 +132,25 @@ gchar * v3270_get_copy_as_data_block(v3270 * terminal) | @@ -115,8 +132,25 @@ gchar * v3270_get_copy_as_data_block(v3270 * terminal) | ||
115 | blockheader->records = 0; | 132 | blockheader->records = 0; |
116 | 133 | ||
117 | // Get values. | 134 | // Get values. |
118 | - GList * values = getUnprotected((const lib3270_selection *) element->data); | 135 | + GList * values = getUnprotected(terminal->host, (const lib3270_selection *) element->data); |
136 | + GList * value; | ||
137 | + | ||
138 | + for(value = values; value; value = value->next) | ||
139 | + { | ||
140 | + size_t length = (sizeof(struct SelectionFieldHeader) + ((struct SelectionFieldHeader *) value->data)->length); | ||
141 | + | ||
142 | + if( (header->length+length) >= szBlock ) | ||
143 | + { | ||
144 | + szBlock += ALLOCATION_BLOCK_LENGTH + header->length + length; | ||
145 | + header = (struct SelectionHeader *) g_realloc(header,szBlock+1); | ||
146 | + } | ||
119 | 147 | ||
148 | + unsigned char *ptr = ((unsigned char *) header); | ||
149 | + | ||
150 | + memcpy((ptr+header->length), value->data, length); | ||
151 | + header->length += length; | ||
152 | + | ||
153 | + } | ||
120 | 154 | ||
121 | g_list_free_full(values,g_free); | 155 | g_list_free_full(values,g_free); |
122 | 156 |