diff --git a/Makefile.in b/Makefile.in index 8588bf6..813684a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -35,6 +35,7 @@ SOURCES= \ $(wildcard src/filetransfer/*.c) \ $(wildcard src/trace/*.c) \ $(wildcard src/dialogs/*.c) \ + $(wildcard src/dialogs/@OSNAME@/*.c) \ $(wildcard src/dialogs/print/*.c) TEST_SOURCES= \ @@ -58,6 +59,7 @@ VALGRIND=@VALGRIND@ GENMARSHAL=@GENMARSHAL@ CONVERT=@CONVERT@ OPTIPNG=@OPTIPNG@ +ZIP=@ZIP@ #---[ Paths ]---------------------------------------------------------------------------- @@ -455,6 +457,16 @@ $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@: \ $(OBJDIR)/marshal/v3270ft.o \ $(LIBS) +zip-debug: \ + $(LIBNAME)-debug-@PACKAGE_VERSION@-@host_cpu@.zip + +$(LIBNAME)-debug-@PACKAGE_VERSION@-@host_cpu@.zip: \ + $(BINDBG)/$(LIBNAME)@EXEEXT@ \ + $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ + + @$(ZIP) -9 -j $@ $^ + + #---[ Clean Targets ]-------------------------------------------------------------------- clean: \ diff --git a/configure.ac b/configure.ac index baf255b..e4c6a41 100644 --- a/configure.ac +++ b/configure.ac @@ -58,6 +58,7 @@ AC_PROG_LN_S AC_PATH_TOOL([AR], [ar], [ar]) AC_PATH_TOOL([CONVERT], [convert], [no]) AC_PATH_TOOL([OPTIPNG],[optipng],[no]) +AC_PATH_TOOL([ZIP],[zip],[no]) AC_LANG([C]) diff --git a/src/dialogs/linux/select.c b/src/dialogs/linux/select.c new file mode 100644 index 0000000..c0d71eb --- /dev/null +++ b/src/dialogs/linux/select.c @@ -0,0 +1,134 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob + * o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + +#include "../private.h" +#include + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + +gchar * v3270_select_file(GtkWidget *widget, const gchar *title, const gchar *button, GtkFileChooserAction action, const gchar *filename, const gchar *filter, ...) +{ + gchar *rc = NULL; + +#if GTK_CHECK_VERSION(3,20,0) + + GtkFileChooserNative *native = + gtk_file_chooser_native_new + ( + title, + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + action, + button, + _( "_Cancel" ) + ); + + + // Setup filename + if(filename && *filename) + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(native),filename); + + // Setup filters + va_list args; + va_start (args, filter); + while(filter) + { + const gchar * name = va_arg(args, const gchar *); + if(!name) + break; + + const gchar * pattern = va_arg(args, const gchar *); + if(!pattern) + break; + + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter,name); + gtk_file_filter_add_pattern(filter, pattern); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter); + + } + va_end(args); + + // Run dialog + if(gtk_native_dialog_run(GTK_NATIVE_DIALOG (native)) == GTK_RESPONSE_ACCEPT) { + rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(native)); + } + + g_object_unref(native); + +#else + + GtkWidget * chooser = + gtk_file_chooser_dialog_new + ( + title, + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + action, + _("_Cancel" ), GTK_RESPONSE_CANCEL, + button, GTK_RESPONSE_ACCEPT, + NULL + ); + + if(filename && *filename) + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(chooser),filename); + + // Setup filters + va_list args; + va_start (args, filter); + while(filter) + { + const gchar * name = va_arg(args, const gchar *); + if(!name) + break; + + const gchar * pattern = va_arg(args, const gchar *); + if(!pattern) + break; + + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter,name); + gtk_file_filter_add_pattern(filter, pattern); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter); + + } + va_end(args); + + if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) { + rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); + } + + gtk_widget_destroy(chooser); + + +#endif // GTK 3.20 + + return rc; + +} + diff --git a/src/dialogs/select.c b/src/dialogs/select.c deleted file mode 100644 index e68bf98..0000000 --- a/src/dialogs/select.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob - * o nome G3270. - * - * Copyright (C) <2008> - * - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela - * Free Software Foundation. - * - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para - * obter mais detalhes. - * - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin - * St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Este programa está nomeado como - possui - linhas de código. - * - * Contatos: - * - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) - * - */ - -#include "private.h" -#include - -/*--[ Implement ]------------------------------------------------------------------------------------*/ - -gchar * v3270_select_file(GtkWidget *widget, const gchar *title, const gchar *button, GtkFileChooserAction action, const gchar *filename, const gchar *filter, ...) -{ - gchar *rc = NULL; - -#if GTK_CHECK_VERSION(3,20,0) - - GtkFileChooserNative *native = - gtk_file_chooser_native_new - ( - title, - GTK_WINDOW(gtk_widget_get_toplevel(widget)), - action, - button, - _( "_Cancel" ) - ); - - - // Setup filename - if(filename && *filename) - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(native),filename); - - // Setup filters - va_list args; - va_start (args, filter); - while(filter) - { - const gchar * name = va_arg(args, const gchar *); - if(!name) - break; - - const gchar * pattern = va_arg(args, const gchar *); - if(!pattern) - break; - - GtkFileFilter *filter = gtk_file_filter_new(); - gtk_file_filter_set_name(filter,name); - gtk_file_filter_add_pattern(filter, pattern); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter); - - } - va_end(args); - - // Run dialog - if(gtk_native_dialog_run(GTK_NATIVE_DIALOG (native)) == GTK_RESPONSE_ACCEPT) { - rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(native)); - } - - g_object_unref(native); - -#else - - GtkWidget * chooser = - gtk_file_chooser_dialog_new - ( - title, - GTK_WINDOW(gtk_widget_get_toplevel(widget)), - action, - _("_Cancel" ), GTK_RESPONSE_CANCEL, - button, GTK_RESPONSE_ACCEPT, - NULL - ); - - if(filename && *filename) - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(chooser),filename); - - // Setup filters - va_list args; - va_start (args, filter); - while(filter) - { - const gchar * name = va_arg(args, const gchar *); - if(!name) - break; - - const gchar * pattern = va_arg(args, const gchar *); - if(!pattern) - break; - - GtkFileFilter *filter = gtk_file_filter_new(); - gtk_file_filter_set_name(filter,name); - gtk_file_filter_add_pattern(filter, pattern); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter); - - } - va_end(args); - - if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) { - rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); - } - - gtk_widget_destroy(chooser); - - -#endif // GTK 3.20 - - return rc; - -} - diff --git a/src/dialogs/windows/select.c b/src/dialogs/windows/select.c new file mode 100644 index 0000000..4aa6841 --- /dev/null +++ b/src/dialogs/windows/select.c @@ -0,0 +1,197 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob + * o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + +#include "../private.h" +#include +#include +#include + +/*--[ Globals ]--------------------------------------------------------------------------------------*/ + +struct FileSelector +{ + OPENFILENAME ofn; + char szName[260]; ///< @brief buffer for file name. + int mode; + BOOL ok; +}; + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + +/* +static gpointer win32_select_file(struct FileSelector *fl) +{ + debug("%s: start",__FUNCTION__); + if(fl->mode == 1) + { + fl->ok = GetSaveFileName(&fl->ofn); + } + else + { + fl->ok = GetOpenFileName(&fl->ofn); + } + debug("%s: end",__FUNCTION__); + + fl->mode = 3; + + return 0; +} + + +gchar * v3270_select_file(GtkWidget *widget, const gchar *title, const gchar *button, GtkFileChooserAction action, const gchar *filename, const gchar *filter, ...) +{ + gchar *rc = NULL; + + // Get parent windows + GdkWindow * win = gtk_widget_get_window(gtk_widget_get_toplevel(widget)); + + // Setup win32 file selection parameters + struct FileSelector fl; + + memset(&fl, 0, sizeof(fl)); + fl.ofn.lStructSize = sizeof(fl.ofn); + fl.ofn.hwndOwner = GDK_WINDOW_HWND(win); + fl.ofn.lpstrFile = fl.szName; + + // Set lpstrFile[0] to '\0' so that GetOpenFileName does not + // use the contents of szFile to initialize itself. + fl.ofn.lpstrFile[0] = '\0'; + + fl.ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0"; + fl.ofn.nFilterIndex = 1; + fl.ofn.lpstrInitialDir = NULL; + + fl.ofn.nMaxFileTitle = strlen(title); + fl.ofn.lpstrFileTitle = (char *) title; + + // Guarda o valor atual + fl.ofn.nMaxFile = sizeof(fl.szName); + strncpy(fl.szName, filename, fl.ofn.nMaxFile-1); + + // Obtêm o tipo de diálogo. + switch(action) { + case GTK_FILE_CHOOSER_ACTION_OPEN: // Indicates open mode. The file chooser will only let the user pick an existing file. + // Enviar arquivo + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646928(v=vs.85).aspx + fl.ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; + + fl.mode = 0; + break; + + case GTK_FILE_CHOOSER_ACTION_SAVE: // Indicates save mode. The file chooser will let the user pick an existing file, or type in a new filename. + // Receber arquivo + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646839(v=vs.85).aspx + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646829(v=vs.85).aspx#open_file + fl.ofn.Flags = OFN_OVERWRITEPROMPT; + + fl.mode = 1; + break; + + case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: // Indicates an Open mode for selecting folders. The file chooser will let the user pick an existing folder. + fl.mode = 3; + break; + + case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: //Indicates a mode for creating a new folder. The file chooser will let the user name an existing or new folder. + fl.mode = 3; + break; + + default: + return NULL; + + } + + GThread * thd = g_thread_new("SelectFileDialog",(GThreadFunc) win32_select_file, &fl); + + gtk_widget_set_sensitive(GTK_WIDGET(widget),FALSE); + debug("%s: Keeping main loop alive",__FUNCTION__); + while(fl.mode != 3) { + gtk_main_iteration(); + } + gtk_widget_set_sensitive(GTK_WIDGET(widget),TRUE); + + debug("%s: Waiting for service thread", __FUNCTION__); + g_thread_join(thd); + debug("%s: Service thread ends", __FUNCTION__); + + return rc; +} +*/ + +gchar * v3270_select_file(GtkWidget *widget, const gchar *title, const gchar *button, GtkFileChooserAction action, const gchar *filename, const gchar *filter, ...) +{ + gchar *rc = NULL; + + GtkWidget * chooser = + gtk_file_chooser_dialog_new + ( + title, + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + action, + _("_Cancel" ), GTK_RESPONSE_CANCEL, + button, GTK_RESPONSE_ACCEPT, + NULL + ); + + if(filename && *filename) + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(chooser),filename); + + // Setup filters + /* + va_list args; + va_start (args, filter); + while(filter) + { + const gchar * name = va_arg(args, const gchar *); + if(!name) + break; + + const gchar * pattern = va_arg(args, const gchar *); + if(!pattern) + break; + + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter,name); + gtk_file_filter_add_pattern(filter, pattern); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter); + + } + va_end(args); + */ + + if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) { + rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); + } + + gtk_widget_destroy(chooser); + + return rc; + +} + diff --git a/src/filetransfer/v3270ft.c b/src/filetransfer/v3270ft.c index d3e6a95..14875e9 100644 --- a/src/filetransfer/v3270ft.c +++ b/src/filetransfer/v3270ft.c @@ -299,6 +299,8 @@ static void select_local_file(GtkButton G_GNUC_UNUSED(*button), v3270ft *dialog) static void icon_press(G_GNUC_UNUSED GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, v3270ft *dialog) { #endif // WIN32 + debug("%s",__FUNCTION__); + gchar *filename = v3270_select_file( GTK_WIDGET(dialog), _("Select local file"), @@ -706,7 +708,11 @@ static void v3270ft_init(v3270ft *dialog) { * * Returns: a new #v3270ft. */ -LIB3270_EXPORT GtkWidget * v3270ft_new(void) { - return GTK_WIDGET(g_object_new(GTK_TYPE_V3270FT, "use-header-bar", (gint) 1, NULL)); +LIB3270_EXPORT GtkWidget * v3270ft_new(GtkWidget *parent) { + + GtkWidget * dialog = GTK_WIDGET(g_object_new(GTK_TYPE_V3270FT, "use-header-bar", (gint) 1, NULL)); + gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(gtk_widget_get_toplevel(parent))); + + return dialog; } diff --git a/src/include/v3270/filetransfer.h b/src/include/v3270/filetransfer.h index 18f386e..f4b6bc2 100644 --- a/src/include/v3270/filetransfer.h +++ b/src/include/v3270/filetransfer.h @@ -52,7 +52,7 @@ typedef struct _v3270ftClass v3270ftClass; - GtkWidget * v3270ft_new(void); + GtkWidget * v3270ft_new(GtkWidget *dialog); GType v3270ft_get_type(void); void v3270ft_set_options(GtkWidget *widget, LIB3270_FT_OPTION opt); LIB3270_FT_OPTION v3270ft_get_options(GtkWidget *widget); diff --git a/src/testprogram/testprogram.c b/src/testprogram/testprogram.c index fbb9e84..74a3b73 100644 --- a/src/testprogram/testprogram.c +++ b/src/testprogram/testprogram.c @@ -148,7 +148,7 @@ static void disconnect_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *term lib3270_disconnect(v3270_get_session(terminal)); } -static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) +static void ft_clicked(GtkButton *button, GtkWidget *terminal) { /* GtkWidget * dialog = v3270_dialog_new(terminal, _("test"), _("test")); @@ -194,7 +194,7 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) // // V5.1 dialog // - GtkWidget *dialog = v3270ft_new(); + GtkWidget *dialog = v3270ft_new(button); /* // @@ -382,6 +382,9 @@ int main (int argc, char **argv) { g_object_unref (app); g_message("rc=%d",status); - return status; + + return 0; + } + diff --git a/v3270.cbp b/v3270.cbp index 89f6059..8ad8479 100644 --- a/v3270.cbp +++ b/v3270.cbp @@ -58,6 +58,9 @@ + + @@ -72,9 +75,6 @@ - - @@ -84,6 +84,9 @@ + + -- libgit2 0.21.2