/*
* grn_commands.c
*
* $Id: grn_commands.c,v 1.30 2000/06/28 11:28:28 sc Exp $
*/
/* Copyright (C) 1999-2000 Sergey Chernikov (sc@ivvs.ul.ru)
*
* Authors: Sergey Chernikov <sc@ivvs.ul.ru>
*
* 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; either version 2 of the License, or
* (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
*/
#include "grn_consts.h"
#include "grn_commands.h"
#include "grn_vars.h"
#include "grn_config.h"
#include "grn_menu.h"
#include "grn_news.h"
#include "grn_util.h"
#include "grn_nglist.h"
#include "grn_threadlist.h"
#include "queue.h"
#include "nntp.h"
#include "grn_perl.h"
#include "tcp.h"
#include "grn_misc.h"
static void grn_done(void)
{
grn_find_save(GRN->find);
grn_find_free(&(GRN->find));
grn_prefs_save();
grn_prefs_done();
gnome_config_pop_prefix();
}
gint evt_app_quit(GtkWidget *widget)
{
evt_cleanup(widget, NULL);
return TRUE;
}
gint evt_cleanup(GtkWidget *widget, gpointer data)
{
nntp_disconnect(GRN->nntp_sock);
if (GRN->nntp_sock->error)
grn_error(_("Socket error"), GRN->nntp_sock->err_msg);
grn_socket_free(&(GRN->nntp_sock));
write_newsrc(grn_prefs.paths[0], grn_prefs.paths[0], newsrc_ht);
grn_save_ws(0, GRN->window);
grn_done();
gtk_main_quit();
return TRUE;
}
void evt_not_impl(GtkWidget *widget)
{
grn_lock();
gnome_ok_dialog(_("Not implemented yet"));
grn_unlock();
}
extern pthread_mutex_t groups_m;
void evt_grouplist(GtkWidget *w)
{
if (flags.open_grouplist) return;
pthread_mutex_lock(&groups_m);
if (! GRN->grouplist) GRN->grouplist = grouplist_create();
grn_set_contents(GRN->grouplist);
if (! GRN->ng_list)
{
grnq_add_download_grouplist();
grnq_add_draw_grouplist();
}
pthread_mutex_unlock(&groups_m);
}
void evt_perl_restart(GtkWidget *w)
{
menu_delete_scripts();
grn_perl_restart();
build_scripts_menu();
}
static void perl_list_destroy(GtkWidget *w, GtkWidget **dlg)
{
*dlg = NULL;
}
static void perl_list_ok(GtkWidget *w, GtkWidget *dlg)
{
gtk_widget_destroy(dlg);
}
void evt_perl_list(GtkWidget *w)
{
gchar *titles[] = {_("type"), _("name"), _("handler")};
GSList *rows, *l;
gint i;
static GtkWidget *dlg = NULL;
GtkWidget *clist, *scrwin;
if (dlg) return;
dlg = gnome_dialog_new(_("Perl scripts list"), GNOME_STOCK_BUTTON_CLOSE, NULL);
gnome_dialog_set_parent(GNOME_DIALOG(dlg), GTK_WINDOW(GRN->window));
gnome_dialog_button_connect(GNOME_DIALOG(dlg), 0,
GTK_SIGNAL_FUNC(perl_list_ok), dlg);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
GTK_SIGNAL_FUNC(perl_list_destroy), &dlg);
clist = gtk_clist_new_with_titles(3, titles);
gtk_widget_set_usize(clist, 450, 200);
gtk_clist_column_titles_passive(GTK_CLIST(clist));
gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_BROWSE);
scrwin = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(scrwin), clist);
gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dlg)->vbox), scrwin, TRUE, TRUE, 3);
rows = grn_perl_list();
for (l=rows; l; l=l->next)
{
gchar **row = l->data;
gtk_clist_append(GTK_CLIST(clist), row);
for (i=0; i<3; i++)
if (row[i]) g_free(row[i]);
g_free(row);
}
g_slist_free(rows);
gtk_clist_columns_autosize(GTK_CLIST(clist));
gtk_widget_show_all(dlg);
}
static void plfs_destroy(GtkWidget *w, GtkWidget **dlg)
{
*dlg = NULL;
}
static void plfs_cancel(GtkWidget *w, GtkWidget *dlg)
{
gtk_widget_destroy(dlg);
}
static void plfs_ok(GtkWidget *w, GtkWidget *dlg)
{
gchar *fn = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(dlg)));
if (fn) perl_load_file(fn);
str_free(&fn);
gtk_widget_destroy(dlg);
}
void evt_perl_load(GtkWidget *w)
{
static GtkWidget *dlg = NULL;
if (dlg) return;
dlg = gtk_file_selection_new(_("Open Perl script"));
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
GTK_SIGNAL_FUNC(plfs_destroy), &dlg);
gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(dlg)->ok_button),
"clicked", GTK_SIGNAL_FUNC(plfs_ok), dlg);
gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(dlg)->cancel_button),
"clicked", GTK_SIGNAL_FUNC(plfs_cancel), dlg);
gtk_widget_show_all(dlg);
}
void evt_perl_command(GtkWidget *w, gpointer data)
{
gchar *cmd_name = (gchar *) data;
if (cmd_name) perl_command_run(cmd_name, GRN, NULL);
}
void evt_save_prefs(GtkWidget *w)
{
grn_prefs_save();
}
void evt_prev(GtkWidget *w)
{
GtkObject *o = gtk_object_get_data(GTK_OBJECT(GRN->window), KEY_FOCUS);
GdkEventKey *event;
if (! o) return;
event = g_new(GdkEventKey, 1);
event->keyval = GDK_Left; event->state = 0;
gtk_signal_emit_by_name(o, "key_press_event", event, event);
}
void evt_next(GtkWidget *w)
{
GtkObject *o = gtk_object_get_data(GTK_OBJECT(GRN->window), KEY_FOCUS);
GdkEventKey *event;
if (! o) return;
event = g_new(GdkEventKey, 1);
event->keyval = GDK_Right; event->state = 0;
gtk_signal_emit_by_name(o, "key_press_event", event, event);
}
int evt_save_state(GnomeClient *client, gint phase, GnomeRestartStyle save_style,
gint shutdown, GnomeInteractStyle istyle, gint fast, gpointer data)
{
return FALSE;
}
void evt_appbar_destroy(GtkWidget *w)
{ GRN->appbar = NULL; }
syntax highlighted by Code2HTML, v. 0.9.1