Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
/* 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);
}
Пример #4
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;
}
Пример #5
0
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);
}