void ui_outgoing_msg(const char * const from, const char * const to, const char * const message) { PContact contact = roster_get_contact(to); ProfWin *window = wins_get_by_recipient(to); int num = 0; // create new window if (window == NULL) { Jid *jid = jid_create(to); if (muc_room_is_active(jid)) { window = wins_new(to, WIN_PRIVATE); } else { window = wins_new(to, WIN_CHAT); } jid_destroy(jid); num = wins_get_num(window); if (prefs_get_boolean(PREF_CHLOG) && prefs_get_boolean(PREF_HISTORY)) { _win_show_history(window->win, num, to); } if (contact != NULL) { if (strcmp(p_contact_presence(contact), "offline") == 0) { const char const *show = p_contact_presence(contact); const char const *status = p_contact_status(contact); _show_status_string(window, to, show, status, NULL, "--", "offline"); } } // use existing window } else { num = wins_get_num(window); } win_print_time(window, '-'); if (strncmp(message, "/me ", 4) == 0) { wattron(window->win, COLOUR_ME); wprintw(window->win, "*%s ", from); wprintw(window->win, "%s", message + 4); wprintw(window->win, "\n"); wattroff(window->win, COLOUR_ME); } else { _win_show_user(window->win, from, 0); _win_show_message(window->win, message); } ui_switch_win(num); }
void ui_print_system_msg_from_recipient(const char * const from, const char *message) { int num = 0; char from_cpy[strlen(from) + 1]; char *bare_jid; if (from == NULL || message == NULL) return; strcpy(from_cpy, from); bare_jid = strtok(from_cpy, "/"); ProfWin *window = wins_get_by_recipient(bare_jid); if (window == NULL) { window = wins_new(bare_jid, WIN_CHAT); if (window != NULL) { num = wins_get_num(window); status_bar_active(num); } else { num = 0; window = wins_get_console(); status_bar_active(1); } } win_print_time(window, '-'); wprintw(window->win, "*%s %s\n", bare_jid, message); // this is the current window if (wins_is_current(window)) { wins_refresh_current(); } }
void ui_create_duck_win(void) { ProfWin *window = wins_new("DuckDuckGo search", WIN_DUCK); int num = wins_get_num(window); ui_switch_win(num); win_print_time(window, '-'); wprintw(window->win, "Type ':help' to find out more.\n"); }
void ui_new_chat_win(const char * const to) { // if the contact is offline, show a message PContact contact = roster_get_contact(to); ProfWin *window = wins_get_by_recipient(to); int num = 0; // create new window if (window == NULL) { Jid *jid = jid_create(to); if (muc_room_is_active(jid)) { window = wins_new(to, WIN_PRIVATE); } else { window = wins_new(to, WIN_CHAT); } jid_destroy(jid); num = wins_get_num(window); if (prefs_get_boolean(PREF_CHLOG) && prefs_get_boolean(PREF_HISTORY)) { _win_show_history(window->win, num, to); } if (contact != NULL) { if (strcmp(p_contact_presence(contact), "offline") == 0) { const char const *show = p_contact_presence(contact); const char const *status = p_contact_status(contact); _show_status_string(window, to, show, status, NULL, "--", "offline"); } } } else { num = wins_get_num(window); } ui_switch_win(num); }
void ui_room_join(Jid *jid) { ProfWin *window = wins_get_by_recipient(jid->barejid); int num = 0; // create new window if (window == NULL) { window = wins_new(jid->barejid, WIN_MUC); } num = wins_get_num(window); ui_switch_win(num); }
void ui_incoming_msg(const char * const from, const char * const message, GTimeVal *tv_stamp, gboolean priv) { gboolean win_created = FALSE; char *display_from = NULL; win_type_t win_type; if (priv) { win_type = WIN_PRIVATE; display_from = get_nick_from_full_jid(from); } else { win_type = WIN_CHAT; PContact contact = roster_get_contact(from); if (contact != NULL) { if (p_contact_name(contact) != NULL) { display_from = strdup(p_contact_name(contact)); } else { display_from = strdup(from); } } else { display_from = strdup(from); } } ProfWin *window = wins_get_by_recipient(from); if (window == NULL) { window = wins_new(from, win_type); win_created = TRUE; } int num = wins_get_num(window); // currently viewing chat window with sender if (wins_is_current(window)) { if (tv_stamp == NULL) { win_print_time(window, '-'); } else { GDateTime *time = g_date_time_new_from_timeval_utc(tv_stamp); gchar *date_fmt = g_date_time_format(time, "%H:%M:%S"); wattron(window->win, COLOUR_TIME); wprintw(window->win, "%s - ", date_fmt); wattroff(window->win, COLOUR_TIME); g_date_time_unref(time); g_free(date_fmt); } if (strncmp(message, "/me ", 4) == 0) { wattron(window->win, COLOUR_THEM); wprintw(window->win, "*%s ", display_from); waddstr(window->win, message + 4); wprintw(window->win, "\n"); wattroff(window->win, COLOUR_THEM); } else { _win_show_user(window->win, display_from, 1); _win_show_message(window->win, message); } title_bar_set_typing(FALSE); title_bar_draw(); status_bar_active(num); wins_refresh_current(); // not currently viewing chat window with sender } else { status_bar_new(num); cons_show_incoming_message(display_from, num); if (prefs_get_boolean(PREF_FLASH)) flash(); window->unread++; if (prefs_get_boolean(PREF_CHLOG) && prefs_get_boolean(PREF_HISTORY)) { _win_show_history(window->win, num, from); } if (tv_stamp == NULL) { win_print_time(window, '-'); } else { // show users status first, when receiving message via delayed delivery if (win_created) { PContact pcontact = roster_get_contact(from); if (pcontact != NULL) { win_show_contact(window, pcontact); } } GDateTime *time = g_date_time_new_from_timeval_utc(tv_stamp); gchar *date_fmt = g_date_time_format(time, "%H:%M:%S"); wattron(window->win, COLOUR_TIME); wprintw(window->win, "%s - ", date_fmt); wattroff(window->win, COLOUR_TIME); g_date_time_unref(time); g_free(date_fmt); } if (strncmp(message, "/me ", 4) == 0) { wattron(window->win, COLOUR_THEM); wprintw(window->win, "*%s ", display_from); waddstr(window->win, message + 4); wprintw(window->win, "\n"); wattroff(window->win, COLOUR_THEM); } else { _win_show_user(window->win, display_from, 1); _win_show_message(window->win, message); } } int ui_index = num; if (ui_index == 10) { ui_index = 0; } if (prefs_get_boolean(PREF_BEEP)) beep(); if (prefs_get_boolean(PREF_NOTIFY_MESSAGE)) notify_message(display_from, ui_index); free(display_from); }
static void open_dialog_window (struct session *sess) { GtkWidget *hbox, *vbox, *bbox; int page = prefs.privmsgtab; struct User *user; if (!main_window) page = 0; if (!page) { sess->gui->window = wins_new (sess->channel, "", kill_session_callback, sess, link_cb, sess, FALSE, FALSE, NULL); gtk_widget_set_usize (sess->gui->window, prefs.dialog_width, prefs.dialog_height); gtk_signal_connect ((GtkObject *) sess->gui->window, "focus_in_event", GTK_SIGNAL_FUNC (focus_in), sess); sess->is_tab = FALSE; } else { sess->gui->window = wins_new (sess->channel, "", kill_session_callback, sess, link_cb, sess, TRUE, FALSE, NULL); sess->is_tab = TRUE; } sess->gui->vbox = vbox = wins_get_vbox (sess->gui->window); if (!page) sess->gui->changad = NULL; else sess->gui->changad = wins_get_notebooklabel (sess->gui->window); sess->gui->tbox = hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 2); if (prefs.topicbar) gtk_widget_show (hbox); /* create the X ^ < > buttons */ wins_create_linkbuttons (sess->gui->window, hbox); sess->gui->topicgad = gtk_entry_new (); gtk_entry_set_editable ((GtkEntry *) sess->gui->topicgad, FALSE); gtk_container_add (GTK_CONTAINER (hbox), sess->gui->topicgad); if (prefs.inputgad_superfocus) show_and_unfocus (sess->gui->topicgad); else gtk_widget_show (sess->gui->topicgad); /*if (prefs.dialogbuttons)*/ dialog_createbuttons (sess); /*else sess->gui->button_box = 0;*/ hbox = gtk_hbox_new (FALSE, 0); sess->gui->leftpane = hbox; gtk_container_add (GTK_CONTAINER (vbox), hbox); gtk_widget_show (hbox); sess->gui->textgad = gtk_xtext_new (prefs.dialog_indent_pixels * prefs.dialog_indent_nicks, prefs.dialog_show_separator); gtk_object_set_user_data (GTK_OBJECT (sess->gui->textgad), sess); ((GtkXText *) sess->gui->textgad)->wordwrap = prefs.dialog_wordwrap; ((GtkXText *) sess->gui->textgad)->max_auto_indent = prefs.max_auto_indent; ((GtkXText *) sess->gui->textgad)->auto_indent = prefs.auto_indent; ((GtkXText *) sess->gui->textgad)->thinline = prefs.thin_separator; ((GtkXText *) sess->gui->textgad)->max_lines = prefs.max_lines; ((GtkXText *) sess->gui->textgad)->error_function = gtkutil_simpledialog; ((GtkXText *) sess->gui->textgad)->urlcheck_function = maingui_word_check; ((GtkXText *) sess->gui->textgad)->tint_red = prefs.dialog_tint_red; ((GtkXText *) sess->gui->textgad)->tint_green = prefs.dialog_tint_green; ((GtkXText *) sess->gui->textgad)->tint_blue = prefs.dialog_tint_blue; if (prefs.timestamp && prefs.dialog_indent_nicks) ((GtkXText *) sess->gui->textgad)->time_stamp = TRUE; gtk_xtext_set_palette (GTK_XTEXT (sess->gui->textgad), colors); gtk_xtext_set_font (GTK_XTEXT (sess->gui->textgad), dialog_font_normal, 0); gtk_xtext_set_background (GTK_XTEXT (sess->gui->textgad), dialogwin_pix, prefs.dialog_transparent, prefs.dialog_tint); gtk_container_add (GTK_CONTAINER (hbox), sess->gui->textgad); show_and_unfocus (sess->gui->textgad); #ifdef USE_GNOME gtk_drag_dest_set (sess->gui->textgad, GTK_DEST_DEFAULT_ALL, dnd_targets, 1, GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK); gtk_signal_connect (GTK_OBJECT (sess->gui->textgad), "drag_data_received", GTK_SIGNAL_FUNC (dialog_dnd_drop), sess); #endif sess->gui->vscrollbar = gtk_vscrollbar_new (GTK_XTEXT (sess->gui->textgad)->adj); gtk_box_pack_start (GTK_BOX (hbox), sess->gui->vscrollbar, FALSE, FALSE, 1); show_and_unfocus (sess->gui->vscrollbar); if (!sess->is_tab) gtk_signal_connect_object (GTK_OBJECT (sess->gui->window), "configure_event", GTK_SIGNAL_FUNC (maingui_configure), GTK_OBJECT (sess)); bbox = gtk_hbox_new (FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (bbox), 0); gtk_box_pack_end (GTK_BOX (vbox), bbox, FALSE, TRUE, 2); gtk_widget_show (bbox); gtk_signal_connect (GTK_OBJECT (sess->gui->textgad), "word_click", GTK_SIGNAL_FUNC (maingui_word_clicked), sess); sess->gui->inputgad = gtk_entry_new_with_max_length (2048); gtk_container_add (GTK_CONTAINER (bbox), sess->gui->inputgad); gtk_signal_connect (GTK_OBJECT (sess->gui->inputgad), "key_press_event", GTK_SIGNAL_FUNC (key_handle_key_press), sess); if (prefs.style_inputbox) gtk_widget_set_style (sess->gui->inputgad, inputgad_style); gtk_widget_show (sess->gui->inputgad); /* create the < ^ buttons on the bottom right (maingui.c) */ gui_create_toolbox (sess, bbox); gtk_widget_show (sess->gui->window); if (page && prefs.newtabstofront) wins_bring_tofront (sess->gui->window); fe_set_title (sess); user = find_name_global (sess->server, sess->channel); if (user) { if (user->hostname) gtk_entry_set_text (GTK_ENTRY (sess->gui->topicgad), user->hostname); } }
static void wins_link_cb (GtkWidget *button, xchatwin *xw) { GtkWidget *new_win; GtkWidget *old_win; xchatwin *new_xw; #ifdef USE_GNOME GtkWidget *wid; #endif old_win = xw->child; /* make sure wins_destroy_cb isn't called */ gtk_signal_disconnect_by_data (GTK_OBJECT (old_win), xw); /* do we need to create a main window? */ if (main_window == NULL && xw->is_toplevel) { gui_make_tab_window (NULL, old_win); gtk_widget_show (main_window); } /* create a new tab/window */ new_win = wins_new (xw->name, xw->title, xw->close_callback, xw->userdata, xw->link_callback, xw->link_userdata, xw->is_toplevel, xw->is_nonirc, xw->child_ret); new_xw = gtk_object_get_user_data (GTK_OBJECT (new_win)); /* give the client the new window pointer */ if (xw->child_ret != NULL) *xw->child_ret = new_win; /* use the old vbox instead */ gtk_widget_destroy (new_xw->vbox); new_xw->vbox = xw->vbox; #ifdef USE_GNOME if (xw->is_toplevel) { gtk_widget_reparent (xw->vbox, new_win); } else { wid = gtk_hbox_new (0, 0); gtk_widget_reparent (xw->vbox, wid); gnome_app_set_contents (GNOME_APP (new_win), wid); } #else gtk_widget_reparent (xw->vbox, new_win); #endif if (xw->button_box != NULL) { /* buttons need to be re-created so that the parameters to the callbacks are updated. */ gtk_widget_destroy (xw->button_box); wins_create_linkbuttons (new_win, xw->button_box_box); } gtk_widget_destroy (old_win); gtk_widget_show (new_win); wins_free (xw); /* this will call link_cb() in maingui.c */ if (new_xw->link_callback != NULL) new_xw->link_callback (new_win, new_xw->link_userdata); /* did we just remove the last page? if so, destroy the main window */ if (gtk_notebook_get_nth_page (GTK_NOTEBOOK (main_book), 0) == NULL) gtk_widget_destroy (main_window); }