void sig_cont( struct terminal *term ) { if ( unblock_itrm( ) ) { return; } }
void unblock_terminal(struct terminal *term) { close_handle((void *)term->blocked); term->blocked = -1; set_handlers(term->fdin, (void (*)(void *))in_term, NULL, (void (*)(void *))destroy_terminal, term); unblock_itrm(term->fdin); redraw_terminal_cls(term); }
/** A select_handler_T read_func and error_func for the pipe (long) @a h. * This is called when the subprocess started on the terminal of this * ELinks process exits. ELinks then resumes using the terminal. */ static void unblock_itrm_x(void *h) { close_handle(h); if (!ditrm) return; unblock_itrm(); /* Note: External editor support depends on this resize event. */ resize_terminal(); }
void sig_cont(struct terminal *t) { if (!F) { unblock_itrm(1); #ifdef G } else { drv->unblock(NULL); #endif } /*else register_bottom_half(raise, SIGSTOP);*/ }
void poll_fg(void *t) { int r; fg_poll_timer = -1; r = unblock_itrm(1); if (r == -1) { fg_poll_timer = install_timer(FG_POLL_TIME, poll_fg, t); } if (r == -2) { /* This will unblock externally spawned viewer, if it exists */ #ifdef SIGCONT kill(0, SIGCONT); #endif } }
static void poll_fg(void *t) { int r; fg_poll_timer = -1; if (!F) { r = unblock_itrm(1); #ifdef G } else { r = drv->unblock(NULL); #endif } if (r == -1) { fg_poll_timer = install_timer(FG_POLL_TIME, poll_fg, t); } if (r == -2) { /* This will unblock externally spawned viewer, if it exists */ #ifdef SIGCONT EINTRLOOP(r, kill(0, SIGCONT)); #endif } }
void sig_cont(struct terminal *t) { unblock_itrm(1); }
static void sig_cont(struct terminal *term) { if (!unblock_itrm()) resize_terminal(); }
/** A select_handler_T read_func for itrm_in.sock. A slave process * calls this when the master sends it data to be displayed. The * master process never calls this. */ static void in_sock(struct itrm *itrm) { struct string path; struct string delete_; char ch; int fg; /* enum term_exec */ ssize_t bytes_read, i, p; unsigned char buf[ITRM_OUT_QUEUE_SIZE]; bytes_read = safe_read(itrm->in.sock, buf, ITRM_OUT_QUEUE_SIZE); if (bytes_read <= 0) goto free_and_return; qwerty: for (i = 0; i < bytes_read; i++) if (!buf[i]) goto has_nul_byte; safe_hard_write(itrm->out.std, buf, bytes_read); return; has_nul_byte: if (i) safe_hard_write(itrm->out.std, buf, i); i++; assert(ITRM_OUT_QUEUE_SIZE - i > 0); memmove(buf, buf + i, ITRM_OUT_QUEUE_SIZE - i); bytes_read -= i; p = 0; #define RD(xx) { \ unsigned char cc; \ \ if (p < bytes_read) \ cc = buf[p++]; \ else if ((hard_read(itrm->in.sock, &cc, 1)) <= 0) \ goto free_and_return; \ xx = cc; \ } RD(fg); if (!init_string(&path)) goto free_and_return; while (1) { RD(ch); if (!ch) break; add_char_to_string(&path, ch); } if (!init_string(&delete_)) { done_string(&path); goto free_and_return; } while (1) { RD(ch); if (!ch) break; add_char_to_string(&delete_, ch); } #undef RD if (!*path.source) { dispatch_special(delete_.source); } else { int blockh; unsigned char *param; int path_len, del_len, param_len; /* TODO: Should this be changed to allow TERM_EXEC_NEWWIN * in a blocked terminal? There is similar code in * exec_on_terminal(). --KON, 2007 */ if (is_blocked() && fg != TERM_EXEC_BG) { if (*delete_.source) unlink(delete_.source); goto nasty_thing; } path_len = path.length; del_len = delete_.length; param_len = path_len + del_len + 3; param = mem_alloc(param_len); if (!param) goto nasty_thing; param[0] = fg; memcpy(param + 1, path.source, path_len + 1); memcpy(param + 1 + path_len + 1, delete_.source, del_len + 1); if (fg == TERM_EXEC_FG) block_itrm(); blockh = start_thread((void (*)(void *, int)) exec_thread, param, param_len); mem_free(param); if (blockh == -1) { if (fg == TERM_EXEC_FG) unblock_itrm(); goto nasty_thing; } if (fg == TERM_EXEC_FG) { set_handlers(blockh, (select_handler_T) unblock_itrm_x, NULL, (select_handler_T) unblock_itrm_x, (void *) (long) blockh); } else { set_handlers(blockh, close_handle, NULL, close_handle, (void *) (long) blockh); } } nasty_thing: done_string(&path); done_string(&delete_); assert(ITRM_OUT_QUEUE_SIZE - p > 0); memmove(buf, buf + p, ITRM_OUT_QUEUE_SIZE - p); bytes_read -= p; goto qwerty; free_and_return: free_itrm(itrm); }