static int display_menu(void) { int ret=0; int maxx,maxy; int curr; do_init_dialog(); getmaxyx(stdscr, maxy, maxx); dialog_vars.help_button=1; dialog_vars.item_help=1; loop: switch(ret=dlg_checklist("Welcome to pkg_cleanup.", "These are the leaf packages installed on your system\nChose the packages to deinstall. Help will display the package description.", maxy-1, maxx, maxy-9, menulen, menu, " X", FLAG_CHECK, &curr)) { case DLG_EXIT_HELP: { char *p = read_desc(menu[curr].ITEM_PROMPT); if(p) { dialog_vars.help_button=0; dialog_msgbox(menu[curr].ITEM_DATA, p, maxy-4, maxx-4, TRUE); dialog_vars.help_button=1; free(p); } goto loop; } case 0: ret=0; break; default: ret=-1; break; } dialog_vars.help_button=0; dialog_vars.item_help=0; end_dialog(); return(ret); }
static int keep_going(void) { int ret; do_init_dialog(); ret = !dialog_yesno(NULL,"Do you want to process the new leaves packages?",-1,-1); end_dialog(); return(ret); }
/* Goes through the glob contents, looking for zero-length +REQUIRED-BY */ static int read_pkglist(int loops) { FILE *pkg; char line[1024]; char *p; do_init_dialog(); dialog_msgbox(NULL, "Searching for leaves", 5, 23, FALSE); fflush(stdout); pkg=popen("/usr/sbin/pkg query -e \"%#r=0 && %k=0\" \"%n-%v\\t%c\"", "r"); if(!pkg) { fputs("Error executing pkg.\n", stderr); return -1; } while(fgets(line, sizeof(line), pkg)!=NULL) { for(p=strchr(line, 0)-1; p>line && isspace(*p); p--) *p=0; p=strtok(line, "\t"); p=strtok(NULL, "\0"); add_item(line, p?p:""); } if(WEXITSTATUS(pclose(pkg)) && menulen==0) { fputs("pkg returned an error.\n", stderr); return -1; } dlg_clear(); if(menulen==0) { if(loops) dialog_msgbox(NULL, "No new leaves found", 5, 23, TRUE); else dialog_msgbox(NULL, "No leaves found", 5, 19, TRUE); end_dialog(); return(-1); } end_dialog(); return(0); }
//*********************************************************************** static LRESULT CALLBACK TermProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static bool main_timer_ran_once = false ; static uint quarter_seconds = 0 ; // static uint curr_redraw_counts = 0 ; // static uint ref_redraw_counts = 0 ; //*************************************************** // debug: log all windows messages //*************************************************** if (dbg_flags & DBG_WINMSGS) { switch (iMsg) { // list messages to be ignored case WM_CTLCOLORBTN: case WM_CTLCOLORSTATIC: case WM_CTLCOLOREDIT: case WM_CTLCOLORDLG: case WM_MOUSEMOVE: case 295: // WM_CHANGEUISTATE case WM_NCMOUSEMOVE: case WM_NCMOUSELEAVE: case WM_NCHITTEST: case WM_SETCURSOR: case WM_ERASEBKGND: case WM_TIMER: case WM_NOTIFY: case WM_COMMAND: // prints its own msgs below break; default: syslog("TOP [%s]\n", lookup_winmsg_name(iMsg)) ; break; } } switch(iMsg) { case WM_INITDIALOG: do_init_dialog(hwnd) ; // wpOrigMainProc = (WNDPROC) SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG) MainSubclassProc); return TRUE; //******************************************************************** case WM_TIMER: switch (wParam) { case IDT_TIMER_MAIN: if (!main_timer_ran_once) { main_timer_ran_once = true ; KillTimer(hwnd, main_timer_id) ; draw_intro_screen(hwnd) ; prog_init_done = true ; // main_timer_id = SetTimer(hwnd, IDT_TIMER_MAIN, 1000, (TIMERPROC) NULL) ; main_timer_id = SetTimer(hwnd, IDT_TIMER_MAIN, 244, (TIMERPROC) NULL) ; } else { if (++quarter_seconds >= 4) { quarter_seconds = 0 ; update_cursor() ; } // syslog("next_timer...redraw_in_progress=%s\n", (redraw_in_progress) ? "true" : "false") ; if (redraw_in_progress) { // syslog("redraw counts: %u vs %u\n", curr_redraw_counts, ref_redraw_counts) ; // if (ref_redraw_counts != 0 && ref_redraw_counts == curr_redraw_counts) { // syslog("redraw main screen\n") ; redraw_in_progress = false ; if (!is_intro_screen_active()) { draw_current_screen() ; show_treasures() ; } // } // ref_redraw_counts = curr_redraw_counts ; } } return TRUE; default: break; // return DefWindowProcA(hwnd, iMsg, wParam, lParam); } break; case WM_NOTIFY: return term_notify(hwnd, lParam) ; //*********************************************************************************************** // 04/16/14 - unfortunately, I cannot use WM_SIZE, nor any other message, to draw my graphics, // because some other message occurs later and over-writes my work... //*********************************************************************************************** case WM_SIZE: if (wParam == SIZE_RESTORED) { // syslog("WM_SIZE\n") ; redraw_in_progress = true ; } //******************************************************************************************** // The last operations in the dialog redraw, are subclassed WM_CTLCOLORSTATIC messages. // So, to determine when it is all done, I need to somehow recognize when these are done, // and then update our graphics objects. //******************************************************************************************** return TRUE; // this occurs during program startup case WM_ERASEBKGND: // syslog("WM_ERASEBKGND\n") ; redraw_in_progress = true ; break; case WM_COMMAND: { // create local context DWORD cmd = HIWORD (wParam) ; DWORD target = LOWORD(wParam) ; switch (cmd) { case FVIRTKEY: // keyboard accelerators: WARNING: same code as CBN_SELCHANGE !! // fall through to BM_CLICKED, which uses same targets case BN_CLICKED: switch(target) { case IDB_HELP: queryout("Terminal keyboard shortcuts") ; infoout("Alt-s = send command (i.e., print command in terminal)") ; infoout("Alt-h = show this help screen") ; infoout("Alt-c = Close this program") ; break; case IDB_CLOSE: PostMessageA(hwnd, WM_CLOSE, 0, 0); break; } //lint !e744 switch target return true; } //lint !e744 switch cmd break; } //lint !e438 !e10 end local context //******************************************************************** // application shutdown handlers //******************************************************************** case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; // default: // return false; } //lint !e744 switch(iMsg) return false; }
static int remove_packages(void) { char **args; char *env[1]={NULL}; char **p; int i; int delete_count=0; pid_t child; int status; size_t st; args=(char **)malloc((menulen+4) * sizeof(char *)); if(!args) { do_init_dialog(); dialog_msgbox("ERROR", "Can not allocate memory for package list!", 5, 45, TRUE); end_dialog(); return(-1); } p=args; *(p++)="/usr/sbin/pkg"; *(p++)="delete"; *(p++)="-y"; for(i=0;i<menulen;i++) { if(menu[i].ITEM_CHECKED) { *(p++)=menu[i].ITEM_PROMPT; delete_count++; } } *(p)=NULL; if(!delete_count) { do_init_dialog(); dialog_msgbox(NULL, "No packages selected", 5, 24, TRUE); end_dialog(); free(args); return(-1); } /* Ensure stdio is "right" */ if(!isendwin()) endwin(); child=vfork(); if(child==0) { execve(args[0], args, env); fprintf(stderr,"ERROR: %d!\n",errno); _exit(EXIT_FAILURE); } free(args); if(child==-1) { do_init_dialog(); dialog_msgbox(NULL, "Can not fork()", 5, 18, TRUE); end_dialog(); return(-1); } waitpid(child, &status, 0); /* On an error return, pause */ if(WIFSIGNALED(status) || (WIFEXITED(status) && WEXITSTATUS(status))) { fputs("\n\nPress ENTER to continue... ",stderr); fgetln(stdin, &st); } return(0); }