Пример #1
0
static int
_inp_rl_tab_handler(int count, int key)
{
    if (rl_point != rl_end || !rl_line_buffer) {
        return 0;
    }

    ProfWin *current = wins_get_current();
    if ((strncmp(rl_line_buffer, "/", 1) != 0) && (current->type == WIN_MUC)) {
        char *result = muc_autocomplete(current, rl_line_buffer);
        if (result) {
            rl_replace_line(result, 0);
            rl_point = rl_end;
            free(result);
        }
    } else if (strncmp(rl_line_buffer, "/", 1) == 0) {
        ProfWin *window = wins_get_current();
        char *result = cmd_autocomplete(window, rl_line_buffer);
        if (result) {
            rl_replace_line(result, 0);
            rl_point = rl_end;
            free(result);
        }
    }

    return 0;
}
Пример #2
0
void
prof_run(char *log_level, char *account_name)
{
    _init(log_level);
    _connect_default(account_name);
    ui_update();

    log_info("Starting main event loop");

    activity_state = ACTIVITY_ST_ACTIVE;
    saved_status = NULL;

    char *line = NULL;
    while(cont) {
        log_stderr_handler();
        _check_autoaway();

        line = ui_readline();
        if (line) {
            ProfWin *window = wins_get_current();
            cont = cmd_process_input(window, line);
            free(line);
            line = NULL;
        } else {
            cont = TRUE;
        }

#ifdef HAVE_LIBOTR
        otr_poll();
#endif
        notify_remind();
        jabber_process_events(10);
        ui_update();
    }
}
Пример #3
0
static int
_inp_rl_subwin_pagedown_handler(int count, int key)
{
    ProfWin *current = wins_get_current();
    win_sub_page_down(current);
    return 0;
}
Пример #4
0
static int
_inp_rl_win_pageup_handler(int count, int key)
{
    ProfWin *current = wins_get_current();
    win_page_up(current);
    return 0;
}
Пример #5
0
static int
_inp_rl_clear_handler(int count, int key)
{
    ProfWin *win = wins_get_current();
    win_clear(win);
    return 0;
}
Пример #6
0
void
ui_init(void)
{
    log_info("Initialising UI");
    initscr();
    nonl();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);
    ui_load_colours();
    refresh();
    create_title_bar();
    create_status_bar();
    status_bar_active(1);
    create_input_window();
    wins_init();
    notifier_initialise();
    cons_about();
#ifdef HAVE_LIBXSS
    display = XOpenDisplay(0);
#endif
    ui_idle_time = g_timer_new();
    inp_size = 0;
    ProfWin *window = wins_get_current();
    win_update_virtual(window);
}
Пример #7
0
void
ui_focus_win(ProfWin *window)
{
    assert(window != NULL);

    if (wins_is_current(window)) {
        return;
    }

    ProfWin *old_current = wins_get_current();
    if (old_current->type == WIN_MUC_CONFIG) {
        ProfMucConfWin *confwin = (ProfMucConfWin*)old_current;
        cmd_ac_remove_form_fields(confwin->form);
    }

    if (window->type == WIN_MUC_CONFIG) {
        ProfMucConfWin *confwin = (ProfMucConfWin*)window;
        cmd_ac_add_form_fields(confwin->form);
    }

    int i = wins_get_num(window);
    wins_set_current_by_num(i);

    if (i == 1) {
        title_bar_console();
        rosterwin_roster();
    } else {
        title_bar_switch();
    }
    status_bar_current(i);
    status_bar_active(i);
}
Пример #8
0
void
ui_update(void)
{
    ProfWin *current = wins_get_current();
    if (current->layout->paged == 0) {
        win_move_to_end(current);
    }

    win_update_virtual(current);

    if (prefs_get_boolean(PREF_WINTITLE_SHOW)) {
        _ui_draw_term_title();
    }
    title_bar_update_virtual();
    status_bar_update_virtual();
    inp_put_back();
    doupdate();

    if (perform_resize) {
        signal(SIGWINCH, SIG_IGN);
        ui_resize();
        perform_resize = FALSE;
        signal(SIGWINCH, ui_sigwinch_handler);
    }
}
Пример #9
0
gboolean
scripts_exec(const char *const script)
{
    char *scriptsdir = files_get_data_path(DIR_SCRIPTS);
    GString *scriptpath = g_string_new(scriptsdir);
    free(scriptsdir);
    g_string_append(scriptpath, "/");
    g_string_append(scriptpath, script);

    FILE *scriptfile = g_fopen(scriptpath->str, "r");
    if (!scriptfile) {
        log_info("Script not found: %s", scriptpath->str);
        g_string_free(scriptpath, TRUE);
        return FALSE;
    }

    g_string_free(scriptpath, TRUE);

    char *line = NULL;
    size_t len = 0;
    ssize_t read;

    while ((read = getline(&line, &len, scriptfile)) != -1) {
        ProfWin *win = wins_get_current();
        cmd_process_input(win, line);
        session_process_events();
        ui_update();
    }

    fclose(scriptfile);
    if (line) free(line);

    return TRUE;
}
Пример #10
0
int
api_current_win_is_console(void)
{
    ProfWin *current = wins_get_current();
    if (current && current->type == WIN_CONSOLE) {
        return 1;
    } else {
        return 0;
    }
}
Пример #11
0
static int
_inp_rl_getc(FILE *stream)
{
    int ch = rl_getc(stream);
    if (_inp_printable(ch)) {
        ProfWin *window = wins_get_current();
        cmd_reset_autocomplete(window);
    }
    return ch;
}
Пример #12
0
void
ui_current_error_line(const char * const msg)
{
    ProfWin *current = wins_get_current();
    win_print_time(current, '-');
    wattron(current->win, COLOUR_ERROR);
    wprintw(current->win, "%s\n", msg);
    wattroff(current->win, COLOUR_ERROR);

    wins_refresh_current();
}
Пример #13
0
void
prof_handle_activity(void)
{
    jabber_conn_status_t status = jabber_get_connection_status();
    ProfWin *current = wins_get_current();

    if ((status == JABBER_CONNECTED) && (current->type == WIN_CHAT)) {
        ProfChatWin *chatwin = (ProfChatWin*)current;
        assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK);
        chat_state_handle_typing(chatwin->barejid, chatwin->state);
    }
}
Пример #14
0
void
ui_current_print_line(const char *const msg, ...)
{
    ProfWin *window = wins_get_current();
    va_list arg;
    va_start(arg, msg);
    GString *fmt_msg = g_string_new(NULL);
    g_string_vprintf(fmt_msg, msg, arg);
    win_println(window, 0, fmt_msg->str);
    va_end(arg);
    g_string_free(fmt_msg, TRUE);
}
Пример #15
0
char *
api_get_current_nick(void)
{
    ProfWin *current = wins_get_current();
    if (current->type == WIN_MUC) {
        ProfMucWin *mucwin = (ProfMucWin*)current;
        assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK);
        return muc_nick(mucwin->roomjid);
    } else {
        return NULL;
    }
}
Пример #16
0
void
ui_status_room(const char * const contact)
{
    PContact pcontact = muc_get_participant(ui_current_recipient(), contact);
    ProfWin *current = wins_get_current();

    if (pcontact != NULL) {
        win_show_contact(current, pcontact);
    } else {
        ui_current_print_line("No such participant \"%s\" in room.", contact);
    }
}
Пример #17
0
char *
api_get_current_recipient(void)
{
    ProfWin *current = wins_get_current();
    if (current->type == WIN_CHAT) {
        ProfChatWin *chatwin = (ProfChatWin*)current;
        assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK);
        return chatwin->barejid;
    } else {
        return NULL;
    }
}
Пример #18
0
void
ui_current_print_formatted_line(const char show_char, int attrs, const char *const msg, ...)
{
    ProfWin *current = wins_get_current();
    va_list arg;
    va_start(arg, msg);
    GString *fmt_msg = g_string_new(NULL);
    g_string_vprintf(fmt_msg, msg, arg);
    win_print(current, show_char, 0, NULL, 0, attrs, "", fmt_msg->str);
    va_end(arg);
    g_string_free(fmt_msg, TRUE);
}
Пример #19
0
void
prof_run(char *log_level, char *account_name)
{
#ifdef PROF_HAVE_GTK
    gtk_ready = gtk_init_check(0, NULL);
    log_debug("Env is GTK-ready: %s", gtk_ready ? "true" : "false");
    if (gtk_ready) {
        gtk_init(0, NULL);
        gtk_main_iteration_do(false);
    }
#endif
    _init(log_level);
    plugins_on_start();
    _connect_default(account_name);

    ui_update();

    log_info("Starting main event loop");

    activity_state = ACTIVITY_ST_ACTIVE;
    saved_status = NULL;

    char *line = NULL;
    while(cont && !force_quit) {
        log_stderr_handler();
        _check_autoaway();

        line = inp_readline();
        if (line) {
            ProfWin *window = wins_get_current();
            cont = cmd_process_input(window, line);
            free(line);
            line = NULL;
        } else {
            cont = TRUE;
        }

#ifdef PROF_HAVE_LIBOTR
        otr_poll();
#endif
        plugins_run_timed();
        notify_remind();
        jabber_process_events(10);
        iq_autoping_check();
        ui_update();
#ifdef PROF_HAVE_GTK
        if (gtk_ready) {
            gtk_main_iteration_do(false);
        }
#endif
    }
}
Пример #20
0
void
ui_status(void)
{
    char *recipient = ui_current_recipient();
    PContact pcontact = roster_get_contact(recipient);
    ProfWin *current = wins_get_current();

    if (pcontact != NULL) {
        win_show_contact(current, pcontact);
    } else {
        ui_current_print_line("Error getting contact info.");
    }
}
Пример #21
0
static void
_connect_default(const char *const account)
{
    ProfWin *window = wins_get_current();
    if (account) {
        cmd_execute_connect(window, account);
    } else {
        char *pref_connect_account = prefs_get_string(PREF_CONNECT_ACCOUNT);
        if (pref_connect_account) {
            cmd_execute_connect(window, pref_connect_account);
            prefs_free_string(pref_connect_account);
        }
    }
}
Пример #22
0
void
ui_current_print_line(const char * const msg, ...)
{
    ProfWin *current = wins_get_current();
    va_list arg;
    va_start(arg, msg);
    GString *fmt_msg = g_string_new(NULL);
    g_string_vprintf(fmt_msg, msg, arg);
    win_print_time(current, '-');
    wprintw(current->win, "%s\n", fmt_msg->str);
    g_string_free(fmt_msg, TRUE);
    va_end(arg);

    wins_refresh_current();
}
Пример #23
0
void
ui_status_private(void)
{
    Jid *jid = jid_create(ui_current_recipient());
    PContact pcontact = muc_get_participant(jid->barejid, jid->resourcepart);
    ProfWin *current = wins_get_current();

    if (pcontact != NULL) {
        win_show_contact(current, pcontact);
    } else {
        ui_current_print_line("Error getting contact info.");
    }

    jid_destroy(jid);
}
Пример #24
0
void
ui_resize(void)
{
    struct winsize w;
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
    erase();
    resizeterm(w.ws_row, w.ws_col);
    refresh();

    log_debug("Resizing UI");
    title_bar_resize();
    wins_resize_all();
    status_bar_resize();
    inp_win_resize();
    ProfWin *window = wins_get_current();
    win_update_virtual(window);
}
Пример #25
0
void
ui_current_page_off(void)
{
    ProfWin *current = wins_get_current();
    current->paged = 0;

    int rows = getmaxy(stdscr);
    int y = getcury(current->win);
    int size = rows - 3;

    current->y_pos = y - (size - 1);
    if (current->y_pos < 0) {
        current->y_pos = 0;
    }

    wins_refresh_current();
}
Пример #26
0
void
title_bar_update_virtual(void)
{
    ProfWin *window = wins_get_current();
    if (window->type != WIN_CONSOLE) {
        if (typing_elapsed) {
            gdouble seconds = g_timer_elapsed(typing_elapsed, NULL);

            if (seconds >= 10) {
                typing = FALSE;

                g_timer_destroy(typing_elapsed);
                typing_elapsed = NULL;
            }
        }
    }
    _title_bar_draw();
}
Пример #27
0
void
prof_run(char *log_level, char *account_name)
{
    _init(log_level);
    plugins_on_start();
    _connect_default(account_name);

    ui_update();

    log_info("Starting main event loop");

    session_init_activity();

    char *line = NULL;
    while(cont && !force_quit) {
        log_stderr_handler();
        session_check_autoaway();

        line = inp_readline();
        if (line) {
            ProfWin *window = wins_get_current();
            cont = cmd_process_input(window, line);
            free(line);
            line = NULL;
        } else {
            cont = TRUE;
        }

#ifdef HAVE_LIBOTR
        otr_poll();
#endif
        plugins_run_timed();
        notify_remind();
        session_process_events();
        iq_autoping_check();
        ui_update();
#ifdef HAVE_GTK
        tray_update();
#endif
    }
}
Пример #28
0
void
ui_invalid_command_usage(const char *const cmd, void (*setting_func)(void))
{
    GString *msg = g_string_new("");
    g_string_printf(msg, "Invalid usage, see '/help %s' for details.", &cmd[1]);

    if (setting_func) {
        cons_show("");
        (*setting_func)();
        cons_show(msg->str);
    } else {
        cons_show("");
        cons_show(msg->str);
        ProfWin *current = wins_get_current();
        if (current->type == WIN_CHAT) {
            win_println(current, THEME_DEFAULT, '-', "%s", msg->str);
        }
    }

    g_string_free(msg, TRUE);
}
Пример #29
0
char*
ui_ask_pgp_passphrase(const char *hint, int prev_fail)
{
    ProfWin *current = wins_get_current();

    win_println(current, THEME_DEFAULT, '-', "");

    if (prev_fail) {
        win_println(current, THEME_DEFAULT, '!', "Incorrect passphrase");
    }

    if (hint) {
        win_println(current, THEME_DEFAULT, '!', "Enter PGP key passphrase for %s", hint);
    } else {
        win_println(current, THEME_DEFAULT, '!', "Enter PGP key passphrase");
    }

    ui_update();

    status_bar_get_password();
    status_bar_update_virtual();
    return inp_get_password();
}
Пример #30
0
static void
_title_bar_draw(void)
{
    ProfWin *current = wins_get_current();

    werase(win);
    wmove(win, 0, 0);
    int i;
    for (i = 0; i < 45; i++) {
        waddch(win, ' ');
    }

    char *title = win_get_title(current);
    mvwprintw(win, 0, 0, " %s", title);
    free(title);

    if (current && current->type == WIN_CHAT) {
        ProfChatWin *chatwin = (ProfChatWin*) current;
        assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK);
        _show_contact_presence(chatwin);
        _show_privacy(chatwin);

        if (typing) {
            wprintw(win, " (typing...)");
        }
    } else if (current && current->type == WIN_MUC) {
        ProfMucWin *mucwin = (ProfMucWin*) current;
        assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK);
        _show_muc_privacy(mucwin);
    }

    _show_self_presence();

    wnoutrefresh(win);
    inp_put_back();
}