4
Copyright (C) 1999-2000 Timo Sirainen
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
#include "module-formats.h"
23
#include "modules-load.h"
31
#include "printtext.h"
32
#include "fe-common-core.h"
36
#include "gui-entry.h"
37
#include "mainwindows.h"
38
#include "gui-printtext.h"
39
#include "gui-readline.h"
40
#include "statusbar.h"
41
#include "gui-windows.h"
42
#include "textbuffer-reformat.h"
47
#ifdef HAVE_STATIC_PERL
48
void perl_core_init(void);
49
void perl_core_deinit(void);
51
void fe_perl_init(void);
52
void fe_perl_deinit(void);
56
void irc_deinit(void);
58
void fe_common_irc_init(void);
59
void fe_common_irc_deinit(void);
61
void gui_expandos_init(void);
62
void gui_expandos_deinit(void);
64
void textbuffer_commands_init(void);
65
void textbuffer_commands_deinit(void);
67
void lastlog_init(void);
68
void lastlog_deinit(void);
70
void mainwindow_activity_init(void);
71
void mainwindow_activity_deinit(void);
73
void mainwindows_layout_init(void);
74
void mainwindows_layout_deinit(void);
76
void term_dummy_init(void);
77
void term_dummy_deinit(void);
79
static int dirty, full_redraw, dummy;
81
static GMainLoop *main_loop;
84
static const char *firsttimer_text =
85
"Looks like this is the first time you've run irssi.\n"
86
"This is just a reminder that you really should go read\n"
87
"startup-HOWTO if you haven't already. You can find it\n"
88
"and more irssi beginner info at http://irssi.org/help/\n"
90
"For the truly impatient people who don't like any automatic\n"
91
"window creation or closing, just type: /MANUAL-WINDOWS";
92
static int display_firsttimer = FALSE;
95
static void sig_exit(void)
100
/* redraw irssi's screen.. */
101
void irssi_redraw(void)
107
void irssi_set_dirty(void)
112
static void dirty_check(void)
122
/* first clear the screen so curses will be
123
forced to redraw the screen */
127
mainwindows_redraw();
128
statusbar_redraw(NULL, TRUE);
131
mainwindows_redraw_dirty();
132
statusbar_redraw_dirty();
138
static void textui_init(void)
141
struct sigaction act;
143
sigemptyset(&act.sa_mask);
145
act.sa_handler = SIG_IGN;
146
sigaction(SIGTRAP, &act, NULL);
149
irssi_gui = IRSSI_GUI_TEXT;
152
fe_common_core_init();
153
fe_common_irc_init();
155
theme_register(gui_text_formats);
156
signal_add_last("gui exit", (SIGNAL_FUNC) sig_exit);
159
static void textui_finish_init(void)
166
term_refresh_freeze();
168
textbuffer_view_init();
169
textbuffer_commands_init();
170
textbuffer_reformat_init();
172
gui_printtext_init();
176
mainwindow_activity_init();
177
mainwindows_layout_init();
182
/* don't check settings with dummy mode */
186
module_register("core", "fe-text");
188
#ifdef HAVE_STATIC_PERL
195
fe_common_core_finish_init();
196
signal_emit("irssi init finished", 0);
198
if (display_firsttimer) {
199
printtext_window(active_win, MSGLEVEL_CLIENTNOTICE,
200
"%s", firsttimer_text);
204
static void textui_deinit(void)
206
signal(SIGINT, SIG_DFL);
208
term_refresh_freeze();
209
while (modules != NULL)
210
module_unload(modules->data);
212
#ifdef HAVE_STATIC_PERL
217
dirty_check(); /* one last time to print any quit messages */
218
signal_remove("gui exit", (SIGNAL_FUNC) sig_exit);
225
gui_printtext_deinit();
226
gui_readline_deinit();
227
gui_windows_deinit();
228
mainwindows_layout_deinit();
229
mainwindow_activity_deinit();
230
mainwindows_deinit();
231
gui_expandos_deinit();
232
textbuffer_reformat_deinit();
233
textbuffer_commands_deinit();
234
textbuffer_view_deinit();
243
fe_common_irc_deinit();
244
fe_common_core_deinit();
249
static void check_oldcrap(void)
252
char *path, str[256];
255
/* check that default.theme is up-to-date */
256
path = g_strdup_printf("%s/default.theme", get_irssi_dir());
257
f = fopen(path, "r+");
263
while (!found && fgets(str, sizeof(str), f) != NULL)
264
found = strstr(str, "abstracts = ") != NULL;
272
printf("\nYou seem to have old default.theme in "IRSSI_DIR_SHORT"/ directory.\n");
273
printf("Themeing system has changed a bit since last irssi release,\n");
274
printf("you should either delete your old default.theme or manually\n");
275
printf("merge it with the new default.theme.\n\n");
276
printf("Do you want to delete the old theme now? (Y/n)\n");
279
fgets(str, sizeof(str), stdin);
280
if (i_toupper(str[0]) == 'Y' || str[0] == '\n' || str[0] == '\0')
285
static void check_files(void)
289
if (stat(get_irssi_dir(), &statbuf) != 0) {
290
/* ~/.irssi doesn't exist, first time running irssi */
291
display_firsttimer = TRUE;
298
static void winsock_init(void)
300
WORD wVersionRequested;
303
wVersionRequested = MAKEWORD(2, 2);
305
if (WSAStartup(wVersionRequested, &wsaData) != 0) {
306
printf("Error initializing winsock\n");
319
GMemVTable gc_mem_table = {
328
int main(int argc, char **argv)
330
static struct poptOption options[] = {
331
{ "dummy", 'd', POPT_ARG_NONE, &dummy, 0, "Use the dummy terminal mode", NULL },
332
{ NULL, '\0', 0, NULL }
336
g_mem_set_vtable(&gc_mem_table);
341
core_init_paths(argc, argv);
352
/* initialize the i18n stuff */
353
bindtextdomain(PACKAGE, LOCALEDIR);
357
/* setlocale() must be called at the beginning before any calls that
358
affect it, especially regexps seem to break if they're generated
361
locales aren't actually used for anything else than autodetection
364
furthermore to get the users's charset with g_get_charset() properly
365
you have to call setlocale(LC_ALL, "") */
366
setlocale(LC_ALL, "");
369
args_register(options);
370
args_execute(argc, argv);
372
if (!dummy && !term_init()) {
373
fprintf(stderr, "Can't initialize screen handling, quitting.\n");
374
fprintf(stderr, "You can still use the dummy mode with -d parameter\n");
378
textui_finish_init();
379
main_loop = g_main_new(TRUE);
381
/* Does the same as g_main_run(main_loop), except we
382
can call our dirty-checker after each iteration */
385
GC_collect_a_little();
387
if (!dummy) term_refresh_freeze();
388
g_main_iteration(TRUE);
389
if (!dummy) term_refresh_thaw();
392
/* SIGHUP received, do /RELOAD */
393
reload_config = FALSE;
394
signal_emit("command reload", 1, "");
400
g_main_destroy(main_loop);
403
session_upgrade(); /* if we /UPGRADEd, start the new process */