Commit 9f575fd338d8ca6590870a911a6a084956282f85
1 parent
d180d2e0
Exists in
master
and in
1 other branch
Working on FT dialog components.
Showing
3 changed files
with
50 additions
and
111 deletions
Show diff stats
src/v3270ft/activitylist.c
| @@ -347,7 +347,7 @@ | @@ -347,7 +347,7 @@ | ||
| 347 | _("Save queue to file"), | 347 | _("Save queue to file"), |
| 348 | _("Save"), | 348 | _("Save"), |
| 349 | GTK_FILE_CHOOSER_ACTION_SAVE, | 349 | GTK_FILE_CHOOSER_ACTION_SAVE, |
| 350 | - "", | 350 | + list->filename, |
| 351 | N_("XML file"), "*.xml", | 351 | N_("XML file"), "*.xml", |
| 352 | NULL ); | 352 | NULL ); |
| 353 | 353 |
src/v3270ft/dialog.c
| @@ -180,9 +180,10 @@ static void remove_clicked(GtkWidget G_GNUC_UNUSED(*button), V3270FTDialog *widg | @@ -180,9 +180,10 @@ static void remove_clicked(GtkWidget G_GNUC_UNUSED(*button), V3270FTDialog *widg | ||
| 180 | v3270_ft_settings_set_activity(widget->settings,NULL); | 180 | v3270_ft_settings_set_activity(widget->settings,NULL); |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | -static void enable_queue_save(GtkWidget G_GNUC_UNUSED(*save), gboolean enabled, GtkWidget *button) | 183 | +static void enable_queue_save(GtkWidget G_GNUC_UNUSED(*save), gboolean enabled, V3270FTDialog *widget) |
| 184 | { | 184 | { |
| 185 | - gtk_widget_set_sensitive(button,enabled); | 185 | + debug("%s: %s",__FUNCTION__,(enabled ? "Enable" : "Disable")); |
| 186 | + gtk_widget_set_sensitive(widget->queue.save,enabled); | ||
| 186 | } | 187 | } |
| 187 | 188 | ||
| 188 | static void V3270FTDialog_init(V3270FTDialog *widget) | 189 | static void V3270FTDialog_init(V3270FTDialog *widget) |
| @@ -251,7 +252,6 @@ static void V3270FTDialog_init(V3270FTDialog *widget) | @@ -251,7 +252,6 @@ static void V3270FTDialog_init(V3270FTDialog *widget) | ||
| 251 | gtk_widget_set_tooltip_markup(widget->queue.save,_("Save transfer queue")); | 252 | gtk_widget_set_tooltip_markup(widget->queue.save,_("Save transfer queue")); |
| 252 | g_signal_connect(widget->queue.save,"clicked",G_CALLBACK(save_queue_clicked),widget); | 253 | g_signal_connect(widget->queue.save,"clicked",G_CALLBACK(save_queue_clicked),widget); |
| 253 | gtk_widget_set_sensitive(widget->queue.save,FALSE); | 254 | gtk_widget_set_sensitive(widget->queue.save,FALSE); |
| 254 | - g_signal_connect(widget->queue.view,"has-file",G_CALLBACK(enable_queue_save),widget->queue.save); | ||
| 255 | 255 | ||
| 256 | widget->queue.saveAs = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR); | 256 | widget->queue.saveAs = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR); |
| 257 | gtk_widget_set_tooltip_markup(widget->queue.saveAs,_("Save transfer queue to file")); | 257 | gtk_widget_set_tooltip_markup(widget->queue.saveAs,_("Save transfer queue to file")); |
| @@ -264,6 +264,7 @@ static void V3270FTDialog_init(V3270FTDialog *widget) | @@ -264,6 +264,7 @@ static void V3270FTDialog_init(V3270FTDialog *widget) | ||
| 264 | widget->queue.view = v3270_activity_list_new(); | 264 | widget->queue.view = v3270_activity_list_new(); |
| 265 | gtk_widget_set_tooltip_markup(widget->queue.view,_("Files to transfer")); | 265 | gtk_widget_set_tooltip_markup(widget->queue.view,_("Files to transfer")); |
| 266 | g_signal_connect(G_OBJECT(widget->queue.view),"row-activated",G_CALLBACK(activity_selected),widget); | 266 | g_signal_connect(G_OBJECT(widget->queue.view),"row-activated",G_CALLBACK(activity_selected),widget); |
| 267 | + g_signal_connect(G_OBJECT(widget->queue.view),"has-file",G_CALLBACK(enable_queue_save),widget); | ||
| 267 | 268 | ||
| 268 | // Put the view inside a scrolled window. | 269 | // Put the view inside a scrolled window. |
| 269 | GtkWidget * scrolled = gtk_scrolled_window_new(NULL,NULL); | 270 | GtkWidget * scrolled = gtk_scrolled_window_new(NULL,NULL); |
src/v3270ft/select.c
| @@ -37,43 +37,7 @@ | @@ -37,43 +37,7 @@ | ||
| 37 | 37 | ||
| 38 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 38 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 39 | 39 | ||
| 40 | -/* | ||
| 41 | -#if defined(_WIN32) | ||
| 42 | - | ||
| 43 | -struct file { | ||
| 44 | - OPENFILENAME ofn; | ||
| 45 | - gboolean enabled; | ||
| 46 | - char szName[260]; // buffer for file name | ||
| 47 | - GtkFileChooserAction action; | ||
| 48 | - BOOL ok; | ||
| 49 | -}; | ||
| 50 | - | ||
| 51 | -static gpointer select_file(struct file *fl) { | ||
| 52 | - | ||
| 53 | - | ||
| 54 | - switch(fl->action) { | ||
| 55 | - case GTK_FILE_CHOOSER_ACTION_SAVE: // Receber arquivo | ||
| 56 | - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646839(v=vs.85).aspx | ||
| 57 | - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646829(v=vs.85).aspx#open_file | ||
| 58 | - fl->ofn.Flags = OFN_OVERWRITEPROMPT | OFN_CREATEPROMPT | OFN_HIDEREADONLY; | ||
| 59 | - fl->ok = GetSaveFileName(&fl->ofn); | ||
| 60 | - break; | ||
| 61 | - | ||
| 62 | - case GTK_FILE_CHOOSER_ACTION_OPEN: // Enviar arquivo | ||
| 63 | - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646928(v=vs.85).aspx | ||
| 64 | - fl->ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; | ||
| 65 | - fl->ok = GetOpenFileName(&fl->ofn); | ||
| 66 | - break; | ||
| 67 | - } | ||
| 68 | - | ||
| 69 | - fl->enabled = FALSE; | ||
| 70 | - | ||
| 71 | - return 0; | ||
| 72 | -} | ||
| 73 | -#endif // _WIN32 | ||
| 74 | -*/ | ||
| 75 | - | ||
| 76 | -gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar *button, GtkFileChooserAction action, G_GNUC_UNUSED const gchar *filename, G_GNUC_UNUSED const gchar *filter, ...) { | 40 | +gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar *button, GtkFileChooserAction action, const gchar *filename, G_GNUC_UNUSED const gchar *filter, ...) { |
| 77 | 41 | ||
| 78 | gchar *rc = NULL; | 42 | gchar *rc = NULL; |
| 79 | 43 | ||
| @@ -91,84 +55,37 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * | @@ -91,84 +55,37 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * | ||
| 91 | ); | 55 | ); |
| 92 | 56 | ||
| 93 | 57 | ||
| 94 | - if(gtk_native_dialog_run(GTK_NATIVE_DIALOG (native)) == GTK_RESPONSE_ACCEPT) { | ||
| 95 | - rc = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(native))); | ||
| 96 | - } | ||
| 97 | - | ||
| 98 | - g_object_unref(native); | ||
| 99 | - | ||
| 100 | -#elif defined(_WIN32) | ||
| 101 | - | ||
| 102 | - GThread * thd; | ||
| 103 | - struct file fl; | ||
| 104 | - GdkWindow * win = gtk_widget_get_window(GTK_WIDGET(dialog)); | ||
| 105 | - | ||
| 106 | - gtk_widget_set_sensitive(GTK_WIDGET(dialog),FALSE); | ||
| 107 | - | ||
| 108 | - memset(&fl,0,sizeof(fl)); | ||
| 109 | - fl.ofn.lStructSize = sizeof(fl.ofn); | ||
| 110 | - fl.ofn.hwndOwner = GDK_WINDOW_HWND(win); | ||
| 111 | - fl.ofn.lpstrFile = fl.szName; | ||
| 112 | - | ||
| 113 | - fl.ofn.lpstrTitle = title; | ||
| 114 | - | ||
| 115 | - // Set lpstrFile[0] to '\0' so that GetOpenFileName does not | ||
| 116 | - // use the contents of szFile to initialize itself. | ||
| 117 | - fl.ofn.lpstrFile[0] = '\0'; | ||
| 118 | - | ||
| 119 | - fl.ofn.nMaxFile = sizeof(fl.szName); | ||
| 120 | - | ||
| 121 | - // Monta lista de arquivos. | ||
| 122 | - va_list args; | ||
| 123 | - size_t ix = 0; | ||
| 124 | - | ||
| 125 | - fl.ofn.lpstrFilter = (char *) g_malloc0(4096); | 58 | + // Setup filename |
| 59 | + if(filename && *filename) | ||
| 60 | + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(native),filename); | ||
| 126 | 61 | ||
| 62 | + // Setup filters | ||
| 63 | + va_list args; | ||
| 127 | va_start (args, filter); | 64 | va_start (args, filter); |
| 128 | - while(filter) { | ||
| 129 | - | ||
| 130 | - filter = gettext(filter); | ||
| 131 | - size_t sz = strlen(filter)+1; | ||
| 132 | - | ||
| 133 | - if(ix+sz > 4095) | 65 | + while(filter) |
| 66 | + { | ||
| 67 | + const gchar * name = va_arg(args, const gchar *); | ||
| 68 | + if(!name) | ||
| 134 | break; | 69 | break; |
| 135 | 70 | ||
| 136 | - debug("%s",filter); | ||
| 137 | - | ||
| 138 | - memcpy(((char *) fl.ofn.lpstrFilter)+ix,filter,sz); | ||
| 139 | - ix += sz; | ||
| 140 | - filter = va_arg(args, const char *); | ||
| 141 | - } | ||
| 142 | - va_end (args); | ||
| 143 | - | ||
| 144 | - debug("%s",fl.ofn.lpstrFilter); | ||
| 145 | - | ||
| 146 | - fl.ofn.nFilterIndex = 1; | ||
| 147 | - fl.ofn.lpstrInitialDir = NULL; | ||
| 148 | - fl.ofn.nMaxFileTitle = 0; | ||
| 149 | - | ||
| 150 | - // Guarda o valor atual | ||
| 151 | - if(filename) | ||
| 152 | - strncpy(fl.szName,filename,fl.ofn.nMaxFile); | ||
| 153 | - | ||
| 154 | - fl.action = action; | 71 | + const gchar * pattern = va_arg(args, const gchar *); |
| 72 | + if(!pattern) | ||
| 73 | + break; | ||
| 155 | 74 | ||
| 156 | - thd = g_thread_new("GetFileName",(GThreadFunc) select_file, &fl); | 75 | + GtkFileFilter *filter = gtk_file_filter_new(); |
| 76 | + gtk_file_filter_set_name(filter,name); | ||
| 77 | + gtk_file_filter_add_pattern(filter, pattern); | ||
| 78 | + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter); | ||
| 157 | 79 | ||
| 158 | - fl.enabled = TRUE; | ||
| 159 | - while(fl.enabled) { | ||
| 160 | - g_main_context_iteration(NULL,TRUE); | ||
| 161 | } | 80 | } |
| 81 | + va_end(args); | ||
| 162 | 82 | ||
| 163 | - g_thread_unref(thd); | ||
| 164 | - | ||
| 165 | - if(fl.ok) { | ||
| 166 | - rc = g_strdup(fl.szName); | 83 | + // Run dialog |
| 84 | + if(gtk_native_dialog_run(GTK_NATIVE_DIALOG (native)) == GTK_RESPONSE_ACCEPT) { | ||
| 85 | + rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(native)); | ||
| 167 | } | 86 | } |
| 168 | 87 | ||
| 169 | - g_free( ((char *) fl.ofn.lpstrFilter) ); | ||
| 170 | - gtk_widget_set_sensitive(GTK_WIDGET(dialog),TRUE); | ||
| 171 | - | 88 | + g_object_unref(native); |
| 172 | 89 | ||
| 173 | #else | 90 | #else |
| 174 | 91 | ||
| @@ -185,6 +102,27 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * | @@ -185,6 +102,27 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * | ||
| 185 | if(filename && *filename) | 102 | if(filename && *filename) |
| 186 | gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(chooser),filename); | 103 | gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(chooser),filename); |
| 187 | 104 | ||
| 105 | + // Setup filters | ||
| 106 | + va_list args; | ||
| 107 | + va_start (args, filter); | ||
| 108 | + while(filter) | ||
| 109 | + { | ||
| 110 | + const gchar * name = va_arg(args, const gchar *); | ||
| 111 | + if(!name) | ||
| 112 | + break; | ||
| 113 | + | ||
| 114 | + const gchar * pattern = va_arg(args, const gchar *); | ||
| 115 | + if(!pattern) | ||
| 116 | + break; | ||
| 117 | + | ||
| 118 | + GtkFileFilter *filter = gtk_file_filter_new(); | ||
| 119 | + gtk_file_filter_set_name(filter,name); | ||
| 120 | + gtk_file_filter_add_pattern(filter, pattern); | ||
| 121 | + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter); | ||
| 122 | + | ||
| 123 | + } | ||
| 124 | + va_end(args); | ||
| 125 | + | ||
| 188 | if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) { | 126 | if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) { |
| 189 | rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); | 127 | rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); |
| 190 | } | 128 | } |
| @@ -192,9 +130,9 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * | @@ -192,9 +130,9 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * | ||
| 192 | gtk_widget_destroy(chooser); | 130 | gtk_widget_destroy(chooser); |
| 193 | 131 | ||
| 194 | 132 | ||
| 195 | -#endif // WIN32 | 133 | +#endif // GTK 3.20 |
| 196 | 134 | ||
| 197 | - debug("%s=%p",__FUNCTION__,rc); | 135 | + debug("%s=%s",__FUNCTION__,rc); |
| 198 | 136 | ||
| 199 | return rc; | 137 | return rc; |
| 200 | 138 |