/* SilcerMainDlg.cc Author: Pekka Riikonen Copyright (C) 2001 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #include "silcerapp.hh" #include "silcerchatview.hh" #include "SilcerMainDlg.hh" #include "gtkspell.h" #include #include #include #include #include #include #include static char *parse_command(const char *buffer) { char *ret; char *cp = (char *)buffer; int len; len = strcspn((const char *)cp, " "); ret = silc_to_upper(cp + 1); ret[len - 1] = 0; return ret; } SilcerMainDlg::SilcerMainDlg(void) : SilcerBaseDialog("SilcerMainDlg") { _thisWindow->realize(); // Get intput box and set it for input _InputBox = getWidget("SilcerMainDlgInputBox"); _InputBox->key_press_event.connect(slot(this, &SilcerMainDlg::InputBoxKeyPress)); _Completer = g_completion_new(NULL); // Get output box and create new chat view box _OutputBox = getWidget("SilcerMainDlgOutputBox"); _ChatView = new SilcerChatView(_thisWindow, _OutputBox, false); // Show only icons on toolbar getWidget("SilcerMainDlgToolbar")-> set_style(GTK_TOOLBAR_ICONS); // Hide tabs, since they are not used currently! getWidget("SilcerMainDlgTab")->set_show_tabs(false); _thisWindow->show(); } SilcerMainDlg::~SilcerMainDlg(void) { } void SilcerMainDlg::print(const string message) { _ChatView->render(message, "", "", BLUE); } void SilcerMainDlg::print(const string message, const string nickname) { _ChatView->render(message, nickname, "", BLUE2); } gint SilcerMainDlg::InputBoxKeyPress(GdkEventKey *key) { string msg; switch (key->keyval) { case GDK_space: if (gtkspell_running()) gtkspell_check_all(_InputBox->gtkobj()); break; case GDK_Return: case GDK_KP_Enter: if (key->state & GDK_SHIFT_MASK) { key->state ^= GDK_SHIFT_MASK; return 0; } // Parse message to see whether it is command msg = _InputBox->get_chars(0, -1); if (msg.empty()) { _InputBox->delete_text(0, -1); gtk_signal_emit_stop_by_name(GTK_OBJECT(_InputBox->gtkobj()), "key_press_event"); break; } if (msg.at(0) == '/') { // Command SilcClientCommand cmd; SilcClientCommandContext ctx; char *tmpcmd; SilcUInt32 argc = 0; unsigned char **argv; SilcUInt32 *argv_lens, *argv_types; // Parse arguments tmpcmd = parse_command(msg.c_str()); cmd = silc_client_command_find(silc_client, (const char *)tmpcmd); silc_free(tmpcmd); if (cmd == NULL) break; silc_parse_command_line((unsigned char *)msg.c_str(), &argv, &argv_lens, &argv_types, &argc, cmd->max_args); ctx = silc_client_command_alloc(); ctx->client = silc_client; ctx->conn = silc_client_conn; ctx->command = cmd; ctx->argc = argc; ctx->argv = argv; ctx->argv_lens = argv_lens; ctx->argv_types = argv_types; // Execute the command silc_client_command_call(cmd, ctx); } else { // Channel message if (silc_client_conn->current_channel) { print(msg); silc_client_send_channel_message(silc_client, silc_client_conn, silc_client_conn->current_channel, NULL, 0, (unsigned char *)msg.c_str(), msg.length(), TRUE); } } _InputBox->delete_text(0, -1); gtk_signal_emit_stop_by_name(GTK_OBJECT(_InputBox->gtkobj()), "key_press_event"); break; case GDK_Tab: { // Word completion msg = _InputBox->get_chars(0, -1); if (!msg.empty()) { string lastword; // Search for the last whitespace string::size_type n = msg.find_last_of(" "); if (n != string::npos) lastword = msg.substr(n+1); else lastword = msg; // Try and autocomplete gchar *prefix; g_completion_complete(_Completer, (char*)lastword.c_str(), &prefix); if (prefix != NULL){ // Replace the last word in the message and update if (n != string::npos) msg.replace(msg.find_last_of(" ")+1, msg.length(), prefix); else msg = string(prefix); g_free(prefix); // Update text _InputBox->delete_text(0, -1); _InputBox->insert(msg); } gtk_signal_emit_stop_by_name(GTK_OBJECT(_InputBox->gtkobj()), "key_press_event"); return 1; } } break; default: break; } return 0; }