1. simplified (custom) init sequence This method is useful for the simplest, gui-only applications that potentially do not have plugins. int main(int argc, char *argv[]) { pcb_fix_locale_and_env(); /* set up non-hidlib related app states */ ... pcb_hidlib_init1(conf_core_init); /* process command line args */ ... pcb_hidlib_init2(pup_buildins); /* set up hidlib related app states - all main infrastructure is up by now */ ... /* initialize the gui and run the main loop */ pcb_gui = pcb_hid_find_gui(gui_name); if (pcb_gui == NULL) { pcb_message(PCB_MSG_ERROR, "can't find HID '%s'\n", gui_name); pcbhl_log_print_uninit_errs(""); exit(1); } if (pcb_gui->parse_arguments(&argc, &argv) != 0) { pcb_message(PCB_MSG_ERROR, "can't init HID '%s'\n", gui_name); pcbhl_log_print_uninit_errs(""); exit(1); } pcb_gui->do_export(&camv.hidlib, 0); /* application state uninit */ ... } 2. standard init sequence Hidlib calls help to initialize the plugin system, parse the command line argument, choose command line action, exporter or GUI in a standard way. Full featured hidlib applications with feature and export plugins should use this sequence. static const char *camv_action_args[] = { /*short, -long, action, help, hint-on-error */ "V", "-version", "PrintVersion()", "Print version info and exit", NULL, "V", "-dump-version", "DumpVersion()", "Print version info in script readable format and exit", NULL, NULL, "-copyright", "PrintCopyright()", "Print copyright and exit", NULL, NULL, NULL, NULL, NULL, NULL /* terminator */ }; int main(int argc, char *argv[]) { pcbhl_main_args_t ga; pcb_fix_locale_and_env(); pcbhl_main_args_init(&ga, argc, camv_action_args); pcb_hidlib_init1(conf_core_init); for(n = 1; n < argc; n++) { /* process application-specific arguments here and skip the next line for those */ n += pcbhl_main_args_add(&ga, argv[n], argv[n+1]); } pcb_hidlib_init2(pup_buildins); /* direct exporting via -x */ if (pcbhl_main_args_setup1(&ga) != 0) { camv_main_uninit(); pcbhl_main_args_uninit(&ga); exit(1); } /* Initialize actions only when the gui is already known so only the right one is registered (there can be only one GUI). */ #include "generated_lists.h" if (pcbhl_main_args_setup2(&ga, &n) != 0) { camv_main_uninit(); pcbhl_main_args_uninit(&ga); exit(n); } if (ga.hid_argc > 0) { /* command line leftover: typically file name(s) to load, in ga.hid_argv[0 .. ga.hid_argc-1]; */ } /* do the export if -x was specified */ if (pcbhl_main_exported(&ga, ...)) { camv_main_uninit(); pcbhl_main_args_uninit(&ga); exit(0); } /* main loop */ do { /* optional: if a plugin is required for basic GUI operation, load it here */ if (PCB_HAVE_GUI_ATTR_DLG) gui_support_plugins(1); pcbhl_mainloop_interactive(&ga, ...); } while(pcb_gui != NULL); /* application specific uninit */ ... pcbhl_main_args_uninit(&ga); return 0; }