コード例 #1
0
ファイル: printtext.c プロジェクト: svn2github/irssi
void printformat_module_dest_args(const char *module, TEXT_DEST_REC *dest,
				  int formatnum, va_list va)
{
	char *arglist[MAX_FORMAT_PARAMS];
	char buffer[DEFAULT_FORMAT_ARGLIST_SIZE];
	FORMAT_REC *formats;
	THEME_REC *theme;
	char *str;

	theme = window_get_theme(dest->window);

	formats = g_hash_table_lookup(default_formats, module);
	format_read_arglist(va, &formats[formatnum],
			    arglist, sizeof(arglist)/sizeof(char *),
			    buffer, sizeof(buffer));

	if (!sending_print_starting) {
		sending_print_starting = TRUE;
		signal_emit_id(signal_print_starting, 1, dest);
                sending_print_starting = FALSE;
	}

	signal_emit_id(signal_print_format, 5, theme, module,
		       dest, GINT_TO_POINTER(formatnum), arglist);

	str = format_get_text_theme_charargs(theme, module, dest,
					     formatnum, arglist);
	if (str != NULL && *str != '\0') print_line(dest, str);
	g_free(str);
}
コード例 #2
0
ファイル: printtext.c プロジェクト: Brijen/MacIrssi
static void sig_print_text(TEXT_DEST_REC *dest, const char *text)
{
        THEME_REC *theme;
	char *str, *tmp;

	g_return_if_fail(dest != NULL);
	g_return_if_fail(text != NULL);

	if (dest->window == NULL) {
                str = strip_codes(text);
		printf("NO WINDOWS: %s\n", str);
                g_free(str);
                return;
	}

	msg_beep_check(dest);

        if ((dest->level & MSGLEVEL_NEVER) == 0)
		dest->window->last_line = time(NULL);

	/* add timestamp/server tag here - if it's done in print_line()
	   it would be written to log files too */
        theme = window_get_theme(dest->window);
	tmp = format_get_line_start(theme, dest, time(NULL));
	str = !theme->info_eol ? format_add_linestart(text, tmp) :
		format_add_lineend(text, tmp);

	g_free_not_null(tmp);

	format_send_to_gui(dest, str);
	g_free(str);

	signal_emit_id(signal_gui_print_text_finished, 1, dest->window);
}
コード例 #3
0
ファイル: fe-exec.c プロジェクト: svn2github/irssi
static void sig_pidwait(void *pid, void *statusp)
{
	PROCESS_REC *rec;
        char *str;
	int status = GPOINTER_TO_INT(statusp);

        rec = process_find_pid(GPOINTER_TO_INT(pid));
	if (rec == NULL) return;

	/* process exited - print the last line if
	   there wasn't a newline at end. */
	if (line_split("\n", 1, &str, &rec->databuf) > 0 && *str != '\0')
		signal_emit_id(signal_exec_input, 2, rec, str);

	if (!rec->silent) {
		if (WIFSIGNALED(status)) {
			status = WTERMSIG(status);
			printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
				  "process %d (%s) terminated with signal %d (%s)",
				  rec->id, rec->args,
				  status, g_strsignal(status));
		} else {
                        status = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
			printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
				  "process %d (%s) terminated with return code %d",
				  rec->id, rec->args, status);
		}
	}
	process_destroy(rec, status);
}
コード例 #4
0
ファイル: fe-exec.c プロジェクト: svn2github/irssi
static void sig_exec_input_reader(PROCESS_REC *rec)
{
        char tmpbuf[512], *str;
        unsigned int recvlen;
	int err, ret;

	g_return_if_fail(rec != NULL);

	recvlen = 0;
	err = g_io_channel_read(rec->in, tmpbuf,
				sizeof(tmpbuf), &recvlen);
	if (err != 0 && err != G_IO_ERROR_AGAIN && errno != EINTR)
		recvlen = -1;

	do {
		ret = line_split(tmpbuf, recvlen, &str, &rec->databuf);
		if (ret == -1) {
			/* link to terminal closed? */
			g_source_remove(rec->read_tag);
                        rec->read_tag = -1;
			break;
		}

		if (ret > 0) {
			signal_emit_id(signal_exec_input, 2, rec, str);
                        if (recvlen > 0) recvlen = 0;
		}
	} while (ret > 0);
}
コード例 #5
0
ファイル: printtext.c プロジェクト: Brijen/MacIrssi
void printformat_module_dest_charargs(const char *module, TEXT_DEST_REC *dest,
				      int formatnum, char **arglist)
{
	THEME_REC *theme;
	char *str;

	theme = window_get_theme(dest->window);

	if (!sending_print_starting) {
		sending_print_starting = TRUE;
		signal_emit_id(signal_print_starting, 1, dest);
                sending_print_starting = FALSE;
	}

	signal_emit_id(signal_print_format, 5, theme, module,
		       dest, GINT_TO_POINTER(formatnum), arglist);

	str = format_get_text_theme_charargs(theme, module, dest,
					     formatnum, arglist);
	if (str != NULL && *str != '\0') print_line(dest, str);
	g_free(str);
}
コード例 #6
0
ファイル: printtext.c プロジェクト: Brijen/MacIrssi
static void printtext_dest_args(TEXT_DEST_REC *dest, const char *text, va_list va)
{
	char *str;

	if (!sending_print_starting) {
		sending_print_starting = TRUE;
		signal_emit_id(signal_print_starting, 1, dest);
                sending_print_starting = FALSE;
	}

	str = printtext_get_args(dest, text, va);
	print_line(dest, str);
	g_free(str);
}
コード例 #7
0
ファイル: rawlog.c プロジェクト: ailin-nemui/irssi
/* NOTE! str must be dynamically allocated and must not be freed after! */
static void rawlog_add(RAWLOG_REC *rawlog, char *str)
{
	if (rawlog->lines->length >= rawlog_lines && rawlog_lines > 0) {
		void *tmp = g_queue_pop_head(rawlog->lines);
		g_free(tmp);
	}

	if (rawlog->logging) {
		write_buffer(rawlog->handle, str, strlen(str));
		write_buffer(rawlog->handle, "\n", 1);
	}

	g_queue_push_tail(rawlog->lines, str);
	signal_emit_id(signal_rawlog, 2, rawlog, str);
}
コード例 #8
0
ファイル: pidwait.c プロジェクト: svn2github/irssi
static int child_check(void)
{
    GSList *tmp, *next;
    int status;

    /* wait for each pid.. */
    for (tmp = pids; tmp != NULL; tmp = next) {
        next = tmp->next;
        if (waitpid(GPOINTER_TO_INT(tmp->data), &status, WNOHANG) > 0) {
            /* process terminated, remove from list */
            pids = g_slist_remove(pids, tmp->data);
            signal_emit_id(signal_pidwait, 1, GPOINTER_TO_INT(tmp->data));
        }
    }
    return 1;
}
コード例 #9
0
ファイル: rawlog.c プロジェクト: svn2github/irssi
/* NOTE! str must be dynamically allocated and must not be freed after! */
static void rawlog_add(RAWLOG_REC *rawlog, char *str)
{
	if (rawlog->nlines < rawlog_lines || rawlog_lines <= 2)
		rawlog->nlines++;
	else {
		g_free(rawlog->lines->data);
		rawlog->lines = g_slist_remove(rawlog->lines, rawlog->lines->data);
	}

	if (rawlog->logging) {
		write(rawlog->handle, str, strlen(str));
		write(rawlog->handle, "\n", 1);
	}

	rawlog->lines = g_slist_append(rawlog->lines, str);
	signal_emit_id(signal_rawlog, 2, rawlog, str);
}
コード例 #10
0
ファイル: printtext.c プロジェクト: Brijen/MacIrssi
/* Like printtext(), but don't handle %s etc. */
void printtext_string(void *server, const char *target, int level, const char *text)
{
	TEXT_DEST_REC dest;
        char *str;

	g_return_if_fail(text != NULL);

        format_create_dest(&dest, server, target, level, NULL);

	if (!sending_print_starting) {
		sending_print_starting = TRUE;
		signal_emit_id(signal_print_starting, 1, &dest);
                sending_print_starting = FALSE;
	}

        str = printtext_expand_formats(text, &dest.flags);
	print_line(&dest, str);
        g_free(str);
}
コード例 #11
0
ファイル: printtext.c プロジェクト: Brijen/MacIrssi
/* Like printtext_window(), but don't handle %s etc. */
void printtext_string_window(WINDOW_REC *window, int level, const char *text)
{
	TEXT_DEST_REC dest;
        char *str;

	g_return_if_fail(text != NULL);

	format_create_dest(&dest, NULL, NULL, level,
			   window != NULL ? window : active_win);

	if (!sending_print_starting) {
		sending_print_starting = TRUE;
		signal_emit_id(signal_print_starting, 1, &dest);
                sending_print_starting = FALSE;
	}

        str = printtext_expand_formats(text, &dest.flags);
	print_line(&dest, str);
        g_free(str);
}
コード例 #12
0
ファイル: printtext.c プロジェクト: Brijen/MacIrssi
static void print_line(TEXT_DEST_REC *dest, const char *text)
{
        THEME_REC *theme;
	char *str, *tmp, *stripped;

	g_return_if_fail(dest != NULL);
	g_return_if_fail(text != NULL);
	
        theme = window_get_theme(dest->window);
	tmp = format_get_level_tag(theme, dest);
	str = !theme->info_eol ? format_add_linestart(text, tmp) :
		format_add_lineend(text, tmp);
	g_free_not_null(tmp);
	
	/* send both the formatted + stripped (for logging etc.) */
	stripped = strip_codes(str);
	signal_emit_id(signal_print_text, 3, dest, str, stripped);
        g_free_and_null(dest->hilight_color);

	g_free(str);
        g_free(stripped);
}