From e42f96cccce7b35a9db9a577fcbdc8fca67095e3 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Fri, 29 Nov 2019 10:17:34 -0300 Subject: [PATCH] Adding fallbacks for scroll actions. --- src/include/terminal.h | 6 +++++- src/include/v3270/actions.h | 2 ++ src/terminal/actions/scroll.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/terminal/scroll.c | 68 -------------------------------------------------------------------- v3270.cbp | 6 +++--- 5 files changed, 162 insertions(+), 72 deletions(-) create mode 100644 src/terminal/actions/scroll.c delete mode 100644 src/terminal/scroll.c diff --git a/src/include/terminal.h b/src/include/terminal.h index e21ff4f..4953609 100644 --- a/src/include/terminal.h +++ b/src/include/terminal.h @@ -221,7 +221,11 @@ G_BEGIN_DECLS GSList * accelerators; ///< @brief Keyboard accelerators. // Scroll actions. - GtkAction * scroll[4]; ///< @brief Scroll actions. + struct + { + void (*activate)(GtkWidget *, gpointer); ///< @brief Callback for scroll activation. + gpointer arg; ///< @brief Argument for callback. + } scroll[4]; ///< @brief Scroll actions. }; diff --git a/src/include/v3270/actions.h b/src/include/v3270/actions.h index 52e76ff..43bc8dc 100644 --- a/src/include/v3270/actions.h +++ b/src/include/v3270/actions.h @@ -70,6 +70,8 @@ // // Misc // + LIB3270_EXPORT void v3270_set_scroll_handler(GtkWidget *widget, GdkScrollDirection direction, GCallback callback, gpointer data); + LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action) G_GNUC_DEPRECATED; // diff --git a/src/terminal/actions/scroll.c b/src/terminal/actions/scroll.c new file mode 100644 index 0000000..68e2397 --- /dev/null +++ b/src/terminal/actions/scroll.c @@ -0,0 +1,152 @@ +/* + * "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. + * + * 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 mouse.c e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include + #include + #include + #include + #include + #include + #include + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + +// Callback for compatibility with the old application. +static void activate_action(GtkWidget *terminal, GtkAction *action) +{ + gtk_action_activate(action); +} + +LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action) +{ + v3270_set_scroll_handler(widget, direction, G_CALLBACK(activate_action), action); +} + +gboolean v3270_scroll_event(GtkWidget *widget, GdkEventScroll *event) +{ + v3270 * terminal = GTK_V3270(widget); + + lib3270_write_event_trace(terminal->host,"scroll event direction=%d",(int) event->direction); + + if(lib3270_get_program_message(terminal->host) != LIB3270_MESSAGE_NONE || event->direction < 0 || event->direction > G_N_ELEMENTS(terminal->scroll)) + { + lib3270_write_event_trace(terminal->host," dropped (not available)\n"); + return FALSE; + } + + lib3270_write_event_trace(terminal->host,"\n"); + + debug("%d %p", (int) event->direction, terminal->scroll[event->direction]); + + // Do I have scroll method?? + if(terminal->scroll[event->direction].activate) + { + // Yes, fire it. + terminal->scroll[event->direction].activate(widget,terminal->scroll[event->direction].arg); + return TRUE; + } + + // Has selection? + if(lib3270_has_selection(terminal->host)) + { + switch(event->direction) + { + case GDK_SCROLL_UP: + lib3270_move_selection(terminal->host,LIB3270_DIR_UP); + return TRUE; + + case GDK_SCROLL_DOWN: + lib3270_move_selection(terminal->host,LIB3270_DIR_DOWN); + return TRUE; + + case GDK_SCROLL_LEFT: + lib3270_move_selection(terminal->host,LIB3270_DIR_LEFT); + return TRUE; + + case GDK_SCROLL_RIGHT: + lib3270_move_selection(terminal->host,LIB3270_DIR_RIGHT); + return TRUE; + } + + } + + // Check for fallbacks + size_t ix; + + static const struct + { + GdkScrollDirection direction; + guint keyval; + GdkModifierType state; + } fallbacks[] = { + + { GDK_SCROLL_UP, GDK_Page_Up, 0 }, + { GDK_SCROLL_DOWN, GDK_Page_Down, 0 }, + + { GDK_SCROLL_UP, GDK_ISO_Left_Tab, GDK_SHIFT_MASK }, + { GDK_SCROLL_DOWN, GDK_Tab, 0 }, + + { GDK_SCROLL_UP, GDK_Up, 0 }, + { GDK_SCROLL_DOWN, GDK_Down, 0 }, + + }; + + for(ix = 0; ix < G_N_ELEMENTS(fallbacks); ix++) { + + if(fallbacks[ix].direction == event->direction) { + + const V3270Accelerator * accel = v3270_get_accelerator(widget, fallbacks[ix].keyval, fallbacks[ix].state); + if(accel) + { + debug("Activating fallback mouse action \"%s\"\n",v3270_accelerator_get_name(accel)); +// lib3270_write_event_trace(terminal->hSession,"Activating fallback mouse action \"%s\"\n",v3270_accelerator_get_name(accel)); + v3270_accelerator_activate(accel,widget); + return TRUE; + } + + } + + } + + return FALSE; + } + + void v3270_set_scroll_handler(GtkWidget *widget, GdkScrollDirection direction, GCallback callback, gpointer data) + { + size_t ix = (size_t) direction; + + g_return_if_fail(GTK_IS_V3270(widget) && ix < 4); + + v3270 * terminal = GTK_V3270(widget); + + terminal->scroll[ix].activate = (void (*)(GtkWidget *, gpointer)) callback; + terminal->scroll[ix].arg = data; + + } + diff --git a/src/terminal/scroll.c b/src/terminal/scroll.c deleted file mode 100644 index 0a52d08..0000000 --- a/src/terminal/scroll.c +++ /dev/null @@ -1,68 +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. - * - * 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 mouse.c e possui - linhas de código. - * - * Contatos: - * - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) - * - */ - - #include - #include - #include - #include - #include - -/*--[ Implement ]------------------------------------------------------------------------------------*/ - -LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action) -{ - g_return_if_fail(GTK_IS_V3270(widget)); - GTK_V3270(widget)->scroll[((int) direction) & 0x03] = action; -} - -gboolean v3270_scroll_event(GtkWidget *widget, GdkEventScroll *event) -{ - v3270 * terminal = GTK_V3270(widget); - - lib3270_write_event_trace(terminal->host,"scroll event direction=%d",(int) event->direction); - - if(lib3270_get_program_message(terminal->host) != LIB3270_MESSAGE_NONE || event->direction < 0 || event->direction > G_N_ELEMENTS(terminal->scroll)) - { - lib3270_write_event_trace(terminal->host," dropped (not available)\n"); - return FALSE; - } - - lib3270_write_event_trace(terminal->host,"\n"); - - debug("%d %p", (int) event->direction, terminal->scroll[event->direction]); - - if(terminal->scroll[event->direction]) - { - debug("%d %s", (int) event->direction, gtk_action_get_name(terminal->scroll[event->direction])); - gtk_action_activate(terminal->scroll[event->direction]); - return TRUE; - } - - return FALSE; - } diff --git a/v3270.cbp b/v3270.cbp index eaef725..5f3f532 100644 --- a/v3270.cbp +++ b/v3270.cbp @@ -226,6 +226,9 @@