void BuildRegisterWindow(Register_Window *rw) { GtkWidget *window; GtkWidget *register_sheet; GtkWidget *main_vbox; GtkWidget *scrolled_window; #define MAXROWS (MAX_REGISTERS/REGISTERS_PER_ROW) #define MAXCOLS (REGISTERS_PER_ROW+1) GtkSheet *sheet; gchar name[10]; gint i; gint column_width,char_width; int x,y,width,height; if(rw==NULL) { printf("Warning build_register_viewer(%x)\n",(unsigned int)rw); return; } window=gtk_window_new(GTK_WINDOW_TOPLEVEL); ((GUI_Object*)rw)->window=window; gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window); //GTK_SIGNAL_FUNC (quit), NULL); main_vbox=gtk_vbox_new(FALSE,1); gtk_container_set_border_width(GTK_CONTAINER(main_vbox),0); gtk_container_add(GTK_CONTAINER(window), main_vbox); gtk_widget_show(main_vbox); if(rw->type==REGISTER_RAM) { register_sheet=gtk_sheet_new(1,MAXCOLS,"gpsim Register Viewer [RAM]"); gtk_window_set_title(GTK_WINDOW(window), "register viewer [RAM]"); // Add a status bar StatusBar_create(main_vbox,gp->status_bar); } else { register_sheet=gtk_sheet_new(1,MAXCOLS,"gpsim Register Viewer [EEPROM]"); gtk_window_set_title(GTK_WINDOW(window), "register viewer [EEPROM]"); } GTK_WIDGET_UNSET_FLAGS(register_sheet,GTK_CAN_DEFAULT); rw->register_sheet = GTK_SHEET(register_sheet); /* create popupmenu */ rw->popup_menu=build_menu(sheet,rw); build_entry_bar(main_vbox, rw); width=((GUI_Object*)rw)->width; height=((GUI_Object*)rw)->height; x=((GUI_Object*)rw)->x; y=((GUI_Object*)rw)->y; gtk_window_set_default_size(GTK_WINDOW(rw->gui_obj.window), width,height); gtk_widget_set_uposition(GTK_WIDGET(rw->gui_obj.window),x,y); gtk_signal_connect(GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC(delete_event), rw); scrolled_window=gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(scrolled_window), register_sheet); GTK_SHEET_SET_FLAGS(register_sheet, GTK_SHEET_CLIP_TEXT); gtk_widget_show(register_sheet); gtk_widget_show(scrolled_window); gtk_box_pack_start(GTK_BOX(main_vbox), scrolled_window, TRUE, TRUE, 0); gtk_signal_connect(GTK_OBJECT(gtk_sheet_get_entry(GTK_SHEET(register_sheet))), "changed", (GtkSignalFunc)show_entry, rw); gtk_signal_connect(GTK_OBJECT(register_sheet), "activate", (GtkSignalFunc)activate_sheet_cell, (gpointer) rw); gtk_signal_connect(GTK_OBJECT(rw->entry), "changed", (GtkSignalFunc)show_sheet_entry, rw); gtk_signal_connect(GTK_OBJECT(rw->entry), "activate", (GtkSignalFunc)activate_sheet_entry, rw); // gtk_widget_realize(window); char_width = gdk_string_width (normal_style->font,"9"); column_width = 3 * char_width + 6; sheet=rw->register_sheet; for(i=0; i<sheet->maxcol; i++){ //sprintf(name,"0x%02x",i); sprintf(name,"%02x",i); gtk_sheet_column_button_add_label(sheet, i, name); gtk_sheet_set_column_title(sheet, i, name); gtk_sheet_set_column_width (sheet, i, column_width); } sprintf(name,"ASCII"); gtk_sheet_column_button_add_label(sheet, i, name); gtk_sheet_set_column_title(sheet, i, name); gtk_sheet_set_column_width (sheet, i, REGISTERS_PER_ROW*char_width + 6); gtk_sheet_set_row_titles_width(sheet, column_width); gtk_signal_connect(GTK_OBJECT(sheet), "key_press_event", (GtkSignalFunc) clipboard_handler, NULL); gtk_signal_connect(GTK_OBJECT(sheet), "resize_range", (GtkSignalFunc) resize_handler, rw); gtk_signal_connect(GTK_OBJECT(sheet), "move_range", (GtkSignalFunc) move_handler, rw); gtk_signal_connect(GTK_OBJECT(sheet), "button_press_event", (GtkSignalFunc) do_popup, rw); gtk_signal_connect(GTK_OBJECT(sheet), "set_cell", (GtkSignalFunc) parse_numbers, rw); // rw->gui_obj.window = window; gtk_signal_connect_after(GTK_OBJECT(rw->gui_obj.window), "configure_event", GTK_SIGNAL_FUNC(gui_object_configure_event),rw); gtk_widget_show (window); gtk_widget_grab_default(rw->location); rw->gui_obj.enabled=1; for(i=0;i<MAX_REGISTERS;i++) rw->registers[i]=NULL; if(rw->processor) { RegWindow_new_processor(rw, ((GUI_Object*)rw)->gp); } }
/* [gtk thread] */ static GtkWidget *build_menu_item(ALLEGRO_MENU_ITEM *aitem) { GtkWidget *gitem; if (!aitem->caption) { gitem = gtk_separator_menu_item_new(); } else { ALLEGRO_USTR *caption = al_ustr_dup(aitem->caption); /* convert & to _ using unprintable chars as placeholders */ al_ustr_find_replace_cstr(caption, 0, "_", "\x01\x02"); al_ustr_find_replace_cstr(caption, 0, "&", "_"); al_ustr_find_replace_cstr(caption, 0, "\x01\x02", "__"); if (aitem->flags & ALLEGRO_MENU_ITEM_CHECKBOX) { gitem = gtk_check_menu_item_new_with_mnemonic(al_cstr(caption)); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gitem), aitem->flags & ALLEGRO_MENU_ITEM_CHECKED); g_signal_connect_swapped (gitem, "toggled", G_CALLBACK(checkbox_on_toggle), (gpointer) aitem); } else { /* always create an image menu item, in case the user ever sets an icon */ gitem = gtk_image_menu_item_new_with_mnemonic(al_cstr(caption)); if (aitem->icon) { const int w = al_get_bitmap_width(aitem->icon), h = al_get_bitmap_height(aitem->icon); const int stride = w * 4; int x, y, i; GdkPixbuf *pixbuf; uint8_t *data = al_malloc(stride * h); if (data) { for (y = 0, i = 0; y < h; ++y) { for (x = 0; x < w; ++x, i += 4) { al_unmap_rgba(al_get_pixel(aitem->icon, x, y), &data[i], &data[i + 1], &data[i + 2], &data[i + 3] ); } } pixbuf = gdk_pixbuf_new_from_data (data, GDK_COLORSPACE_RGB, TRUE, 8, w, h, stride, destroy_pixbuf, NULL); aitem->extra2 = gtk_image_new_from_pixbuf(pixbuf); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gitem), aitem->extra2); /* Subtract the main reference. the image still holds a reference, so the * pixbuf won't be destroyed until the image itself is. */ g_object_unref(pixbuf); } } } al_ustr_free(caption); gtk_widget_set_sensitive(gitem, !(aitem->flags & ALLEGRO_MENU_ITEM_DISABLED)); aitem->extra1 = gitem; if (aitem->popup) { GtkWidget *gsubmenu = gtk_menu_new(); build_menu(gsubmenu, aitem->popup); aitem->popup->extra1 = gsubmenu; gtk_widget_show(gsubmenu); gtk_menu_item_set_submenu(GTK_MENU_ITEM(gitem), gsubmenu); } else if (aitem->id) { g_signal_connect_swapped (gitem, "activate", G_CALLBACK(menuitem_response), (gpointer) aitem); } } gtk_widget_show(gitem); return gitem; }
void init_graphics (char *window_name) { /* Open the toplevel window, get the colors, 2 graphics * * contexts, load a font, and set up the toplevel window * * Calls build_menu to set up the menu. */ char *display_name = NULL; int x, y; /* window position */ unsigned int border_width = 2; /* ignored by OpenWindows */ XTextProperty windowName; /* X Windows' names for my colours. */ char *cnames[NUM_COLOR] = {"white", "black", "grey55", "grey75", "blue", "green", "yellow", "cyan", "red", "RGBi:0.0/0.5/0.0" }; XColor exact_def; Colormap cmap; int i; unsigned long valuemask = 0; /* ignore XGCvalues and use defaults */ XGCValues values; XEvent event; disp_type = SCREEN; /* Graphics go to screen, not ps */ for (i=0;i<=MAX_FONT_SIZE;i++) font_is_loaded[i] = 0; /* No fonts loaded yet. */ /* connect to X server */ /* connect to X server */ if ( (display=XOpenDisplay(display_name)) == NULL ) { fprintf( stderr, "Cannot connect to X server %s\n", XDisplayName(display_name)); exit( -1 ); } /* get screen size from display structure macro */ screen_num = DefaultScreen(display); display_width = DisplayWidth(display, screen_num); display_height = DisplayHeight(display, screen_num); x = y = 0; top_width = 2*display_width/3; top_height = 4*display_height/5; cmap = DefaultColormap(display, screen_num); private_cmap = None; for (i=0;i<NUM_COLOR;i++) { if (!XParseColor(display,cmap,cnames[i],&exact_def)) { fprintf(stderr, "Color name %s not in database", cnames[i]); exit(-1); } if (!XAllocColor(display, cmap, &exact_def)) { fprintf(stderr, "Couldn't allocate color %s.\n",cnames[i]); if (private_cmap == None) { fprintf(stderr, "Will try to allocate a private colourmap.\n"); fprintf(stderr, "Colours will only display correctly when your " "cursor is in the graphics window.\n" "Exit other colour applications and rerun this " "program if you don't like that.\n\n"); private_cmap = XCopyColormapAndFree (display, cmap); cmap = private_cmap; if (!XAllocColor (display, cmap, &exact_def)) { fprintf (stderr, "Couldn't allocate color %s as private.\n", cnames[i]); exit (1); } } else { fprintf (stderr, "Couldn't allocate color %s as private.\n", cnames[i]); exit (1); } } colors[i] = exact_def.pixel; } toplevel = XCreateSimpleWindow(display,RootWindow(display,screen_num), x, y, top_width, top_height, border_width, colors[BLACK], colors[WHITE]); if (private_cmap != None) XSetWindowColormap (display, toplevel, private_cmap); /* hints stuff deleted. */ XSelectInput (display, toplevel, ExposureMask | StructureNotifyMask | ButtonPressMask); /* Create default Graphics Contexts. valuemask = 0 -> use defaults. */ gc = XCreateGC(display, toplevel, valuemask, &values); gc_menus = XCreateGC(display, toplevel, valuemask, &values); /* Create XOR graphics context for Rubber Banding */ values.function = GXxor; values.foreground = colors[BLACK]; gcxor = XCreateGC(display, toplevel, (GCFunction | GCForeground), &values); /* specify font for menus. */ load_font(menu_font_size); font_is_loaded[menu_font_size] = 1; XSetFont(display, gc_menus, font_info[menu_font_size]->fid); /* Set drawing defaults for user-drawable area. Use whatever the * * initial values of the current stuff was set to. */ force_setfontsize(currentfontsize); force_setcolor (currentcolor); force_setlinestyle (currentlinestyle); force_setlinewidth (currentlinewidth); XStringListToTextProperty(&window_name, 1, &windowName); XSetWMName (display, toplevel, &windowName); /* XSetWMIconName (display, toplevel, &windowName); */ /* set line attributes */ /* XSetLineAttributes(display, gc, line_width, line_style, cap_style, join_style); */ /* set dashes */ /* XSetDashes(display, gc, dash_offset, dash_list, list_length); */ XMapWindow (display, toplevel); build_textarea(); build_menu(); /* The following is completely unnecessary if the user is using the * * interactive (event_loop) graphics. It waits for the first Expose * * event before returning so that I can tell the window manager has got * * the top-level window up and running. Thus the user can start drawing * * into this window immediately, and there's no danger of the window not * * being ready and output being lost. */ XPeekIfEvent (display, &event, test_if_exposed, NULL); }
GtkWidget* XNavGtk::build_menu(GtkWidget* Parent, int MenuType, const char* MenuTitle, void* MenuUserData, void (*Callback)(GtkWidget*, gpointer), void* CallbackData, xmenu_sMenuItem* Items, int* idx) { GtkWidget *Menu, *W; int i; unsigned int Level; Menu = (GtkWidget*)g_object_new(GTK_TYPE_MENU, NULL); g_object_set_data((GObject*)Menu, "userdata", (gpointer)MenuUserData); Level = Items[*idx].Level; for (; Items[*idx].Level != 0 && Items[*idx].Level >= Level; (*idx)++) { switch (Items[*idx].Item) { case xmenu_eMenuItem_Ref: { if (MenuType == MENU_OPTION) { printf("You can't have submenus from option menu items."); return NULL; } i = *idx; GtkWidget* sub = gtk_menu_item_new_with_label( CoWowGtk::translate_utf8(Items[*idx].Name)); (*idx)++; W = build_menu(Menu, MENU_PULLDOWN, Lng::translate(Items[i].Name), MenuUserData, Callback, CallbackData, Items, idx); (*idx)--; gtk_menu_item_set_submenu(GTK_MENU_ITEM(sub), GTK_WIDGET(W)); gtk_menu_shell_append(GTK_MENU_SHELL(Menu), sub); gtk_widget_show(sub); break; } case xmenu_eMenuItem_Cascade: { if (MenuType == MENU_OPTION) { printf("You can't have submenus from option menu items."); return NULL; } // Check that the Cascade contains any pushbuttons int found = 0; unsigned int cascade_level = Items[*idx].Level; int cidx; for (cidx = *idx + 1; Items[cidx].Level != 0 && Items[cidx].Level > cascade_level; cidx++) { if (Items[cidx].Item == xmenu_eMenuItem_Ref || Items[cidx].Item == xmenu_eMenuItem_Button) { found = 1; break; } } if (found) { i = *idx; GtkWidget* sub = gtk_menu_item_new_with_label( CoWowGtk::translate_utf8(Items[*idx].Name)); (*idx)++; W = build_menu(Menu, MENU_PULLDOWN, Lng::translate(Items[i].Name), MenuUserData, Callback, CallbackData, Items, idx); (*idx)--; gtk_menu_item_set_submenu(GTK_MENU_ITEM(sub), GTK_WIDGET(W)); gtk_menu_shell_append(GTK_MENU_SHELL(Menu), sub); gtk_widget_show(sub); } else { *idx = cidx - 1; } break; } case xmenu_eMenuItem_Separator: // Separator W = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(Menu), W); gtk_widget_show(W); break; case xmenu_eMenuItem_Button: // Pushbutton W = gtk_menu_item_new_with_label( CoWowGtk::translate_utf8(Items[*idx].Name)); gtk_widget_set_sensitive(W, Items[*idx].Flags.f.Sensitive ? TRUE : FALSE); g_object_set_data((GObject*)W, "userdata", (gpointer)((long int)*idx)); if (Callback) g_signal_connect(W, "activate", G_CALLBACK(Callback), CallbackData); gtk_menu_shell_append(GTK_MENU_SHELL(Menu), W); gtk_widget_show(W); break; default:; } } return Menu; }
int main(int argc, char **argv) { /* args parser */ Parameters::config p_c {40, 90, 3, 1, 13, 5, 3, 2, Parameters::lang_us}; Parameters p(argc, argv, p_c); build_menu(&p); try { p.parse_params(); } /* catch errors on parameters */ catch(const std::exception& e) { std::cerr << "error :" << std::endl << " " << e.what() << std::endl; std::cerr << "You can use \"--help\" to get more help." << std::endl; return 0; } /* stops if no arg or help requested */ if(p.is_spec("help") || argc==1) { p.print_help(); return 0; } /* or if license is needed */ else if(p.is_spec("license")) { p.print_license(); return 0; } /* checks incompatibility among parameters */ if(!check_errors(&p)) { std::cerr << "You can use \"--help\" to get more help." << std::endl; return 0; } /* add slash to MNIST folder */ std::string mnist_folder = ""; if(p.is_spec("mnist")) { mnist_folder = p.str_val("mnist"); if(mnist_folder.length()>0 && mnist_folder.at(mnist_folder.length()-1)!='/') mnist_folder.push_back('/'); } /* initializations */ srand(static_cast<unsigned int>(time(NULL))); /* DigitScanner */ DigitScanner<float> dgs; if(p.is_spec("hlayers")) { if(p.num_val<int>("hlayers", 1)==0) dgs.set_layers({784, 10}); else if(p.num_val<int>("hlayers", 2)==0) dgs.set_layers({784, p.num_val<int>("hlayers", 1), 10}); else dgs.set_layers({784, p.num_val<int>("hlayers", 1), p.num_val<int>("hlayers", 2), 10}); } else if(p.is_spec("fnnin")) { if(!dgs.load(p.str_val("fnnin"))) return 0; } /* actions */ if(p.is_spec("train")) { dgs.train(mnist_folder, p.num_val<int>("train", 1), p.num_val<int>("train", 2), p.num_val<int>("train", 3), p.num_val<int>("train", 4), p.num_val<double>("eta"), p.num_val<double>("alpha"), p.num_val<int>("threads")); } if(p.is_spec("test")) { dgs.test(mnist_folder, p.num_val<int>("test", 1), p.num_val<int>("test", 2), p.num_val<int>("threads")); } /* save */ if(p.is_spec("fnnout")) { dgs.save(p.str_val("fnnout")); } /* gui */ if(p.is_spec("gui")) { Window *w = new Window(280, 280); w->set_dgs(&dgs); w->set_scene_width(280); w->init(); w->launch(); } return 0; }
Widget XNavMotif::build_menu( Widget Parent, int MenuType, const char *MenuTitle, void *MenuUserData, void (*Callback)( Widget, XNav *, XmAnyCallbackStruct *), void *CallbackData, xmenu_sMenuItem *Items, int *idx) { Widget Menu, Cascade, W; int i; unsigned int Level; XmString Str; WidgetClass Class; Arg ArgList[5]; XmFontList fontlist; XFontStruct *font; XmFontListEntry fontentry; // Set default fontlist font = XLoadQueryFont( flow_Display(Parent), "-*-Helvetica-Bold-R-Normal--12-*-*-*-P-*-ISO8859-1"); fontentry = XmFontListEntryCreate( (char*) "tag1", XmFONT_IS_FONT, font); fontlist = XmFontListAppendEntry( NULL, fontentry); XtFree( (char *)fontentry); i = 0; XtSetArg(ArgList[i], XmNuserData, MenuUserData); i++; XtSetArg(ArgList[i], XmNbuttonFontList, fontlist); i++; XtSetArg(ArgList[i], XmNlabelFontList, fontlist); i++; if (MenuType == MENU_PULLDOWN || MenuType == MENU_OPTION) Menu = XmCreatePulldownMenu(Parent, (char*) "_pulldown", ArgList, i); else if (MenuType == MENU_POPUP) Menu = XmCreatePopupMenu(Parent, (char*) "_popup", ArgList, i); else { XtWarning("Invalid menu type passed to BuildMenu()."); return NULL; } if (MenuType == MENU_PULLDOWN) { Str = XmStringCreateSimple((char*) MenuTitle); Cascade = XtVaCreateManagedWidget(MenuTitle, xmCascadeButtonGadgetClass, Parent, XmNsubMenuId, Menu, XmNlabelString, Str, NULL); XmStringFree(Str); } else if (MenuType == MENU_OPTION) { Str = XmStringCreateSimple((char*) MenuTitle); XtSetArg(ArgList[0], XmNsubMenuId, Menu); XtSetArg(ArgList[1], XmNlabelString, Str); Cascade = XmCreateOptionMenu(Parent, (char*) MenuTitle, ArgList, 2); XmStringFree(Str); } XmFontListFree( fontlist); Level = Items[*idx].Level; for (; Items[*idx].Level != 0 && Items[*idx].Level >= Level; (*idx)++) { if (Items[*idx].Item == xmenu_eMenuItem_Cascade || Items[*idx].Item == xmenu_eMenuItem_Ref) { if (MenuType == MENU_OPTION) { XtWarning("You can't have submenus from option menu items."); return NULL; } else { i = *idx; (*idx)++; build_menu(Menu, MENU_PULLDOWN, Lng::translate( Items[i].Name), MenuUserData, Callback, CallbackData, Items, idx); (*idx)--; } } else { if (Items[*idx].Item == xmenu_eMenuItem_Separator) Class = xmSeparatorGadgetClass; else Class = xmPushButtonGadgetClass; W = XtVaCreateManagedWidget(Lng::translate( Items[*idx].Name), Class, Menu, XmNuserData, *idx, XmNsensitive, (Boolean)(Items[*idx].Flags.f.Sensitive == 1), NULL); if (Callback && Class == xmPushButtonGadgetClass) XtAddCallback(W, XmNactivateCallback, (XtCallbackProc) Callback, (XtPointer) CallbackData); } } return MenuType == MENU_POPUP ? Menu : Cascade; }
static void update_actions (void) { GtkAction *action; WebKitWebBackForwardList *back_forward_list; WebKitWebFrame *frame; back_forward_list = webkit_web_view_get_back_forward_list (WEBKIT_WEB_VIEW (view)); /* update the back button and its menu */ action = gtk_ui_manager_get_action (ui_manager, "/ui/help-browser-popup/back"); gtk_action_set_sensitive (action, webkit_web_view_can_go_back (WEBKIT_WEB_VIEW (view))); if (back_forward_list) { const GList *list; list = webkit_web_back_forward_list_get_back_list_with_limit (back_forward_list, 12); gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (button_prev), build_menu (list, TRUE)); } else { gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (button_prev), NULL); } /* update the forward button and its menu */ action = gtk_ui_manager_get_action (ui_manager, "/ui/help-browser-popup/forward"); gtk_action_set_sensitive (action, webkit_web_view_can_go_forward (WEBKIT_WEB_VIEW (view))); if (back_forward_list) { const GList *list; list = webkit_web_back_forward_list_get_forward_list_with_limit (back_forward_list, 12); gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (button_next), build_menu (list, FALSE)); } else { gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (button_next), NULL); } /* update the copy-location action */ action = gtk_ui_manager_get_action (ui_manager, "/ui/help-browser-popup/copy-location"); frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (view)); gtk_action_set_sensitive (action, webkit_web_frame_get_uri (frame) != NULL); /* update the show-index action */ action = gtk_ui_manager_get_action (ui_manager, "/ui/help-browser-popup/show-index"); gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), gtk_widget_get_visible (sidebar)); }
int main(int argc, char **argv) { int rc = 0; struct cfgdata_t cfg; struct params_t params; kx_inputs inputs; lg = log_open(16); log_msg(lg, "%s starting", PACKAGE_STRING); initmode = do_init(); /* Get cmdline parameters */ params.cfg = &cfg; init_cfgdata(&cfg); cfg.angle = 0; /* No rotation by default */ parse_cmdline(&cfg); kxb_ttydev = cfg.ttydev; setup_terminal(kxb_ttydev, &kxb_echo_state, 1); /* Setup function that will restore terminal when exit() will called */ atexit(atexit_restore_terminal); log_msg(lg, "FB angle is %d, tty is %s", cfg.angle, cfg.ttydev); #ifdef USE_MACHINE_KERNEL machine_kernel = get_machine_kernelpath(); /* FIXME should be passed as arg to get_bootinfo() */ #endif #ifdef USE_DELAY /* extra delay for initializing slow SD/CF */ sleep(USE_DELAY); #endif int no_ui = 1; /* UI presence flag */ #ifdef USE_FBMENU params.gui = NULL; if (no_ui) { params.gui = gui_init(cfg.angle); if (NULL == params.gui) { log_msg(lg, "Can't initialize GUI"); } else no_ui = 0; } #endif #ifdef USE_TEXTUI FILE *ttyfp; params.tui = NULL; if (no_ui) { if (cfg.ttydev) ttyfp = fopen(cfg.ttydev, "w"); else ttyfp = stdout; params.tui = tui_init(ttyfp); if (NULL == params.tui) { log_msg(lg, "Can't initialize TUI"); if (ttyfp != stdout) fclose(ttyfp); } else no_ui = 0; } #endif if (no_ui) exit(-1); /* Exit if no one UI was initialized */ params.menu = build_menu(¶ms); params.bootcfg = NULL; scan_devices(¶ms); if (-1 == fill_menu(¶ms)) { exit(-1); } /* Collect input devices */ inputs_init(&inputs, 8); inputs_open(&inputs); inputs_preprocess(&inputs); /* Run main event loop * Return values: <0 - error, >=0 - selected item id */ rc = do_main_loop(¶ms, &inputs); #ifdef USE_FBMENU if (params.gui) { if (rc < 0) gui_clear(params.gui); gui_destroy(params.gui); } #endif #ifdef USE_TEXTUI if (params.tui) { tui_destroy(params.tui); if (ttyfp != stdout) fclose(ttyfp); } #endif inputs_close(&inputs); inputs_clean(&inputs); log_close(lg); lg = NULL; /* rc < 0 indicate error */ if (rc < 0) exit(rc); menu_destroy(params.menu, 0); if (rc >= A_DEVICES) { start_kernel(¶ms, rc - A_DEVICES); } /* When we reach this point then some error has occured */ DPRINTF("We should not reach this point!"); exit(-1); }