diff --git a/pw3270.cbp b/pw3270.cbp
index 92eee83..018c87e 100644
--- a/pw3270.cbp
+++ b/pw3270.cbp
@@ -8,8 +8,8 @@
-
-
+
+
@@ -18,8 +18,8 @@
-
-
+
+
@@ -33,7 +33,7 @@
-
+
@@ -41,273 +41,270 @@
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
+
-
-
+
-
+
-
+
-
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
-
-
+
+
+
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
-
-
-
+
+
+
+
-
-
-
-
+
-
+
-
+
+
+
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
-
-
+
+
+
+
-
-
-
-
+
+
+
-
-
-
+
-
+
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
-
-
-
-
+
+
-
-
+
-
+
+
+
+
-
-
-
-
+
+
-
-
+
+
-
-
+
+
+
-
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
-
+
+
+
-
-
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
diff --git a/src/gtk/actions.c b/src/gtk/actions.c
index 4f6c442..08c91c5 100644
--- a/src/gtk/actions.c
+++ b/src/gtk/actions.c
@@ -186,8 +186,41 @@ static void action_pakey(GtkAction *action, GtkWidget *widget)
lib3270_pakey(GTK_V3270(widget)->host,(int) g_object_get_data(G_OBJECT(action),"pakey"));
}
+static void action_fullscreen(GtkAction *action, GtkWidget *widget)
+{
+ lib3270_set_toggle(GTK_V3270(widget)->host,LIB3270_TOGGLE_FULL_SCREEN,1);
+}
+
+static void action_unfullscreen(GtkAction *action, GtkWidget *widget)
+{
+ lib3270_set_toggle(GTK_V3270(widget)->host,LIB3270_TOGGLE_FULL_SCREEN,0);
+}
+
void ui_connect_pakey(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id)
{
g_object_set_data(G_OBJECT(action),"pakey",(gpointer) atoi(id));
g_signal_connect(action,"activate",G_CALLBACK(action_pakey),widget);
}
+
+void ui_connect_index_action(GtkAction *action, GtkWidget *widget, int ix, GtkAction **lst)
+{
+ trace("action(%d): %p",ix,action);
+
+ switch(ix)
+ {
+ case ACTION_PASTENEXT:
+ break;
+
+ case ACTION_FULLSCREEN:
+ g_signal_connect(action,"activate",G_CALLBACK(action_fullscreen),widget);
+ break;
+
+ case ACTION_UNFULLSCREEN:
+ g_signal_connect(action,"activate",G_CALLBACK(action_unfullscreen),widget);
+ break;
+
+ default:
+ g_warning("Action \"%s\" has unexpected id %d",gtk_action_get_name(action),ix);
+ gtk_action_set_sensitive(action,FALSE);
+ }
+}
diff --git a/src/gtk/globals.h b/src/gtk/globals.h
index 5280396..336e7fe 100644
--- a/src/gtk/globals.h
+++ b/src/gtk/globals.h
@@ -39,6 +39,16 @@
#include "v3270/v3270.h"
+ // Special actions
+ enum
+ {
+ ACTION_PASTENEXT,
+ ACTION_FULLSCREEN,
+ ACTION_UNFULLSCREEN,
+
+ ACTION_COUNT
+ };
+
// Configuration
#include "common/common.h"
diff --git a/src/gtk/mainwindow.c b/src/gtk/mainwindow.c
index edaa48e..920ba49 100644
--- a/src/gtk/mainwindow.c
+++ b/src/gtk/mainwindow.c
@@ -73,22 +73,37 @@
"selection",
NULL
};
+
+ static const gchar *actionname[ACTION_COUNT+1] = { "pastenext",
+ "setfullscreen",
+ "resetfullscreen"
+ };
/*--[ Implement ]------------------------------------------------------------------------------------*/
- static void save_toggle(GtkWidget *widget, LIB3270_TOGGLE id, gboolean toggled, const gchar *name, GtkWindow *toplevel)
+ static void toggle_changed(GtkWidget *widget, LIB3270_TOGGLE id, gboolean toggled, const gchar *name, GtkWindow *toplevel)
{
gchar *nm = g_ascii_strdown(name,-1);
- trace("Toggle \"%s\" in widget %p is %s toplevel=%p",nm,widget,toggled ? "Active" : "Inactive",toplevel);
set_boolean_to_config("toggle",nm,toggled);
g_free(nm);
if(id == LIB3270_TOGGLE_FULL_SCREEN)
{
+ GtkAction **action = (GtkAction **) g_object_get_data(G_OBJECT(toplevel),"named_actions");
+
+ if(action[ACTION_FULLSCREEN])
+ gtk_action_set_visible(action[ACTION_FULLSCREEN],!toggled);
+
+ if(action[ACTION_UNFULLSCREEN])
+ gtk_action_set_visible(action[ACTION_UNFULLSCREEN],toggled);
+
if(toggled)
gtk_window_fullscreen(GTK_WINDOW(toplevel));
else
gtk_window_unfullscreen(GTK_WINDOW(toplevel));
}
+
+ #warning TODO: Update toggle actions.
+
}
static void disconnected(GtkWidget *widget, GtkActionGroup **group)
@@ -226,6 +241,7 @@
H3270 * host = v3270_get_session(terminal);
gchar * path = build_data_filename("ui",NULL);
GtkActionGroup **group;
+ GtkAction **action;
GtkWidget **popup;
int f;
@@ -247,9 +263,10 @@
}
// Create window
- window = ui_parse_xml_folder(path,groupname,popupname,terminal,widget_setup);
+ window = ui_parse_xml_folder(path,groupname,popupname,actionname,terminal,widget_setup);
group = g_object_get_data(G_OBJECT(window),"action_groups");
popup = g_object_get_data(G_OBJECT(window),"popup_menus");
+ action = (GtkAction **) g_object_get_data(G_OBJECT(window),"named_actions");
// Setup action groups
gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],FALSE);
@@ -258,8 +275,15 @@
gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],FALSE);
disconnected(terminal, (gpointer) group);
+ // Setup actions
+ if(action[ACTION_FULLSCREEN])
+ gtk_action_set_visible(action[ACTION_FULLSCREEN],!lib3270_get_toggle(host,LIB3270_TOGGLE_FULL_SCREEN));
+
+ if(action[ACTION_UNFULLSCREEN])
+ gtk_action_set_visible(action[ACTION_UNFULLSCREEN],lib3270_get_toggle(host,LIB3270_TOGGLE_FULL_SCREEN));
+
// Connect widget signals
- g_signal_connect(terminal,"toggle_changed",G_CALLBACK(save_toggle),window);
+ g_signal_connect(terminal,"toggle_changed",G_CALLBACK(toggle_changed),window);
g_signal_connect(terminal,"disconnected",G_CALLBACK(disconnected),group);
g_signal_connect(terminal,"connected",G_CALLBACK(connected),group);
g_signal_connect(terminal,"update_config",G_CALLBACK(update_config),0);
diff --git a/src/gtk/uiparser/parsefile.c b/src/gtk/uiparser/parsefile.c
index 8289d78..9d71fd7 100644
--- a/src/gtk/uiparser/parsefile.c
+++ b/src/gtk/uiparser/parsefile.c
@@ -182,10 +182,24 @@
}
else
{
+ int ix = -1;
+
action = GTK_ACTION(create(nm,NULL,NULL,NULL));
g_hash_table_insert(info->actions,nm,action);
- if(g_strcasecmp(name,"quit"))
+ if(info->actionname)
+ {
+ int f;
+ for(f=0;info->actionname[f] && ix < 0;f++)
+ {
+ if(!g_strcasecmp(nm,info->actionname[f]))
+ ix = f;
+ }
+ }
+
+ if(ix >= 0)
+ ui_connect_index_action(info->action[ix] = action,info->center_widget,ix,info->action);
+ else if(g_strcasecmp(name,"quit"))
connect(action,info->center_widget,name,id);
else
g_signal_connect(action,"activate",G_CALLBACK(gtk_main_quit), NULL);
diff --git a/src/gtk/uiparser/parser.c b/src/gtk/uiparser/parser.c
index 2c3b51b..c4792cc 100644
--- a/src/gtk/uiparser/parser.c
+++ b/src/gtk/uiparser/parser.c
@@ -206,20 +206,18 @@ void parser_build(struct parser *p, GtkWidget *widget)
}
-static void release_popups(GtkWidget **popup)
+static void release_list(GObject **obj)
{
int f;
- for(f=0;popup[f] != ((GtkWidget *) -1);f++)
+ for(f=0;obj[f] != ((GObject *) -1);f++)
{
-// trace("%s[%d]=%p",__FUNCTION__,f,popup[f]);
- if(popup[f])
- g_object_unref(popup[f]);
+ if(obj[f])
+ g_object_unref(obj[f]);
}
-
- g_free(popup);
+ g_free(obj);
}
-GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, const gchar **popupname, GtkWidget *widget, const UI_WIDGET_SETUP *setup)
+GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, const gchar **popupname, const gchar **actionname, GtkWidget *widget, const UI_WIDGET_SETUP *setup)
{
struct parser p;
GDir * dir;
@@ -272,11 +270,16 @@ GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, con
p.popupname = popupname;
p.strings = g_string_chunk_new(0);
p.setup = setup;
+ p.actionname = actionname;
sz = (g_strv_length((gchar **) p.popupname));
p.popup = g_new0(GtkWidget *,sz+1);
p.popup[sz] = (GtkWidget *) -1;
- g_object_set_data_full(G_OBJECT(p.toplevel),"popup_menus",(gpointer) p.popup, (GDestroyNotify) release_popups);
+ g_object_set_data_full(G_OBJECT(p.toplevel),"popup_menus",(gpointer) p.popup, (GDestroyNotify) release_list);
+
+ sz = (g_strv_length((gchar **) p.actionname));
+ p.action = g_new0(GtkAction *,sz);
+ g_object_set_data_full(G_OBJECT(p.toplevel),"named_actions",(gpointer) p.action, (GDestroyNotify) g_free);
for(current = g_list_first(file);current;current = g_list_next(current))
{
diff --git a/src/gtk/uiparser/parser.h b/src/gtk/uiparser/parser.h
index fb92ef5..fffe5a7 100644
--- a/src/gtk/uiparser/parser.h
+++ b/src/gtk/uiparser/parser.h
@@ -51,8 +51,9 @@
void (*setup)(GtkWidget *widget, GtkWidget *obj);
} UI_WIDGET_SETUP;
- GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, const gchar **popupname, GtkWidget *widget, const UI_WIDGET_SETUP *itn);
+ GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, const gchar **popupname, const gchar **actionname, GtkWidget *widget, const UI_WIDGET_SETUP *itn);
void ui_connect_action(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id);
+ void ui_connect_index_action(GtkAction *action, GtkWidget *widget, int ix, GtkAction **lst);
void ui_connect_toggle(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id);
void ui_connect_pfkey(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id);
void ui_connect_pakey(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id);
diff --git a/src/gtk/uiparser/private.h b/src/gtk/uiparser/private.h
index e0a1d80..83ab5ef 100644
--- a/src/gtk/uiparser/private.h
+++ b/src/gtk/uiparser/private.h
@@ -59,9 +59,11 @@
GObject * element;
GtkWidget * center_widget;
GtkWidget ** popup; /**< Popup widgets */
+ GtkAction ** action; /**< Named actions */
GStringChunk * strings;
const gchar ** group; /**< Action group list */
const gchar ** popupname; /**< Popup names */
+ const gchar ** actionname; /**< Action names */
GHashTable * actions; /**< List of actions */
GHashTable * element_list[UI_ELEMENT_COUNT];
const UI_WIDGET_SETUP * setup;
diff --git a/src/gtk/uiparser/testprogram.c b/src/gtk/uiparser/testprogram.c
index 02ae7fe..b23a2dc 100644
--- a/src/gtk/uiparser/testprogram.c
+++ b/src/gtk/uiparser/testprogram.c
@@ -14,6 +14,12 @@ void activated(GtkAction *action, GtkWidget *widget)
trace("Action %s activated on widget %p",gtk_action_get_name(action),widget);
}
+void ui_connect_index_action(GtkAction *action, GtkWidget *widget, int ix, GtkAction **lst)
+{
+ trace("%s: Connecting indexed action %d",__FUNCTION__,ix);
+ g_signal_connect(action,"activate",G_CALLBACK(activated),widget);
+}
+
void toggled(GtkToggleAction *action, GtkWidget *widget)
{
trace("Action %s toggled on widget %p",gtk_action_get_name(GTK_ACTION(action)),widget);
@@ -52,20 +58,26 @@ void show_popup(GtkWidget *button, GtkWidget *menu)
int main (int argc, char *argv[])
{
- static const gchar *groupname[] = { "default",
- "online",
- "offline",
- "selection",
- "clipboard",
- "filetransfer",
- "paste",
- NULL };
-
- static const gchar *popupname[] = { "default",
- "selection",
- "offline",
- "dock",
- NULL };
+ static const gchar *groupname[] = { "default",
+ "online",
+ "offline",
+ "selection",
+ "clipboard",
+ "filetransfer",
+ "paste",
+ NULL };
+
+ static const gchar *popupname[] = { "default",
+ "selection",
+ "offline",
+ "dock",
+ NULL };
+
+ static const gchar *actionname[] = { "pastenext",
+ "setfullscreen",
+ "resetfullscreen",
+ NULL };
+
int f;
GtkWidget * window;
gchar * path;
@@ -78,7 +90,7 @@ int main (int argc, char *argv[])
hbox = gtk_hbox_new(FALSE,5);
vbox = gtk_vbox_new(FALSE,5);
path = build_data_filename("ui",NULL);
- window = ui_parse_xml_folder(path,groupname,popupname,vbox,NULL);
+ window = ui_parse_xml_folder(path,groupname,popupname,actionname,vbox,NULL);
g_free(path);
popup = g_object_get_data(G_OBJECT(window),"popup_menus");
diff --git a/src/gtk/uiparser/uiparser.cbp b/src/gtk/uiparser/uiparser.cbp
index 0647694..5288f37 100644
--- a/src/gtk/uiparser/uiparser.cbp
+++ b/src/gtk/uiparser/uiparser.cbp
@@ -7,8 +7,8 @@
-
-
+
+
@@ -17,8 +17,8 @@
-
-
+
+
@@ -32,13 +32,13 @@
-
+
-
-
+
+
@@ -83,7 +83,6 @@
-
diff --git a/src/lib3270/screen.c b/src/lib3270/screen.c
index d691b58..233e0c7 100644
--- a/src/lib3270/screen.c
+++ b/src/lib3270/screen.c
@@ -86,6 +86,10 @@ static unsigned short color_from_fa(unsigned char fa);
static void addch(H3270 *session, int baddr, unsigned char c, unsigned short attr)
{
+ // If set to keep selection adjust corresponding flag based on the current state
+ if(lib3270_get_toggle(session,LIB3270_TOGGLE_KEEP_SELECTED))
+ attr |= (session->ea_buf[baddr].attr & LIB3270_ATTR_SELECTED);
+
if(session->ea_buf[baddr].chr == c && session->ea_buf[baddr].attr == attr)
return;
--
libgit2 0.21.2