Пример #1
0
void display_word(char *str, int *x, int *y) {
    term_attr_set(color_word[theme_no]);
    while(*str) {
        if(*y >= term_height - 1)
            break;
        str = putkchar(str, x, y);
    }
    term_attr_reset();
}
Пример #2
0
void term_reverse(Bool onoff)
{
/* Another attributes are ignored. */
#ifdef CURSES
    if (onoff){
	attron(A_REVERSE);
    } else {
	attroff(A_REVERSE);
    }
#else
    term_attr = (term_attr & 7) | (onoff << 3);
    term_attr_set();
#endif
}
Пример #3
0
void print_status(MYD myd, int n_match) {
    int i;
    char str[256];

    snprintf(str, sizeof(str), "%d/%d", n_match, myd_n_index(myd));
    str[255] = '\0';

    term_move(0, term_height-1);
    term_attr_set("7");

    i = term_width - 1 - strlen(str);
    for(; i>0; i--)
        putchar(' ');
    fputs(str, stdout);

    term_attr_reset();
}
Пример #4
0
void term_color(int code)
{
    term_attr = (code%8) | (term_attr & (256-8));
    term_attr_set();
}
Пример #5
0
int job_wait(struct job *j, int async)
{
	int wait_status = 0, proc_still_running = 0;
	struct proc *p;
	pid_t pid;
	pid_t wait_on_me;

#define JOB_WAIT_CHANGE_GROUP
#ifdef JOB_WAIT_CHANGE_GROUP
	pid_t orig_pgid;
	int save;

	if(interactive)
		orig_pgid = getpgid(STDIN_FILENO);
#endif

rewait:
	if(interactive){
		if(j->tconf_got)
			term_attr_set(&j->tconf);
		else
			term_attr_orig();

#ifdef JOB_WAIT_CHANGE_GROUP
		term_give_to(j->gid);
		/*setpgid(getpid(), j->gid);*/
#endif
	}

	if(j->gid){
		wait_on_me = -j->gid;
	}else{
		struct proc *p = job_first_proc(j);

		if(p)
			wait_on_me = p->pid;
		else
			wait_on_me = j->proc->pid; /* guess */
	}

	pid = waitpid(wait_on_me, &wait_status,
			WUNTRACED | WCONTINUED | (async ? WNOHANG : 0));

	if(interactive){
#ifdef JOB_WAIT_CHANGE_GROUP
		save = errno;
		term_give_to(orig_pgid);
		/*setpgid(getpid(), orig_pgid);*/
		errno = save;
#endif

		term_attr_get(&j->tconf);
		j->tconf_got = 1;
		term_attr_ush();
	}


	if(pid == -1){
		if(errno == EINTR)
			goto rewait;
		else
			fprintf(stderr, "waitpid(%d [job %d: \"%s\"], async = %s): %s\n",
					-j->gid, j->job_id, j->cmd, async ? "true" : "false",
					strerror(errno));

		return 1;
	}else if(pid == 0 && async)
		return 0;


	for(p = j->proc; p; p = p->next)
		if(p->pid == pid){
			if(WIFSIGNALED(wait_status)){
				p->state = PROC_FIN;

				p->exit_sig = WTERMSIG(wait_status);
				p->exit_code = WEXITSTATUS(wait_status); /* 0 */
			}else if(WIFEXITED(wait_status)){
				p->state = PROC_FIN;

				p->exit_sig = 0;
				p->exit_code = WEXITSTATUS(wait_status);
			}else if(WIFSTOPPED(wait_status)){
				p->state = PROC_STOP;

				p->exit_sig = WSTOPSIG(wait_status); /* could be TTIN or pals */
				proc_still_running = 1;
			}else if(WIFCONTINUED(wait_status)){
				p->state = PROC_RUN;

				p->exit_sig = SIGCONT;
				proc_still_running = 1;
			}else
				fprintf(stderr, "job_wait(): wait_status unknown for pid %d: 0x%x\n", pid, wait_status);
		}else if(p->state != PROC_FIN)
			proc_still_running = 1;


	if(!proc_still_running)
		j->state = JOB_COMPLETE;
	return 0;
}