Commit d678623ce2b5f3e72864f5907310d7496f99fbea
1 parent
08322062
Exists in
master
and in
5 other branches
Testando em windows 32 & 64.
Showing
3 changed files
with
58 additions
and
10 deletions
Show diff stats
src/pw3270/include/v3270ft.h
| ... | ... | @@ -75,7 +75,7 @@ |
| 75 | 75 | void v3270ft_append_file(GtkWidget *widget, const gchar *filename, gboolean text); |
| 76 | 76 | guint v3270ft_append_selection(GtkWidget *widget, GtkSelectionData *data); |
| 77 | 77 | |
| 78 | - gchar * v3270ft_select_file(v3270ft *dialog, const gchar *title, const gchar *button, GtkFileChooserAction action, const gchar *filename); | |
| 78 | + gchar * v3270ft_select_file(v3270ft *dialog, const gchar *title, const gchar *button, GtkFileChooserAction action, const gchar *filename, const gchar *filter, ... ) G_GNUC_NULL_TERMINATED; | |
| 79 | 79 | |
| 80 | 80 | gint v3270ft_transfer(GtkWidget *dialog, H3270 *session); |
| 81 | 81 | ... | ... |
src/pw3270/v3270ft/select.c
| ... | ... | @@ -28,7 +28,8 @@ |
| 28 | 28 | * |
| 29 | 29 | */ |
| 30 | 30 | |
| 31 | - #include "private.h" | |
| 31 | +#include "private.h" | |
| 32 | +#include <stdarg.h> | |
| 32 | 33 | |
| 33 | 34 | #ifdef WIN32 |
| 34 | 35 | #include <gdk/gdkwin32.h> |
| ... | ... | @@ -53,13 +54,13 @@ static gpointer select_file(struct file *fl) { |
| 53 | 54 | case GTK_FILE_CHOOSER_ACTION_SAVE: // Receber arquivo |
| 54 | 55 | // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646839(v=vs.85).aspx |
| 55 | 56 | // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646829(v=vs.85).aspx#open_file |
| 56 | - fl->ofn.Flags = OFN_OVERWRITEPROMPT; | |
| 57 | + fl->ofn.Flags = OFN_OVERWRITEPROMPT | OFN_CREATEPROMPT | OFN_HIDEREADONLY; | |
| 57 | 58 | fl->ok = GetSaveFileName(&fl->ofn); |
| 58 | 59 | break; |
| 59 | 60 | |
| 60 | 61 | case GTK_FILE_CHOOSER_ACTION_OPEN: // Enviar arquivo |
| 61 | 62 | // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646928(v=vs.85).aspx |
| 62 | - fl->ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; | |
| 63 | + fl->ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; | |
| 63 | 64 | fl->ok = GetOpenFileName(&fl->ofn); |
| 64 | 65 | break; |
| 65 | 66 | } |
| ... | ... | @@ -71,7 +72,7 @@ static gpointer select_file(struct file *fl) { |
| 71 | 72 | |
| 72 | 73 | #endif // _WIN32 |
| 73 | 74 | |
| 74 | -gchar * v3270ft_select_file(v3270ft *dialog, const gchar *title, const gchar *button, GtkFileChooserAction action, const gchar *filename) { | |
| 75 | +gchar * v3270ft_select_file(v3270ft *dialog, const gchar *title, const gchar *button, GtkFileChooserAction action, const gchar *filename, const gchar *filter, ...) { | |
| 75 | 76 | |
| 76 | 77 | gchar *rc = NULL; |
| 77 | 78 | |
| ... | ... | @@ -113,10 +114,35 @@ gchar * v3270ft_select_file(v3270ft *dialog, const gchar *title, const gchar *bu |
| 113 | 114 | fl.ofn.lpstrFile[0] = '\0'; |
| 114 | 115 | |
| 115 | 116 | fl.ofn.nMaxFile = sizeof(fl.szName); |
| 116 | - fl.ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0"; | |
| 117 | + | |
| 118 | + // Monta lista de arquivos. | |
| 119 | + va_list args; | |
| 120 | + size_t ix = 0; | |
| 121 | + | |
| 122 | + fl.ofn.lpstrFilter = (char *) g_malloc0(4096); | |
| 123 | + | |
| 124 | + va_start (args, filter); | |
| 125 | + while(filter) { | |
| 126 | + | |
| 127 | + filter = gettext(filter); | |
| 128 | + size_t sz = strlen(filter)+1; | |
| 129 | + | |
| 130 | + if(ix+sz > 4095) | |
| 131 | + break; | |
| 132 | + | |
| 133 | + debug("%s",filter); | |
| 134 | + | |
| 135 | + memcpy(((char *) fl.ofn.lpstrFilter)+ix,filter,sz); | |
| 136 | + ix += sz; | |
| 137 | + filter = va_arg(args, const char *); | |
| 138 | + } | |
| 139 | + va_end (args); | |
| 140 | + | |
| 141 | + debug("%s",fl.ofn.lpstrFilter); | |
| 142 | + | |
| 117 | 143 | fl.ofn.nFilterIndex = 1; |
| 118 | - fl.ofn.nMaxFileTitle = 0; | |
| 119 | 144 | fl.ofn.lpstrInitialDir = NULL; |
| 145 | + fl.ofn.nMaxFileTitle = 0; | |
| 120 | 146 | |
| 121 | 147 | // Guarda o valor atual |
| 122 | 148 | if(filename) |
| ... | ... | @@ -137,6 +163,7 @@ gchar * v3270ft_select_file(v3270ft *dialog, const gchar *title, const gchar *bu |
| 137 | 163 | rc = g_strdup(fl.szName); |
| 138 | 164 | } |
| 139 | 165 | |
| 166 | + g_free( ((char *) fl.ofn.lpstrFilter) ); | |
| 140 | 167 | gtk_widget_set_sensitive(GTK_WIDGET(dialog),TRUE); |
| 141 | 168 | |
| 142 | 169 | ... | ... |
src/pw3270/v3270ft/v3270ft.c
| ... | ... | @@ -188,7 +188,13 @@ static void remove_file(GtkButton *button, v3270ft *dialog) { |
| 188 | 188 | |
| 189 | 189 | static void load_file(GtkButton *button, v3270ft *dialog) { |
| 190 | 190 | |
| 191 | - gchar * filename = v3270ft_select_file(dialog, _("Load queue from file"), _("Load"), GTK_FILE_CHOOSER_ACTION_OPEN, NULL); | |
| 191 | + gchar * filename = v3270ft_select_file( | |
| 192 | + dialog, | |
| 193 | + _("Load queue from file"), | |
| 194 | + _("Load"), GTK_FILE_CHOOSER_ACTION_OPEN, | |
| 195 | + "", | |
| 196 | + N_("XML file"), "*.xml", | |
| 197 | + NULL ); | |
| 192 | 198 | |
| 193 | 199 | if(filename) { |
| 194 | 200 | v3270ft_load(GTK_WIDGET(dialog),filename); |
| ... | ... | @@ -201,7 +207,14 @@ static void load_file(GtkButton *button, v3270ft *dialog) { |
| 201 | 207 | |
| 202 | 208 | static void save_file(GtkButton *button, v3270ft *dialog) { |
| 203 | 209 | |
| 204 | - gchar * filename = v3270ft_select_file(dialog, _("Save queue to file"), _("Save"), GTK_FILE_CHOOSER_ACTION_SAVE, NULL); | |
| 210 | + gchar * filename = v3270ft_select_file( | |
| 211 | + dialog, | |
| 212 | + _("Save queue to file"), | |
| 213 | + _("Save"), | |
| 214 | + GTK_FILE_CHOOSER_ACTION_SAVE, | |
| 215 | + "", | |
| 216 | + N_("XML file"), "*.xml", | |
| 217 | + NULL ); | |
| 205 | 218 | |
| 206 | 219 | if(filename) { |
| 207 | 220 | v3270ft_save(GTK_WIDGET(dialog),filename); |
| ... | ... | @@ -282,7 +295,15 @@ static void select_local_file(GtkButton *button, v3270ft *dialog) { |
| 282 | 295 | static void icon_press(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, v3270ft *dialog) { |
| 283 | 296 | #endif // WIN32 |
| 284 | 297 | |
| 285 | - gchar *filename = v3270ft_select_file(dialog, _("Select local file"), _("Select"), GTK_FILE_CHOOSER_ACTION_OPEN, gtk_entry_get_text(dialog->local)); | |
| 298 | + gchar *filename = v3270ft_select_file( | |
| 299 | + dialog, | |
| 300 | + _("Select local file"), | |
| 301 | + _("Select"), | |
| 302 | + GTK_FILE_CHOOSER_ACTION_OPEN, | |
| 303 | + gtk_entry_get_text(dialog->local), | |
| 304 | + N_("All files"), "*.*", | |
| 305 | + N_("Text files"), "*.txt", | |
| 306 | + NULL ); | |
| 286 | 307 | |
| 287 | 308 | if(filename) { |
| 288 | 309 | ... | ... |