Commit 5fca6f1299c5c40c5ef59fd043a488eb2c97f738

Authored by Perry Werneck
1 parent 818e87e6
Exists in script-support

Script dialog should scan plugins for an available runner.

Showing 1 changed file with 38 additions and 17 deletions   Show diff stats
src/objects/application/actions/script.c
@@ -27,7 +27,7 @@ @@ -27,7 +27,7 @@
27 #ifdef ENABLE_SCRIPTS 27 #ifdef ENABLE_SCRIPTS
28 28
29 static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); 29 static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal);
30 -static void response(GtkWidget *dialog, gint response_id, GtkWidget *input); 30 +static void response(GtkWidget *dialog, gint response_id, GtkEntry *input);
31 static void icon_press(GtkWidget *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, const void *dunno); 31 static void icon_press(GtkWidget *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, const void *dunno);
32 32
33 GAction * pw3270_script_action_new() { 33 GAction * pw3270_script_action_new() {
@@ -98,18 +98,6 @@ GtkWidget * factory(V3270SimpleAction * action, GtkWidget *terminal) { @@ -98,18 +98,6 @@ GtkWidget * factory(V3270SimpleAction * action, GtkWidget *terminal) {
98 NULL 98 NULL
99 ); 99 );
100 100
101 - /*  
102 - // Cant use gtk_entry_bind_to_filechooser due to plugin interaction  
103 - gtk_entry_bind_to_filechooser(  
104 - input,  
105 - GTK_FILE_CHOOSER_ACTION_OPEN,  
106 - _("Run script"),  
107 - NULL,  
108 - "*.*",  
109 - _("All files")  
110 - );  
111 - */  
112 -  
113 g_signal_connect(dialog,"response",G_CALLBACK(response),input); 101 g_signal_connect(dialog,"response",G_CALLBACK(response),input);
114 102
115 gtk_widget_show_all(GTK_WIDGET(grid)); 103 gtk_widget_show_all(GTK_WIDGET(grid));
@@ -117,7 +105,7 @@ GtkWidget * factory(V3270SimpleAction * action, GtkWidget *terminal) { @@ -117,7 +105,7 @@ GtkWidget * factory(V3270SimpleAction * action, GtkWidget *terminal) {
117 105
118 } 106 }
119 107
120 -void icon_press(GtkWidget *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, const void *dunno) { 108 +void icon_press(GtkWidget *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, GdkEvent G_GNUC_UNUSED(*event), const void G_GNUC_UNUSED(*dunno)) {
121 109
122 GtkWidget * dialog = 110 GtkWidget * dialog =
123 gtk_file_chooser_dialog_new( 111 gtk_file_chooser_dialog_new(
@@ -164,14 +152,47 @@ void icon_press(GtkWidget *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G @@ -164,14 +152,47 @@ void icon_press(GtkWidget *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G
164 152
165 } 153 }
166 154
167 -void response(GtkWidget *dialog, gint response_id, GtkWidget *input) { 155 +void response(GtkWidget *input_dialog, gint response_id, GtkEntry *entry) {
168 156
169 - if(response_id == GTK_RESPONSE_APPLY) { 157 + g_autofree gchar *filename = g_strdup(gtk_entry_get_text(entry));
170 158
  159 + gtk_widget_destroy(input_dialog);
171 160
  161 + if(response_id != GTK_RESPONSE_APPLY) {
  162 + return;
172 } 163 }
173 164
174 - gtk_widget_destroy(dialog); 165 + GtkWidget * terminal = pw3270_get_active_terminal();
  166 +
  167 + g_message("Finding worker for '%s'",filename);
  168 +
  169 + int (*call)(GtkWidget *terminal, const gchar *filename);
  170 +
  171 + GSList * item;
  172 + for(item = PW3270_APPLICATION(g_application_get_default())->plugins; item; item = g_slist_next(item)) {
  173 + if(g_module_symbol((GModule *) item->data, "pw3270_plugin_run_script", (gpointer *) &call)) {
  174 + if(call(terminal,filename) == 0) {
  175 + break;
  176 + }
  177 + }
  178 + }
  179 +
  180 + GtkWidget * dialog = gtk_message_dialog_new_with_markup(
  181 + GTK_WINDOW(gtk_widget_get_toplevel(terminal)),
  182 + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
  183 + GTK_MESSAGE_ERROR,
  184 + GTK_BUTTONS_OK,
  185 + _("Can't run \"%s\""), filename
  186 + );
  187 +
  188 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",_("No available runner for this file"));
  189 +
  190 + gtk_window_set_title(GTK_WINDOW(dialog),_("Can't run script"));
  191 +
  192 + gtk_widget_show_all(dialog);
  193 +
  194 + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL);
  195 + g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL);
175 196
176 } 197 }
177 #endif // ENABLE_SCRIPTS 198 #endif // ENABLE_SCRIPTS