Yattm - unified GTK instant-messaging client | |
[Generated for version 0.2-17 - Mon Jan 6 19:01:23 GMT+1 2003] |
#include "intl.h"
#include <string.h>
#include <stdlib.h>
#include <gdk/gdkkeysyms.h>
#include <ctype.h>
#include <assert.h>
#include "chat_window.h"
#include "util.h"
#include "gtkspell.h"
#include "add_contact_window.h"
#include "sound.h"
#include "dialog.h"
#include "globals.h"
#include "status.h"
#include "away_window.h"
#include "message_parse.h"
#include "gtk_eb_html.h"
#include "plugin.h"
#include "contact_actions.h"
#include "smileys.h"
#include "prefs.h"
#include "pixmaps/tb_book_red.xpm"
#include "pixmaps/tb_open.xpm"
#include "pixmaps/tb_volume.xpm"
#include "pixmaps/tb_edit.xpm"
#include "pixmaps/tb_search.xpm"
#include "pixmaps/tb_no.xpm"
#include "pixmaps/tb_mail_send.xpm"
#include "pixmaps/cancel.xpm"
#include "pixmaps/smiley_button.xpm"
Include dependency graph for chat_window.c:
Go to the source code of this file.
Defines | |
#define | BUF_SIZE 1024 |
#define | GET_CHAT_WINDOW(cur_cw) |
Functions | |
void | eb_update_window_title (chat_window *cw, gboolean new_message) |
void | eb_update_window_title_to_tab (int tab, gboolean new_message) |
void | set_tab_red (GtkNotebook *notebook, GtkWidget *child) |
void | set_tab_normal (GtkNotebook *notebook, GtkWidget *child) |
void | end_conversation (chat_window *cw) |
void | destroy_event (GtkWidget *widget, gpointer userdata) |
void | close_tab_callback (GtkWidget *button, gpointer userdata) |
void | add_unknown_callback (GtkWidget *add_button, gpointer userdata) |
void | send_message (GtkWidget *widget, gpointer d) |
void | view_log_callback (GtkWidget *widget, gpointer d) |
void | insert_smiley (GtkWidget *widget, chat_window *cw) |
void | show_smileys_callback (GtkWidget *widget, gpointer d) |
void | ignore_dialog_callback (GtkWidget *widget, gpointer userdata) |
void | ignore_callback (GtkWidget *ignore_button, gpointer userdata) |
void | send_file (GtkWidget *sendf_button, gpointer userdata) |
void | set_sound_on_toggle (GtkWidget *sound_button, gpointer userdata) |
void | set_sound_on_click (GtkWidget *button, gpointer userdata) |
void | close_win (GtkWidget *close_button, gpointer userdata) |
void | allow_offline_on_toggle (GtkWidget *allow_button, gpointer userdata) |
void | allow_offline_on_click (GtkWidget *button, gpointer userdata) |
void | change_local_account_on_click (GtkWidget *button, gpointer userdata) |
GtkWidget * | get_local_accounts (chat_window *cw) |
void | handle_focus (GtkWidget *widget, GdkEventFocus *event, gpointer userdata) |
void | handle_click (GtkWidget *widget, GdkEventButton *event, gpointer userdata) |
void | send_typing_status (chat_window *cw) |
gboolean | chat_singleline_key_press (GtkWidget *widget, GdkEventKey *event, gpointer data) |
gboolean | chat_key_press (GtkWidget *widget, GdkEventKey *event, gpointer data) |
void | chat_notebook_switch_callback (GtkNotebook *notebook, GtkNotebookPage *page, gint page_num, gpointer user_data) |
chat_window * | find_tabbed_chat_window () |
chat_window * | find_tabbed_chat_window_index (int current_page) |
chat_window * | find_tabbed_current_chat_window () |
chat_window * | eb_chat_window_new (eb_local_account *local, struct contact *remote) |
void | eb_chat_window_display_error (eb_account *remote, gchar *message) |
void | eb_chat_window_do_timestamp (struct contact *c, gboolean online) |
void | eb_chat_window_display_remote_message (eb_local_account *account, eb_account *remote, struct service *serv, gchar *o_message) |
void | eb_chat_window_display_contact (struct contact *remote_contact) |
void | eb_chat_window_display_account (eb_account *remote_account) |
void | eb_log_status_changed (eb_account *ea, gchar *status) |
void | eb_log_message (FILE *log_file, gchar buff[], gchar *message) |
void | eb_restore_last_conv (gchar *file_name, chat_window *cw) |
void | eb_chat_window_display_status (eb_account *remote, gchar *message) |
Variables | |
GList * | outgoing_message_filters = NULL |
GList * | incoming_message_filters = NULL |
|
Definition at line 66 of file chat_window.c. Referenced by eb_chat_window_display_remote_message(), eb_chat_window_do_timestamp(), eb_restore_last_conv(), eb_update_window_title(), eb_update_window_title_to_tab(), ignore_callback(), and send_message(). |
|
Value: {\ if(do_tabbed_chat) { \ chat_window *bck = cur_cw; \ if (cur_cw->notebook) \ cur_cw = find_tabbed_chat_window_index(gtk_notebook_get_current_page(GTK_NOTEBOOK(cur_cw->notebook))); \ if (cur_cw == NULL) \ cur_cw = bck; \ } \ } Definition at line 385 of file chat_window.c. Referenced by allow_offline_on_click(), ignore_callback(), insert_smiley(), send_file(), send_message(), set_sound_on_click(), and view_log_callback(). |
|
Definition at line 356 of file chat_window.c. References contact::accounts, add_unknown_account_window_new(), _chat_window::contact, find_suitable_remote_account(), and _chat_window::perfered. Referenced by eb_chat_window_new(), and handle_click().
00357 { 00358 chat_window * cw = userdata; 00359 00360 /* if something wierd is going on and the unknown contact has multiple 00361 * accounts, find use the perfered account 00362 */ 00363 00364 cw->perfered = find_suitable_remote_account(cw->perfered, cw->contact); 00365 00366 /* if in the weird case that the unknown user has gone offline 00367 * just use the first account you see 00368 */ 00369 00370 if(!cw->perfered) 00371 cw->perfered = cw->contact->accounts->data; 00372 00373 /* if that fails, something is seriously wrong 00374 * bail out while you can 00375 */ 00376 00377 if(!cw->perfered) 00378 return; 00379 00380 /* now that we have a valid account, pop up the window already :) */ 00381 00382 add_unknown_account_window_new(cw->perfered); 00383 } |
|
Definition at line 828 of file chat_window.c. References _chat_window::allow_button, _chat_window::contact, GET_CHAT_WINDOW, and contact::send_offline. Referenced by eb_chat_window_new(), and handle_click().
00829 { 00830 chat_window * cw = (chat_window *)userdata; 00831 GET_CHAT_WINDOW(cw); 00832 00833 if (cw->contact->send_offline) 00834 { 00835 cw->contact->send_offline = FALSE; 00836 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(cw->allow_button), FALSE); 00837 } 00838 else 00839 { 00840 cw->contact->send_offline = TRUE; 00841 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(cw->allow_button), TRUE); 00842 } 00843 } |
|
Definition at line 812 of file chat_window.c. References _chat_window::contact, and contact::send_offline. Referenced by eb_chat_window_new().
00813 { 00814 chat_window * cw = (chat_window *)userdata; 00815 00816 /*set send_offline based upon toggle button*/ 00817 00818 if (GTK_TOGGLE_BUTTON (allow_button)->active) 00819 { 00820 cw->contact->send_offline = TRUE; 00821 } 00822 else 00823 { 00824 cw->contact->send_offline = FALSE; 00825 } 00826 } |
|
Definition at line 845 of file chat_window.c. References _chat_window_account::cw, _chat_window_account::data, DBG_CORE, eb_debug, and _chat_window::local_user. Referenced by get_local_accounts().
00846 { 00847 GtkLabel *label= GTK_LABEL (GTK_BIN (button)->child); 00848 chat_window_account *cwa = (chat_window_account *)userdata; 00849 chat_window * cw; 00850 gchar *account; 00851 eb_local_account *ela=NULL; 00852 00853 /* Should never happen */ 00854 if(!cwa) 00855 return; 00856 cw=cwa->cw; 00857 ela=(eb_local_account *)cwa->data; 00858 cw->local_user=ela; 00859 /* don't free it */ 00860 gtk_label_get(label, &account); 00861 eb_debug(DBG_CORE, "change_local_account_on_click: %s\n", account); 00862 } |
|
Definition at line 1084 of file chat_window.c. References eb_update_window_title(), _chat_window::entry, _chat_window::hist_pos, _chat_window::history, _chat_window::notebook, _chat_window::perfered, send_message(), send_typing_status(), and _chat_window::this_msg_in_history. Referenced by eb_chat_window_new().
01085 { 01086 chat_window *cw = (chat_window *)data; 01087 GdkModifierType modifiers = event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_MOD4_MASK); 01088 01089 eb_update_window_title(cw, FALSE); 01090 01091 if (event->keyval == GDK_Return) 01092 { 01093 /* Just print a newline on Shift-Return */ 01094 if (event->state & GDK_SHIFT_MASK) 01095 { 01096 event->state = 0; 01097 } 01098 else if (do_enter_send) 01099 { 01100 /*Prevents a newline from being printed*/ 01101 gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event"); 01102 01103 send_message(NULL, cw); 01104 return gtk_true(); 01105 } 01106 } 01107 else if (event->keyval == GDK_Up) 01108 { 01109 gint p=0; 01110 01111 if(cw->history==NULL) { return gtk_true(); } 01112 01113 if(cw->hist_pos==NULL) 01114 { 01115 char * s; 01116 GList * node; 01117 01118 s= gtk_editable_get_chars(GTK_EDITABLE (cw->entry), 0, -1); 01119 01120 for(node=cw->history; node!=NULL ; node=node->next) 01121 { 01122 cw->hist_pos=node; 01123 } 01124 01125 if(strlen(s)>0) 01126 { 01127 cw->history=g_list_append(cw->history, strdup(s)); 01128 //cw->hist_pos=cw->history->next; 01129 g_free(s); // that strdup() followed by g_free() looks stupid, but it isn't 01130 // - strdup() uses vanilla malloc(), and the destroy code uses 01131 // vanilla free(), so we can't use something that needs to be 01132 // g_free()ed (apparently glib uses an incompatible allocation 01133 //system 01134 cw->this_msg_in_history=1; 01135 } 01136 01137 } else { 01138 cw->hist_pos=cw->hist_pos->prev; 01139 if(cw->hist_pos==NULL) 01140 { 01141 GList * node; 01142 printf("Wrapped!\n"); 01143 for(node=cw->history; node!=NULL ; node=node->next) 01144 { 01145 cw->hist_pos=node; 01146 } 01147 } 01148 } 01149 01150 gtk_editable_delete_text(GTK_EDITABLE (cw->entry), 0, -1); 01151 gtk_editable_insert_text(GTK_EDITABLE (cw->entry), cw->hist_pos->data, strlen(cw->hist_pos->data), &p); 01152 } 01153 else if (event->keyval == GDK_Down) 01154 { 01155 gint p=0; 01156 01157 if(cw->history==NULL || cw->hist_pos==NULL) { return gtk_true(); } 01158 cw->hist_pos=cw->hist_pos->next; 01159 if(cw->hist_pos==NULL) 01160 { 01161 gtk_editable_delete_text(GTK_EDITABLE (cw->entry), 0, -1); 01162 } else { 01163 gtk_editable_delete_text(GTK_EDITABLE (cw->entry), 0, -1); 01164 gtk_editable_insert_text(GTK_EDITABLE (cw->entry), cw->hist_pos->data, strlen(cw->hist_pos->data), &p); 01165 } 01166 } 01167 else if (cw->notebook != NULL) /* only change tabs if this window is tabbed */ 01168 { 01169 /* 01170 * this does not allow for using the same keyval for both prev and next 01171 * when next contains every modifier that previous has (with some more) 01172 * but i really don't think that will be a huge problem =) 01173 */ 01174 if ((modifiers == accel_prev_tab.modifiers) && (event->keyval == accel_prev_tab.keyval)) 01175 { 01176 gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event"); 01177 gtk_notebook_prev_page( GTK_NOTEBOOK(cw->notebook) ); 01178 return gtk_true(); 01179 } 01180 else if ((modifiers == accel_next_tab.modifiers) && (event->keyval == accel_next_tab.keyval)) 01181 { 01182 gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event"); 01183 gtk_notebook_next_page( GTK_NOTEBOOK(cw->notebook) ); 01184 return gtk_true(); 01185 } 01186 } 01187 01188 if(cw->perfered==NULL || modifiers) 01189 { return gtk_false(); } 01190 01191 if(!modifiers) 01192 { 01193 send_typing_status(cw); 01194 } 01195 01196 return gtk_false(); 01197 } |
|
Definition at line 1199 of file chat_window.c. References contact::chatwindow, eb_update_window_title_to_tab(), _chat_window::entry, _chat_window::notebook, _chat_window::notebook_child, and set_tab_normal(). Referenced by eb_chat_window_new().
01200 { 01201 /* find the contact for the page we just switched to and turn off their talking penguin icon */ 01202 GList * l1; 01203 GList * l2; 01204 struct contact* c; 01205 01206 for(l1 = groups; l1; l1=l1->next ) 01207 { 01208 for(l2 = ((grouplist*)l1->data)->members; l2; l2=l2->next ) 01209 { 01210 // if this contact's chatwindow is equal to this one, 01211 // then we need to end the conversation and remove the 01212 // notebook tab... 01213 c = (struct contact*)l2->data; 01214 if (c->chatwindow != NULL) { 01215 if (c->chatwindow->notebook_child == page->child) { 01216 /* get rid of this pixmap .. no more icons in the tabs */ 01217 /* gtk_widget_hide(c->chatwindow->talk_pixmap); */ 01218 set_tab_normal(GTK_NOTEBOOK(c->chatwindow->notebook), c->chatwindow->notebook_child); 01219 gtk_widget_grab_focus(c->chatwindow->entry); 01220 eb_update_window_title_to_tab (page_num, FALSE); 01221 } 01222 } 01223 } 01224 } 01225 } |
|
Definition at line 1074 of file chat_window.c. References send_typing_status(). Referenced by eb_chat_window_new().
01075 { 01076 chat_window *cw = (chat_window *)data; 01077 if(!(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_MOD4_MASK))) 01078 { 01079 send_typing_status(cw); 01080 } 01081 return gtk_true(); 01082 } |
|
Definition at line 321 of file chat_window.c. References gtk_notebook_get_number_pages(), _chat_window::notebook, _chat_window::notebook_child, and _chat_window::window. Referenced by eb_chat_window_new(), and handle_click().
00322 { 00323 chat_window *cw = (chat_window*)userdata; 00324 GtkWidget *window = cw->window; 00325 GtkWidget *notebook = cw->notebook; 00326 gint tab_number; 00327 00328 /* we got called to kill the tab, so find out which tab number 00329 we need to kill */ 00330 tab_number = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), 00331 cw->notebook_child); 00332 00333 gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), tab_number); 00334 00335 /* 00336 * WARNING: AT THIS POINT IN TIME cw IS NO LONGER AVAILABLE 00337 * end_conversation calls a g_free on cw 00338 * gtk_notebook_remove_page triggers the destroy signal on the vbox 00339 * (which calls end_conversation via destroy_event) 00340 */ 00341 00342 /* 00343 * Question: Now, as soon as the last page from the notebook gets 00344 * removed the window disappears, and I didn't find a call to destroy 00345 * it so... i've left in this destroy.. but I really don't know if it 00346 * is needed... 00347 */ 00348 00349 if (gtk_notebook_get_number_pages(GTK_NOTEBOOK(notebook)) == 0) { 00350 // we just delete the last conversation, no point in having the window 00351 // around... note that this also causes end_conversation to be called... 00352 gtk_widget_destroy(window); 00353 } 00354 } |
|
Definition at line 801 of file chat_window.c. References _chat_window::smiley_window, and _chat_window::window. Referenced by eb_chat_window_new(), and handle_click().
00802 { 00803 chat_window * cw = (chat_window *)userdata; 00804 if(cw->smiley_window != NULL && cw->smiley_window->window != NULL) { 00805 /* close smileys popup */ 00806 gtk_widget_destroy(cw->smiley_window); 00807 cw->smiley_window = NULL; 00808 } 00809 gtk_widget_destroy(cw->window); 00810 } |
|
Definition at line 313 of file chat_window.c. References end_conversation(). Referenced by eb_chat_window_new().
00314 { 00315 chat_window* cw = (chat_window*)userdata; 00316 /* gotta clean up all of the people we're talking with */ 00317 00318 end_conversation(cw); 00319 } |
|
Definition at line 2155 of file chat_window.c. References account::account_contact, contact::chatwindow, eb_chat_window_new(), eb_restore_last_conv(), eb_update_window_title(), _chat_window::entry, find_suitable_local_account(), make_safe_filename(), NAME_MAX, contact::nick, _chat_window::notebook, _chat_window::notebook_child, _chat_window::perfered, account::service_id, set_tab_normal(), and _chat_window::window. Referenced by account_click().
02156 { 02157 struct contact * remote_contact = remote_account->account_contact; 02158 eb_local_account * account =find_suitable_local_account(NULL, remote_account->service_id); 02159 02160 if(!remote_contact->chatwindow || !remote_contact->chatwindow->window) 02161 { 02162 if(remote_contact->chatwindow) 02163 { 02164 g_free(remote_contact->chatwindow); 02165 } 02166 02167 remote_contact->chatwindow = eb_chat_window_new(account, remote_contact); 02168 02169 if(remote_contact->chatwindow) 02170 { 02171 gtk_widget_show(remote_contact->chatwindow->window); 02172 if (do_restore_last_conv) 02173 { 02174 gchar buff[NAME_MAX]; 02175 make_safe_filename(buff, remote_contact->nick); 02176 eb_restore_last_conv(buff,remote_contact->chatwindow); 02177 } 02178 gdk_window_raise(remote_contact->chatwindow->window->window); 02179 gtk_window_set_focus (GTK_WINDOW 02180 (remote_contact->chatwindow->window), 02181 remote_contact->chatwindow->entry); 02182 } 02183 else /* Did they get denied because they're in the Unknown group? */ 02184 return; 02185 } 02186 else if (remote_contact->chatwindow && remote_contact->chatwindow->window) 02187 { 02188 gdk_window_raise(remote_contact->chatwindow->window->window); 02189 gtk_window_set_focus (GTK_WINDOW 02190 (remote_contact->chatwindow->window), 02191 remote_contact->chatwindow->entry); 02192 } 02193 02194 eb_update_window_title(remote_contact->chatwindow, FALSE); 02195 02196 if (remote_contact->chatwindow->notebook != NULL) 02197 { 02198 int page_num = gtk_notebook_page_num(GTK_NOTEBOOK(remote_contact->chatwindow->notebook), 02199 remote_contact->chatwindow->notebook_child); 02200 /* no more icons in the tabs */ 02201 /* gtk_widget_hide(remote_contact->chatwindow->talk_pixmap); */ 02202 set_tab_normal(GTK_NOTEBOOK(remote_contact->chatwindow->notebook), 02203 remote_contact->chatwindow->notebook_child); 02204 gtk_notebook_set_page(GTK_NOTEBOOK(remote_contact->chatwindow->notebook), 02205 page_num); 02206 02207 } else { 02208 gdk_window_raise(remote_contact->chatwindow->window->window); 02209 gtk_window_set_focus(GTK_WINDOW(remote_contact->chatwindow->window), 02210 remote_contact->chatwindow->entry); 02211 } 02212 02213 remote_contact->chatwindow->perfered = remote_account; 02214 } |
|
Definition at line 2097 of file chat_window.c. References contact::chatwindow, eb_chat_window_new(), eb_restore_last_conv(), _chat_window::entry, find_suitable_local_account(), find_suitable_remote_account(), make_safe_filename(), NAME_MAX, contact::nick, _chat_window::notebook, _chat_window::notebook_child, account::service_id, set_tab_normal(), and _chat_window::window. Referenced by console_session_get_command(), contact_click(), and pounce_contact().
02098 { 02099 eb_account *remote_account = 02100 find_suitable_remote_account (NULL, remote_contact); 02101 eb_local_account *account = NULL; 02102 02103 if (remote_account) 02104 account = find_suitable_local_account (NULL, remote_account->service_id); 02105 02106 if (!remote_contact->chatwindow || !remote_contact->chatwindow->window) 02107 { 02108 if (remote_contact->chatwindow) 02109 { 02110 g_free (remote_contact->chatwindow); 02111 } 02112 02113 remote_contact->chatwindow = eb_chat_window_new (account, remote_contact); 02114 02115 if (remote_contact->chatwindow) 02116 { 02117 gtk_widget_show (remote_contact->chatwindow->window); 02118 if (do_restore_last_conv) 02119 { 02120 gchar buff[NAME_MAX]; 02121 make_safe_filename (buff, remote_contact->nick); 02122 eb_restore_last_conv (buff, remote_contact->chatwindow); 02123 } 02124 gdk_window_raise(remote_contact->chatwindow->window->window); 02125 gtk_window_set_focus (GTK_WINDOW 02126 (remote_contact->chatwindow->window), 02127 remote_contact->chatwindow->entry); 02128 } 02129 02130 } else { 02131 gdk_window_raise(remote_contact->chatwindow->window->window); 02132 gtk_window_set_focus (GTK_WINDOW 02133 (remote_contact->chatwindow->window), 02134 remote_contact->chatwindow->entry); 02135 02136 } 02137 02138 if (remote_contact->chatwindow->notebook != NULL) 02139 { 02140 int page_num = 02141 gtk_notebook_page_num (GTK_NOTEBOOK 02142 (remote_contact->chatwindow->notebook), 02143 remote_contact->chatwindow->notebook_child); 02144 /* no more icons in the tabs */ 02145 /* gtk_widget_hide(remote_contact->chatwindow->talk_pixmap); */ 02146 02147 set_tab_normal (GTK_NOTEBOOK (remote_contact->chatwindow->notebook), 02148 remote_contact->chatwindow->notebook_child); 02149 02150 gtk_notebook_set_page (GTK_NOTEBOOK 02151 (remote_contact->chatwindow->notebook), page_num); 02152 } 02153 } |
|
Definition at line 1871 of file chat_window.c. References _, account::account_contact, _chat_window::chat, contact::chatwindow, EXT_GTK_TEXT, and gtk_eb_html_add().
01872 { 01873 struct contact * remote_contact = remote->account_contact; 01874 01875 if(remote_contact->chatwindow) 01876 { 01877 gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), 01878 _("<b>Error: </b>"), 0,0,0); 01879 gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), message, 0,0,0); 01880 gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), "<br>", 0,0,0); 01881 } 01882 } |
|
Definition at line 1904 of file chat_window.c. References _, account::account_contact, local_account::alias, _chat_window::away_msg_sent, BUF_SIZE, _chat_window::chat, contact::chatwindow, DBG_CORE, eb_chat_window_new(), eb_debug, eb_log_message(), eb_restore_last_conv(), eb_smilify(), eb_update_window_title(), _chat_window::entry, EXT_GTK_TEXT, _chat_window::first_enabled, FIRSTMSG, _chat_window::fp, service_callbacks::get_color, service_callbacks::get_smileys, contact::group, gtk_eb_html_add(), incoming_message_filters, _chat_window::local_user, make_safe_filename(), _grouplist::name, NAME_MAX, contact::nick, _chat_window::notebook, _chat_window::notebook_child, _chat_window::perfered, play_sound(), RECEIVE, _chat_window::receive_enabled, RUN_SERVICE, service::sc, send_message(), set_tab_red(), _chat_window::sound_enabled, and _chat_window::window. Referenced by eb_parse_incomming_message().
01908 { 01909 struct contact * remote_contact = remote->account_contact; 01910 gchar buff[BUF_SIZE]; 01911 gchar buff2[BUF_SIZE]; 01912 struct tm * cur_time; 01913 time_t t; 01914 GList * filter_walk; 01915 gchar * message; 01916 gboolean firstmsg = FALSE; /* init to false so only play if 01917 * first msg is one received rather 01918 * than sent */ 01919 #ifdef HAVE_ICONV_H 01920 /* 'BUF_SIZE*2' e.g. for 'Latin-x' to 'UTF-8', 01921 which is 1-byte to 2-byte recoding */ 01922 char recode_buff[BUF_SIZE*2 + 1]; 01923 #endif 01924 01925 01926 /* do we need to ignore this user? If so, do it BEFORE filters so they can't DoS us */ 01927 01928 if(!strcasecmp(remote_contact->group->name, _("Ignore") )) 01929 return; 01930 01931 // Inbound filters here - Meredydd 01932 filter_walk=incoming_message_filters; 01933 01934 eb_debug(DBG_CORE, "Starting to run incoming filters\n"); 01935 01936 message=strdup(o_message); 01937 01938 while(filter_walk!=NULL) 01939 { 01940 gchar * (*ofilter)(eb_local_account *, eb_account *, struct contact *, gchar *); 01941 01942 eb_debug(DBG_CORE, "Running an incoming filter\n"); 01943 ofilter=(gchar *(*)(eb_local_account *, eb_account *, struct contact *, gchar *))filter_walk->data; 01944 01945 message=ofilter(account, remote, remote_contact, message); 01946 if(message==NULL) { return; } // Nothing to clean up (I think...) 01947 01948 filter_walk=g_list_next(filter_walk); 01949 } 01950 01951 eb_debug(DBG_CORE, "Finished incoming filters\n"); 01952 01953 // end inbound filters 01954 01955 01956 message = eb_smilify(message, serv->sc->get_smileys()); 01957 01958 if(!remote_contact->chatwindow || !remote_contact->chatwindow->window) 01959 { 01960 if(remote_contact->chatwindow) 01961 g_free(remote_contact->chatwindow); 01962 01963 remote_contact->chatwindow = eb_chat_window_new(account, remote_contact); 01964 01965 if (!remote_contact->chatwindow) 01966 /* this message is ignored */ 01967 return; 01968 01969 gtk_widget_show(remote_contact->chatwindow->window); 01970 firstmsg = TRUE; /* chat window created by 01971 * receive msg, so set to true */ 01972 if (do_restore_last_conv){ 01973 gchar buff[NAME_MAX]; 01974 make_safe_filename(buff, remote_contact->nick); 01975 eb_restore_last_conv(buff,remote_contact->chatwindow); 01976 } 01977 } 01978 01979 /*for now we will assume the identity that the person in question talked 01980 to us last as */ 01981 remote_contact->chatwindow->local_user = account; 01982 01983 /*also specify that if possible, try to use the same account they used 01984 to last talk to us with */ 01985 remote_contact->chatwindow->perfered = remote; 01986 01987 if (remote_contact->chatwindow->notebook != NULL) { 01988 /* no more icons in the tabs */ 01989 /* gtk_widget_show(remote_contact->chatwindow->talk_pixmap); */ 01990 01991 if (gtk_notebook_page_num(GTK_NOTEBOOK(remote_contact->chatwindow->notebook), 01992 remote_contact->chatwindow->notebook_child) != gtk_notebook_get_current_page( 01993 GTK_NOTEBOOK(remote_contact->chatwindow->notebook))) 01994 { 01995 set_tab_red(GTK_NOTEBOOK(remote_contact->chatwindow->notebook), remote_contact->chatwindow->notebook_child); 01996 } 01997 01998 } else { 01999 gdk_window_raise(remote_contact->chatwindow->window->window); 02000 gtk_window_set_focus(GTK_WINDOW(remote_contact->chatwindow->window), 02001 remote_contact->chatwindow->entry); 02002 } 02003 02004 eb_update_window_title(remote_contact->chatwindow, TRUE); 02005 02006 if(remote_contact->chatwindow->sound_enabled) 02007 { 02008 if (firstmsg) 02009 { 02010 if (remote_contact->chatwindow->first_enabled) 02011 { 02012 play_sound(FIRSTMSG); 02013 firstmsg = FALSE; 02014 } 02015 else 02016 { 02017 play_sound(RECEIVE); 02018 firstmsg = FALSE; 02019 } 02020 } 02021 else if (remote_contact->chatwindow->receive_enabled) 02022 play_sound(RECEIVE); 02023 } 02024 02025 /*for grab the focus*/ 02026 02027 if(do_raise_window) 02028 { 02029 gdk_window_raise(remote_contact->chatwindow->window->window); 02030 // gtk_widget_grab_focus(remote_contact->chatwindow->entry); 02031 } 02032 02033 if (do_convo_timestamp) 02034 { 02035 gchar * color; 02036 02037 color=serv->sc->get_color(); // note do not free() afterwards, may be static 02038 02039 time(&t); 02040 cur_time = localtime(&t); 02041 g_snprintf(buff2, BUF_SIZE, "<FONT COLOR=\"#ff0000\">%d:%.2d:%.2d</FONT> <FONT COLOR=\"%s\">%s:</FONT>", 02042 cur_time->tm_hour, cur_time->tm_min, 02043 cur_time->tm_sec, color, remote_contact->nick); 02044 } 02045 else 02046 { 02047 g_snprintf(buff2, BUF_SIZE, "%s", remote_contact->nick); 02048 } 02049 02050 #ifdef HAVE_ICONV_H 02051 message = recode_if_needed(message, recode_buff, RECODE_TO_LOCAL); 02052 #endif 02053 02054 g_snprintf(buff, BUF_SIZE, "<B>%s </B>",buff2); 02055 02056 gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), buff,0,0,0); 02057 gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), message,do_ignore_back,do_ignore_fore,do_ignore_font); 02058 gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), "<BR>",0,0,0); 02059 02060 /* Log the message */ 02061 02062 if(do_logging) eb_log_message(remote_contact->chatwindow->fp, buff, message); 02063 02064 /* If user's away and hasn't yet sent the away message in the last 5 minutes, 02065 send, display, & log his away message. 02066 We might want to give the option of whether or not to always send the message.*/ 02067 02068 if(is_away && (time(NULL) - remote_contact->chatwindow->away_msg_sent) > 300) 02069 { 02070 send_message(NULL, remote_contact->chatwindow); 02071 RUN_SERVICE(account)->send_im( 02072 account, 02073 remote, 02074 gtk_entry_get_text(GTK_ENTRY(away_message))); 02075 time(&t); 02076 cur_time = localtime(&t); 02077 g_snprintf(buff, BUF_SIZE, "<FONT COLOR=\"#0000ff\"><B>%d:%.2d:%.2d %s: </B></FONT>", 02078 cur_time->tm_hour, cur_time->tm_min, cur_time->tm_sec, 02079 account->alias); 02080 gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), buff,0,0,0); 02081 gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), 02082 gtk_entry_get_text(GTK_ENTRY(away_message)),do_ignore_back,do_ignore_fore,do_ignore_font); 02083 gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), "<br>", 0,0,0); 02084 02085 /* Note that the time the last away message has been sent */ 02086 02087 remote_contact->chatwindow->away_msg_sent = time(NULL); 02088 02089 /* Log it */ 02090 02091 if(do_logging) eb_log_message(remote_contact->chatwindow->fp, buff, 02092 gtk_entry_get_text(GTK_ENTRY(away_message))); 02093 } 02094 free(message); 02095 } |
|
Definition at line 2409 of file chat_window.c. References contact::chatwindow, find_contact_by_handle(), account::handle, and _chat_window::status_label. Referenced by eb_update_status().
02411 { 02412 struct contact * remote_contact = find_contact_by_handle(remote->handle); 02413 char * tmp = NULL; 02414 02415 /* trim @.* part for User is typing */ 02416 if (remote_contact == NULL || remote_contact->chatwindow == NULL) { 02417 gchar ** tmp_ct = NULL; 02418 if (strchr (remote->handle,'@') ) { 02419 tmp_ct = g_strsplit (remote->handle,"@",2); 02420 remote_contact = find_contact_by_handle(tmp_ct[0]); 02421 g_strfreev (tmp_ct); 02422 } 02423 } 02424 02425 if (remote_contact == NULL || remote_contact->chatwindow == NULL) 02426 return; 02427 02428 if (message != NULL && strlen(message) > 0) 02429 tmp = g_strdup_printf("%s", message); 02430 else 02431 tmp = g_strdup_printf(" "); 02432 02433 gtk_label_set_text( GTK_LABEL(remote_contact->chatwindow->status_label), tmp ); 02434 g_free(tmp); 02435 } |
|
Definition at line 1884 of file chat_window.c. References _, BUF_SIZE, _chat_window::chat, contact::chatwindow, EXT_GTK_TEXT, gtk_eb_html_add(), and contact::nick. Referenced by contact_login(), and contact_logoff().
01885 { 01886 gchar buff[BUF_SIZE]; 01887 time_t my_time = time(NULL); 01888 if(!c || !c->chatwindow) 01889 return; 01890 01891 if(!do_timestamp) 01892 { 01893 return; 01894 } 01895 01896 gtk_eb_html_add(EXT_GTK_TEXT(c->chatwindow->chat), "<hr>", 0,0,0); 01897 g_snprintf(buff, BUF_SIZE,_("<b>%s is logged %s @ %s.</b>"), 01898 c->nick, (online?_("in"):_("out")), g_strchomp(asctime(localtime(&my_time)))); 01899 gtk_eb_html_add(EXT_GTK_TEXT(c->chatwindow->chat), buff, 0,0,0); 01900 gtk_eb_html_add(EXT_GTK_TEXT(c->chatwindow->chat), "<hr>", 0,0,0); 01901 } |
|
Definition at line 1320 of file chat_window.c. References _, add_unknown_callback(), _chat_window::allow_button, allow_offline_on_click(), allow_offline_on_toggle(), _chat_window::away_msg_sent, can_offline_message(), _chat_window::chat, chat_key_press(), chat_notebook_switch_callback(), chat_singleline_key_press(), close_tab_callback(), close_win(), _chat_window::contact, destroy_event(), eb_icon(), _chat_window::entry, EXT_GTK_TEXT, ext_gtk_text_new(), find_tabbed_chat_window(), _chat_window::first_enabled, _chat_window::fp, contact::group, gtk_eb_html_init(), gtkspell_attach(), gtkspell_running(), gtkspell_start(), handle_click(), handle_focus(), ignore_callback(), _chat_window::local_user, make_safe_filename(), _grouplist::name, NAME_MAX, contact::nick, _chat_window::notebook, _chat_window::notebook_child, _chat_window::perfered, _chat_window::receive_enabled, _chat_window::send_enabled, send_file(), send_message(), set_sound_on_click(), set_sound_on_toggle(), show_smileys_callback(), _chat_window::smiley_button, _chat_window::sound_button, _chat_window::sound_enabled, _chat_window::status_label, view_log_callback(), and _chat_window::window. Referenced by eb_chat_window_display_account(), eb_chat_window_display_contact(), and eb_chat_window_display_remote_message().
01321 { 01322 GtkWidget *vbox; 01323 GtkWidget *hbox; 01324 GtkWidget *scrollwindow; 01325 GtkWidget *toolbar; 01326 GtkWidget *add_button; 01327 GtkWidget *sendf_button; 01328 GtkWidget *send_button; 01329 GtkWidget *view_log_button; 01330 GtkWidget *close_button; 01331 GtkWidget *ignore_button; 01332 GtkWidget *iconwid; 01333 GdkPixmap *icon; 01334 GdkBitmap *mask; 01335 GtkAccelGroup *accel_group; 01336 GtkWidget *menu; 01337 GtkWidget *button; 01338 GtkWidget *separator; 01339 GtkWidget *resize_bar; 01340 gchar buff[NAME_MAX]; 01341 chat_window *cw; 01342 chat_window *tab_cw; 01343 GtkPositionType pos; 01344 GtkWidget *contact_label; 01345 01346 if (do_ignore_unknown) 01347 { 01348 if (!strcmp(_("Unknown"), remote->group->name)) 01349 return NULL; 01350 } 01351 01352 /* first we allocate room for the new chat window */ 01353 cw = g_new0(chat_window,1); 01354 cw->contact = remote; 01355 cw->away_msg_sent = 0; 01356 cw->perfered = NULL; 01357 cw->local_user = NULL; 01358 01359 vbox = gtk_vbox_new(FALSE,0); 01360 01361 /* we're doing a tabbed chat */ 01362 if (do_tabbed_chat) { 01363 /* look for an already open tabbed chat window */ 01364 tab_cw = find_tabbed_chat_window(); 01365 if (tab_cw == NULL) { 01366 /* none exists, create one */ 01367 cw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 01368 gtk_window_set_wmclass(GTK_WINDOW(cw->window), "yattm-chat", "Yattm"); 01369 gtk_window_set_policy(GTK_WINDOW(cw->window), TRUE, TRUE, TRUE); 01370 gtk_widget_realize(cw->window); 01371 01372 cw->notebook = gtk_notebook_new(); 01373 01374 /* Set tab orientation.... */ 01375 pos = GTK_POS_BOTTOM; 01376 switch (do_tabbed_chat_orient) 01377 { 01378 case 1: 01379 pos = GTK_POS_TOP; 01380 break;; 01381 01382 case 2: 01383 pos = GTK_POS_LEFT; 01384 break;; 01385 01386 case 3: 01387 pos = GTK_POS_RIGHT; 01388 break;; 01389 01390 case 0: 01391 default: 01392 pos = GTK_POS_BOTTOM; 01393 break;; 01394 } 01395 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(cw->notebook), pos); 01396 /* End tab orientation */ 01397 01398 gtk_notebook_set_scrollable(GTK_NOTEBOOK(cw->notebook), TRUE); 01399 gtk_container_add(GTK_CONTAINER(cw->window), cw->notebook); 01400 01401 /* setup a signal handler for the notebook to handle page switches */ 01402 gtk_signal_connect(GTK_OBJECT(cw->notebook), "switch-page", 01403 GTK_SIGNAL_FUNC(chat_notebook_switch_callback), 01404 cw); 01405 01406 01407 gtk_widget_show(cw->notebook); 01408 } else { 01409 cw->window = tab_cw->window; 01410 cw->notebook = tab_cw->notebook; 01411 } 01412 01413 /* set up the text and close button */ 01414 contact_label = gtk_label_new(remote->nick); 01415 gtk_widget_show(contact_label); 01416 01417 /* we use vbox as our child. */ 01418 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5); 01419 cw->notebook_child = vbox; 01420 gtk_notebook_append_page(GTK_NOTEBOOK(cw->notebook), cw->notebook_child, contact_label); 01421 gtk_widget_show(cw->notebook_child); 01422 } else { 01423 /* setup like normal */ 01424 cw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 01425 01426 gtk_window_set_wmclass(GTK_WINDOW(cw->window), "yattm-chat", "Yattm"); 01427 gtk_window_set_policy(GTK_WINDOW(cw->window), TRUE, TRUE, TRUE); 01428 gtk_widget_realize(cw->window); 01429 01430 cw->notebook = NULL; 01431 cw->notebook_child = NULL; 01432 gtk_container_add(GTK_CONTAINER(cw->window), vbox); 01433 gtk_widget_show(vbox); 01434 } 01435 01436 /* Next line allows making window smaller than orig. size */ 01437 cw->chat = ext_gtk_text_new(NULL,NULL); 01438 gtk_eb_html_init(EXT_GTK_TEXT(cw->chat)); 01439 scrollwindow = gtk_scrolled_window_new(NULL, EXT_GTK_TEXT(cw->chat)->vadj); 01440 /* gtk_widget_realize(cw->window); */ 01441 01442 gtk_window_set_title(GTK_WINDOW(cw->window), remote->nick); 01443 01444 eb_icon(cw->window->window); 01445 gtk_widget_set_usize(scrollwindow, 375, 150); 01446 gtk_container_add(GTK_CONTAINER(scrollwindow), cw->chat); 01447 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwindow), 01448 GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); 01449 gtk_widget_show(scrollwindow); 01450 01451 /* Create the bar for resizing chat/window box */ 01452 01453 /*Add stuff for multi-line*/ 01454 01455 if(do_multi_line) 01456 { 01457 resize_bar = gtk_vpaned_new(); 01458 gtk_paned_set_gutter_size(GTK_PANED(resize_bar), 20); 01459 gtk_paned_pack1(GTK_PANED(resize_bar), scrollwindow, TRUE, TRUE); 01460 gtk_widget_show(scrollwindow); 01461 01462 scrollwindow = gtk_scrolled_window_new(NULL, NULL); 01463 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrollwindow), 01464 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); 01465 01466 cw->entry = gtk_text_new(NULL, NULL); 01467 01468 gtk_widget_set_usize(scrollwindow, 375, 50); 01469 gtk_container_add(GTK_CONTAINER(scrollwindow), cw->entry); 01470 01471 gtk_text_set_editable(GTK_TEXT(cw->entry), TRUE); 01472 gtk_text_set_word_wrap(GTK_TEXT(cw->entry), TRUE); 01473 gtk_text_set_line_wrap(GTK_TEXT(cw->entry), TRUE); 01474 01475 #ifdef HAVE_ISPELL 01476 if(do_spell_checking) 01477 { 01478 if(!gtkspell_running()) 01479 { 01480 gchar *ispell_cmd[] = { "ispell", "-a", NULL }; 01481 gtkspell_start(NULL, ispell_cmd); 01482 } 01483 gtkspell_attach(GTK_TEXT(cw->entry)); 01484 } 01485 #endif 01486 01487 gtk_signal_connect(GTK_OBJECT(cw->entry), "key_press_event", 01488 GTK_SIGNAL_FUNC(chat_key_press), 01489 cw); 01490 01491 gtk_paned_pack2(GTK_PANED(resize_bar), scrollwindow, FALSE, FALSE); 01492 gtk_widget_show(scrollwindow); 01493 gtk_box_pack_start(GTK_BOX(vbox),resize_bar, TRUE, TRUE, 5); 01494 gtk_widget_show(resize_bar); 01495 } 01496 01497 /*Or not multi-line*/ 01498 01499 else 01500 { 01501 cw->entry = gtk_entry_new(); 01502 gtk_signal_connect(GTK_OBJECT(cw->entry), "key_press_event", 01503 GTK_SIGNAL_FUNC(chat_singleline_key_press), 01504 cw); 01505 01506 gtk_box_pack_start(GTK_BOX(vbox), scrollwindow, TRUE,TRUE, 5); 01507 gtk_box_pack_start(GTK_BOX(vbox), cw->entry, FALSE,FALSE, 5); 01508 } 01509 01510 gtk_container_set_border_width(GTK_CONTAINER(cw->window), do_tabbed_chat ? 2 : 5); 01511 /* gtk_container_add(GTK_CONTAINER(cw->window), vbox); */ 01512 01513 gtk_signal_connect(GTK_OBJECT(cw->entry), "activate", 01514 GTK_SIGNAL_FUNC(send_message), cw); 01515 01516 gtk_signal_connect(GTK_OBJECT(vbox), "destroy", 01517 GTK_SIGNAL_FUNC(destroy_event), cw); 01518 01519 gtk_signal_connect(GTK_OBJECT(cw->chat), "button_press_event", 01520 GTK_SIGNAL_FUNC(handle_click), cw); 01521 01522 gtk_signal_connect(GTK_OBJECT(cw->window), "focus_in_event", 01523 GTK_SIGNAL_FUNC(handle_focus), cw); 01524 01525 hbox = gtk_hbox_new(FALSE, 0); 01526 gtk_widget_set_usize(hbox, 200, 25); 01527 01528 toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS); 01529 gtk_toolbar_set_button_relief(GTK_TOOLBAR(toolbar), GTK_RELIEF_NONE); 01530 gtk_container_set_border_width(GTK_CONTAINER(toolbar), 0); 01531 gtk_toolbar_set_space_size(GTK_TOOLBAR(toolbar), 5); 01532 01533 /* Adding accelerators to windows*/ 01534 01535 accel_group = gtk_accel_group_new(); 01536 gtk_window_add_accel_group(GTK_WINDOW(cw->window), accel_group); 01537 menu = gtk_menu_new(); 01538 01539 /* This is the same as handle_clicks, without showing the menu for 01540 accelerators to hopefully work better now. 01541 */ 01542 01543 /*Add Contact Selection*/ 01544 01545 if(!strcmp(cw->contact->group->name, _("Unknown"))) 01546 { 01547 button = gtk_menu_item_new_with_label(_("Add Contact")); 01548 gtk_signal_connect(GTK_OBJECT(button), "activate", 01549 GTK_SIGNAL_FUNC(add_unknown_callback), 01550 cw); 01551 gtk_menu_append(GTK_MENU(menu), button); 01552 } 01553 01554 /*Allow Offline Messaging Selection*/ 01555 01556 if(can_offline_message(cw->contact)) 01557 { 01558 button = gtk_menu_item_new_with_label(_("Offline Messaging")); 01559 gtk_signal_connect(GTK_OBJECT(button), "activate", 01560 GTK_SIGNAL_FUNC(allow_offline_on_click), 01561 cw); 01562 gtk_widget_add_accelerator(button, "activate", accel_group, 01563 GDK_o, GDK_CONTROL_MASK, 01564 GTK_ACCEL_VISIBLE); 01565 gtk_menu_append(GTK_MENU(menu), button); 01566 } 01567 01568 /*Sound Selection*/ 01569 01570 if (cw->sound_enabled) 01571 { 01572 button = gtk_menu_item_new_with_label(_("Disable Sounds")); 01573 } 01574 else 01575 { 01576 button = gtk_menu_item_new_with_label(_("Enable Sounds")); 01577 } 01578 01579 gtk_signal_connect(GTK_OBJECT(button), "activate", 01580 GTK_SIGNAL_FUNC(set_sound_on_click), 01581 cw); 01582 gtk_widget_add_accelerator(button, "activate", accel_group, 01583 GDK_s, GDK_CONTROL_MASK, 01584 GTK_ACCEL_VISIBLE); 01585 gtk_menu_append(GTK_MENU(menu), button); 01586 01587 /* Ignore button section */ 01588 01589 button = gtk_menu_item_new_with_label(_("Ignore Contact")); 01590 gtk_signal_connect(GTK_OBJECT(button), "activate", 01591 GTK_SIGNAL_FUNC(ignore_callback), cw); 01592 gtk_widget_add_accelerator(button, "activate", accel_group, 01593 GDK_g, GDK_CONTROL_MASK, 01594 GTK_ACCEL_VISIBLE); 01595 gtk_menu_append(GTK_MENU(menu), button); 01596 01597 /*Send File Selection*/ 01598 01599 button = gtk_menu_item_new_with_label(_("Send File")); 01600 gtk_signal_connect(GTK_OBJECT(button), "activate", 01601 GTK_SIGNAL_FUNC(send_file), 01602 cw); 01603 gtk_widget_add_accelerator(button, "activate", accel_group, 01604 GDK_t, GDK_CONTROL_MASK, 01605 GTK_ACCEL_VISIBLE); 01606 gtk_menu_append(GTK_MENU(menu), button); 01607 01608 /*Send Selection*/ 01609 01610 button = gtk_menu_item_new_with_label(_("Send Message")); 01611 gtk_signal_connect(GTK_OBJECT(button), "activate", 01612 GTK_SIGNAL_FUNC(send_message), 01613 cw); 01614 gtk_widget_add_accelerator(button, "activate", accel_group, 01615 GDK_r, GDK_CONTROL_MASK, 01616 GTK_ACCEL_VISIBLE); 01617 gtk_menu_append(GTK_MENU(menu), button); 01618 01619 /*** MIZHI 01620 * view log file selection 01621 */ 01622 01623 button = gtk_menu_item_new_with_label(_("View log")); 01624 gtk_signal_connect(GTK_OBJECT(button), "activate", 01625 GTK_SIGNAL_FUNC(view_log_callback), 01626 cw); 01627 gtk_widget_add_accelerator(button, "activate", accel_group, 01628 GDK_l, GDK_CONTROL_MASK, 01629 GTK_ACCEL_VISIBLE); 01630 gtk_menu_append(GTK_MENU(menu), button); 01631 01632 /*Close Selection*/ 01633 01634 button = gtk_menu_item_new_with_label(_("Close")); 01635 01636 gtk_signal_connect(GTK_OBJECT(button), "activate", 01637 GTK_SIGNAL_FUNC(close_win), 01638 cw); 01639 01640 gtk_widget_add_accelerator(button, "activate", accel_group, 01641 GDK_q, GDK_CONTROL_MASK, 01642 GTK_ACCEL_VISIBLE); 01643 gtk_menu_append(GTK_MENU(menu), button); 01644 01645 /*This is we decide whether or not the add button should be displayed*/ 01646 01647 if (!strcmp(cw->contact->group->name, _("Unknown"))) 01648 { 01649 /*This is the add button*/ 01650 icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_book_red_xpm); 01651 iconwid = gtk_pixmap_new(icon , mask); 01652 gtk_widget_show(iconwid); 01653 add_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), 01654 _("Add"), 01655 _("Add Contact"), 01656 _("Add"), 01657 iconwid, 01658 GTK_SIGNAL_FUNC(add_unknown_callback), 01659 cw); 01660 gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 01661 } 01662 01663 /*Decide whether the offline messaging button should be displayed*/ 01664 01665 if(can_offline_message(remote)) 01666 { 01667 icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_edit_xpm); 01668 iconwid = gtk_pixmap_new(icon , mask); 01669 gtk_widget_show(iconwid); 01670 cw->allow_button = gtk_toolbar_append_element(GTK_TOOLBAR(toolbar), 01671 GTK_TOOLBAR_CHILD_TOGGLEBUTTON, 01672 NULL, 01673 _("Allow"), 01674 _("Allow Offline Messaging CTRL+O"), 01675 _("Allow"), 01676 iconwid, 01677 GTK_SIGNAL_FUNC(allow_offline_on_toggle), 01678 cw); 01679 gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 01680 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(cw->allow_button), FALSE); 01681 } 01682 01683 /* smileys */ 01684 if(do_smiley == 1) { 01685 icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, smiley_button_xpm); 01686 iconwid = gtk_pixmap_new(icon, mask); 01687 gtk_widget_show(iconwid); 01688 cw->smiley_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), 01689 _("Smiley"), 01690 _("Insert Smiley"), 01691 _("Smiley"), 01692 iconwid, 01693 GTK_SIGNAL_FUNC(show_smileys_callback), 01694 cw); 01695 /*Create the separator for the toolbar*/ 01696 01697 gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 01698 separator = gtk_vseparator_new(); 01699 gtk_widget_set_usize(GTK_WIDGET(separator), 0, 20); 01700 gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar), separator, NULL, NULL); 01701 gtk_widget_show(separator); 01702 gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 01703 } 01704 /*This is the sound toggle button*/ 01705 01706 icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_volume_xpm); 01707 iconwid = gtk_pixmap_new(icon, mask); 01708 gtk_widget_show(iconwid); 01709 cw->sound_button = gtk_toolbar_append_element(GTK_TOOLBAR(toolbar), 01710 GTK_TOOLBAR_CHILD_TOGGLEBUTTON, 01711 NULL, 01712 _("Sound"), 01713 _("Enable Sounds CTRL+S"), 01714 _("Sound"), 01715 iconwid, 01716 GTK_SIGNAL_FUNC(set_sound_on_toggle), 01717 cw); 01718 gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 01719 01720 /*Toggle the sound button based on preferences*/ 01721 01722 if (do_play_send) 01723 cw->send_enabled=TRUE; 01724 01725 if (do_play_receive) 01726 cw->receive_enabled = TRUE; 01727 01728 if (do_play_first) 01729 cw->first_enabled = TRUE; 01730 01731 if (do_play_send + do_play_receive + do_play_first > 0) 01732 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(cw->sound_button), TRUE); 01733 else 01734 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(cw->sound_button), FALSE); 01735 01736 /*Create the separator for the toolbar*/ 01737 01738 separator = gtk_vseparator_new(); 01739 gtk_widget_set_usize(GTK_WIDGET(separator), 0, 20); 01740 gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar), separator, NULL, NULL); 01741 gtk_widget_show(separator); 01742 gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 01743 01744 /*** MIZHI 01745 * create the button for the log viewing functions 01746 */ 01747 01748 icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_search_xpm); 01749 iconwid = gtk_pixmap_new(icon, mask); 01750 gtk_widget_show(iconwid); 01751 view_log_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), 01752 "View", 01753 _("View Log CTRL+L"), 01754 "View", 01755 iconwid, 01756 GTK_SIGNAL_FUNC(view_log_callback), 01757 cw); 01758 gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 01759 01760 /*This is the send file button*/ 01761 01762 icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_open_xpm); 01763 iconwid = gtk_pixmap_new(icon, mask); 01764 gtk_widget_show(iconwid); 01765 sendf_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), 01766 "sendf", 01767 _("Send File CTRL+T"), 01768 "sendf", 01769 iconwid, 01770 GTK_SIGNAL_FUNC(send_file), 01771 cw); 01772 gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 01773 01774 /*This is the ignore button*/ 01775 01776 icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_no_xpm); 01777 iconwid = gtk_pixmap_new(icon, mask); 01778 gtk_widget_show(iconwid); 01779 ignore_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), 01780 "ignore", 01781 _("Ignore CTRL+G"), 01782 "ignore", 01783 iconwid, 01784 GTK_SIGNAL_FUNC(ignore_callback), 01785 cw); 01786 gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 01787 01788 /*This is the send button*/ 01789 01790 icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_mail_send_xpm); 01791 iconwid = gtk_pixmap_new(icon, mask); 01792 gtk_widget_show(iconwid); 01793 send_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), 01794 "send", 01795 _("Send Message CTRL+R"), 01796 "send", 01797 iconwid, 01798 GTK_SIGNAL_FUNC(send_message), 01799 cw); 01800 gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 01801 01802 /* Vertical separator */ 01803 01804 separator = gtk_vseparator_new(); 01805 gtk_widget_set_usize(GTK_WIDGET(separator), 0, 20); 01806 gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar), separator, NULL, NULL); 01807 gtk_widget_show(separator); 01808 gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 01809 01810 /*This is the close button*/ 01811 01812 icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, cancel_xpm); 01813 iconwid = gtk_pixmap_new(icon, mask); 01814 gtk_widget_show(iconwid); 01815 01816 if (do_tabbed_chat) 01817 { 01818 close_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), 01819 "close", 01820 _("Close CTRL+Q"), 01821 "close", 01822 iconwid, 01823 GTK_SIGNAL_FUNC(close_tab_callback), 01824 cw); 01825 } else { 01826 01827 close_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), 01828 "close", 01829 _("Close CTRL+Q"), 01830 "close", 01831 iconwid, 01832 GTK_SIGNAL_FUNC(close_win), 01833 cw); 01834 } 01835 01836 cw->status_label = gtk_label_new(" "); 01837 gtk_box_pack_start(GTK_BOX(hbox), cw->status_label, FALSE, FALSE, 0); 01838 gtk_widget_show(cw->status_label); 01839 01840 gtk_box_pack_end(GTK_BOX(hbox), toolbar, FALSE, FALSE, 0); 01841 gtk_widget_show(toolbar); 01842 01843 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); 01844 gtk_widget_show(hbox); 01845 01846 make_safe_filename(buff, remote->nick); 01847 01848 if ((cw->fp = fopen(buff, "a")) == NULL) 01849 { 01850 perror(buff); 01851 do_logging=0; 01852 } 01853 01854 if(do_logging) 01855 { 01856 time_t my_time = time(NULL); 01857 fprintf(cw->fp, _("%sConversation started on %s %s\n"), 01858 (do_strip_html ? "" : "<HR WIDTH=\"100%%\"><P ALIGN=\"CENTER\"><B>"), 01859 g_strchomp(asctime(localtime(&my_time))), (do_strip_html?"":"</B></P>")); 01860 fflush(cw->fp); 01861 } 01862 01863 gtk_widget_show(cw->chat); 01864 gtk_widget_show(cw->entry); 01865 /* gtk_widget_show(vbox); 01866 gtk_widget_show(cw->notebook); */ 01867 01868 return cw; 01869 } |
|
Definition at line 2227 of file chat_window.c. References strip_html(). Referenced by eb_chat_window_display_remote_message(), eb_log_status_changed(), and send_message().
02228 { 02229 gchar * my_name = strdup(buff); 02230 gchar * my_message = strdup(message); 02231 02232 /* Get rid of the HTML if the user doesn't want it */ 02233 02234 if(do_strip_html) 02235 { 02236 strip_html(my_message); 02237 strip_html(my_name); 02238 } 02239 02240 /* Log the message, using the appropriate formatting */ 02241 02242 fprintf(log_file, "%s %s %s %s\n", 02243 (do_strip_html ? "" : "<P>"), my_name, my_message, (do_strip_html ? "" : "</P>")); 02244 fflush(log_file); 02245 02246 free(my_message); 02247 free(my_name); 02248 } |
|
Definition at line 2216 of file chat_window.c. References account::account_contact, contact::chatwindow, eb_log_message(), _chat_window::fp, and account::handle. Referenced by buddy_update_status_and_log().
02217 { 02218 if(ea == NULL || ea->account_contact == NULL || 02219 ea->account_contact->chatwindow == NULL || 02220 ea->account_contact->chatwindow->fp == NULL) 02221 return; 02222 02223 eb_log_message(ea->account_contact->chatwindow->fp, ea->handle, 02224 ((status && status[0])?status:"Available")); 02225 } |
|
Definition at line 2250 of file chat_window.c. References _, BUF_SIZE, _chat_window::chat, _chat_window::contact, EXT_GTK_TEXT, gtk_eb_html_add(), contact::nick, and strip_html(). Referenced by eb_chat_window_display_account(), eb_chat_window_display_contact(), and eb_chat_window_display_remote_message().
02251 { 02252 FILE * fp; 02253 gchar buff[1024]; 02254 gchar buff2[1024]; 02255 gchar *buff3; 02256 gchar color[8]; 02257 gchar name[512]; 02258 gchar *token; 02259 long location = -1; 02260 long lastlocation = -1; 02261 long beforeget; 02262 02263 if ( (fp = fopen(file_name, "r")) == NULL) 02264 { 02265 //there must not be a list logfile... 02266 return; 02267 } 02268 02269 02270 /*find last conversation */ 02271 while(!feof(fp)) 02272 { 02273 beforeget = ftell(fp); 02274 fgets(buff, 1024, fp); 02275 if(feof(fp)) 02276 { 02277 break; 02278 } 02279 g_strchomp(buff); 02280 if(!strncmp(buff,_("Conversation started"),strlen(_("Conversation started"))) 02281 || !strncmp(buff,_("<HR WIDTH=\"100%\"><P ALIGN=\"CENTER\"><B>Conversation started"),strlen(_("<HR WIDTH=\"100%\"><P ALIGN=\"CENTER\"><B>Conversation started")))) 02282 { 02283 lastlocation = location; 02284 location = beforeget; 02285 } 02286 } 02287 02288 if(lastlocation == -1) 02289 { 02290 if(location == -1 || location == 0) 02291 { 02292 fclose(fp); 02293 return; 02294 } 02295 lastlocation = location; 02296 } 02297 fseek(fp,lastlocation, SEEK_SET); 02298 02299 /* now we display the log */ 02300 while(!feof(fp)) 02301 { 02302 fgets(buff,1024,fp); 02303 if(feof(fp)) 02304 { 02305 break; 02306 } 02307 g_strchomp(buff); 02308 02309 if(buff[0] == '<') /*this is html*/ 02310 { 02311 02312 if(!strncmp(buff,"<HR WIDTH=\"100%\">", 02313 strlen("<HR WIDTH=\"100%\">"))) 02314 { 02315 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff+strlen("<HR WIDTH=\"100%\">"),0,0,0); 02316 } 02317 else 02318 { 02319 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff, 0,0,0); 02320 } 02321 02322 02323 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<br>",0,0,0); 02324 02325 if(strlen(buff) > 34 && !strncmp(buff+34,_("ended on"),8)) 02326 { 02327 break; 02328 } 02329 } 02330 else if(!strncmp(buff,_("Conversation started"),strlen(_("Conversation started")))) 02331 { 02332 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<hr>", 0,0,0); 02333 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff, 0,0,0); 02334 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<br>",0,0,0); 02335 02336 } 02337 else if(!strncmp(buff,_("Conversation ended"),strlen(_("Conversation ended")))) 02338 { 02339 02340 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff,0,0,0); 02341 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<br>",0,0,0); 02342 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<hr>",0,0,0); 02343 break; 02344 } 02345 else 02346 { 02347 strip_html(buff); /*better safe than sorry */ 02348 strcpy(buff2, buff); 02349 02350 token = strtok(buff2,":"); 02351 02352 if(token && (strcmp(buff,token) != 0)) 02353 { 02354 /* not happy with this if statement at all! */ 02355 if(((strlen(token)==3)&&isdigit((int)token[1])&&isdigit(token[2])) 02356 || ((strlen(token)==2) && isdigit((int)token[1]))) 02357 { 02358 /* we must have time stamps */ 02359 /* allready have hours */ 02360 token = strtok(NULL,":"); /*minutes*/ 02361 if(token == NULL) /* we were wrong, this isn't a time stamp */ 02362 { 02363 break; /* need to test this */ 02364 } 02365 token = strtok(NULL,":"); /*seconds + name*/ 02366 02367 if(token == NULL) /* we were wrong, this isn't a time stamp */ 02368 break; /* need to test this */ 02369 buff3 = token + strlen(token)+1; /* should be the end 02370 of the screen name */ 02371 token+=3; 02372 } 02373 else 02374 { 02375 /* no time stamps */ 02376 buff3 = buff2+strlen(token)+1; 02377 token++; 02378 } 02379 if( !strncmp(token,cw->contact->nick,strlen(cw->contact->nick))) 02380 { 02381 /* this is the other person */ 02382 02383 strcpy(color,"#ff0000"); 02384 } 02385 else 02386 { 02387 /* must be me */ 02388 strcpy(color,"#0000ff"); 02389 } 02390 strncpy(name,buff,buff3-buff2); 02391 name[buff3-buff2] = '\0'; 02392 g_snprintf(buff, BUF_SIZE, "<FONT COLOR=\"%s\"><B>%s </B></FONT>",color, name); 02393 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff,0,0,0); 02394 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff3,0,0,0); 02395 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<br>",0,0,0); 02396 } 02397 else 02398 { 02399 /* hmm, no ':' must be a non start/blank line */ 02400 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat),buff2,0,0,0); 02401 gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<br>",0,0,0); 02402 } 02403 } 02404 } 02405 fclose(fp); 02406 02407 } |
|
Definition at line 2470 of file chat_window.c. References local_account::alias, BUF_SIZE, contact::chatwindow, _chat_window::contact, find_tabbed_current_chat_window(), GET_SERVICE, account::handle, _chat_window::local_user, contact::nick, _chat_window::notebook, _chat_window::perfered, and _chat_window::window. Referenced by chat_key_press(), eb_chat_window_display_account(), eb_chat_window_display_remote_message(), handle_focus(), and send_message().
02471 { 02472 char buff[BUF_SIZE]; 02473 02474 if (!do_tabbed_chat 02475 && cw != NULL 02476 && cw->contact != NULL 02477 && cw->perfered != NULL 02478 && cw->local_user != NULL && GET_SERVICE (cw->local_user).name != NULL) 02479 { 02480 g_snprintf (buff, BUF_SIZE, "%s%s (%s <=> %s via %s)", 02481 new_message == TRUE ? "* " : "", 02482 cw->contact->nick, cw->local_user->alias, 02483 cw->perfered->handle, GET_SERVICE (cw->local_user).name); 02484 02485 gtk_window_set_title (GTK_WINDOW (cw->contact->chatwindow->window), 02486 buff); 02487 } 02488 else if (do_tabbed_chat) 02489 { 02490 if (!new_message) 02491 cw = find_tabbed_current_chat_window (); 02492 if (cw && cw->notebook != NULL 02493 && cw->contact != NULL 02494 && cw->local_user != NULL 02495 && cw->perfered != NULL 02496 && GET_SERVICE (cw->local_user).name != NULL) 02497 { 02498 g_snprintf (buff, BUF_SIZE, "%s%s (%s <=> %s via %s)", 02499 new_message == TRUE ? "* " : "", 02500 cw->contact->nick, cw->local_user->alias, 02501 cw->perfered->handle, 02502 GET_SERVICE (cw->local_user).name); 02503 02504 gtk_window_set_title (GTK_WINDOW (cw->contact->chatwindow->window), 02505 buff); 02506 02507 02508 } 02509 } 02510 } |
|
Definition at line 2438 of file chat_window.c. References local_account::alias, BUF_SIZE, contact::chatwindow, _chat_window::contact, find_tabbed_chat_window_index(), GET_SERVICE, account::handle, _chat_window::local_user, contact::nick, _chat_window::notebook, _chat_window::perfered, and _chat_window::window. Referenced by chat_notebook_switch_callback().
02439 { 02440 char buff[BUF_SIZE]; 02441 chat_window * cw = NULL; 02442 02443 cw = find_tabbed_chat_window_index(tab); 02444 if (cw && cw->notebook != NULL 02445 && cw->contact != NULL 02446 && cw->local_user != NULL 02447 && cw->perfered != NULL 02448 && GET_SERVICE (cw->local_user).name != NULL) 02449 { 02450 g_snprintf (buff, BUF_SIZE, "%s%s (%s <=> %s via %s)", 02451 new_message == TRUE ? "* " : "", 02452 cw->contact->nick, cw->local_user->alias, 02453 cw->perfered->handle, 02454 GET_SERVICE (cw->local_user).name); 02455 02456 gtk_window_set_title (GTK_WINDOW (cw->contact->chatwindow->window), 02457 buff); 02458 02459 02460 } 02461 else if(cw && cw->contact != NULL) 02462 { 02463 gtk_window_set_title (GTK_WINDOW (cw->contact->chatwindow->window), 02464 cw->contact->nick); 02465 } 02466 02467 } |
|
Definition at line 241 of file chat_window.c. References _, contact::accounts, contact::chatwindow, _chat_window::contact, _chat_window::fp, _chat_window::history, RUN_SERVICE, and account::service_id. Referenced by destroy_event().
00242 { 00243 GList * node; 00244 00245 /* cw->window=NULL; */ 00246 00247 /* will this fix the weird tabbed chat segfault? */ 00248 if (cw->contact != NULL) 00249 { 00250 cw->contact->chatwindow = NULL; 00251 } 00252 00253 /* 00254 * Some protocols like MSN and jabber require that something 00255 * needs to be done when you stop a conversation 00256 * for every protocol that requires it we call their terminate 00257 * method 00258 */ 00259 00260 for(node = cw->contact->accounts; node; node = node->next) 00261 { 00262 eb_account *ea = (eb_account*)(node->data); 00263 00264 if(eb_services[ea->service_id].sc->terminate_chat) 00265 { 00266 RUN_SERVICE(ea)->terminate_chat(ea); 00267 } 00268 } 00269 00270 for(node=cw->history; node!=NULL; node=node->next) 00271 { 00272 free(node->data); 00273 node->data=NULL; 00274 } 00275 00276 g_list_free(cw->history); 00277 00278 /* 00279 * if we are logging conversations, time stamp when the conversation 00280 * has ended 00281 */ 00282 00283 if(do_logging) 00284 { 00285 time_t my_time = time(NULL); 00286 00287 fprintf(cw->fp, _("%sConversation ended on %s %s\n"), 00288 (do_strip_html ? "" : "<P ALIGN=\"CENTER\"><B>"), 00289 g_strchomp(asctime(localtime(&my_time))), 00290 (do_strip_html ? "" : "</B></P>")); 00291 } 00292 00293 /* 00294 * close the log file 00295 */ 00296 00297 if ((cw->fp != NULL )) fclose(cw->fp); 00298 00299 /* 00300 * and free the memory we allocated to the chat window 00301 * NOTE: a memset is done to flush out bugs related to the 00302 * tabbed chat window 00303 */ 00304 00305 memset(cw, 0, sizeof(chat_window)); 00306 g_free(cw); 00307 } |
|
Definition at line 1228 of file chat_window.c. References contact::chatwindow, and _chat_window::notebook. Referenced by eb_chat_window_new(), find_tabbed_chat_window_index(), and find_tabbed_current_chat_window().
01229 { 01230 GList * l1; 01231 GList * l2; 01232 struct contact* c; 01233 01234 for(l1 = groups; l1; l1=l1->next ) 01235 { 01236 for(l2 = ((grouplist*)l1->data)->members; l2; l2=l2->next ) 01237 { 01238 c = (struct contact*)l2->data; 01239 if (c->chatwindow != NULL) { 01240 if (c->chatwindow->notebook != NULL) { 01241 return c->chatwindow; 01242 } 01243 } 01244 } 01245 } 01246 01247 return NULL; 01248 } |
|
Definition at line 1251 of file chat_window.c. References contact::chatwindow, find_tabbed_chat_window(), and _chat_window::notebook_child. Referenced by eb_update_window_title_to_tab().
01252 { 01253 GList *l1; 01254 GList *l2; 01255 struct contact *c; 01256 01257 chat_window *notebook_window = find_tabbed_chat_window (); 01258 if (notebook_window == NULL || notebook_window->notebook == NULL) 01259 { 01260 return NULL; 01261 } 01262 01263 01264 for (l1 = groups; l1; l1 = l1->next) 01265 { 01266 for (l2 = ((grouplist *) l1->data)->members; l2; l2 = l2->next) 01267 { 01268 c = (struct contact *) l2->data; 01269 if (c->chatwindow != NULL) 01270 { 01271 if (gtk_notebook_page_num 01272 (GTK_NOTEBOOK (notebook_window->notebook), 01273 c->chatwindow->notebook_child) == current_page) 01274 { 01275 return c->chatwindow; 01276 } 01277 } 01278 } 01279 } 01280 01281 return NULL; 01282 } |
|
Definition at line 1284 of file chat_window.c. References contact::chatwindow, find_tabbed_chat_window(), _chat_window::notebook, and _chat_window::notebook_child. Referenced by eb_update_window_title().
01285 { 01286 GList *l1; 01287 GList *l2; 01288 struct contact *c; 01289 int current_page = 0; 01290 01291 chat_window *notebook_window = find_tabbed_chat_window (); 01292 if (notebook_window == NULL || notebook_window->notebook == NULL) 01293 { 01294 return NULL; 01295 } 01296 01297 current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (notebook_window->notebook)); 01298 01299 01300 for (l1 = groups; l1; l1 = l1->next) 01301 { 01302 for (l2 = ((grouplist *) l1->data)->members; l2; l2 = l2->next) 01303 { 01304 c = (struct contact *) l2->data; 01305 if (c->chatwindow != NULL) 01306 { 01307 if (gtk_notebook_page_num 01308 (GTK_NOTEBOOK (notebook_window->notebook), 01309 c->chatwindow->notebook_child) == current_page) 01310 { 01311 return c->chatwindow; 01312 } 01313 } 01314 } 01315 } 01316 01317 return NULL; 01318 } |
|
Definition at line 864 of file chat_window.c. References _, local_account::alias, change_local_account_on_click(), _chat_window::contact, _chat_window_account::cw, _chat_window_account::data, DBG_CORE, eb_debug, find_local_account_for_remote(), find_suitable_remote_account(), get_service_name(), account::handle, _chat_window::perfered, and local_account::service_id. Referenced by handle_click().
00865 { 00866 GtkWidget *submenu, *label, *button; 00867 char *handle=NULL, buff[256]; 00868 eb_local_account *first_act=NULL, *subsequent_act=NULL; 00869 chat_window_account *cwa=NULL; 00870 00871 /* Do we have a preferred remote account, no, get one */ 00872 if(!cw->perfered) { 00873 cw->perfered = find_suitable_remote_account(NULL, cw->contact); 00874 if(!cw->perfered) /* The remote user is not online */ 00875 return(NULL); 00876 } 00877 handle=cw->perfered->handle; 00878 eb_debug(DBG_CORE, "Setting menu item with label: %s\n", handle); 00879 /* Check to see if we have at least 2 local accounts suitable for the remote account */ 00880 first_act = find_local_account_for_remote(cw->perfered, TRUE); 00881 subsequent_act = find_local_account_for_remote(NULL, TRUE); 00882 if(!first_act || !subsequent_act) 00883 return(NULL); 00884 00885 first_act = find_local_account_for_remote(cw->perfered, TRUE); 00886 00887 /* Start building the menu */ 00888 label = gtk_menu_item_new_with_label(_("Change Local Account")); 00889 submenu = gtk_menu_new(); 00890 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label), submenu); 00891 00892 subsequent_act = first_act; 00893 do { 00894 sprintf(buff, "%s:%s", get_service_name(subsequent_act->service_id), subsequent_act->alias); 00895 button = gtk_menu_item_new_with_label(buff); 00896 gtk_menu_append(GTK_MENU(submenu), button); 00897 cwa = g_new0(chat_window_account, 1); 00898 cwa->cw=cw; 00899 cwa->data=subsequent_act; 00900 gtk_signal_connect(GTK_OBJECT(button), "activate", 00901 GTK_SIGNAL_FUNC(change_local_account_on_click), cwa); 00902 gtk_widget_show(button); 00903 } while( (subsequent_act = find_local_account_for_remote(NULL, TRUE))); 00904 gtk_widget_show(label); 00905 gtk_widget_show(submenu); 00906 00907 return(label); 00908 } |
|
Definition at line 920 of file chat_window.c. References _, add_unknown_callback(), allow_offline_on_click(), can_offline_message(), close_tab_callback(), close_win(), ebmContactData::contact, _chat_window::contact, menu_item_data::data, DBG_CORE, EB_CHAT_WINDOW_MENU, eb_debug, ebmContactData_new(), get_local_accounts(), GetPref(), contact::group, ignore_callback(), menu_item_data::label, menu_data::menu_items, _grouplist::name, contact::nick, send_file(), send_message(), set_sound_on_click(), _chat_window::sound_enabled, and view_log_callback(). Referenced by eb_chat_window_new().
00922 { 00923 chat_window * cw = (chat_window*)userdata; 00924 00925 if (event->type == GDK_BUTTON_PRESS && event->button == 3) 00926 { 00927 GtkWidget *menu; 00928 GtkWidget *button; 00929 menu_data *md=NULL; 00930 menu_item_data *mid=NULL; 00931 ebmContactData *ecd=NULL; 00932 GList *list=NULL; 00933 00934 gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), 00935 "button_press_event"); 00936 menu = gtk_menu_new(); 00937 00938 /*Add Contact Selection*/ 00939 00940 if(!strcmp(cw->contact->group->name, _("Unknown"))) 00941 { 00942 button = gtk_menu_item_new_with_label(_("Add Contact")); 00943 gtk_signal_connect(GTK_OBJECT(button), "activate", 00944 GTK_SIGNAL_FUNC(add_unknown_callback), cw); 00945 gtk_menu_append(GTK_MENU(menu), button); 00946 gtk_widget_show(button); 00947 } 00948 00949 /*Allow Offline Messaging Selection*/ 00950 00951 if(can_offline_message(cw->contact)) 00952 { 00953 button = gtk_menu_item_new_with_label(_("Offline Messaging")); 00954 gtk_signal_connect(GTK_OBJECT(button), "activate", 00955 GTK_SIGNAL_FUNC(allow_offline_on_click), cw); 00956 gtk_menu_append(GTK_MENU(menu), button); 00957 gtk_widget_show(button); 00958 } 00959 00960 /*Allow account selection when there are multiple accounts for the same protocl */ 00961 button = get_local_accounts(cw); 00962 if(button) 00963 gtk_menu_append(GTK_MENU(menu), button); 00964 00965 /*Sound Selection*/ 00966 00967 if (cw->sound_enabled) 00968 button = gtk_menu_item_new_with_label(_("Disable Sounds")); 00969 else 00970 button = gtk_menu_item_new_with_label(_("Enable Sounds")); 00971 00972 gtk_signal_connect(GTK_OBJECT(button), "activate", 00973 GTK_SIGNAL_FUNC(set_sound_on_click), cw); 00974 gtk_menu_append(GTK_MENU(menu), button); 00975 gtk_widget_show(button); 00976 00977 /*View log selection*/ 00978 00979 button = gtk_menu_item_new_with_label(_("View Log")); 00980 gtk_signal_connect(GTK_OBJECT(button), "activate", 00981 GTK_SIGNAL_FUNC(view_log_callback), cw); 00982 gtk_menu_append(GTK_MENU(menu), button); 00983 gtk_widget_show(button); 00984 00985 /*Send File Selection*/ 00986 00987 button = gtk_menu_item_new_with_label(_("Send File")); 00988 gtk_signal_connect(GTK_OBJECT(button), "activate", 00989 GTK_SIGNAL_FUNC(send_file), cw); 00990 gtk_menu_append(GTK_MENU(menu), button); 00991 gtk_widget_show(button); 00992 00993 /*Ignore Section*/ 00994 00995 button = gtk_menu_item_new_with_label(_("Ignore Contact")); 00996 gtk_signal_connect(GTK_OBJECT(button), "activate", 00997 GTK_SIGNAL_FUNC(ignore_callback), cw); 00998 gtk_menu_append(GTK_MENU(menu), button); 00999 gtk_widget_show(button); 01000 01001 /*Send message Section*/ 01002 01003 button = gtk_menu_item_new_with_label(_("Send Message")); 01004 gtk_signal_connect(GTK_OBJECT(button), "activate", 01005 GTK_SIGNAL_FUNC(send_message), cw); 01006 gtk_menu_append(GTK_MENU(menu), button); 01007 gtk_widget_show(button); 01008 01009 /*Add Plugin Menus*/ 01010 md = GetPref(EB_CHAT_WINDOW_MENU); 01011 if(md) { 01012 for(list = md->menu_items; list; list = g_list_next(list) ) { 01013 ecd=ebmContactData_new(); 01014 ecd->contact=cw->contact->nick; 01015 mid=(menu_item_data *)list->data; 01016 mid->data=(ebmCallbackData *)ecd; 01017 eb_debug(DBG_CORE, "adding chat window item: %s\n", mid->label); 01018 button = gtk_menu_item_new_with_label(mid->label); 01019 gtk_menu_append(GTK_MENU(menu), button); 01020 gtk_signal_connect(GTK_OBJECT(button), "activate", 01021 eb_generic_menu_function, mid); 01022 gtk_widget_show(button); 01023 } 01024 } 01025 01026 01027 /*Close Selection*/ 01028 01029 button = gtk_menu_item_new_with_label(_("Close")); 01030 01031 if (do_tabbed_chat) 01032 { 01033 gtk_signal_connect(GTK_OBJECT(button), "activate", 01034 GTK_SIGNAL_FUNC(close_tab_callback), cw); 01035 } else { 01036 gtk_signal_connect(GTK_OBJECT(button), "activate", 01037 GTK_SIGNAL_FUNC(close_win), cw); 01038 } 01039 gtk_menu_append(GTK_MENU(menu), button); 01040 gtk_widget_show(button); 01041 01042 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 01043 event->button, event->time ); 01044 } 01045 } |
|
Definition at line 910 of file chat_window.c. References eb_update_window_title(). Referenced by eb_chat_window_new().
00912 { 00913 chat_window * cw = (chat_window *)userdata; 00914 eb_update_window_title(cw, FALSE); 00915 00916 } |
|
Definition at line 734 of file chat_window.c. References _, BUF_SIZE, _chat_window::contact, do_dialog(), GET_CHAT_WINDOW, ignore_dialog_callback(), and contact::nick. Referenced by eb_chat_window_new(), and handle_click().
00735 { 00736 chat_window * cw = (chat_window *)userdata; 00737 gchar *buff = (gchar *)g_new0(gchar *, BUF_SIZE); 00738 GET_CHAT_WINDOW(cw); 00739 00740 g_snprintf(buff, BUF_SIZE, _("Do you really want to ignore %s?\n"), cw->contact->nick); 00741 00742 do_dialog(buff, _("Ignore Contact"), ignore_dialog_callback, cw->contact); 00743 g_free(buff); 00744 } |
|
Definition at line 720 of file chat_window.c. References _, move_contact(), update_contact_list(), and write_contact_list(). Referenced by ignore_callback().
00721 { 00722 struct contact *c = (struct contact *)userdata; 00723 int response = (int)gtk_object_get_user_data(GTK_OBJECT(widget)); 00724 00725 if (response) 00726 { 00727 move_contact(_("Ignore"), c); 00728 update_contact_list (); 00729 write_contact_list(); 00730 } 00731 00732 } |
|
Definition at line 602 of file chat_window.c. References _chat_window::entry, GET_CHAT_WINDOW, and _chat_window::smiley_window. Referenced by show_smileys_callback().
00603 { 00604 gint pos=0; 00605 GET_CHAT_WINDOW(cw); 00606 if(GTK_EDITABLE(cw->entry) && GTK_EDITABLE(cw->entry)->current_pos) 00607 pos=GTK_EDITABLE(cw->entry)->current_pos; 00608 gtk_editable_insert_text(GTK_EDITABLE (cw->entry), 00609 gtk_widget_get_name(widget), 00610 strlen(gtk_widget_get_name(widget)), 00611 &pos); 00612 gtk_widget_destroy(cw->smiley_window); 00613 cw->smiley_window = NULL; 00614 } |
|
Definition at line 747 of file chat_window.c. References _chat_window::chat, _chat_window::contact, eb_do_send_file(), EXT_GTK_TEXT, find_suitable_remote_account(), GET_CHAT_WINDOW, gtk_eb_html_add(), contact::online, and _chat_window::perfered. Referenced by eb_chat_window_new(), and handle_click().
00748 { 00749 eb_account *ea; 00750 chat_window *data = (chat_window*)userdata; 00751 GET_CHAT_WINDOW(data); 00752 00753 if ( data->contact->online == 0 ) 00754 { 00755 gtk_eb_html_add(EXT_GTK_TEXT(data->chat), "<hr>", 0,0,0); 00756 gtk_eb_html_add(EXT_GTK_TEXT(data->chat), "<b>Cannot send message - user is offline.</b>", 0, 0, 0); 00757 gtk_eb_html_add(EXT_GTK_TEXT(data->chat), "<hr>", 0,0,0); 00758 return; 00759 } 00760 00761 ea = find_suitable_remote_account(data->perfered, 00762 data->contact); 00763 00764 eb_do_send_file(ea); 00765 } |
|
Definition at line 395 of file chat_window.c. References local_account::alias, _chat_window::away_msg_sent, BUF_SIZE, can_offline_message(), _chat_window::chat, local_account::connected, _chat_window::contact, convert_eol(), DBG_CORE, eb_debug, eb_log_message(), eb_smilify(), eb_update_window_title(), _chat_window::entry, EXT_GTK_TEXT, find_suitable_local_account(), find_suitable_remote_account(), _chat_window::fp, GET_CHAT_WINDOW, gtk_eb_html_add(), _chat_window::hist_pos, _chat_window::history, linkify(), _chat_window::local_user, _chat_window::notebook, _chat_window::notebook_child, outgoing_message_filters, _chat_window::perfered, play_sound(), RUN_SERVICE, SEND, _chat_window::send_enabled, contact::send_offline, serv_touch_idle(), local_account::service_id, account::service_id, set_tab_normal(), _chat_window::sound_enabled, and _chat_window::this_msg_in_history. Referenced by chat_key_press(), console_session_get_command(), eb_chat_window_display_remote_message(), eb_chat_window_new(), handle_click(), and pounce_contact().
00396 { 00397 chat_window * data = (chat_window*)d; 00398 gchar buff[BUF_SIZE]; 00399 gchar buff2[BUF_SIZE]; 00400 gchar * text, *o_text; 00401 gchar * link_message; 00402 gchar * temp_message; 00403 struct tm * cur_time; 00404 time_t t; 00405 00406 GList * filter_walk; 00407 00408 #ifdef HAVE_ICONV_H 00409 /* 'BUF_SIZE*2' e.g. for 'Latin-x' to 'UTF-8', 00410 which is 1-byte to 2-byte recoding */ 00411 char recode_buff[BUF_SIZE*2 + 1]; 00412 #endif 00413 GET_CHAT_WINDOW(data); 00414 00415 /*determine what is the best account to send to*/ 00416 data->perfered= find_suitable_remote_account(data->perfered, data->contact); 00417 00418 00419 if(!data->perfered) 00420 { 00421 /*Eventually this will need to become a dialog box that pops up*/ 00422 00423 if(data->contact->send_offline && can_offline_message(data->contact)) 00424 { 00425 data->perfered = can_offline_message(data->contact); 00426 } 00427 else 00428 { 00429 gtk_eb_html_add(EXT_GTK_TEXT(data->chat), "<hr>", 0,0,0); 00430 gtk_eb_html_add(EXT_GTK_TEXT(data->chat), "<b>Cannot send message - user is offline.</b>", 0, 0, 0); 00431 gtk_eb_html_add(EXT_GTK_TEXT(data->chat), "<hr>", 0,0,0); 00432 return; 00433 } 00434 } 00435 00436 if(data->local_user && data->local_user->service_id != data->perfered->service_id) 00437 { 00438 data->local_user = NULL; 00439 } 00440 00441 if(data->local_user && !data->local_user->connected) 00442 { 00443 data->local_user = NULL; 00444 } 00445 00446 /*determine what is the best local account to use*/ 00447 00448 if(!data->local_user) 00449 { 00450 data->local_user = 00451 find_suitable_local_account(data->local_user, data->perfered->service_id); 00452 } 00453 00454 if(!data->local_user) { 00455 return; 00456 } 00457 00458 eb_update_window_title(data, FALSE); 00459 00460 text = gtk_editable_get_chars(GTK_EDITABLE (data->entry), 0, -1); 00461 00462 if(strlen(text) == 0) 00463 return; 00464 00465 if(data->this_msg_in_history) 00466 { 00467 GList * node=NULL; 00468 GList * node2=NULL; 00469 00470 for(node=data->history; node!=NULL ; node=node->next) 00471 { 00472 node2=node; 00473 } 00474 free(node2->data); 00475 node2->data=strdup(text); 00476 data->this_msg_in_history=0; 00477 } else { 00478 data->history=g_list_append(data->history, strdup(text)); 00479 data->hist_pos=NULL; 00480 } 00481 00482 temp_message = eb_smilify(strdup(text), RUN_SERVICE(data->local_user)->get_smileys()); 00483 link_message = linkify(temp_message); 00484 g_free(temp_message); 00485 00486 eb_update_window_title(data, FALSE); 00487 00488 // Outbound filters here - Meredydd 00489 filter_walk=outgoing_message_filters; 00490 00491 eb_debug(DBG_CORE, "Starting to run outgoing filters\n"); 00492 00493 while(filter_walk!=NULL) 00494 { 00495 gchar * (*ifilter)(eb_local_account *, eb_account *, struct contact *, gchar *); 00496 00497 eb_debug(DBG_CORE, "Running an outgoing filter\n"); 00498 00499 ifilter=(gchar *(*)(eb_local_account *, eb_account *, struct contact *, gchar *))filter_walk->data; 00500 00501 text=ifilter(data->local_user, data->perfered, data->contact, text); 00502 00503 if(text==NULL) { return; } // Urgh, no cleanup, but it does it on strlen(text)==0 too 00504 00505 filter_walk=g_list_next(filter_walk); 00506 } 00507 00508 eb_debug(DBG_CORE, "Finished outgoing filters\n"); 00509 00510 // end outbound filters 00511 00512 o_text = text; 00513 text = convert_eol(text); 00514 g_free(o_text); 00515 00516 #ifdef HAVE_ICONV_H 00517 if(!eb_services[data->perfered->service_id].can_iconvert) 00518 { 00519 RUN_SERVICE(data->local_user)->send_im( 00520 data->local_user, 00521 data->perfered, 00522 text); 00523 } 00524 else 00525 { 00526 RUN_SERVICE(data->local_user)->send_im( 00527 data->local_user, 00528 data->perfered, 00529 recode_if_needed(text, recode_buff, RECODE_TO_REMOTE) ); 00530 } 00531 /* seems like variable 'text' is not used any more down 00532 the function, so we don't have to assign it (BTW it's freed in the end)*/ 00533 #else 00534 RUN_SERVICE(data->local_user)->send_im( 00535 data->local_user, 00536 data->perfered, 00537 text); 00538 #endif 00539 serv_touch_idle(); 00540 00541 if(data->sound_enabled && data->send_enabled) 00542 play_sound(SEND); 00543 00544 if (do_convo_timestamp) 00545 { 00546 time(&t); 00547 cur_time = localtime(&t); 00548 g_snprintf(buff2, BUF_SIZE, "%d:%.2d:%.2d %s", cur_time->tm_hour, 00549 cur_time->tm_min, cur_time->tm_sec, 00550 data->local_user->alias); 00551 } 00552 else 00553 { 00554 g_snprintf(buff2, BUF_SIZE, "%s", data->local_user->alias); 00555 } 00556 00557 g_snprintf(buff, BUF_SIZE, "<FONT COLOR=\"#0000ff\"><B>%s: </B></FONT>", buff2); 00558 00559 gtk_eb_html_add(EXT_GTK_TEXT(data->chat), buff, 1, 0, 0); 00560 gtk_eb_html_add(EXT_GTK_TEXT(data->chat), link_message, do_ignore_back, do_ignore_fore, do_ignore_font); 00561 gtk_eb_html_add(EXT_GTK_TEXT(data->chat), "<br>", 0, 0, 0); 00562 00563 /* If an away message had been sent to this person, reset the away message tracker */ 00564 /* It's probably faster to just do the assignment all the time--the test 00565 is there for code clarity. */ 00566 00567 if (data->away_msg_sent) 00568 { 00569 data->away_msg_sent = FALSE; 00570 } 00571 00572 /* Log the message */ 00573 00574 if(do_logging) eb_log_message(data->fp, buff, link_message); 00575 00576 gtk_editable_delete_text(GTK_EDITABLE (data->entry), 0, -1); 00577 g_free(link_message); 00578 g_free(text); 00579 00580 00581 /* if using tabs, then turn off the chat icon */ 00582 if (data->notebook != NULL) { 00583 /* no more icons in the tabs */ 00584 /* gtk_widget_hide(data->talk_pixmap); */ 00585 /* printf("chat icon is off... \n"); */ 00586 set_tab_normal(GTK_NOTEBOOK(data->notebook), data->notebook_child); 00587 } 00588 } |
|
Definition at line 1047 of file chat_window.c. References _chat_window::contact, find_suitable_local_account(), find_suitable_remote_account(), _chat_window::local_user, _chat_window::next_typing_send, _chat_window::perfered, RUN_SERVICE, and account::service_id. Referenced by chat_key_press(), and chat_singleline_key_press().
01048 { 01049 /* typing send code */ 01050 time_t now=time(NULL); 01051 01052 if(!do_send_typing_notify) 01053 return; 01054 01055 if(now>=cw->next_typing_send) 01056 { 01057 if(!cw->perfered) { 01058 if(!cw->contact) 01059 return; 01060 cw->perfered = find_suitable_remote_account(NULL, cw->contact); 01061 if(!cw->perfered) /* The remote user is not online */ 01062 return; 01063 } 01064 cw->local_user=find_suitable_local_account(cw->local_user, cw->perfered->service_id); 01065 if(cw->local_user==NULL) { return; } 01066 01067 if(RUN_SERVICE(cw->local_user)->send_typing!=NULL) 01068 { 01069 cw->next_typing_send=now + RUN_SERVICE(cw->local_user)->send_typing(cw->local_user, cw->perfered); 01070 } 01071 } 01072 } |
|
Definition at line 781 of file chat_window.c. References GET_CHAT_WINDOW, _chat_window::sound_button, and _chat_window::sound_enabled. Referenced by eb_chat_window_new(), and handle_click().
00782 { 00783 chat_window * cw = (chat_window *)userdata; 00784 GET_CHAT_WINDOW(cw); 00785 00786 if (cw->sound_enabled) 00787 { 00788 cw->sound_enabled = FALSE; 00789 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(cw->sound_button), FALSE); 00790 } 00791 00792 else 00793 { 00794 cw->sound_enabled = TRUE; 00795 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(cw->sound_button), TRUE); 00796 } 00797 } |
|
Definition at line 769 of file chat_window.c. References _chat_window::sound_enabled. Referenced by eb_chat_window_new().
00770 { 00771 chat_window * cw = (chat_window *)userdata; 00772 00773 /*Set the sound_enable variable depending on the toggle button*/ 00774 00775 if (GTK_TOGGLE_BUTTON (sound_button)->active) 00776 cw->sound_enabled = TRUE; 00777 else 00778 cw->sound_enabled = FALSE; 00779 } |
|
Definition at line 219 of file chat_window.c. Referenced by chat_notebook_switch_callback(), eb_chat_window_display_account(), eb_chat_window_display_contact(), and send_message().
00220 { 00221 GtkStyle *style; 00222 GdkColor color; 00223 00224 GtkWidget *label = gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), child); 00225 gtk_widget_realize(label); 00226 00227 color.red = 0; 00228 color.green = 0; 00229 color.blue = 0; 00230 00231 style = gtk_style_new(); 00232 gdk_font_unref(style->font); 00233 style->font = gdk_font_ref(label->style->font); 00234 style->fg[0] = GTK_WIDGET(notebook)->style->fg[0]; 00235 00236 gtk_widget_set_style(label, style); 00237 gtk_style_unref(style); 00238 } |
|
Definition at line 195 of file chat_window.c. Referenced by eb_chat_window_display_remote_message().
00196 { 00197 GtkStyle *style; 00198 GdkColor color; 00199 00200 GtkWidget *label = gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), child); 00201 00202 gtk_widget_realize(label); 00203 00204 color.red = 65000; 00205 color.green = 0; 00206 color.blue = 0; 00207 00208 00209 style = gtk_style_new(); 00210 gdk_font_unref(style->font); 00211 style->font = gdk_font_ref(label->style->font); 00212 style->fg[0] = color; 00213 00214 gtk_widget_set_style(label, style); 00215 00216 00217 } |
|
Definition at line 616 of file chat_window.c. References get_smiley_by_name(), insert_smiley(), _chat_window::local_user, protocol_smiley_struct::name, smiley_struct::pixmap, RUN_SERVICE, _chat_window::smiley_window, protocol_smiley_struct::text, and _chat_window::window. Referenced by eb_chat_window_new().
00617 { 00618 chat_window *data = (chat_window*) d; 00619 GList *smileys = NULL; 00620 protocol_smiley * msmiley = NULL; 00621 GtkWidget * smileys_table = NULL; 00622 GtkWidget * button = NULL; 00623 GtkWidget *iconwid; 00624 GdkPixmap *icon; 00625 GdkBitmap *mask; 00626 GList *done = NULL; 00627 int len = 0, real_len = 0, x=-1, y=0; 00628 int win_w=0, win_h=0, w, h; 00629 gint win_x, win_y; 00630 if(data->smiley_window != NULL) { 00631 /* close popup */ 00632 gtk_widget_destroy(data->smiley_window); 00633 data->smiley_window = NULL; 00634 return; 00635 } 00636 00637 if (data && data->local_user && RUN_SERVICE(data->local_user)) 00638 smileys = RUN_SERVICE(data->local_user)->get_smileys(); 00639 else 00640 return; 00641 len = g_list_length(smileys); 00642 smileys_table = gtk_table_new(5,len/5 +((len%5==0)?1:2),TRUE); 00643 for(;smileys;smileys=g_list_next(smileys)) { 00644 GList * l; 00645 gboolean already_done = FALSE; 00646 smiley * dsmile = NULL; 00647 msmiley = (smileys->data); 00648 for(l=done; l; l=g_list_next(l)) { 00649 if(!strcmp((char*)l->data, msmiley->name)) { 00650 already_done = TRUE; 00651 break; 00652 } 00653 } 00654 00655 if(already_done) 00656 continue; 00657 00658 done = g_list_append(done, msmiley->name); 00659 00660 dsmile = get_smiley_by_name(msmiley->name); 00661 if(dsmile != NULL) { 00662 icon = gdk_pixmap_create_from_xpm_d(data->window->window, &mask, NULL, dsmile->pixmap); 00663 iconwid = gtk_pixmap_new(icon, mask); 00664 sscanf (dsmile->pixmap [0], "%d %d", &w, &h); 00665 if(x<5) { 00666 x++; 00667 if(y==0) win_h+=h+2; 00668 } 00669 if(x==5) { 00670 y++; 00671 x=0; 00672 if(x==0) win_w+=w+2; 00673 } 00674 gtk_widget_show(iconwid); 00675 button = gtk_button_new(); 00676 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); 00677 gtk_container_add(GTK_CONTAINER(button), iconwid); 00678 gtk_widget_show(button); 00679 gtk_widget_set_name(button,msmiley->text); 00680 gtk_signal_connect (GTK_OBJECT (button), "clicked", 00681 GTK_SIGNAL_FUNC (insert_smiley), data); 00682 gtk_table_attach(GTK_TABLE(smileys_table), 00683 button, 00684 y,y+1, 00685 x,x+1, 00686 GTK_FILL, GTK_FILL, 0, 0); 00687 real_len++; 00688 } 00689 } 00690 00691 g_list_free(done); 00692 done = NULL; 00693 gtk_table_resize(GTK_TABLE(smileys_table), 5,real_len/5 +((real_len%5==0)?0:1)); 00694 00695 data->smiley_window = gtk_window_new(GTK_WINDOW_DIALOG); 00696 gtk_window_set_modal(GTK_WINDOW(data->smiley_window), FALSE); 00697 gtk_window_set_wmclass(GTK_WINDOW(data->smiley_window), "yattm-chat", "Yattm"); 00698 gtk_window_set_title(GTK_WINDOW(data->smiley_window), "Smileys"); 00699 gtk_window_set_policy(GTK_WINDOW(data->smiley_window), FALSE, FALSE, FALSE); 00700 gtk_widget_realize(data->smiley_window); 00701 00702 gtk_widget_show(data->smiley_window); 00703 00704 gtk_container_add(GTK_CONTAINER(data->smiley_window), smileys_table); 00705 gtk_widget_show(smileys_table); 00706 00707 /* move the window a bit after the cursor and in the screen */ 00708 gdk_window_get_pointer (NULL, &win_x, &win_y, NULL); 00709 win_x += 5; win_y += 5; 00710 while ((win_x)+win_w > gdk_screen_width() - 30) 00711 win_x -= 20; 00712 while ((win_y)+win_h > gdk_screen_height() - 30) 00713 win_y -= 20; 00714 gdk_window_move_resize(data->smiley_window->window, win_x, win_y, win_w, win_h); 00715 00716 } |
|
Definition at line 595 of file chat_window.c. References _chat_window::contact, eb_view_log(), and GET_CHAT_WINDOW. Referenced by eb_chat_window_new(), and handle_click().
00596 { 00597 chat_window* data = (chat_window*)d; 00598 GET_CHAT_WINDOW(data); 00599 eb_view_log(data->contact); 00600 } |
|
Definition at line 193 of file chat_window.c. Referenced by eb_chat_window_display_remote_message(). |
|
Definition at line 192 of file chat_window.c. Referenced by send_message(). |