static void plugin_exec (GtkWidget *widget, gpointer user_data) { Plugin *plugin; Documentable *doc = document_manager_get_current_documentable(main_window.docmg); if (!doc) return; GtkPluginManagerMenu *menu= GTK_PLUGIN_MANAGER_MENU (user_data); plugin = get_plugin_by_name(menu->priv->plugmg, (gchar *) gtk_menu_item_get_label (GTK_MENU_ITEM(widget))); plugin_run(plugin, doc); }
LOCAL_EXTERN int get_action_info_by_name(const gchar *key, const gchar **names, const gchar **values, gchar **name, UI_CALLBACK *info) { static const struct _action { const gchar * name; /**< Name of the action */ GCallback callback; /**< Callback for "activated/toggled" signal */ } action[] = { // Offline actions { "Connect", G_CALLBACK(action_connect) }, { "LoadScreenDump", G_CALLBACK(action_loadscreendump) }, { "SetHostname", G_CALLBACK(action_sethostname) }, { "TestPattern", G_CALLBACK(lib3270_testpattern) }, // Online actions { "Redraw", G_CALLBACK(action_redraw) }, { "SaveScreen", G_CALLBACK(action_savescreen) }, { "PrintScreen", G_CALLBACK(action_printscreen) }, { "DumpScreen", G_CALLBACK(action_dumpscreen) }, { "Disconnect", G_CALLBACK(action_disconnect) }, // Select actions { "SelectField", G_CALLBACK(action_selectfield) }, { "SelectRight", G_CALLBACK(action_selectright) }, { "SelectLeft", G_CALLBACK(action_selectleft) }, { "SelectUp", G_CALLBACK(action_selectup) }, { "SelectDown", G_CALLBACK(action_selectdown) }, { "SelectionRight", G_CALLBACK(action_selectionright) }, { "SelectionLeft", G_CALLBACK(action_selectionleft) }, { "SelectionUp", G_CALLBACK(action_selectionup) }, { "SelectionDown", G_CALLBACK(action_selectiondown) }, // Cursor Movement { "CursorRight", G_CALLBACK(action_Right) }, { "CursorLeft", G_CALLBACK(action_Left) }, { "CursorUp", G_CALLBACK(action_Up) }, { "CursorDown", G_CALLBACK(action_Down) }, { "Newline", G_CALLBACK(action_Newline) }, { "NextField", G_CALLBACK(lib3270_tab) }, { "PreviousField", G_CALLBACK(lib3270_backtab) }, { "kpadd", G_CALLBACK(action_kpadd) }, { "kpsubtract", G_CALLBACK(action_kpsubtract) }, // Edit actions { "PasteNext", G_CALLBACK(action_pastenext) }, { "PasteTextFile", G_CALLBACK(action_pastetextfile) }, { "Reselect", G_CALLBACK(action_reselect) }, { "SelectAll", G_CALLBACK(action_selectall) }, { "EraseInput", G_CALLBACK(erase_input_action) }, { "Clear", G_CALLBACK(clear_action) }, { "Reset", G_CALLBACK(action_Reset) }, { "Escape", G_CALLBACK(action_Reset) }, // File-transfer actions { "Download", G_CALLBACK(action_download) }, { "Upload", G_CALLBACK(action_upload) }, // Selection actions { "Append", G_CALLBACK(action_append) }, { "Unselect", G_CALLBACK(action_unselect) }, { "Copy", G_CALLBACK(action_copy) }, { "CopyAsTable", G_CALLBACK(action_copyastable) }, { "CopyAsImage", G_CALLBACK(action_copyasimage) }, { "PrintSelected", G_CALLBACK(action_printselected) }, { "SaveSelected", G_CALLBACK(action_saveselected) }, { "PrintClipboard", G_CALLBACK(action_printclipboard) }, { "SaveClipboard", G_CALLBACK(action_saveclipboard) }, { "Paste", G_CALLBACK(action_paste) }, { "FileMenu", NULL }, { "FTMenu", NULL }, { "NetworkMenu", NULL }, { "HelpMenu", NULL }, { "EditMenu", NULL }, { "OptionsMenu", NULL }, { "SettingsMenu", NULL }, { "ScriptsMenu", NULL }, { "ViewMenu", NULL }, { "InputMethod", NULL }, { "ToolbarMenu", NULL }, { "DebugMenu", NULL }, { "FontSettings", NULL }, { "Preferences", NULL }, { "Network", NULL }, { "Properties", NULL }, { "ScreenSizes", NULL }, { "About", G_CALLBACK(action_about) }, { "Quit", G_CALLBACK(action_quit) }, { "SelectColors", G_CALLBACK(action_selectcolors) }, { "Save", NULL }, { "Return", G_CALLBACK(action_enter) }, { "Enter", G_CALLBACK(action_enter) }, // Lib3270 calls { "EraseEOF", G_CALLBACK(lib3270_eraseeof) }, { "EraseEOL", G_CALLBACK(lib3270_eraseeol) }, { "Home", G_CALLBACK(lib3270_firstfield) }, { "DeleteWord", G_CALLBACK(lib3270_deleteword) }, { "EraseField", G_CALLBACK(lib3270_deletefield) }, { "Delete", G_CALLBACK(lib3270_delete) }, { "Erase", G_CALLBACK(lib3270_erase) }, { "SysREQ", G_CALLBACK(lib3270_sysreq) }, { "Attn", G_CALLBACK(lib3270_attn) }, { "Break", G_CALLBACK(lib3270_break) }, { "Dup", G_CALLBACK(lib3270_dup) }, { "FirstField", G_CALLBACK(lib3270_firstfield) }, }; int f; if(name) *name = NULL; memset(info,0,sizeof(UI_CALLBACK)); if(!g_ascii_strcasecmp(key,"pfkey")) { info->type = UI_CALLBACK_TYPE_DEFAULT; info->label = "pfkey"; info->callback = G_CALLBACK(action_pfkey); info->user_data = (gpointer) atoi(get_xml_attribute(names, values, "id")); if(name) *name = g_strdup_printf("pf%02d",(int) info->user_data); return 0; } if(!g_ascii_strcasecmp(key,"pakey")) { info->type = UI_CALLBACK_TYPE_DEFAULT; info->label = "pakey"; info->callback = G_CALLBACK(action_pakey); info->user_data = (gpointer) atoi(get_xml_attribute(names, values, "id")); if(name) *name = g_strdup_printf("pa%02d",(int) info->user_data); return 0; } if(!g_ascii_strcasecmp(key,"toggle")) { // Check for lib3270 toggles const gchar *id = get_xml_attribute(names, values, "id"); for(f=0;f<N_TOGGLES;f++) { if(!g_ascii_strcasecmp(id,get_toggle_name(f))) { info->type = UI_CALLBACK_TYPE_TOGGLE; info->callback = G_CALLBACK(toggle_action); info->user_data = (gpointer) f; if(name) *name = g_strconcat("Toggle",get_toggle_name(f),NULL); return 0; } } // Check for GUI toggles for(f=0;f<G_N_ELEMENTS(gui_toggle_info);f++) { if(!g_ascii_strcasecmp(id,gui_toggle_info[f].name)) { info->type = UI_CALLBACK_TYPE_TOGGLE; info->callback = G_CALLBACK(toggle_gui); info->user_data = (gpointer) f; if(name) *name = g_strconcat("Toggle",gui_toggle_info[f].name,NULL); return 0; } } if(!g_ascii_strcasecmp(id,"gdkdebug")) { info->type = UI_CALLBACK_TYPE_TOGGLE; info->callback = G_CALLBACK(action_ToggleGDKDebug); info->user_data = (gpointer) f; if(name) *name = g_strdup("ToggleGDKDebug"); return 0; } return EINVAL; } if(!g_ascii_strcasecmp(key,"toggleset")) { const gchar *id = get_xml_attribute(names, values, "id"); for(f=0;f<N_TOGGLES;f++) { if(!g_ascii_strcasecmp(id,get_toggle_name(f))) { info->type = UI_CALLBACK_TYPE_DEFAULT; // info->label = toggle_info[f].set_label ? toggle_info[f].set_label : toggle_info[f].do_label; info->callback = G_CALLBACK(toggle_set_action); info->user_data = (gpointer) f; if(name) *name = g_strconcat("ToggleSet",get_toggle_name(f),NULL); return 0; } } return EINVAL; } if(!g_ascii_strcasecmp(key,"togglereset")) { const gchar *id = get_xml_attribute(names, values, "id"); for(f=0;f<N_TOGGLES;f++) { if(!g_ascii_strcasecmp(id,get_toggle_name(f))) { info->type = UI_CALLBACK_TYPE_DEFAULT; // info->label = toggle_info[f].reset_label ? toggle_info[f].reset_label : toggle_info[f].do_label; info->callback = G_CALLBACK(toggle_reset_action); info->user_data = (gpointer) f; if(name) *name = g_strconcat("ToggleReset",get_toggle_name(f),NULL); return 0; } } return EINVAL; } // Search internal actions for(f=0;f<G_N_ELEMENTS(action);f++) { if(!g_ascii_strcasecmp(key,action[f].name)) { info->type = UI_CALLBACK_TYPE_DEFAULT; // info->label = action[f].label; info->callback = action[f].callback; return 0; } } // Search for plugin actions if(strchr(key,'.')) { gchar *plugin_name = g_strdup(key); gchar *entry_name = strchr(plugin_name,'.'); GModule *plugin; *(entry_name++) = 0; plugin = get_plugin_by_name(plugin_name); if(plugin) { gpointer cbk; if(get_symbol_by_name(plugin,&cbk,"action_%s_activated",entry_name)) { info->type = UI_CALLBACK_TYPE_DEFAULT; info->callback = (GCallback) cbk; info->user_data = (gpointer) topwindow; } else if(get_symbol_by_name(plugin,&cbk,"action_%s_toggled",entry_name)) { info->type = UI_CALLBACK_TYPE_TOGGLE; info->callback = (GCallback) cbk; info->user_data = (gpointer) topwindow; } } g_free(plugin_name); if(info->callback) return 0; } // Check if it's an external program action if(!g_ascii_strncasecmp(key,"call",4) && strlen(key) > 5 && g_ascii_isspace(*(key+4))) { } return ENOENT; }