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,7 +75,7 @@ | ||
| 75 | void v3270ft_append_file(GtkWidget *widget, const gchar *filename, gboolean text); | 75 | void v3270ft_append_file(GtkWidget *widget, const gchar *filename, gboolean text); |
| 76 | guint v3270ft_append_selection(GtkWidget *widget, GtkSelectionData *data); | 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 | gint v3270ft_transfer(GtkWidget *dialog, H3270 *session); | 80 | gint v3270ft_transfer(GtkWidget *dialog, H3270 *session); |
| 81 | 81 |
src/pw3270/v3270ft/select.c
| @@ -28,7 +28,8 @@ | @@ -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 | #ifdef WIN32 | 34 | #ifdef WIN32 |
| 34 | #include <gdk/gdkwin32.h> | 35 | #include <gdk/gdkwin32.h> |
| @@ -53,13 +54,13 @@ static gpointer select_file(struct file *fl) { | @@ -53,13 +54,13 @@ static gpointer select_file(struct file *fl) { | ||
| 53 | case GTK_FILE_CHOOSER_ACTION_SAVE: // Receber arquivo | 54 | case GTK_FILE_CHOOSER_ACTION_SAVE: // Receber arquivo |
| 54 | // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646839(v=vs.85).aspx | 55 | // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646839(v=vs.85).aspx |
| 55 | // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646829(v=vs.85).aspx#open_file | 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 | fl->ok = GetSaveFileName(&fl->ofn); | 58 | fl->ok = GetSaveFileName(&fl->ofn); |
| 58 | break; | 59 | break; |
| 59 | 60 | ||
| 60 | case GTK_FILE_CHOOSER_ACTION_OPEN: // Enviar arquivo | 61 | case GTK_FILE_CHOOSER_ACTION_OPEN: // Enviar arquivo |
| 61 | // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646928(v=vs.85).aspx | 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 | fl->ok = GetOpenFileName(&fl->ofn); | 64 | fl->ok = GetOpenFileName(&fl->ofn); |
| 64 | break; | 65 | break; |
| 65 | } | 66 | } |
| @@ -71,7 +72,7 @@ static gpointer select_file(struct file *fl) { | @@ -71,7 +72,7 @@ static gpointer select_file(struct file *fl) { | ||
| 71 | 72 | ||
| 72 | #endif // _WIN32 | 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 | gchar *rc = NULL; | 77 | gchar *rc = NULL; |
| 77 | 78 | ||
| @@ -113,10 +114,35 @@ gchar * v3270ft_select_file(v3270ft *dialog, const gchar *title, const gchar *bu | @@ -113,10 +114,35 @@ gchar * v3270ft_select_file(v3270ft *dialog, const gchar *title, const gchar *bu | ||
| 113 | fl.ofn.lpstrFile[0] = '\0'; | 114 | fl.ofn.lpstrFile[0] = '\0'; |
| 114 | 115 | ||
| 115 | fl.ofn.nMaxFile = sizeof(fl.szName); | 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 | fl.ofn.nFilterIndex = 1; | 143 | fl.ofn.nFilterIndex = 1; |
| 118 | - fl.ofn.nMaxFileTitle = 0; | ||
| 119 | fl.ofn.lpstrInitialDir = NULL; | 144 | fl.ofn.lpstrInitialDir = NULL; |
| 145 | + fl.ofn.nMaxFileTitle = 0; | ||
| 120 | 146 | ||
| 121 | // Guarda o valor atual | 147 | // Guarda o valor atual |
| 122 | if(filename) | 148 | if(filename) |
| @@ -137,6 +163,7 @@ gchar * v3270ft_select_file(v3270ft *dialog, const gchar *title, const gchar *bu | @@ -137,6 +163,7 @@ gchar * v3270ft_select_file(v3270ft *dialog, const gchar *title, const gchar *bu | ||
| 137 | rc = g_strdup(fl.szName); | 163 | rc = g_strdup(fl.szName); |
| 138 | } | 164 | } |
| 139 | 165 | ||
| 166 | + g_free( ((char *) fl.ofn.lpstrFilter) ); | ||
| 140 | gtk_widget_set_sensitive(GTK_WIDGET(dialog),TRUE); | 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,7 +188,13 @@ static void remove_file(GtkButton *button, v3270ft *dialog) { | ||
| 188 | 188 | ||
| 189 | static void load_file(GtkButton *button, v3270ft *dialog) { | 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 | if(filename) { | 199 | if(filename) { |
| 194 | v3270ft_load(GTK_WIDGET(dialog),filename); | 200 | v3270ft_load(GTK_WIDGET(dialog),filename); |
| @@ -201,7 +207,14 @@ static void load_file(GtkButton *button, v3270ft *dialog) { | @@ -201,7 +207,14 @@ static void load_file(GtkButton *button, v3270ft *dialog) { | ||
| 201 | 207 | ||
| 202 | static void save_file(GtkButton *button, v3270ft *dialog) { | 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 | if(filename) { | 219 | if(filename) { |
| 207 | v3270ft_save(GTK_WIDGET(dialog),filename); | 220 | v3270ft_save(GTK_WIDGET(dialog),filename); |
| @@ -282,7 +295,15 @@ static void select_local_file(GtkButton *button, v3270ft *dialog) { | @@ -282,7 +295,15 @@ static void select_local_file(GtkButton *button, v3270ft *dialog) { | ||
| 282 | static void icon_press(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, v3270ft *dialog) { | 295 | static void icon_press(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, v3270ft *dialog) { |
| 283 | #endif // WIN32 | 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 | if(filename) { | 308 | if(filename) { |
| 288 | 309 |