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(); }
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 }
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(); }
void term_color(int code) { term_attr = (code%8) | (term_attr & (256-8)); term_attr_set(); }
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; }