~ubuntu-branches/debian/jessie/gman/jessie

« back to all changes in this revision

Viewing changes to .pc/evince.patch/menu.c

  • Committer: Package Import Robot
  • Author(s): Osamu Aoki
  • Date: 2012-01-04 00:48:23 UTC
  • Revision ID: package-import@ubuntu.com-20120104004823-wbo6r3f2eslbt1ln
Tags: 0.9.3-5.2
* Non-maintainer upload.
* Switched from mozilla to sensible-browser.
* Added evince as choice since this is gnome/GTK+ app.
* Updated manpath default values to current situation.
* Updated policy version, used 3.0 (quilt) format, and
  made some lintian touch-ups.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/********************** modified from t2.c *******************/
 
2
/********************* menu.c ********************************/
 
3
 
 
4
#include <stdio.h>
 
5
#include <string.h>
 
6
#include <strings.h>
 
7
#include <sys/types.h>
 
8
#ifdef SYS_DIR
 
9
#include <sys_dir.h>
 
10
#else
 
11
#ifdef NDIR
 
12
#include <ndir.h>
 
13
#else
 
14
#include <dirent.h>
 
15
#endif
 
16
#endif
 
17
 
 
18
#include <sys/stat.h>
 
19
#include <unistd.h>
 
20
#include <errno.h>
 
21
 
 
22
#include <stdlib.h>
 
23
 
 
24
#include <gtk/gtk.h>
 
25
 
 
26
#include <libintl.h>
 
27
 
 
28
#include "mandata.h"
 
29
#include "util.h"
 
30
#include "gman.h"
 
31
#include "list.h"
 
32
#include "task.h"
 
33
#include "window2.h"
 
34
#include "taskfunc.h"
 
35
 
 
36
static int window_resize_callback(GtkWidget *w, GtkAllocation *size, gpointer data);
 
37
static int section_policy_callback(GtkWidget *w, gpointer data);
 
38
static int section_select_callback(GtkWidget *w, gpointer data);
 
39
static int status_bar_callback (GtkWidget *widget, gpointer   data);
 
40
static int search_mode_callback (GtkWidget *widget, gpointer   data);
 
41
static int show_mode_callback(GtkWidget *w, gpointer data);
 
42
static void app_quit(GtkWidget *w, gpointer data);
 
43
static void select_row_callback(GtkWidget *, gint, gint, GdkEventButton *, gpointer);
 
44
static void select_row_callback3(GtkWidget *, gint, gint, GdkEventButton *, gpointer);
 
45
static void entry_activate_callback(GtkWidget *,gpointer);
 
46
static void entry_changed_callback(GtkWidget *,gpointer);
 
47
static void window_help_about_callback (GtkWidget *widget, gpointer   data);
 
48
static void entry4_activate_callback(GtkWidget *,gpointer);
 
49
static void entry4_changed_callback(GtkWidget *,gpointer);
 
50
static int button_clicked_callback(GtkWidget *,gpointer);
 
51
 
 
52
#define MAX_PATHS 10
 
53
 
 
54
#define MENU_DISPLAY_POSITION 201
 
55
#define MENU_NEXT_POSITION 202
 
56
 
 
57
#define _(string) gettext(string)
 
58
 
 
59
static GtkItemFactoryEntry menu_items[] = {
 
60
  {"/_File",         NULL,         NULL, 0, "<Branch>"},
 
61
  {"/File/_Quit",     "<control>Q", (void (*)())app_quit, 0, NULL},
 
62
  {"/_Sections",                 NULL,         NULL, 0, "<Branch>"},
 
63
  {"/Sections/tearoff1", NULL,      NULL,       0, "<Tearoff>" },
 
64
  {"/Sections/_All",    NULL,                   (void (*)())section_policy_callback, 0, "<RadioItem>"},
 
65
  {"/Sections/all _But",   NULL,                (void (*)())section_policy_callback, 1, "/Sections/All"},
 
66
  {"/Sections/_Only",   NULL,                   (void (*)())section_policy_callback, 2, "/Sections/All"},
 
67
  {"/Sections/sep1",    NULL,                   NULL,           0,                      "<Separator>"},
 
68
  {"/Sections/_1: User Commands",       NULL,   (void (*)())section_select_callback,    1<<0,   "<CheckItem>"},
 
69
  {"/Sections/_2: System Calls",        NULL,   (void (*)())section_select_callback, 1<<1,      "<CheckItem>"},
 
70
  {"/Sections/_3: Subroutines",         NULL,   (void (*)())section_select_callback, 1<<2,      "<CheckItem>"},
 
71
  {"/Sections/_4: Devices",                     NULL,   (void (*)())section_select_callback,    1<<3,   "<CheckItem>"},
 
72
  {"/Sections/_5: File Formats",        NULL,   (void (*)())section_select_callback,    1<<4,   "<CheckItem>"},
 
73
  {"/Sections/_6: Games",                       NULL,   (void (*)())section_select_callback,    1<<5,   "<CheckItem>"},
 
74
  {"/Sections/_7: Miscellaneous",       NULL,   (void (*)())section_select_callback,    1<<6,   "<CheckItem>"},
 
75
  {"/Sections/_8: Sys.Administration",NULL,     (void (*)())section_select_callback,    1<<7,   "<CheckItem>"},
 
76
  {"/Sections/_l: Local",                       NULL,   (void (*)())section_select_callback,    1<<8,   "<CheckItem>"},
 
77
  {"/Sections/_n: New",                         NULL,   (void (*)())section_select_callback,    1<<9,   "<CheckItem>"},
 
78
  {"/_View",      NULL,         NULL, 0, "<Branch>"},
 
79
  {"/View/x_Term",              "<control>T",   (void (*)())show_mode_callback, 0,      "<RadioItem>"},
 
80
  {"/View/_GhostView",          "<control>G",   (void (*)())show_mode_callback, 1,      "/View/xTerm"},
 
81
  {"/View/_LocalBrowse",                "<control>L",   (void (*)())show_mode_callback, 2,      "/View/xTerm"},
 
82
  {"/View/_NetBrowse",          "<control>N",   (void (*)())show_mode_callback, 3,      "/View/xTerm"},
 
83
  {"/_Options",      NULL,         NULL, 0, "<Branch>"},
 
84
  {"/Options/Status bar",               NULL,   (void (*)())status_bar_callback, 0,     "<CheckItem>"},
 
85
  {"/Options/sep1",     NULL,         NULL, 0, "<Separator>"},
 
86
  {"/Options/_Index search",    "<control>I",   (void (*)())search_mode_callback, 0, "<RadioItem>"},
 
87
  {"/Options/_Key word search",   "<control>K", (void (*)())search_mode_callback, 1, "/Options/Index search"},
 
88
  {"/Options/sep2",     NULL,         NULL, 0, "<Separator>"},
 
89
  {"/Options/Man _Paths...",    NULL,   (void (*)())edit_paths_callback, 0, NULL},
 
90
  {"/_Help",         NULL,         NULL, 0, "<LastBranch>"},
 
91
  {"/_Help/About",   NULL,         GTK_SIGNAL_FUNC(window_help_about_callback),0,NULL}
 
92
};
 
93
 
 
94
/********************* init_main_window *************************/
 
95
 
 
96
GtkWidget * clist;
 
97
GtkWidget * entry;
 
98
GtkWidget * clist3;
 
99
GtkWidget * window;             //main window
 
100
GtkTooltips * tooltips;
 
101
 
 
102
GtkWidget * section_buttons[MAX_MAN_SECTION];
 
103
GtkWidget * section_select[3];
 
104
GtkWidget * searching_mode_buttons[2];
 
105
GtkWidget * show_mode_buttons[4];
 
106
GtkWidget * status_bar_button;
 
107
 
 
108
int signal_select_row;  //used by select_row_callback() to decide whether to active man pages
 
109
int signal_entry_change; //used by entry_changed_callback() to decide whether to refresh list
 
110
int signal_menu_change; //used by menu_item callback to decide whether to take action or not
 
111
Dictionary * man_paths;
 
112
char * *man_items_buffer;
 
113
int man_items_count;
 
114
int clist_selected_row;
 
115
List * man_paths_to_be_load;
 
116
const char * keyword;
 
117
 
 
118
void updata_menu_buttons(int);
 
119
 
 
120
void get_main_menu(GtkWidget *window, GtkWidget ** menubar) {
 
121
        int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]);
 
122
        GtkItemFactory *item_factory;
 
123
        GtkAccelGroup *accel_group;
 
124
 
 
125
        accel_group = gtk_accel_group_new();
 
126
 
 
127
        /* This function initializes the item factory.
 
128
           Param 1: The type of menu - can be GTK_TYPE_MENU_BAR, GTK_TYPE_MENU,
 
129
                    or GTK_TYPE_OPTION_MENU.
 
130
                Param 2: The path of the menu.
 
131
                Param 3: A pointer to a gtk_accel_group.  The item factory sets up
 
132
              the accelerator table while generating menus.
 
133
        */
 
134
 
 
135
        item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", 
 
136
                                                                                accel_group);
 
137
 
 
138
  /* This function generates the menu items. Pass the item factory,
 
139
     the number of items in the array, the array itself, and any
 
140
     callback data for the the menu items. */
 
141
        gtk_item_factory_create_items(item_factory, nmenu_items, menu_items, NULL);
 
142
 
 
143
  /* Attach the new accelerator group to the window. */
 
144
/*      gtk_accel_group_attach (accel_group, GTK_OBJECT (window)); */
 
145
        gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
 
146
 
 
147
        if (menubar)
 
148
        /* Finally, return the actual menu bar created by the item factory. */ 
 
149
                *menubar = gtk_item_factory_get_widget(item_factory, "<main>");
 
150
        section_select[0] = gtk_item_factory_get_widget(item_factory, "/Sections/All");
 
151
        section_select[1] = gtk_item_factory_get_widget(item_factory, "/Sections/all But");
 
152
        section_select[2] = gtk_item_factory_get_widget(item_factory, "/Sections/Only");
 
153
        section_buttons[0] = gtk_item_factory_get_widget(item_factory, "/Sections/1: User Commands");
 
154
        section_buttons[1] = gtk_item_factory_get_widget(item_factory, "/Sections/2: System Calls");
 
155
        section_buttons[2] = gtk_item_factory_get_widget(item_factory, "/Sections/3: Subroutines");
 
156
        section_buttons[3] = gtk_item_factory_get_widget(item_factory, "/Sections/4: Devices");
 
157
        section_buttons[4] = gtk_item_factory_get_widget(item_factory, "/Sections/5: File Formats");
 
158
        section_buttons[5] = gtk_item_factory_get_widget(item_factory, "/Sections/6: Games");
 
159
        section_buttons[6] = gtk_item_factory_get_widget(item_factory, "/Sections/7: Miscellaneous");
 
160
        section_buttons[7] = gtk_item_factory_get_widget(item_factory, "/Sections/8: Sys.Administration");
 
161
        section_buttons[8] = gtk_item_factory_get_widget(item_factory, "/Sections/l: Local");
 
162
        section_buttons[9] = gtk_item_factory_get_widget(item_factory, "/Sections/n: New");
 
163
        searching_mode_buttons[0] = gtk_item_factory_get_widget(item_factory, "/Options/Index search");
 
164
        searching_mode_buttons[1] = gtk_item_factory_get_widget(item_factory, "/Options/Key word search");
 
165
        show_mode_buttons[0] = gtk_item_factory_get_widget(item_factory, "/View/xTerm");
 
166
        show_mode_buttons[1] = gtk_item_factory_get_widget(item_factory, "/View/GhostView");
 
167
        show_mode_buttons[2] = gtk_item_factory_get_widget(item_factory, "/View/LocalBrowse");
 
168
        show_mode_buttons[3] = gtk_item_factory_get_widget(item_factory, "/View/NetBrowse");
 
169
        status_bar_button = gtk_item_factory_get_widget(item_factory, "/Options/Status bar");
 
170
        //  gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(section_buttons[4]),1);
 
171
        updata_menu_buttons(0);
 
172
}
 
173
 
 
174
/*flag = 0 means not to invoke call backs when changing the states of buttons.*/
 
175
void updata_menu_buttons(int flag) 
 
176
{
 
177
        long i,j,k,k2;
 
178
        k = (long)context->get_value("display_section_policy");
 
179
        if(k>0 && k<=2)
 
180
                if(!((GtkCheckMenuItem*)(section_select[k]))->active){
 
181
                        if(!flag) signal_menu_change++;
 
182
                        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(section_select[k]),1);
 
183
                }
 
184
        k = (long)context->get_value("display_section");
 
185
        for (i = 0;i<10;i++)
 
186
                if(!(k&(1<<i)) != !(((GtkCheckMenuItem*)(section_buttons[i]))->active)) {
 
187
                        if(!flag) signal_menu_change++;
 
188
                        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(section_buttons[i]),k&(1<<i));
 
189
                }
 
190
        k = (long)context->get_value("searching_mode");
 
191
        if(k>0 && k<=1)
 
192
                if(!(((GtkCheckMenuItem*)(searching_mode_buttons[k]))->active)) {
 
193
                        if(!flag) signal_menu_change++;
 
194
                        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(searching_mode_buttons[k]),1);
 
195
                }
 
196
        k = (long)context->get_value("show_mode");
 
197
        if(k>0 && k<=3)
 
198
                if(!(((GtkCheckMenuItem*)(show_mode_buttons[k]))->active)) {
 
199
                        if(!flag) signal_menu_change++;
 
200
                        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(show_mode_buttons[k]),1);
 
201
                }
 
202
        k2 = (long)context->get_value("show_status_bar");
 
203
        i = k2&(1<<k);
 
204
        j = (((GtkCheckMenuItem*)(status_bar_button))->active);
 
205
        if((i&&!j) || (!i&&j)) {
 
206
                if(!flag) signal_menu_change++;
 
207
                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(status_bar_button),i);
 
208
        }
 
209
        gtk_widget_hide(status_bar_button);
 
210
}
 
211
 
 
212
static  GtkWidget *index_search_vbox;
 
213
static  GtkWidget *keyword_search_vbox;
 
214
static  GtkWidget *hbox4;
 
215
static  GtkWidget *hbox_status;
 
216
static  GtkWidget *entry4;
 
217
GtkWidget *search_button;
 
218
GtkWidget *stop_button;
 
219
static  GtkWidget *statusbar1;
 
220
static  GtkWidget *statusbar2;
 
221
 
 
222
static void updata_widget_show(int flag)
 
223
{       
 
224
        long k,k2;
 
225
        
 
226
        k = (long)context->get_value("searching_mode");
 
227
        k2 = (long)context->get_value("show_status_bar");
 
228
 
 
229
        if(k2&(1<<k)) 
 
230
                gtk_widget_show(hbox_status);
 
231
        else
 
232
                gtk_widget_hide(hbox_status);
 
233
        gtk_widget_hide(!k?keyword_search_vbox:index_search_vbox);
 
234
        gtk_widget_show(k?keyword_search_vbox:index_search_vbox);
 
235
        if(k2 & (1<<k)) gtk_widget_show (hbox_status);
 
236
}
 
237
 
 
238
 
 
239
void init_main_window(GtkWidget * window)
 
240
{
 
241
        GtkWidget *     main_vbox;
 
242
        GtkWidget *     menubar;
 
243
        GtkWidget *     swindow;
 
244
        GtkWidget *     swindow2;
 
245
        GtkWidget * focus;
 
246
 
 
247
        ::window = window;
 
248
        gchar *titles[2] = { "Name", "Section" };
 
249
        gchar *titles2[3] = { "Name", "Section", "Description"};
 
250
        signal_select_row = 0;
 
251
        signal_entry_change = 0;
 
252
        
 
253
        tooltips = gtk_tooltips_new();
 
254
 
 
255
        gtk_signal_connect(GTK_OBJECT(window), "destroy", 
 
256
                                           GTK_SIGNAL_FUNC(app_quit), 
 
257
                                           0);
 
258
 
 
259
        gtk_window_set_title(GTK_WINDOW(window), "Gman");
 
260
        gtk_window_set_policy( GTK_WINDOW( window ), FALSE, TRUE, FALSE );
 
261
        gtk_window_set_default_size(GTK_WINDOW(window),
 
262
                                                                (long)context->get_value("h_size"),
 
263
                                                                (long)context->get_value("v_size"));
 
264
        
 
265
        gtk_widget_set_usize(GTK_WIDGET(window),200,150);
 
266
        main_vbox = gtk_vbox_new(FALSE, 1);
 
267
        gtk_container_border_width(GTK_CONTAINER(main_vbox), 1);
 
268
        gtk_container_add(GTK_CONTAINER(window), main_vbox);
 
269
        gtk_widget_show(main_vbox);
 
270
 
 
271
        get_main_menu(window, &menubar);
 
272
        gtk_box_pack_start(GTK_BOX(main_vbox), menubar, FALSE, TRUE, 0);
 
273
        gtk_widget_show(menubar);
 
274
 
 
275
        gtk_signal_connect(GTK_OBJECT(window),"size_allocate",GTK_SIGNAL_FUNC(window_resize_callback),NULL);
 
276
 
 
277
        //keyword_search_vbox
 
278
        keyword_search_vbox = gtk_vbox_new(FALSE,1);
 
279
        gtk_box_pack_start(GTK_BOX(main_vbox), keyword_search_vbox, TRUE, TRUE, 0);
 
280
        
 
281
        hbox4 = gtk_hbox_new (FALSE, 1);
 
282
        gtk_object_set_data (GTK_OBJECT (window), "hbox4", hbox4);
 
283
        gtk_box_pack_start (GTK_BOX (keyword_search_vbox), hbox4, FALSE, TRUE, 0);
 
284
        gtk_widget_show (hbox4);
 
285
 
 
286
        stop_button = gtk_button_new_with_label ("Stop");
 
287
        gtk_object_set_data (GTK_OBJECT (window), "stop_button", stop_button);
 
288
        gtk_widget_set_sensitive(stop_button,0);
 
289
        gtk_signal_connect (GTK_OBJECT(stop_button),"clicked",(GtkSignalFunc)button_clicked_callback,(void*)1);
 
290
        gtk_widget_show (stop_button);
 
291
        gtk_box_pack_start (GTK_BOX (hbox4), stop_button, FALSE, TRUE, 0);
 
292
        gtk_widget_set_usize (stop_button, 40, -2);
 
293
        
 
294
        entry4 = gtk_entry_new ();
 
295
        gtk_object_set_data (GTK_OBJECT (window), "entry4", entry4);
 
296
        gtk_widget_show (entry4);
 
297
        gtk_tooltips_set_tip (tooltips, entry4, "Key word search", NULL);
 
298
        gtk_box_pack_start (GTK_BOX (hbox4), entry4, TRUE, TRUE, 0);
 
299
    gtk_signal_connect(GTK_OBJECT(entry4), "activate",
 
300
                       GTK_SIGNAL_FUNC(entry4_activate_callback),NULL);
 
301
    gtk_signal_connect(GTK_OBJECT(entry4), "changed",
 
302
                       GTK_SIGNAL_FUNC(entry4_changed_callback),NULL);
 
303
        
 
304
        search_button = gtk_button_new_with_label ("Search");
 
305
        gtk_object_set_data (GTK_OBJECT (window), "search_button", search_button);
 
306
        gtk_widget_set_sensitive(search_button,0);
 
307
        gtk_signal_connect (GTK_OBJECT(stop_button),"clicked",(GtkSignalFunc)button_clicked_callback,(void*)2);
 
308
        gtk_widget_show (search_button);
 
309
        gtk_box_pack_start (GTK_BOX (hbox4), search_button, FALSE, TRUE, 0);
 
310
        gtk_widget_set_usize (search_button, 60, -2);
 
311
 
 
312
        
 
313
    clist3 = gtk_clist_new_with_titles( 3, titles2);
 
314
        swindow2 = gtk_scrolled_window_new (NULL, NULL);
 
315
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow2),
 
316
                                        GTK_POLICY_AUTOMATIC,
 
317
                                        GTK_POLICY_AUTOMATIC);
 
318
 
 
319
        
 
320
        gtk_clist_set_column_width(GTK_CLIST(clist3),0,100);
 
321
        gtk_clist_set_selection_mode(GTK_CLIST(clist3),GTK_SELECTION_SINGLE);
 
322
        gtk_clist_column_titles_passive(GTK_CLIST(clist3));
 
323
        gtk_clist_set_column_auto_resize (GTK_CLIST(clist3),2,1);
 
324
 
 
325
        gtk_container_add (GTK_CONTAINER (swindow2), clist3);
 
326
        gtk_box_pack_start (GTK_BOX (keyword_search_vbox), swindow2, TRUE, TRUE, 0);
 
327
        gtk_widget_show_all(GTK_WIDGET(swindow2));
 
328
 
 
329
        gtk_signal_connect(GTK_OBJECT(clist3),"select_row",
 
330
                                           GTK_SIGNAL_FUNC(select_row_callback3),NULL);
 
331
        
 
332
        //index_search_vbox
 
333
        index_search_vbox = gtk_vbox_new(FALSE,1);
 
334
        gtk_box_pack_start(GTK_BOX(main_vbox), index_search_vbox, TRUE, TRUE, 0);
 
335
    entry = gtk_entry_new_with_max_length (50);
 
336
    clist = gtk_clist_new_with_titles( 2, titles);
 
337
    gtk_signal_connect(GTK_OBJECT(entry), "activate",
 
338
                       GTK_SIGNAL_FUNC(entry_activate_callback),
 
339
                       (gpointer)clist);
 
340
    gtk_signal_connect(GTK_OBJECT(entry), "changed",
 
341
                       GTK_SIGNAL_FUNC(entry_changed_callback),
 
342
                       (gpointer)clist);
 
343
    gtk_box_pack_start (GTK_BOX (index_search_vbox), entry, FALSE, TRUE, 0);
 
344
        gtk_tooltips_set_tip (tooltips, entry, "index search", NULL);
 
345
        gtk_widget_show(entry);
 
346
 
 
347
        swindow = gtk_scrolled_window_new (NULL, NULL);
 
348
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
 
349
                                        GTK_POLICY_AUTOMATIC,
 
350
                                        GTK_POLICY_AUTOMATIC);
 
351
 
 
352
 
 
353
        gtk_clist_set_column_width(GTK_CLIST(clist),0,200);
 
354
        gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE);
 
355
        gtk_clist_column_titles_passive(GTK_CLIST(clist));
 
356
        gtk_container_add (GTK_CONTAINER (swindow), clist);
 
357
        gtk_box_pack_start (GTK_BOX (index_search_vbox), swindow, TRUE, TRUE, 0);
 
358
 
 
359
        gtk_signal_connect(GTK_OBJECT(clist),"select_row",
 
360
                                           GTK_SIGNAL_FUNC(select_row_callback),NULL);
 
361
 
 
362
        focus = entry;
 
363
        gtk_widget_grab_focus (focus);
 
364
        gtk_widget_show_all (swindow);
 
365
 
 
366
        hbox_status = gtk_hbox_new (FALSE, 0);
 
367
        gtk_object_set_data (GTK_OBJECT (window), "hbox_status", hbox_status);
 
368
        gtk_box_pack_start (GTK_BOX (main_vbox), hbox_status, FALSE, TRUE, 0);
 
369
 
 
370
        updata_widget_show(0);
 
371
 
 
372
        statusbar1 = gtk_statusbar_new ();
 
373
        gtk_object_set_data (GTK_OBJECT (window), "statusbar1", statusbar1);
 
374
        gtk_widget_show (statusbar1);
 
375
        gtk_box_pack_start (GTK_BOX (hbox_status), statusbar1, TRUE, TRUE, 0);
 
376
 
 
377
        statusbar2 = gtk_statusbar_new ();
 
378
        gtk_object_set_data (GTK_OBJECT (window), "statusbar2", statusbar2);
 
379
        gtk_widget_show (statusbar2);
 
380
        gtk_box_pack_start (GTK_BOX (hbox_status), statusbar2, FALSE, TRUE, 0);
 
381
}
 
382
 
 
383
 
 
384
/******************* tools functions ******************/
 
385
/*int search_array_for_text(char ** array, int count, char * text) */
 
386
int search_array_for_text(char ** array, int count, const char * text)
 
387
{
 
388
        int i;
 
389
        for (i=0;i<count && strcmp(text,array[i])>0 ;i++);
 
390
        return (i >= count)? i-1:i;
 
391
}
 
392
 
 
393
/******************* call backs ***********************/
 
394
void select_row_callback(GtkWidget *widget,
 
395
                                                 gint row,
 
396
                                                 gint column,
 
397
                                                 GdkEventButton *event,
 
398
                                                 gpointer data)
 
399
{
 
400
        ManItem * item;
 
401
        if(signal_select_row>0) {signal_select_row--;return;}
 
402
        item = (ManItem*) gtk_clist_get_row_data(GTK_CLIST(widget),row);
 
403
        item->active_man_page();
 
404
        signal_entry_change++;
 
405
        gtk_entry_set_text(GTK_ENTRY(entry),man_items_buffer[row]);
 
406
}
 
407
void select_row_callback3(GtkWidget *widget,
 
408
                                                 gint row,
 
409
                                                 gint column,
 
410
                                                 GdkEventButton *event,
 
411
                                                 gpointer data)
 
412
{
 
413
        ManItem * item;
 
414
        if(signal_select_row>0) {signal_select_row--;return;}
 
415
        item = (ManItem*) gtk_clist_get_row_data(GTK_CLIST(widget),row);
 
416
        if(item) item->active_man_page();
 
417
}
 
418
void entry_activate_callback(GtkWidget * w,gpointer data)
 
419
{
 
420
        int i;
 
421
        GtkWidget * clist = (GtkWidget *)data;
 
422
        i = search_array_for_text(man_items_buffer, 
 
423
                man_items_count, 
 
424
                gtk_entry_get_text(GTK_ENTRY(w)));
 
425
        if (i == -1) return;
 
426
        gtk_clist_moveto(GTK_CLIST(clist),i,0,0.1,0.0);
 
427
        GTK_CLIST(clist)->focus_row = i;
 
428
        gtk_clist_select_row(GTK_CLIST(clist),i,0);
 
429
}
 
430
        
 
431
void entry_changed_callback(GtkWidget * w,gpointer data)
 
432
{
 
433
        int i;
 
434
        GtkWidget * clist = (GtkWidget *)data;
 
435
        if(signal_entry_change>0) {signal_entry_change--;return;}
 
436
        i = search_array_for_text(man_items_buffer, 
 
437
                                                          man_items_count, 
 
438
                                                          gtk_entry_get_text(GTK_ENTRY(w)));
 
439
        if (i == -1) return;
 
440
        signal_select_row++;
 
441
        gtk_clist_moveto(GTK_CLIST(clist),i,0,0.1,0.0);
 
442
        GTK_CLIST(clist)->focus_row = i;
 
443
        gtk_clist_select_row(GTK_CLIST(clist),i,0);
 
444
}
 
445
 
 
446
static int section_policy_callback(GtkWidget *w, gpointer data) {
 
447
        //      static int signal;
 
448
        long k,k2;
 
449
        k2 = (long) data;
 
450
        if(!((GtkCheckMenuItem*)(section_select[k2]))->active) return 1;
 
451
        //      g_message("Hello, World! %x\n signal = %d",data,signal_menu_change);
 
452
        if(signal_menu_change>0) {signal_menu_change--;return 1;}
 
453
        //if(!signal) {signal++;return 1;}
 
454
        //signal--;
 
455
        k = (long) context->get_value("display_section_policy");
 
456
        if(k == k2) return 1;
 
457
        pthread_mutex_lock(&context_lock);
 
458
        context->set_value("display_section_policy","int",(void*)k2);
 
459
        pthread_mutex_unlock(&context_lock);
 
460
        task_set_active(task_extract_man_data);
 
461
        task_set_active(task_add_data_to_clist);
 
462
        return 0;
 
463
}
 
464
 
 
465
static int section_select_callback(GtkWidget *w, gpointer data) {
 
466
        long var;
 
467
        if(signal_menu_change>0) {signal_menu_change--;return 1;}
 
468
 
 
469
        pthread_mutex_lock(&context_lock);
 
470
        var = (long)context->get_value("display_section");
 
471
        var ^= (long)data;
 
472
        context->set_value("display_section","int",(void*)var);
 
473
        if (context->get_value("display_section_policy")) {
 
474
                task_set_active(task_extract_man_data);
 
475
                task_set_active(task_add_data_to_clist);
 
476
        }
 
477
        pthread_mutex_unlock(&context_lock);
 
478
        //              g_message("Hello, World! %x\n",data);
 
479
        return 0;
 
480
}
 
481
 
 
482
static void app_quit(GtkWidget *w, gpointer data) {
 
483
  //    g_message("Bye, World! %x\n",data);
 
484
        char buffer[1024],*p;
 
485
        FILE * fd;
 
486
        int i,j;
 
487
        p = buffer;
 
488
        j = man_paths->get_size();
 
489
        for (i = 0;i<j;i++) {
 
490
                sprintf(p,i?":%s":"%s",man_paths->get_name(i));
 
491
                for(;*p;p++);
 
492
        }
 
493
        context->set_value("man_paths","char*",my_strdup(buffer));
 
494
        attach(buffer,getenv("HOME"),".gman");
 
495
        if((fd = fopen(buffer,"w"))) {
 
496
                context->save(fd,"automatically made by Gman");
 
497
                fclose(fd);
 
498
        }
 
499
        //      context->save(stdout,"automatically made by Gman");
 
500
        
 
501
        gtk_exit((long)data);
 
502
}
 
503
 
 
504
static int window_resize_callback(GtkWidget *w, GtkAllocation * size, gpointer data)
 
505
{
 
506
        /*
 
507
        g_message("x = %d, y = %d, width = %d, height = %d, data = %x\n",
 
508
        size->x,size->y,size->width,size->height,data); */
 
509
        context->set_value("h_size","int",(void*)size->width);
 
510
        context->set_value("v_size","int",(void*)size->height);
 
511
        return 0;
 
512
}
 
513
 
 
514
static void window_help_about_callback (GtkWidget *widget, gpointer   data)
 
515
{
 
516
        const gchar *authors[] = {"Xinkai Wang <aakwxk@hotmail.com>", NULL };
 
517
        static GtkWidget *about_window = NULL;
 
518
 
 
519
        if (!about_window)
 
520
        {
 
521
 
 
522
        GtkWidget *button;
 
523
 
 
524
        about_window = gtk_dialog_new ();
 
525
        gtk_window_set_position (GTK_WINDOW (about_window), GTK_WIN_POS_MOUSE);
 
526
        gtk_window_set_title (GTK_WINDOW (about_window), _("About gman"));
 
527
 
 
528
        gtk_signal_connect (GTK_OBJECT (about_window), "delete_event",
 
529
                  GTK_SIGNAL_FUNC (gtk_false), NULL);
 
530
        gtk_signal_connect (GTK_OBJECT (about_window), "destroy",
 
531
                  (GtkSignalFunc) gtk_widget_destroyed,
 
532
                  &about_window);
 
533
 
 
534
        button = gtk_button_new_with_label (_("Close"));
 
535
        gtk_widget_show (button);
 
536
        gtk_box_pack_start (GTK_BOX (GTK_DIALOG (about_window)->action_area),
 
537
                  button, TRUE, TRUE, 0);
 
538
        gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
 
539
                  (GtkSignalFunc) gtk_widget_destroy,
 
540
                  GTK_OBJECT (about_window));
 
541
 
 
542
        gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (about_window)->vbox), 5);
 
543
 
 
544
         /* TODO: we need a logo ;) */
 
545
 
 
546
        gtk_box_pack_start (GTK_BOX (GTK_DIALOG (about_window)->vbox),
 
547
                  gtk_label_new ("Gman - version " VERSION),
 
548
                  FALSE, FALSE, 5);
 
549
 
 
550
        gtk_box_pack_start (GTK_BOX (GTK_DIALOG (about_window)->vbox),
 
551
                  gtk_label_new ("Copyright (C) 1999 Xinkai Wang"),
 
552
                  FALSE, FALSE, 5);
 
553
 
 
554
        char *tmp = g_strdup_printf("Credits: %s", authors[0]);
 
555
        gtk_box_pack_start (GTK_BOX (GTK_DIALOG (about_window)->vbox),
 
556
                  gtk_label_new (tmp),
 
557
                  FALSE, FALSE, 5);
 
558
        g_free(tmp);
 
559
 
 
560
        gtk_box_pack_start (GTK_BOX (GTK_DIALOG (about_window)->vbox),
 
561
                  gtk_label_new ("Comments and suggestions are extremely welcomed!"),
 
562
                  FALSE, FALSE, 5);
 
563
 
 
564
        gtk_box_pack_start (GTK_BOX (GTK_DIALOG (about_window)->vbox),
 
565
                  gtk_label_new ("Web: http://homex.coolconnect.com/user/xkwang/gman/"),
 
566
                  FALSE, FALSE, 5);
 
567
 
 
568
        if (!GTK_WIDGET_VISIBLE (about_window))
 
569
                  gtk_widget_show_all (about_window);
 
570
        else
 
571
                  gtk_widget_hide (about_window);
 
572
 
 
573
        }
 
574
}
 
575
 
 
576
static int status_bar_callback (GtkWidget *widget, gpointer   data)
 
577
{
 
578
        long k,k2;
 
579
        if(signal_menu_change>0) {signal_menu_change--;return 1;}
 
580
        k2 = (long) context->get_value("show_status_bar");
 
581
        k = (long) context->get_value("searching_mode");
 
582
        if(((GtkCheckMenuItem*)(status_bar_button))->active) k2 = k2 | (1<<k);
 
583
        else k2 = k2 & ~(1<<k);
 
584
        pthread_mutex_lock(&context_lock);
 
585
        context->set_value("show_status_bar","int",(void*)k2);
 
586
        pthread_mutex_unlock(&context_lock);
 
587
        updata_widget_show(0);
 
588
        return 0;
 
589
}
 
590
 
 
591
static int search_mode_callback (GtkWidget *widget, gpointer   data)
 
592
{
 
593
        long k,k2;
 
594
        k2 = (long) data;
 
595
        if(!((GtkCheckMenuItem*)(searching_mode_buttons[k2]))->active) return 1;
 
596
        if(signal_menu_change>0) {signal_menu_change--;return 1;}
 
597
        //if(!signal) {signal++;return 1;}
 
598
        //signal--;
 
599
        k = (long) context->get_value("searching_mode");
 
600
        if(k == k2) return 1;
 
601
        pthread_mutex_lock(&context_lock);
 
602
        context->set_value("searching_mode","int",(void*)k2);
 
603
        pthread_mutex_unlock(&context_lock);
 
604
        updata_widget_show(0);
 
605
        updata_menu_buttons(0);
 
606
        return 0;
 
607
}
 
608
 
 
609
static int show_mode_callback (GtkWidget *widget, gpointer   data)
 
610
{
 
611
        long k,k2;
 
612
        k2 = (long) data;
 
613
        if(!((GtkCheckMenuItem*)(show_mode_buttons[k2]))->active) return 1;
 
614
        if(signal_menu_change>0) {signal_menu_change--;return 1;}
 
615
        //if(!signal) {signal++;return 1;}
 
616
        //signal--;
 
617
        k = (long) context->get_value("show_mode");
 
618
        if(k == k2) return 1;
 
619
        pthread_mutex_lock(&context_lock);
 
620
        context->set_value("show_mode","int",(void*)k2);
 
621
        pthread_mutex_unlock(&context_lock);
 
622
        //updata_widget_show(0);
 
623
        //updata_menu_buttons(0);
 
624
        return 0;
 
625
}
 
626
 
 
627
static void entry4_activate_callback(GtkWidget *w,gpointer data)
 
628
{
 
629
        keyword = gtk_entry_get_text(GTK_ENTRY(entry4));
 
630
        task_set_active(task_key_word_search);
 
631
}
 
632
 
 
633
static void entry4_changed_callback(GtkWidget *w,gpointer data)
 
634
{
 
635
        const char * tmp;
 
636
        tmp = gtk_entry_get_text(GTK_ENTRY(entry4));
 
637
        gtk_widget_set_sensitive(search_button,strlen(tmp) >= 3);
 
638
                
 
639
}
 
640
 
 
641
static int button_clicked_callback(GtkWidget * w,gpointer data)
 
642
{
 
643
        long i = (long) data;
 
644
        switch (i) {
 
645
        case 1: task_set_stop(task_key_word_search);break;
 
646
        case 2: task_set_active(task_key_word_search);break;
 
647
        }
 
648
        return 0;
 
649
}