2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2001 Hiroyuki Yamamoto
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 #include <gdk/gdkkeysyms.h>
37 #include "prefs_matcher.h"
38 #include "prefs_common.h"
39 #include "mainwindow.h"
40 #include "foldersel.h"
41 #include "manage_window.h"
46 #include "alertpanel.h"
49 static struct Matcher {
54 GtkWidget *predicate_combo;
55 GtkWidget *predicate_flag_combo;
56 GtkWidget *header_combo;
58 GtkWidget *criteria_list;
60 GtkWidget *predicate_list;
61 GtkWidget *predicate_label;
62 GtkWidget *predicate_flag_list;
64 GtkWidget *bool_op_list;
66 GtkWidget *header_entry;
67 GtkWidget *header_label;
68 GtkWidget *value_entry;
69 GtkWidget *value_label;
70 GtkWidget *case_chkbtn;
71 GtkWidget *regexp_chkbtn;
75 GtkWidget *cond_clist;
78 /* choice in the list */
87 CRITERIA_TO_OR_CC = 5,
88 CRITERIA_NEWSGROUPS = 6,
89 CRITERIA_INREPLYTO = 7,
90 CRITERIA_REFERENCES = 8,
91 CRITERIA_AGE_GREATER = 9,
92 CRITERIA_AGE_LOWER = 10,
94 CRITERIA_HEADERS_PART = 12,
95 CRITERIA_BODY_PART = 13,
96 CRITERIA_MESSAGE = 14,
100 CRITERIA_MARKED = 17,
101 CRITERIA_DELETED = 18,
102 CRITERIA_REPLIED = 19,
103 CRITERIA_FORWARDED = 20,
105 CRITERIA_SCORE_GREATER = 21,
106 CRITERIA_SCORE_LOWER = 22,
108 CRITERIA_EXECUTE = 23
116 gchar * bool_op_text [] = {
121 PREDICATE_CONTAINS = 0,
122 PREDICATE_DOES_NOT_CONTAIN = 1
125 gchar * predicate_text [] = {
126 "contains", "does not contain"
130 PREDICATE_FLAG_ENABLED = 0,
131 PREDICATE_FLAG_DISABLED = 1
134 gchar * predicate_flag_text [] = {
138 gchar * criteria_text [] = {
139 "All messages", "Subject",
140 "From", "To", "Cc", "To or Cc",
141 "Newsgroups", "In reply to", "References",
142 "Age greater than", "Age lower than",
143 "Header", "Headers part",
144 "Body part", "Whole message",
145 "Unread flag", "New flag",
146 "Marked flag", "Deleted flag",
147 "Replied flag", "Forwarded flag",
148 "Score greater than", "Score lower than",
152 static gint get_sel_from_list(GtkList * list)
158 sel = list->selection->data;
159 for(child = list->children ; child != NULL ;
160 child = g_list_next(child)) {
161 if (child->data == sel)
169 static PrefsMatcherSignal * matchers_callback;
172 #define VSPACING_NARROW 4
173 #define DEFAULT_ENTRY_WIDTH 80
174 #define PREFSBUFSIZE 1024
176 /* widget creating functions */
177 static void prefs_matcher_create (void);
179 static void prefs_matcher_set_dialog (MatcherList * matchers);
182 static void prefs_matcher_set_list (void);
183 static gint prefs_matcher_clist_set_row (gint row);
186 /* callback functions */
189 static void prefs_matcher_select_dest_cb (void);
191 static void prefs_matcher_register_cb (void);
192 static void prefs_matcher_substitute_cb (void);
193 static void prefs_matcher_delete_cb (void);
194 static void prefs_matcher_up (void);
195 static void prefs_matcher_down (void);
196 static void prefs_matcher_select (GtkCList *clist,
201 static void prefs_matcher_key_pressed (GtkWidget *widget,
204 static void prefs_matcher_ok (void);
205 static void prefs_matcher_cancel (void);
206 static gint prefs_matcher_deleted(GtkWidget *widget, GdkEventAny *event,
208 static void prefs_matcher_criteria_select(GtkList *list,
211 static MatcherList * prefs_matcher_get_list(void);
212 static void prefs_matcher_exec_info_create(void);
214 void prefs_matcher_open(MatcherList * matchers, PrefsMatcherSignal * cb)
216 inc_autocheck_timer_remove();
218 if (!matcher.window) {
219 prefs_matcher_create();
222 manage_window_set_transient(GTK_WINDOW(matcher.window));
223 gtk_widget_grab_focus(matcher.ok_btn);
225 matchers_callback = cb;
227 prefs_matcher_set_dialog(matchers);
229 gtk_widget_show(matcher.window);
232 static void prefs_matcher_create(void)
237 GtkWidget *cancel_btn;
238 GtkWidget *confirm_area;
247 GtkWidget *header_combo;
248 GtkWidget *header_entry;
249 GtkWidget *header_label;
250 GtkWidget *criteria_combo;
251 GtkWidget *criteria_list;
252 GtkWidget *criteria_label;
253 GtkWidget *value_label;
254 GtkWidget *value_entry;
255 GtkWidget *predicate_combo;
256 GtkWidget *predicate_list;
257 GtkWidget *predicate_flag_combo;
258 GtkWidget *predicate_flag_list;
259 GtkWidget *predicate_label;
260 GtkWidget *bool_op_combo;
261 GtkWidget *bool_op_list;
262 GtkWidget *bool_op_label;
264 GtkWidget *regexp_chkbtn;
265 GtkWidget *case_chkbtn;
271 GtkWidget *subst_btn;
274 GtkWidget *cond_hbox;
275 GtkWidget *cond_scrolledwin;
276 GtkWidget *cond_clist;
287 gchar *title[] = {_("Registered rules")};
289 debug_print(_("Creating matcher setting window...\n"));
291 window = gtk_window_new (GTK_WINDOW_DIALOG);
292 gtk_container_set_border_width (GTK_CONTAINER (window), 8);
293 gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
294 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
295 gtk_window_set_policy (GTK_WINDOW (window), FALSE, TRUE, FALSE);
297 vbox = gtk_vbox_new (FALSE, 6);
298 gtk_widget_show (vbox);
299 gtk_container_add (GTK_CONTAINER (window), vbox);
301 gtkut_button_set_create(&confirm_area, &ok_btn, _("OK"),
302 &cancel_btn, _("Cancel"), NULL, NULL);
303 gtk_widget_show (confirm_area);
304 gtk_box_pack_end (GTK_BOX(vbox), confirm_area, FALSE, FALSE, 0);
305 gtk_widget_grab_default (ok_btn);
307 gtk_window_set_title (GTK_WINDOW(window),
308 _("Condition setting"));
309 gtk_signal_connect (GTK_OBJECT(window), "delete_event",
310 GTK_SIGNAL_FUNC(prefs_matcher_deleted), NULL);
311 gtk_signal_connect (GTK_OBJECT(window), "key_press_event",
312 GTK_SIGNAL_FUNC(prefs_matcher_key_pressed), NULL);
313 gtk_signal_connect (GTK_OBJECT(window), "focus_in_event",
314 GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
315 gtk_signal_connect (GTK_OBJECT(window), "focus_out_event",
316 GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
317 gtk_signal_connect (GTK_OBJECT(ok_btn), "clicked",
318 GTK_SIGNAL_FUNC(prefs_matcher_ok), NULL);
319 gtk_signal_connect (GTK_OBJECT(cancel_btn), "clicked",
320 GTK_SIGNAL_FUNC(prefs_matcher_cancel), NULL);
322 vbox1 = gtk_vbox_new (FALSE, VSPACING);
323 gtk_widget_show (vbox1);
324 gtk_box_pack_start (GTK_BOX (vbox), vbox1, TRUE, TRUE, 0);
325 gtk_container_set_border_width (GTK_CONTAINER (vbox1), 2);
327 table1 = gtk_table_new (2, 4, FALSE);
328 gtk_widget_show (table1);
330 gtk_box_pack_start (GTK_BOX (vbox1), table1, FALSE, FALSE, 0);
331 gtk_table_set_row_spacings (GTK_TABLE (table1), 8);
332 gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
334 /* criteria combo box */
336 criteria_label = gtk_label_new (_("Match type"));
337 gtk_widget_show (criteria_label);
338 gtk_misc_set_alignment (GTK_MISC (criteria_label), 0, 0.5);
339 gtk_table_attach (GTK_TABLE (table1), criteria_label, 0, 1, 0, 1,
342 criteria_combo = gtk_combo_new ();
343 gtk_widget_show (criteria_combo);
347 for(i = 0 ; i < (gint) (sizeof(criteria_text) / sizeof(gchar *)) ;
349 combo_items = g_list_append(combo_items,
350 (gpointer) _(criteria_text[i]));
352 gtk_combo_set_popdown_strings(GTK_COMBO(criteria_combo), combo_items);
354 g_list_free(combo_items);
356 gtk_widget_set_usize (criteria_combo, 120, -1);
357 gtk_table_attach (GTK_TABLE (table1), criteria_combo, 0, 1, 1, 2,
359 criteria_list = GTK_COMBO(criteria_combo)->list;
360 gtk_signal_connect (GTK_OBJECT (criteria_list), "select-child",
361 GTK_SIGNAL_FUNC (prefs_matcher_criteria_select),
364 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(criteria_combo)->entry),
369 header_label = gtk_label_new (_("Header name"));
370 gtk_widget_show (header_label);
371 gtk_misc_set_alignment (GTK_MISC (header_label), 0, 0.5);
372 gtk_table_attach (GTK_TABLE (table1), header_label, 1, 2, 0, 1,
375 header_combo = gtk_combo_new ();
376 gtk_widget_show (header_combo);
377 gtk_widget_set_usize (header_combo, 96, -1);
378 gtkut_combo_set_items (GTK_COMBO (header_combo),
379 "Subject", "From", "To", "Cc", "Reply-To",
380 "Sender", "X-ML-Name", "X-List", "X-Sequence",
383 gtk_table_attach (GTK_TABLE (table1), header_combo, 1, 2, 1, 2,
385 header_entry = GTK_COMBO (header_combo)->entry;
386 gtk_entry_set_editable (GTK_ENTRY (header_entry), TRUE);
390 value_label = gtk_label_new (_("Value"));
391 gtk_widget_show (value_label);
392 gtk_misc_set_alignment (GTK_MISC (value_label), 0, 0.5);
393 gtk_table_attach (GTK_TABLE (table1), value_label, 2, 3, 0, 1,
394 GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0, 0);
396 value_entry = gtk_entry_new ();
397 gtk_widget_show (value_entry);
398 gtk_widget_set_usize (value_entry, 200, -1);
399 gtk_table_attach (GTK_TABLE (table1), value_entry, 2, 3, 1, 2,
400 GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0, 0);
402 exec_btn = gtk_button_new_with_label (_("Info ..."));
403 gtk_widget_show (exec_btn);
404 gtk_table_attach (GTK_TABLE (table1), exec_btn, 3, 4, 1, 2,
405 GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0, 0);
406 gtk_signal_connect (GTK_OBJECT (exec_btn), "clicked",
407 GTK_SIGNAL_FUNC (prefs_matcher_exec_info),
412 vbox2 = gtk_vbox_new (FALSE, VSPACING);
413 gtk_widget_show (vbox2);
414 gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
416 hbox1 = gtk_hbox_new (FALSE, 8);
417 gtk_widget_show (hbox1);
418 gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
420 predicate_label = gtk_label_new (_("Predicate"));
421 gtk_widget_show (predicate_label);
422 gtk_box_pack_start (GTK_BOX (hbox1), predicate_label,
425 predicate_combo = gtk_combo_new ();
426 gtk_widget_show (predicate_combo);
427 gtk_widget_set_usize (predicate_combo, 120, -1);
428 predicate_list = GTK_COMBO(predicate_combo)->list;
429 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(predicate_combo)->entry),
434 for(i = 0 ; i < (gint) (sizeof(predicate_text) / sizeof(gchar *)) ;
436 combo_items = g_list_append(combo_items,
437 (gpointer) _(predicate_text[i]));
439 gtk_combo_set_popdown_strings(GTK_COMBO(predicate_combo), combo_items);
441 g_list_free(combo_items);
443 gtk_box_pack_start (GTK_BOX (hbox1), predicate_combo,
448 predicate_flag_combo = gtk_combo_new ();
449 gtk_widget_hide (predicate_flag_combo);
450 gtk_widget_set_usize (predicate_flag_combo, 120, -1);
451 predicate_flag_list = GTK_COMBO(predicate_flag_combo)->list;
452 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(predicate_flag_combo)->entry), FALSE);
456 for(i = 0 ; i < (gint) (sizeof(predicate_text) / sizeof(gchar *)) ;
458 combo_items = g_list_append(combo_items, (gpointer) _(predicate_flag_text[i]));
460 gtk_combo_set_popdown_strings(GTK_COMBO(predicate_flag_combo),
463 g_list_free(combo_items);
465 gtk_box_pack_start (GTK_BOX (hbox1), predicate_flag_combo,
468 vbox3 = gtk_vbox_new (FALSE, 0);
469 gtk_widget_show (vbox3);
470 gtk_box_pack_start (GTK_BOX (hbox1), vbox3, FALSE, FALSE, 0);
472 PACK_CHECK_BUTTON (vbox3, case_chkbtn, _("Case sensitive"));
473 PACK_CHECK_BUTTON (vbox3, regexp_chkbtn, _("Use regexp"));
475 /* register / substitute / delete */
477 reg_hbox = gtk_hbox_new (FALSE, 4);
478 gtk_widget_show (reg_hbox);
479 gtk_box_pack_start (GTK_BOX (vbox1), reg_hbox, FALSE, FALSE, 0);
481 arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT);
482 gtk_widget_show (arrow);
483 gtk_box_pack_start (GTK_BOX (reg_hbox), arrow, FALSE, FALSE, 0);
484 gtk_widget_set_usize (arrow, -1, 16);
486 btn_hbox = gtk_hbox_new (TRUE, 4);
487 gtk_widget_show (btn_hbox);
488 gtk_box_pack_start (GTK_BOX (reg_hbox), btn_hbox, FALSE, FALSE, 0);
490 reg_btn = gtk_button_new_with_label (_("Register"));
491 gtk_widget_show (reg_btn);
492 gtk_box_pack_start (GTK_BOX (btn_hbox), reg_btn, FALSE, TRUE, 0);
493 gtk_signal_connect (GTK_OBJECT (reg_btn), "clicked",
494 GTK_SIGNAL_FUNC (prefs_matcher_register_cb), NULL);
496 subst_btn = gtk_button_new_with_label (_(" Substitute "));
497 gtk_widget_show (subst_btn);
498 gtk_box_pack_start (GTK_BOX (btn_hbox), subst_btn, FALSE, TRUE, 0);
499 gtk_signal_connect (GTK_OBJECT (subst_btn), "clicked",
500 GTK_SIGNAL_FUNC (prefs_matcher_substitute_cb),
503 del_btn = gtk_button_new_with_label (_("Delete"));
504 gtk_widget_show (del_btn);
505 gtk_box_pack_start (GTK_BOX (btn_hbox), del_btn, FALSE, TRUE, 0);
506 gtk_signal_connect (GTK_OBJECT (del_btn), "clicked",
507 GTK_SIGNAL_FUNC (prefs_matcher_delete_cb), NULL);
509 /* boolean operation */
511 bool_op_label = gtk_label_new (_("Boolean Op"));
512 gtk_misc_set_alignment (GTK_MISC (value_label), 0, 0.5);
513 gtk_widget_show (bool_op_label);
514 gtk_box_pack_start (GTK_BOX (btn_hbox), bool_op_label,
517 bool_op_combo = gtk_combo_new ();
518 gtk_widget_show (bool_op_combo);
519 gtk_widget_set_usize (bool_op_combo, 50, -1);
520 bool_op_list = GTK_COMBO(bool_op_combo)->list;
521 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(bool_op_combo)->entry),
526 for(i = 0 ; i < (gint) (sizeof(bool_op_text) / sizeof(gchar *)) ;
528 combo_items = g_list_append(combo_items,
529 (gpointer) _(bool_op_text[i]));
531 gtk_combo_set_popdown_strings(GTK_COMBO(bool_op_combo), combo_items);
533 g_list_free(combo_items);
535 gtk_box_pack_start (GTK_BOX (btn_hbox), bool_op_combo,
538 cond_hbox = gtk_hbox_new (FALSE, 8);
539 gtk_widget_show (cond_hbox);
540 gtk_box_pack_start (GTK_BOX (vbox1), cond_hbox, TRUE, TRUE, 0);
542 cond_scrolledwin = gtk_scrolled_window_new (NULL, NULL);
543 gtk_widget_show (cond_scrolledwin);
544 gtk_widget_set_usize (cond_scrolledwin, -1, 150);
545 gtk_box_pack_start (GTK_BOX (cond_hbox), cond_scrolledwin,
547 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (cond_scrolledwin),
548 GTK_POLICY_AUTOMATIC,
549 GTK_POLICY_AUTOMATIC);
551 cond_clist = gtk_clist_new_with_titles(1, title);
552 gtk_widget_show (cond_clist);
553 gtk_container_add (GTK_CONTAINER (cond_scrolledwin), cond_clist);
554 gtk_clist_set_column_width (GTK_CLIST (cond_clist), 0, 80);
555 gtk_clist_set_selection_mode (GTK_CLIST (cond_clist),
556 GTK_SELECTION_BROWSE);
557 GTK_WIDGET_UNSET_FLAGS (GTK_CLIST (cond_clist)->column[0].button,
559 gtk_signal_connect (GTK_OBJECT (cond_clist), "select_row",
560 GTK_SIGNAL_FUNC (prefs_matcher_select), NULL);
562 btn_vbox = gtk_vbox_new (FALSE, 8);
563 gtk_widget_show (btn_vbox);
564 gtk_box_pack_start (GTK_BOX (cond_hbox), btn_vbox, FALSE, FALSE, 0);
566 up_btn = gtk_button_new_with_label (_("Up"));
567 gtk_widget_show (up_btn);
568 gtk_box_pack_start (GTK_BOX (btn_vbox), up_btn, FALSE, FALSE, 0);
569 gtk_signal_connect (GTK_OBJECT (up_btn), "clicked",
570 GTK_SIGNAL_FUNC (prefs_matcher_up), NULL);
572 down_btn = gtk_button_new_with_label (_("Down"));
573 gtk_widget_show (down_btn);
574 gtk_box_pack_start (GTK_BOX (btn_vbox), down_btn, FALSE, FALSE, 0);
575 gtk_signal_connect (GTK_OBJECT (down_btn), "clicked",
576 GTK_SIGNAL_FUNC (prefs_matcher_down), NULL);
578 gtk_widget_show_all(window);
580 matcher.window = window;
582 matcher.ok_btn = ok_btn;
584 matcher.criteria_list = criteria_list;
585 matcher.header_combo = header_combo;
586 matcher.header_entry = header_entry;
587 matcher.header_label = header_label;
588 matcher.value_entry = value_entry;
589 matcher.value_label = value_label;
590 matcher.predicate_label = predicate_label;
591 matcher.predicate_list = predicate_list;
592 matcher.predicate_combo = predicate_combo;
593 matcher.predicate_flag_list = predicate_flag_list;
594 matcher.predicate_flag_combo = predicate_flag_combo;
595 matcher.case_chkbtn = case_chkbtn;
596 matcher.regexp_chkbtn = regexp_chkbtn;
597 matcher.bool_op_list = bool_op_list;
598 matcher.exec_btn = exec_btn;
600 matcher.cond_clist = cond_clist;
603 static gint prefs_matcher_clist_set_row(gint row, MatcherProp * prop)
605 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
610 cond_str[0] = _("(New)");
611 return gtk_clist_append(clist, cond_str);
614 matcher_str = matcherprop_to_string(prop);
615 cond_str[0] = matcher_str;
617 row = gtk_clist_append(clist, cond_str);
619 gtk_clist_set_text(clist, row, 0, cond_str[0]);
625 static void prefs_matcher_reset_condition(void)
627 gtk_list_select_item(GTK_LIST(matcher.criteria_list), 0);
628 gtk_list_select_item(GTK_LIST(matcher.predicate_list), 0);
629 gtk_entry_set_text(GTK_ENTRY(matcher.header_entry), "");
630 gtk_entry_set_text(GTK_ENTRY(matcher.value_entry), "");
633 static void prefs_matcher_update_hscrollbar(void)
635 gint optwidth = gtk_clist_optimal_column_width(GTK_CLIST(matcher.cond_clist), 0);
636 gtk_clist_set_column_width(GTK_CLIST(matcher.cond_clist), 0, optwidth);
639 static void prefs_matcher_set_dialog(MatcherList * matchers)
641 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
643 gboolean bool_op = 1;
645 gtk_clist_freeze(clist);
646 gtk_clist_clear(clist);
648 prefs_matcher_clist_set_row(-1, NULL);
649 if (matchers != NULL) {
650 for (cur = matchers->matchers ; cur != NULL ;
651 cur = g_slist_next(cur)) {
653 prop = (MatcherProp *) cur->data;
654 prefs_matcher_clist_set_row(-1, prop);
657 bool_op = matchers->bool_and;
660 prefs_matcher_update_hscrollbar();
662 gtk_clist_thaw(clist);
664 gtk_list_select_item(GTK_LIST(matcher.bool_op_list), bool_op);
666 prefs_matcher_reset_condition();
669 static MatcherList * prefs_matcher_get_list(void)
676 GSList * matcher_list;
677 MatcherList * matchers;
681 while (gtk_clist_get_text(GTK_CLIST(matcher.cond_clist),
682 row, 0, &matcher_str)) {
684 if (strcmp(matcher_str, _("(New)")) != 0) {
686 prop = matcherprop_parse(&tmp);
691 matcher_list = g_slist_append(matcher_list, prop);
696 bool_and = get_sel_from_list(GTK_LIST(matcher.bool_op_list));
698 matchers = matcherlist_new(matcher_list, bool_and);
703 static gint prefs_matcher_get_criteria_from_matching(gint matching_id)
705 switch(matching_id) {
708 case MATCHING_NOT_UNREAD:
709 case MATCHING_UNREAD:
710 return CRITERIA_UNREAD;
711 case MATCHING_NOT_NEW:
714 case MATCHING_NOT_MARKED:
715 case MATCHING_MARKED:
716 return CRITERIA_MARKED;
717 case MATCHING_NOT_DELETED:
718 case MATCHING_DELETED:
719 return CRITERIA_DELETED;
721 case MATCHING_NOT_REPLIED:
722 case MATCHING_REPLIED:
723 return CRITERIA_REPLIED;
724 case MATCHING_NOT_FORWARDED:
725 case MATCHING_FORWARDED:
726 return CRITERIA_FORWARDED;
727 case MATCHING_NOT_SUBJECT:
728 case MATCHING_SUBJECT:
729 return CRITERIA_SUBJECT;
730 case MATCHING_NOT_FROM:
732 return CRITERIA_FROM;
733 case MATCHING_NOT_TO:
736 case MATCHING_NOT_CC:
739 case MATCHING_NOT_NEWSGROUPS:
740 case MATCHING_NEWSGROUPS:
741 return CRITERIA_NEWSGROUPS;
742 case MATCHING_NOT_INREPLYTO:
743 case MATCHING_INREPLYTO:
744 return CRITERIA_INREPLYTO;
745 case MATCHING_NOT_REFERENCES:
746 case MATCHING_REFERENCES:
747 return CRITERIA_REFERENCES;
748 case MATCHING_NOT_TO_AND_NOT_CC:
749 case MATCHING_TO_OR_CC:
750 return CRITERIA_TO_OR_CC;
751 case MATCHING_NOT_BODY_PART:
752 case MATCHING_BODY_PART:
753 return CRITERIA_BODY_PART;
754 case MATCHING_NOT_MESSAGE:
755 case MATCHING_MESSAGE:
756 return CRITERIA_MESSAGE;
758 case MATCHING_NOT_HEADERS_PART:
759 case MATCHING_HEADERS_PART:
760 return CRITERIA_HEADERS_PART;
761 case MATCHING_NOT_HEADER:
762 case MATCHING_HEADER:
763 return CRITERIA_HEADER;
764 case MATCHING_AGE_GREATER:
765 return CRITERIA_AGE_GREATER;
766 case MATCHING_AGE_LOWER:
767 return CRITERIA_AGE_LOWER;
768 case MATCHING_SCORE_GREATER:
769 return CRITERIA_SCORE_GREATER;
770 case MATCHING_SCORE_LOWER:
771 return CRITERIA_SCORE_LOWER;
772 case MATCHING_NOT_EXECUTE:
773 case MATCHING_EXECUTE:
774 return CRITERIA_EXECUTE;
781 static gint prefs_matcher_get_matching_from_criteria(gint criteria_id)
783 switch (criteria_id) {
786 case CRITERIA_UNREAD:
787 return MATCHING_UNREAD;
790 case CRITERIA_MARKED:
791 return MATCHING_MARKED;
792 case CRITERIA_DELETED:
793 return MATCHING_DELETED;
794 case CRITERIA_REPLIED:
795 return MATCHING_REPLIED;
796 case CRITERIA_FORWARDED:
797 return MATCHING_FORWARDED;
798 case CRITERIA_SUBJECT:
799 return MATCHING_SUBJECT;
801 return MATCHING_FROM;
806 case CRITERIA_TO_OR_CC:
807 return MATCHING_TO_OR_CC;
808 case CRITERIA_NEWSGROUPS:
809 return MATCHING_NEWSGROUPS;
810 case CRITERIA_INREPLYTO:
811 return MATCHING_INREPLYTO;
812 case CRITERIA_REFERENCES:
813 return MATCHING_REFERENCES;
814 case CRITERIA_AGE_GREATER:
815 return MATCHING_AGE_GREATER;
816 case CRITERIA_AGE_LOWER:
817 return MATCHING_AGE_LOWER;
818 case CRITERIA_SCORE_GREATER:
819 return MATCHING_SCORE_GREATER;
820 case CRITERIA_SCORE_LOWER:
821 return MATCHING_SCORE_LOWER;
822 case CRITERIA_HEADER:
823 return MATCHING_HEADER;
824 case CRITERIA_HEADERS_PART:
825 return MATCHING_HEADERS_PART;
826 case CRITERIA_BODY_PART:
827 return MATCHING_BODY_PART;
828 case CRITERIA_MESSAGE:
829 return MATCHING_MESSAGE;
830 case CRITERIA_EXECUTE:
831 return MATCHING_EXECUTE;
837 static gint prefs_matcher_not_criteria(gint matcher_criteria)
839 switch(matcher_criteria) {
840 case MATCHING_UNREAD:
841 return MATCHING_NOT_UNREAD;
843 return MATCHING_NOT_NEW;
844 case MATCHING_MARKED:
845 return MATCHING_NOT_MARKED;
846 case MATCHING_DELETED:
847 return MATCHING_NOT_DELETED;
848 case MATCHING_REPLIED:
849 return MATCHING_NOT_REPLIED;
850 case MATCHING_FORWARDED:
851 return MATCHING_NOT_FORWARDED;
852 case MATCHING_SUBJECT:
853 return MATCHING_NOT_SUBJECT;
855 return MATCHING_NOT_FROM;
857 return MATCHING_NOT_TO;
859 return MATCHING_NOT_CC;
860 case MATCHING_TO_OR_CC:
861 return MATCHING_NOT_TO_AND_NOT_CC;
862 case MATCHING_NEWSGROUPS:
863 return MATCHING_NOT_NEWSGROUPS;
864 case MATCHING_INREPLYTO:
865 return MATCHING_NOT_INREPLYTO;
866 case MATCHING_REFERENCES:
867 return MATCHING_NOT_REFERENCES;
868 case MATCHING_HEADER:
869 return MATCHING_NOT_HEADER;
870 case MATCHING_HEADERS_PART:
871 return MATCHING_NOT_HEADERS_PART;
872 case MATCHING_MESSAGE:
873 return MATCHING_NOT_MESSAGE;
874 case MATCHING_EXECUTE:
875 return MATCHING_NOT_EXECUTE;
876 case MATCHING_BODY_PART:
877 return MATCHING_NOT_BODY_PART;
879 return matcher_criteria;
883 static MatcherProp * prefs_matcher_dialog_to_matcher()
885 MatcherProp * matcherprop;
889 gint value_pred_flag;
892 gboolean case_sensitive;
898 value_criteria = get_sel_from_list(GTK_LIST(matcher.criteria_list));
900 criteria = prefs_matcher_get_matching_from_criteria(value_criteria);
902 value_pred = get_sel_from_list(GTK_LIST(matcher.predicate_list));
903 value_pred_flag = get_sel_from_list(GTK_LIST(matcher.predicate_flag_list));
905 use_regexp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn));
906 case_sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn));
908 switch (value_criteria) {
909 case CRITERIA_UNREAD:
911 case CRITERIA_MARKED:
912 case CRITERIA_DELETED:
913 case CRITERIA_REPLIED:
914 case CRITERIA_FORWARDED:
915 if (value_pred_flag == PREDICATE_FLAG_DISABLED)
916 criteria = prefs_matcher_not_criteria(criteria);
918 case CRITERIA_SUBJECT:
922 case CRITERIA_TO_OR_CC:
923 case CRITERIA_NEWSGROUPS:
924 case CRITERIA_INREPLYTO:
925 case CRITERIA_REFERENCES:
926 case CRITERIA_HEADERS_PART:
927 case CRITERIA_BODY_PART:
928 case CRITERIA_MESSAGE:
929 case CRITERIA_EXECUTE:
930 case CRITERIA_AGE_GREATER:
931 case CRITERIA_AGE_LOWER:
932 case CRITERIA_HEADER:
933 if (value_pred == PREDICATE_DOES_NOT_CONTAIN)
934 criteria = prefs_matcher_not_criteria(criteria);
940 matchtype = MATCHING_REGEXP;
942 matchtype = MATCHING_REGEXPCASE;
946 matchtype = MATCHING_MATCH;
948 matchtype = MATCHING_MATCHCASE;
955 switch (value_criteria) {
957 case CRITERIA_UNREAD:
959 case CRITERIA_MARKED:
960 case CRITERIA_DELETED:
961 case CRITERIA_REPLIED:
962 case CRITERIA_FORWARDED:
965 case CRITERIA_SUBJECT:
969 case CRITERIA_TO_OR_CC:
970 case CRITERIA_NEWSGROUPS:
971 case CRITERIA_INREPLYTO:
972 case CRITERIA_REFERENCES:
973 case CRITERIA_HEADERS_PART:
974 case CRITERIA_BODY_PART:
975 case CRITERIA_MESSAGE:
976 case CRITERIA_EXECUTE:
977 expr = gtk_entry_get_text(GTK_ENTRY(matcher.value_entry));
981 alertpanel_error(_("Match string is not set."));
987 case CRITERIA_AGE_GREATER:
988 case CRITERIA_AGE_LOWER:
989 case CRITERIA_SCORE_GREATER:
990 case CRITERIA_SCORE_LOWER:
991 value_str = gtk_entry_get_text(GTK_ENTRY(matcher.value_entry));
993 if (*value_str == '\0') {
994 alertpanel_error(_("Value is not set."));
998 value = atoi(value_str);
1002 case CRITERIA_HEADER:
1004 header = gtk_entry_get_text(GTK_ENTRY(matcher.header_entry));
1005 expr = gtk_entry_get_text(GTK_ENTRY(matcher.value_entry));
1007 if (*header == '\0') {
1008 alertpanel_error(_("Header name is not set."));
1012 if (*expr == '\0') {
1013 alertpanel_error(_("Match string is not set."));
1020 matcherprop = matcherprop_new(criteria, header, matchtype,
1026 static void prefs_matcher_register_cb(void)
1028 MatcherProp * matcherprop;
1030 matcherprop = prefs_matcher_dialog_to_matcher();
1031 if (matcherprop == NULL)
1034 prefs_matcher_clist_set_row(-1, matcherprop);
1036 matcherprop_free(matcherprop);
1038 prefs_matcher_reset_condition();
1039 prefs_matcher_update_hscrollbar();
1042 static void prefs_matcher_substitute_cb(void)
1044 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
1046 MatcherProp * matcherprop;
1048 row = GPOINTER_TO_INT(clist->selection->data);
1052 matcherprop = prefs_matcher_dialog_to_matcher();
1053 if (matcherprop == NULL)
1056 prefs_matcher_clist_set_row(row, matcherprop);
1058 matcherprop_free(matcherprop);
1060 prefs_matcher_reset_condition();
1062 prefs_matcher_update_hscrollbar();
1065 static void prefs_matcher_delete_cb(void)
1067 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
1070 if (!clist->selection) return;
1071 row = GPOINTER_TO_INT(clist->selection->data);
1075 gtk_clist_remove(clist, row);
1077 prefs_matcher_update_hscrollbar();
1080 static void prefs_matcher_up(void)
1082 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
1085 if (!clist->selection) return;
1087 row = GPOINTER_TO_INT(clist->selection->data);
1089 gtk_clist_row_move(clist, row, row - 1);
1092 static void prefs_matcher_down(void)
1094 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
1097 if (!clist->selection) return;
1099 row = GPOINTER_TO_INT(clist->selection->data);
1100 if (row >= 1 && row < clist->rows - 1)
1101 gtk_clist_row_move(clist, row, row + 1);
1104 static void prefs_matcher_select(GtkCList *clist, gint row, gint column,
1107 gchar * matcher_str;
1110 gboolean negative_cond;
1113 if (!gtk_clist_get_text(GTK_CLIST(matcher.cond_clist),
1114 row, 0, &matcher_str))
1117 negative_cond = FALSE;
1120 prefs_matcher_reset_condition();
1125 prop = matcherprop_parse(&tmp);
1129 criteria = prefs_matcher_get_criteria_from_matching(prop->criteria);
1131 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1134 switch(prop->criteria) {
1135 case MATCHING_NOT_UNREAD:
1136 case MATCHING_NOT_NEW:
1137 case MATCHING_NOT_MARKED:
1138 case MATCHING_NOT_DELETED:
1139 case MATCHING_NOT_REPLIED:
1140 case MATCHING_NOT_FORWARDED:
1141 case MATCHING_NOT_SUBJECT:
1142 case MATCHING_NOT_FROM:
1143 case MATCHING_NOT_TO:
1144 case MATCHING_NOT_CC:
1145 case MATCHING_NOT_NEWSGROUPS:
1146 case MATCHING_NOT_INREPLYTO:
1147 case MATCHING_NOT_REFERENCES:
1148 case MATCHING_NOT_TO_AND_NOT_CC:
1149 case MATCHING_NOT_BODY_PART:
1150 case MATCHING_NOT_MESSAGE:
1151 case MATCHING_NOT_HEADERS_PART:
1152 case MATCHING_NOT_HEADER:
1153 negative_cond = TRUE;
1157 switch(prop->criteria) {
1161 case MATCHING_NOT_SUBJECT:
1162 case MATCHING_NOT_FROM:
1163 case MATCHING_NOT_TO:
1164 case MATCHING_NOT_CC:
1165 case MATCHING_NOT_TO_AND_NOT_CC:
1166 case MATCHING_NOT_NEWSGROUPS:
1167 case MATCHING_NOT_INREPLYTO:
1168 case MATCHING_NOT_REFERENCES:
1169 case MATCHING_NOT_HEADERS_PART:
1170 case MATCHING_NOT_BODY_PART:
1171 case MATCHING_NOT_MESSAGE:
1172 case MATCHING_SUBJECT:
1176 case MATCHING_TO_OR_CC:
1177 case MATCHING_NEWSGROUPS:
1178 case MATCHING_INREPLYTO:
1179 case MATCHING_REFERENCES:
1180 case MATCHING_HEADERS_PART:
1181 case MATCHING_BODY_PART:
1182 case MATCHING_MESSAGE:
1183 gtk_entry_set_text(GTK_ENTRY(matcher.value_entry), prop->expr);
1186 case MATCHING_AGE_GREATER:
1187 case MATCHING_AGE_LOWER:
1188 case MATCHING_SCORE_GREATER:
1189 case MATCHING_SCORE_LOWER:
1190 gtk_entry_set_text(GTK_ENTRY(matcher.value_entry), itos(prop->value));
1193 case MATCHING_NOT_HEADER:
1194 case MATCHING_HEADER:
1195 gtk_entry_set_text(GTK_ENTRY(matcher.header_entry), prop->header);
1196 gtk_entry_set_text(GTK_ENTRY(matcher.value_entry), prop->expr);
1201 gtk_list_select_item(GTK_LIST(matcher.predicate_list), 1);
1203 gtk_list_select_item(GTK_LIST(matcher.predicate_list), 0);
1205 switch(prop->matchtype) {
1206 case MATCHING_MATCH:
1207 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), FALSE);
1208 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), TRUE);
1211 case MATCHING_MATCHCASE:
1212 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), FALSE);
1213 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), FALSE);
1216 case MATCHING_REGEXP:
1217 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), TRUE);
1218 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), TRUE);
1221 case MATCHING_REGEXPCASE:
1222 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), TRUE);
1223 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), FALSE);
1228 static void prefs_matcher_criteria_select(GtkList *list,
1234 value = get_sel_from_list(GTK_LIST(matcher.criteria_list));
1238 gtk_widget_set_sensitive(matcher.header_combo, FALSE);
1239 gtk_widget_set_sensitive(matcher.header_label, FALSE);
1240 gtk_widget_set_sensitive(matcher.value_label, FALSE);
1241 gtk_widget_set_sensitive(matcher.value_entry, FALSE);
1242 gtk_widget_set_sensitive(matcher.predicate_label, FALSE);
1243 gtk_widget_set_sensitive(matcher.predicate_combo, FALSE);
1244 gtk_widget_set_sensitive(matcher.predicate_flag_combo, FALSE);
1245 gtk_widget_hide(matcher.predicate_combo);
1246 gtk_widget_show(matcher.predicate_flag_combo);
1247 gtk_widget_set_sensitive(matcher.case_chkbtn, FALSE);
1248 gtk_widget_set_sensitive(matcher.regexp_chkbtn, FALSE);
1249 gtk_widget_set_sensitive(matcher.exec_btn, FALSE);
1252 case CRITERIA_UNREAD:
1254 case CRITERIA_MARKED:
1255 case CRITERIA_DELETED:
1256 case CRITERIA_REPLIED:
1257 case CRITERIA_FORWARDED:
1258 gtk_widget_set_sensitive(matcher.header_combo, FALSE);
1259 gtk_widget_set_sensitive(matcher.header_label, FALSE);
1260 gtk_widget_set_sensitive(matcher.value_label, FALSE);
1261 gtk_widget_set_sensitive(matcher.value_entry, FALSE);
1262 gtk_widget_set_sensitive(matcher.predicate_label, TRUE);
1263 gtk_widget_set_sensitive(matcher.predicate_combo, FALSE);
1264 gtk_widget_set_sensitive(matcher.predicate_flag_combo, TRUE);
1265 gtk_widget_hide(matcher.predicate_combo);
1266 gtk_widget_show(matcher.predicate_flag_combo);
1267 gtk_widget_set_sensitive(matcher.case_chkbtn, FALSE);
1268 gtk_widget_set_sensitive(matcher.regexp_chkbtn, FALSE);
1269 gtk_widget_set_sensitive(matcher.exec_btn, FALSE);
1272 case CRITERIA_SUBJECT:
1276 case CRITERIA_TO_OR_CC:
1277 case CRITERIA_NEWSGROUPS:
1278 case CRITERIA_INREPLYTO:
1279 case CRITERIA_REFERENCES:
1280 case CRITERIA_HEADERS_PART:
1281 case CRITERIA_BODY_PART:
1282 case CRITERIA_MESSAGE:
1283 gtk_widget_set_sensitive(matcher.header_combo, FALSE);
1284 gtk_widget_set_sensitive(matcher.header_label, FALSE);
1285 gtk_widget_set_sensitive(matcher.value_label, TRUE);
1286 gtk_widget_set_sensitive(matcher.value_entry, TRUE);
1287 gtk_widget_set_sensitive(matcher.predicate_label, TRUE);
1288 gtk_widget_set_sensitive(matcher.predicate_combo, TRUE);
1289 gtk_widget_set_sensitive(matcher.predicate_flag_combo, FALSE);
1290 gtk_widget_show(matcher.predicate_combo);
1291 gtk_widget_hide(matcher.predicate_flag_combo);
1292 gtk_widget_set_sensitive(matcher.case_chkbtn, TRUE);
1293 gtk_widget_set_sensitive(matcher.regexp_chkbtn, TRUE);
1294 gtk_widget_set_sensitive(matcher.exec_btn, FALSE);
1297 case CRITERIA_EXECUTE:
1298 gtk_widget_set_sensitive(matcher.header_combo, FALSE);
1299 gtk_widget_set_sensitive(matcher.header_label, FALSE);
1300 gtk_widget_set_sensitive(matcher.value_label, TRUE);
1301 gtk_widget_set_sensitive(matcher.value_entry, TRUE);
1302 gtk_widget_set_sensitive(matcher.predicate_label, TRUE);
1303 gtk_widget_set_sensitive(matcher.predicate_combo, FALSE);
1304 gtk_widget_set_sensitive(matcher.predicate_flag_combo, TRUE);
1305 gtk_widget_hide(matcher.predicate_combo);
1306 gtk_widget_show(matcher.predicate_flag_combo);
1307 gtk_widget_set_sensitive(matcher.case_chkbtn, FALSE);
1308 gtk_widget_set_sensitive(matcher.regexp_chkbtn, FALSE);
1309 gtk_widget_set_sensitive(matcher.exec_btn, TRUE);
1312 case CRITERIA_AGE_GREATER:
1313 case CRITERIA_AGE_LOWER:
1314 case CRITERIA_SCORE_GREATER:
1315 case CRITERIA_SCORE_LOWER:
1316 gtk_widget_set_sensitive(matcher.header_combo, FALSE);
1317 gtk_widget_set_sensitive(matcher.header_label, FALSE);
1318 gtk_widget_set_sensitive(matcher.value_label, TRUE);
1319 gtk_widget_set_sensitive(matcher.value_entry, TRUE);
1320 gtk_widget_set_sensitive(matcher.predicate_label, FALSE);
1321 gtk_widget_set_sensitive(matcher.predicate_combo, FALSE);
1322 gtk_widget_set_sensitive(matcher.predicate_flag_combo, FALSE);
1323 gtk_widget_show(matcher.predicate_combo);
1324 gtk_widget_hide(matcher.predicate_flag_combo);
1325 gtk_widget_set_sensitive(matcher.case_chkbtn, FALSE);
1326 gtk_widget_set_sensitive(matcher.regexp_chkbtn, FALSE);
1327 gtk_widget_set_sensitive(matcher.exec_btn, FALSE);
1330 case CRITERIA_HEADER:
1331 gtk_widget_set_sensitive(matcher.header_combo, TRUE);
1332 gtk_widget_set_sensitive(matcher.header_label, TRUE);
1333 gtk_widget_set_sensitive(matcher.value_label, TRUE);
1334 gtk_widget_set_sensitive(matcher.value_entry, TRUE);
1335 gtk_widget_set_sensitive(matcher.predicate_label, TRUE);
1336 gtk_widget_set_sensitive(matcher.predicate_combo, TRUE);
1337 gtk_widget_set_sensitive(matcher.predicate_flag_combo, FALSE);
1338 gtk_widget_show(matcher.predicate_combo);
1339 gtk_widget_hide(matcher.predicate_flag_combo);
1340 gtk_widget_set_sensitive(matcher.case_chkbtn, TRUE);
1341 gtk_widget_set_sensitive(matcher.regexp_chkbtn, TRUE);
1342 gtk_widget_set_sensitive(matcher.exec_btn, FALSE);
1347 static void prefs_matcher_key_pressed(GtkWidget *widget, GdkEventKey *event,
1350 if (event && event->keyval == GDK_Escape)
1351 prefs_matcher_cancel();
1354 static void prefs_matcher_cancel(void)
1356 gtk_widget_hide(matcher.window);
1359 static void prefs_matcher_ok(void)
1361 MatcherList * matchers;
1363 matchers = prefs_matcher_get_list();
1364 if (matchers != NULL) {
1365 gtk_widget_hide(matcher.window);
1366 if (matchers_callback != NULL)
1367 matchers_callback(matchers);
1368 matcherlist_free(matchers);
1371 gtk_widget_hide(matcher.window);
1375 static gint prefs_matcher_deleted(GtkWidget *widget, GdkEventAny *event,
1378 prefs_matcher_cancel();
1382 static GtkWidget * exec_info_win;
1384 void prefs_matcher_exec_info(void)
1387 prefs_matcher_exec_info_create();
1389 gtk_widget_show(exec_info_win);
1391 gtk_widget_hide(exec_info_win);
1394 static void prefs_matcher_exec_info_create(void)
1402 exec_info_win = gtk_window_new(GTK_WINDOW_DIALOG);
1403 gtk_window_set_title(GTK_WINDOW(exec_info_win),
1404 _("Description of symbols"));
1405 gtk_container_set_border_width(GTK_CONTAINER(exec_info_win), 8);
1406 gtk_window_set_position(GTK_WINDOW(exec_info_win), GTK_WIN_POS_CENTER);
1407 gtk_window_set_modal(GTK_WINDOW(exec_info_win), TRUE);
1408 gtk_window_set_policy(GTK_WINDOW(exec_info_win), FALSE, TRUE, FALSE);
1410 vbox = gtk_vbox_new(FALSE, 8);
1411 gtk_container_add(GTK_CONTAINER(exec_info_win), vbox);
1413 hbox = gtk_hbox_new(FALSE, 4);
1414 gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
1416 label = gtk_label_new
1429 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
1430 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
1432 label = gtk_label_new
1442 "Filename - should not be modified\n"
1445 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
1446 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
1448 gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
1449 NULL, NULL, NULL, NULL);
1450 gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
1452 gtk_widget_grab_default(ok_btn);
1453 gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
1454 GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1456 gtk_signal_connect(GTK_OBJECT(exec_info_win), "delete_event",
1457 GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1459 gtk_widget_show_all(vbox);