~ubuntu-branches/ubuntu/hardy/gnome-commander/hardy

« back to all changes in this revision

Viewing changes to src/gnome-cmd-cmdline.c

  • Committer: Bazaar Package Importer
  • Author(s): Michael Vogt
  • Date: 2006-06-13 15:39:48 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20060613153948-gvrt3mb2ddk5u62o
Tags: 1.2.0-3
added --disable-scrollkeeper on build

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
    GNOME Commander - A GNOME based file manager 
 
2
    GNOME Commander - A GNOME based file manager
3
3
    Copyright (C) 2001-2006 Marcus Bjurman
4
4
 
5
5
    This program is free software; you can redistribute it and/or modify
15
15
    You should have received a copy of the GNU General Public License
16
16
    along with this program; if not, write to the Free Software
17
17
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
 
*/ 
 
18
*/
19
19
#include <config.h>
20
20
#include "gnome-cmd-includes.h"
21
21
#include "gnome-cmd-cmdline.h"
31
31
 
32
32
struct _GnomeCmdCmdlinePrivate
33
33
{
34
 
        GtkWidget *combo;
35
 
        GtkWidget *cwd;
 
34
    GtkWidget *combo;
 
35
    GtkWidget *cwd;
36
36
 
37
 
        GList *history;
 
37
    GList *history;
38
38
};
39
39
 
40
40
 
41
41
static void
42
42
update_history_combo (GnomeCmdCmdline *cmdline)
43
43
{
44
 
        GList *tmp = cmdline->priv->history;
45
 
 
46
 
        gnome_cmd_combo_clear (GNOME_CMD_COMBO (cmdline->priv->combo));
47
 
        
48
 
        while (tmp) {
49
 
                gchar *command = (gchar*)tmp->data;
50
 
                gchar *text[2];
51
 
 
52
 
                text[0] = command;
53
 
                text[1] = NULL;
54
 
                
55
 
                gnome_cmd_combo_append (GNOME_CMD_COMBO (cmdline->priv->combo), text, command);
56
 
                tmp = tmp->next;
57
 
        }
58
 
 
59
 
        gtk_clist_select_row (GTK_CLIST (GNOME_CMD_COMBO (cmdline->priv->combo)->list), 0, 0);
 
44
    GList *tmp = cmdline->priv->history;
 
45
 
 
46
    gnome_cmd_combo_clear (GNOME_CMD_COMBO (cmdline->priv->combo));
 
47
 
 
48
    while (tmp) {
 
49
        gchar *command = (gchar*)tmp->data;
 
50
        gchar *text[2];
 
51
 
 
52
        text[0] = command;
 
53
        text[1] = NULL;
 
54
 
 
55
        gnome_cmd_combo_append (GNOME_CMD_COMBO (cmdline->priv->combo), text, command);
 
56
        tmp = tmp->next;
 
57
    }
 
58
 
 
59
    gtk_clist_select_row (GTK_CLIST (GNOME_CMD_COMBO (cmdline->priv->combo)->list), 0, 0);
60
60
}
61
61
 
62
62
 
63
63
static void
64
64
add_to_history (GnomeCmdCmdline *cmdline, const gchar *command)
65
 
{       
66
 
        cmdline->priv->history = string_history_add (
67
 
                cmdline->priv->history,
68
 
                command,
69
 
                gnome_cmd_data_get_cmdline_history_length());
70
 
        
71
 
        update_history_combo (cmdline);
 
65
{
 
66
    cmdline->priv->history = string_history_add (
 
67
        cmdline->priv->history,
 
68
        command,
 
69
        gnome_cmd_data_get_cmdline_history_length());
 
70
 
 
71
    update_history_combo (cmdline);
72
72
}
73
73
 
74
74
 
75
75
static void
76
76
on_exec (GnomeCmdCmdline *cmdline, gboolean term)
77
77
{
78
 
        const gchar *text;
79
 
        GnomeCmdFileSelector *fs = gnome_cmd_main_win_get_active_fs (main_win);
80
 
 
81
 
        text = gtk_entry_get_text (GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry));
82
 
        text = g_strstrip (g_strdup (text));
83
 
 
84
 
        if (strlen (text) > 3 && strncmp (text, "cd ", 3) == 0) {
85
 
                const gchar *dir = text + 3;
86
 
                dir = g_strstrip (g_strdup (dir));
87
 
                gnome_cmd_file_selector_goto_directory (fs, dir);
88
 
        }
89
 
        else if (strcmp (text, "cd") == 0) {
90
 
                gnome_cmd_file_selector_goto_directory (fs, "~");
91
 
        }               
92
 
        else {
93
 
                if (gnome_cmd_con_is_local (gnome_cmd_file_selector_get_connection (fs))) {
94
 
                        GnomeCmdDir *dir = gnome_cmd_file_selector_get_directory (fs);
95
 
                        gchar *fpath = gnome_cmd_file_get_real_path (GNOME_CMD_FILE (dir));
96
 
 
97
 
                        run_command_indir (text, fpath, term);
98
 
                        g_free (fpath);
99
 
                }
100
 
        }
101
 
 
102
 
        add_to_history (cmdline, text);
103
 
        gnome_cmd_cmdline_set_text (cmdline, "");
 
78
    const gchar *text;
 
79
    GnomeCmdFileSelector *fs = gnome_cmd_main_win_get_active_fs (main_win);
 
80
 
 
81
    text = gtk_entry_get_text (GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry));
 
82
    text = g_strstrip (g_strdup (text));
 
83
 
 
84
    if (strlen (text) > 3 && strncmp (text, "cd ", 3) == 0) {
 
85
        const gchar *dir = text + 3;
 
86
        dir = g_strstrip (g_strdup (dir));
 
87
        gnome_cmd_file_selector_goto_directory (fs, dir);
 
88
    }
 
89
    else if (strcmp (text, "cd") == 0) {
 
90
        gnome_cmd_file_selector_goto_directory (fs, "~");
 
91
    }
 
92
    else {
 
93
        if (gnome_cmd_con_is_local (gnome_cmd_file_selector_get_connection (fs))) {
 
94
            GnomeCmdDir *dir = gnome_cmd_file_selector_get_directory (fs);
 
95
            gchar *fpath = gnome_cmd_file_get_real_path (GNOME_CMD_FILE (dir));
 
96
 
 
97
            run_command_indir (text, fpath, term);
 
98
            g_free (fpath);
 
99
        }
 
100
    }
 
101
 
 
102
    add_to_history (cmdline, text);
 
103
    gnome_cmd_cmdline_set_text (cmdline, "");
104
104
}
105
105
 
106
106
 
107
107
static gboolean
108
108
on_key_pressed (GtkWidget *entry,
109
 
                                GdkEventKey *event,
110
 
                                GnomeCmdCmdline *cmdline)
 
109
                GdkEventKey *event,
 
110
                GnomeCmdCmdline *cmdline)
111
111
{
112
 
        switch (event->keyval) {
113
 
                case GDK_BackSpace:
114
 
                case GDK_space:
115
 
                case GDK_Home:
116
 
                case GDK_End:
117
 
                case GDK_Delete:
118
 
                case GDK_Left:
119
 
                case GDK_Right:
120
 
                        return gnome_cmd_cmdline_keypressed (cmdline, event);
121
 
        }
122
 
        
123
 
        if (gnome_cmd_cmdline_keypressed (cmdline, event))
124
 
                return TRUE;
125
 
        else if (gnome_cmd_main_win_keypressed (main_win, event))
126
 
                return TRUE;
127
 
 
128
 
        return FALSE;
 
112
    switch (event->keyval) {
 
113
        case GDK_BackSpace:
 
114
        case GDK_space:
 
115
        case GDK_Home:
 
116
        case GDK_End:
 
117
        case GDK_Delete:
 
118
        case GDK_Left:
 
119
        case GDK_Right:
 
120
            return gnome_cmd_cmdline_keypressed (cmdline, event);
 
121
    }
 
122
 
 
123
    if (gnome_cmd_cmdline_keypressed (cmdline, event))
 
124
        return TRUE;
 
125
    else if (gnome_cmd_main_win_keypressed (main_win, event))
 
126
        return TRUE;
 
127
 
 
128
    return FALSE;
129
129
}
130
130
 
131
131
 
132
132
static void
133
133
on_combo_item_selected (GnomeCmdCombo *combo,
134
 
                                                const gchar *command,
135
 
                                                GnomeCmdCmdline *cmdline)
 
134
                        const gchar *command,
 
135
                        GnomeCmdCmdline *cmdline)
136
136
{
137
 
        g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
138
 
        g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
139
 
        g_return_if_fail (command != NULL);
 
137
    g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
 
138
    g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
 
139
    g_return_if_fail (command != NULL);
140
140
 
141
 
        gnome_cmd_cmdline_set_text (cmdline, command);
142
 
        gtk_widget_grab_focus (combo->entry);
 
141
    gnome_cmd_cmdline_set_text (cmdline, command);
 
142
    gtk_widget_grab_focus (combo->entry);
143
143
}
144
144
 
145
145
 
146
146
static void
147
147
on_combo_popwin_hidden (GnomeCmdCombo *combo, GnomeCmdCmdline *cmdline)
148
148
{
149
 
        g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
150
 
        g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
151
 
        
152
 
        gtk_widget_grab_focus (combo->entry);
 
149
    g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
 
150
    g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
 
151
 
 
152
    gtk_widget_grab_focus (combo->entry);
153
153
}
154
154
 
155
155
 
156
156
static void
157
157
on_switch_fs (GnomeCmdMainWin *mw, GnomeCmdFileSelector *fs, GnomeCmdCmdline *cmdline)
158
158
{
159
 
        gchar *dpath;
160
 
        
161
 
        g_return_if_fail (GNOME_CMD_IS_MAIN_WIN (mw));
162
 
        g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs));
163
 
        g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
164
 
 
165
 
        dpath = gnome_cmd_dir_get_display_path (
166
 
                gnome_cmd_file_selector_get_directory (fs));
167
 
 
168
 
        gnome_cmd_cmdline_set_dir (cmdline, dpath);
169
 
        g_free (dpath);
 
159
    gchar *dpath;
 
160
 
 
161
    g_return_if_fail (GNOME_CMD_IS_MAIN_WIN (mw));
 
162
    g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs));
 
163
    g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
 
164
 
 
165
    dpath = gnome_cmd_dir_get_display_path (
 
166
        gnome_cmd_file_selector_get_directory (fs));
 
167
 
 
168
    gnome_cmd_cmdline_set_dir (cmdline, dpath);
 
169
    g_free (dpath);
170
170
}
171
171
 
172
172
 
173
173
static void
174
174
on_fs_changed_dir (GnomeCmdFileSelector *fs, GnomeCmdDir *dir, GnomeCmdCmdline *cmdline)
175
175
{
176
 
        gchar *dpath;
177
 
        
178
 
        g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs));
179
 
        g_return_if_fail (dir != NULL);
180
 
        g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
181
 
 
182
 
        if (fs != gnome_cmd_main_win_get_active_fs (main_win)) return;
183
 
 
184
 
        dpath = gnome_cmd_dir_get_display_path (dir);
185
 
        gnome_cmd_cmdline_set_dir (cmdline, dpath);
186
 
        g_free (dpath);
 
176
    gchar *dpath;
 
177
 
 
178
    g_return_if_fail (GNOME_CMD_IS_FILE_SELECTOR (fs));
 
179
    g_return_if_fail (dir != NULL);
 
180
    g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
 
181
 
 
182
    if (fs != gnome_cmd_main_win_get_active_fs (main_win)) return;
 
183
 
 
184
    dpath = gnome_cmd_dir_get_display_path (dir);
 
185
    gnome_cmd_cmdline_set_dir (cmdline, dpath);
 
186
    g_free (dpath);
187
187
}
188
188
 
189
189
 
194
194
static void
195
195
destroy (GtkObject *object)
196
196
{
197
 
        gtk_signal_disconnect_by_func (
198
 
                GTK_OBJECT (main_win), GTK_SIGNAL_FUNC (on_switch_fs), object);
199
 
        gtk_signal_disconnect_by_func (
200
 
                GTK_OBJECT (gnome_cmd_main_win_get_left_fs (main_win)),
201
 
                GTK_SIGNAL_FUNC (on_fs_changed_dir), object);
202
 
        gtk_signal_disconnect_by_func (
203
 
                GTK_OBJECT (gnome_cmd_main_win_get_right_fs (main_win)),
204
 
                GTK_SIGNAL_FUNC (on_fs_changed_dir), object);
205
 
        
206
 
        if (GTK_OBJECT_CLASS (parent_class)->destroy)
207
 
                (*GTK_OBJECT_CLASS (parent_class)->destroy) (object);
 
197
    gtk_signal_disconnect_by_func (
 
198
        GTK_OBJECT (main_win), GTK_SIGNAL_FUNC (on_switch_fs), object);
 
199
    gtk_signal_disconnect_by_func (
 
200
        GTK_OBJECT (gnome_cmd_main_win_get_left_fs (main_win)),
 
201
        GTK_SIGNAL_FUNC (on_fs_changed_dir), object);
 
202
    gtk_signal_disconnect_by_func (
 
203
        GTK_OBJECT (gnome_cmd_main_win_get_right_fs (main_win)),
 
204
        GTK_SIGNAL_FUNC (on_fs_changed_dir), object);
 
205
 
 
206
    if (GTK_OBJECT_CLASS (parent_class)->destroy)
 
207
        (*GTK_OBJECT_CLASS (parent_class)->destroy) (object);
208
208
}
209
209
 
210
210
 
211
211
static void
212
212
map (GtkWidget *widget)
213
213
{
214
 
        if (GTK_WIDGET_CLASS (parent_class)->map != NULL)
215
 
                GTK_WIDGET_CLASS (parent_class)->map (widget);
 
214
    if (GTK_WIDGET_CLASS (parent_class)->map != NULL)
 
215
        GTK_WIDGET_CLASS (parent_class)->map (widget);
216
216
}
217
217
 
218
218
 
219
219
static void
220
220
class_init (GnomeCmdCmdlineClass *class)
221
221
{
222
 
        GtkObjectClass *object_class;
223
 
        GtkWidgetClass *widget_class;
224
 
 
225
 
        object_class = GTK_OBJECT_CLASS (class);
226
 
        widget_class = GTK_WIDGET_CLASS (class);
227
 
 
228
 
        parent_class = gtk_type_class (gtk_hbox_get_type ());
229
 
        object_class->destroy = destroy;
230
 
        widget_class->map = map;
 
222
    GtkObjectClass *object_class;
 
223
    GtkWidgetClass *widget_class;
 
224
 
 
225
    object_class = GTK_OBJECT_CLASS (class);
 
226
    widget_class = GTK_WIDGET_CLASS (class);
 
227
 
 
228
    parent_class = gtk_type_class (gtk_hbox_get_type ());
 
229
    object_class->destroy = destroy;
 
230
    widget_class->map = map;
231
231
}
232
232
 
233
233
 
234
234
static void
235
235
init (GnomeCmdCmdline *cmdline)
236
236
{
237
 
        GtkWidget *label;
238
 
 
239
 
        g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
240
 
        
241
 
        cmdline->priv = g_new (GnomeCmdCmdlinePrivate, 1);
242
 
        cmdline->priv->history = NULL;
243
 
 
244
 
        cmdline->priv->cwd = gtk_label_new ("cwd");
245
 
        gtk_widget_ref (cmdline->priv->cwd);
246
 
        gtk_object_set_data_full (GTK_OBJECT (cmdline), "cwdlabel", cmdline->priv->cwd,
247
 
                                                          (GtkDestroyNotify) gtk_widget_unref);
248
 
        gtk_widget_show (cmdline->priv->cwd);
249
 
        gtk_box_pack_start (GTK_BOX (cmdline), cmdline->priv->cwd,
250
 
                                                FALSE, TRUE, 2);
251
 
        gtk_label_set_selectable (GTK_LABEL (cmdline->priv->cwd), TRUE);
252
 
 
253
 
        label = gtk_label_new ("#");
254
 
        gtk_widget_ref (label);
255
 
        gtk_object_set_data_full (GTK_OBJECT (cmdline), "label", label,
256
 
                                                          (GtkDestroyNotify) gtk_widget_unref);
257
 
        gtk_widget_show (label);
258
 
        gtk_box_pack_start (GTK_BOX (cmdline), label, FALSE, FALSE, 0);
259
 
        
260
 
        cmdline->priv->combo = gnome_cmd_combo_new (1, 0, NULL);
261
 
        gtk_widget_ref (cmdline->priv->combo);
262
 
        gtk_object_set_data_full (GTK_OBJECT (cmdline), "combo", cmdline->priv->combo,
263
 
                                                          (GtkDestroyNotify) gtk_widget_unref);
264
 
        gtk_clist_set_column_width (
265
 
                GTK_CLIST (GNOME_CMD_COMBO (cmdline->priv->combo)->list), 0, 500);              
266
 
        gtk_box_pack_start (GTK_BOX (cmdline), cmdline->priv->combo, TRUE, TRUE, 2);
267
 
        gtk_widget_show (cmdline->priv->combo);
268
 
        gtk_entry_set_editable (GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry), TRUE);
269
 
        GTK_WIDGET_UNSET_FLAGS (GNOME_CMD_COMBO (cmdline->priv->combo)->button, GTK_CAN_FOCUS);
270
 
        GTK_WIDGET_SET_FLAGS (GNOME_CMD_COMBO (cmdline->priv->combo)->entry, GTK_CAN_FOCUS);
271
 
 
272
 
        gtk_signal_connect (GTK_OBJECT (GNOME_CMD_COMBO (cmdline->priv->combo)->entry),
273
 
                                                "key-press-event",
274
 
                                                GTK_SIGNAL_FUNC (on_key_pressed), cmdline);     
275
 
        gtk_signal_connect (GTK_OBJECT (cmdline->priv->combo), "item-selected",
276
 
                                                GTK_SIGNAL_FUNC (on_combo_item_selected), cmdline);
277
 
        gtk_signal_connect (GTK_OBJECT (cmdline->priv->combo), "popwin-hidden",
278
 
                                                GTK_SIGNAL_FUNC (on_combo_popwin_hidden), cmdline);
279
 
        gtk_signal_connect_after (GTK_OBJECT (main_win), "switch-fs",
280
 
                                                GTK_SIGNAL_FUNC (on_switch_fs), cmdline);
281
 
        gtk_signal_connect (GTK_OBJECT (gnome_cmd_main_win_get_left_fs (main_win)),
282
 
                                                "changed-dir", GTK_SIGNAL_FUNC (on_fs_changed_dir), cmdline);
283
 
        gtk_signal_connect (GTK_OBJECT (gnome_cmd_main_win_get_right_fs (main_win)),
284
 
                                                "changed-dir", GTK_SIGNAL_FUNC (on_fs_changed_dir), cmdline);
285
 
 
286
 
        gnome_cmd_cmdline_update_style (cmdline);
 
237
    GtkWidget *label;
 
238
 
 
239
    g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
 
240
 
 
241
    cmdline->priv = g_new (GnomeCmdCmdlinePrivate, 1);
 
242
    cmdline->priv->history = NULL;
 
243
 
 
244
    cmdline->priv->cwd = gtk_label_new ("cwd");
 
245
    gtk_widget_ref (cmdline->priv->cwd);
 
246
    gtk_object_set_data_full (GTK_OBJECT (cmdline), "cwdlabel", cmdline->priv->cwd,
 
247
                              (GtkDestroyNotify) gtk_widget_unref);
 
248
    gtk_widget_show (cmdline->priv->cwd);
 
249
    gtk_box_pack_start (GTK_BOX (cmdline), cmdline->priv->cwd,
 
250
                        FALSE, TRUE, 2);
 
251
    gtk_label_set_selectable (GTK_LABEL (cmdline->priv->cwd), TRUE);
 
252
 
 
253
    label = gtk_label_new ("#");
 
254
    gtk_widget_ref (label);
 
255
    gtk_object_set_data_full (GTK_OBJECT (cmdline), "label", label,
 
256
                              (GtkDestroyNotify) gtk_widget_unref);
 
257
    gtk_widget_show (label);
 
258
    gtk_box_pack_start (GTK_BOX (cmdline), label, FALSE, FALSE, 0);
 
259
 
 
260
    cmdline->priv->combo = gnome_cmd_combo_new (1, 0, NULL);
 
261
    gtk_widget_ref (cmdline->priv->combo);
 
262
    gtk_object_set_data_full (GTK_OBJECT (cmdline), "combo", cmdline->priv->combo,
 
263
                              (GtkDestroyNotify) gtk_widget_unref);
 
264
    gtk_clist_set_column_width (
 
265
        GTK_CLIST (GNOME_CMD_COMBO (cmdline->priv->combo)->list), 0, 500);
 
266
    gtk_box_pack_start (GTK_BOX (cmdline), cmdline->priv->combo, TRUE, TRUE, 2);
 
267
    gtk_widget_show (cmdline->priv->combo);
 
268
    gtk_entry_set_editable (GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry), TRUE);
 
269
    GTK_WIDGET_UNSET_FLAGS (GNOME_CMD_COMBO (cmdline->priv->combo)->button, GTK_CAN_FOCUS);
 
270
    GTK_WIDGET_SET_FLAGS (GNOME_CMD_COMBO (cmdline->priv->combo)->entry, GTK_CAN_FOCUS);
 
271
 
 
272
    gtk_signal_connect (GTK_OBJECT (GNOME_CMD_COMBO (cmdline->priv->combo)->entry),
 
273
                        "key-press-event",
 
274
                        GTK_SIGNAL_FUNC (on_key_pressed), cmdline);
 
275
    gtk_signal_connect (GTK_OBJECT (cmdline->priv->combo), "item-selected",
 
276
                        GTK_SIGNAL_FUNC (on_combo_item_selected), cmdline);
 
277
    gtk_signal_connect (GTK_OBJECT (cmdline->priv->combo), "popwin-hidden",
 
278
                        GTK_SIGNAL_FUNC (on_combo_popwin_hidden), cmdline);
 
279
    gtk_signal_connect_after (GTK_OBJECT (main_win), "switch-fs",
 
280
                        GTK_SIGNAL_FUNC (on_switch_fs), cmdline);
 
281
    gtk_signal_connect (GTK_OBJECT (gnome_cmd_main_win_get_left_fs (main_win)),
 
282
                        "changed-dir", GTK_SIGNAL_FUNC (on_fs_changed_dir), cmdline);
 
283
    gtk_signal_connect (GTK_OBJECT (gnome_cmd_main_win_get_right_fs (main_win)),
 
284
                        "changed-dir", GTK_SIGNAL_FUNC (on_fs_changed_dir), cmdline);
 
285
 
 
286
    gnome_cmd_cmdline_update_style (cmdline);
287
287
}
288
288
 
289
289
 
295
295
 
296
296
GtkWidget*
297
297
gnome_cmd_cmdline_new ()
298
 
{       
299
 
        GnomeCmdCmdline *cmdline = gtk_type_new (gnome_cmd_cmdline_get_type ());
300
 
 
301
 
        gnome_cmd_cmdline_set_history (cmdline, gnome_cmd_data_get_cmdline_history ());
302
 
        update_history_combo (cmdline);
303
 
        
304
 
        return GTK_WIDGET (cmdline);
 
298
{
 
299
    GnomeCmdCmdline *cmdline = gtk_type_new (gnome_cmd_cmdline_get_type ());
 
300
 
 
301
    gnome_cmd_cmdline_set_history (cmdline, gnome_cmd_data_get_cmdline_history ());
 
302
    update_history_combo (cmdline);
 
303
 
 
304
    return GTK_WIDGET (cmdline);
305
305
}
306
306
 
307
307
 
309
309
GtkType
310
310
gnome_cmd_cmdline_get_type         (void)
311
311
{
312
 
        static GtkType dlg_type = 0;
313
 
 
314
 
        if (dlg_type == 0)
315
 
        {
316
 
                GtkTypeInfo dlg_info =
317
 
                {
318
 
                        "GnomeCmdCmdline",
319
 
                        sizeof (GnomeCmdCmdline),
320
 
                        sizeof (GnomeCmdCmdlineClass),
321
 
                        (GtkClassInitFunc) class_init,
322
 
                        (GtkObjectInitFunc) init,
323
 
                        /* reserved_1 */ NULL,
324
 
                        /* reserved_2 */ NULL,
325
 
                        (GtkClassInitFunc) NULL
326
 
                };
327
 
 
328
 
                dlg_type = gtk_type_unique (gtk_hbox_get_type (), &dlg_info);
329
 
        }
330
 
        return dlg_type;
 
312
    static GtkType dlg_type = 0;
 
313
 
 
314
    if (dlg_type == 0)
 
315
    {
 
316
        GtkTypeInfo dlg_info =
 
317
        {
 
318
            "GnomeCmdCmdline",
 
319
            sizeof (GnomeCmdCmdline),
 
320
            sizeof (GnomeCmdCmdlineClass),
 
321
            (GtkClassInitFunc) class_init,
 
322
            (GtkObjectInitFunc) init,
 
323
            /* reserved_1 */ NULL,
 
324
            /* reserved_2 */ NULL,
 
325
            (GtkClassInitFunc) NULL
 
326
        };
 
327
 
 
328
        dlg_type = gtk_type_unique (gtk_hbox_get_type (), &dlg_info);
 
329
    }
 
330
    return dlg_type;
331
331
}
332
332
 
333
333
 
334
334
void
335
335
gnome_cmd_cmdline_set_dir (GnomeCmdCmdline *cmdline, const gchar *cwd)
336
336
{
337
 
        gchar *s;
338
 
        
339
 
        g_return_if_fail (cmdline != NULL);
340
 
        g_return_if_fail (cmdline->priv != NULL);
341
 
 
342
 
        s = get_utf8 (cwd);
343
 
        gtk_label_set_text (GTK_LABEL (cmdline->priv->cwd), s);
344
 
        g_free (s);
 
337
    gchar *s;
 
338
 
 
339
    g_return_if_fail (cmdline != NULL);
 
340
    g_return_if_fail (cmdline->priv != NULL);
 
341
 
 
342
    s = get_utf8 (cwd);
 
343
    gtk_label_set_text (GTK_LABEL (cmdline->priv->cwd), s);
 
344
    g_free (s);
345
345
}
346
346
 
347
347
 
348
348
void
349
349
gnome_cmd_cmdline_append_text (GnomeCmdCmdline *cmdline, const gchar *text)
350
350
{
351
 
        const gchar *curtext;
352
 
        gint curpos;
353
 
        GtkEntry *entry;
354
 
        
355
 
        g_return_if_fail (cmdline != NULL);
356
 
        g_return_if_fail (cmdline->priv != NULL);
357
 
        g_return_if_fail (cmdline->priv->combo != NULL);
358
 
 
359
 
        entry = GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry);
360
 
        curtext = gtk_entry_get_text (entry);
361
 
        if (curtext[strlen(curtext)-1] != ' ' && strlen(curtext) > 0)
362
 
                gtk_entry_append_text (entry, " ");
363
 
        curpos = gtk_editable_get_position (GTK_EDITABLE (entry));
364
 
        gtk_entry_append_text (entry, text);
365
 
        gtk_editable_set_position (GTK_EDITABLE (entry), curpos + strlen (text));
 
351
    const gchar *curtext;
 
352
    gint curpos;
 
353
    GtkEntry *entry;
 
354
 
 
355
    g_return_if_fail (cmdline != NULL);
 
356
    g_return_if_fail (cmdline->priv != NULL);
 
357
    g_return_if_fail (cmdline->priv->combo != NULL);
 
358
 
 
359
    entry = GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry);
 
360
    curtext = gtk_entry_get_text (entry);
 
361
    if (curtext[strlen(curtext)-1] != ' ' && strlen(curtext) > 0)
 
362
        gtk_entry_append_text (entry, " ");
 
363
    curpos = gtk_editable_get_position (GTK_EDITABLE (entry));
 
364
    gtk_entry_append_text (entry, text);
 
365
    gtk_editable_set_position (GTK_EDITABLE (entry), curpos + strlen (text));
366
366
}
367
367
 
368
368
 
369
369
void
370
370
gnome_cmd_cmdline_insert_text (GnomeCmdCmdline *cmdline, const gchar *text)
371
371
{
372
 
        gint curpos, tmp;
373
 
        GtkEntry *entry;
374
 
        
375
 
        g_return_if_fail (cmdline != NULL);
376
 
        g_return_if_fail (cmdline->priv != NULL);
377
 
        g_return_if_fail (cmdline->priv->combo != NULL);
378
 
 
379
 
        entry = GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry);
380
 
        curpos = gtk_editable_get_position (GTK_EDITABLE (entry));
381
 
        tmp = curpos;
382
 
        gtk_editable_insert_text (GTK_EDITABLE (entry), text, strlen (text), &tmp);
383
 
        gtk_editable_set_position (GTK_EDITABLE (entry), curpos + strlen (text));
 
372
    gint curpos, tmp;
 
373
    GtkEntry *entry;
 
374
 
 
375
    g_return_if_fail (cmdline != NULL);
 
376
    g_return_if_fail (cmdline->priv != NULL);
 
377
    g_return_if_fail (cmdline->priv->combo != NULL);
 
378
 
 
379
    entry = GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry);
 
380
    curpos = gtk_editable_get_position (GTK_EDITABLE (entry));
 
381
    tmp = curpos;
 
382
    gtk_editable_insert_text (GTK_EDITABLE (entry), text, strlen (text), &tmp);
 
383
    gtk_editable_set_position (GTK_EDITABLE (entry), curpos + strlen (text));
384
384
}
385
385
 
386
386
 
387
387
void
388
388
gnome_cmd_cmdline_set_text    (GnomeCmdCmdline *cmdline, const gchar *text)
389
389
{
390
 
        g_return_if_fail (cmdline != NULL);
391
 
        g_return_if_fail (cmdline->priv != NULL);
392
 
        g_return_if_fail (cmdline->priv->combo != NULL);
 
390
    g_return_if_fail (cmdline != NULL);
 
391
    g_return_if_fail (cmdline->priv != NULL);
 
392
    g_return_if_fail (cmdline->priv->combo != NULL);
393
393
 
394
 
        gtk_entry_set_text (GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry), text);
 
394
    gtk_entry_set_text (GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry), text);
395
395
}
396
396
 
397
397
 
398
398
gboolean
399
399
gnome_cmd_cmdline_is_empty    (GnomeCmdCmdline *cmdline)
400
400
{
401
 
        const gchar *text = gtk_entry_get_text (GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry));
402
 
 
403
 
        if (text == NULL || strcmp (text, ""))
404
 
                return TRUE;
405
 
 
406
 
        return FALSE;
 
401
    const gchar *text = gtk_entry_get_text (GTK_ENTRY (GNOME_CMD_COMBO (cmdline->priv->combo)->entry));
 
402
 
 
403
    if (text == NULL || strcmp (text, ""))
 
404
        return TRUE;
 
405
 
 
406
    return FALSE;
407
407
}
408
408
 
409
409
 
410
410
void
411
411
gnome_cmd_cmdline_exec        (GnomeCmdCmdline *cmdline)
412
412
{
413
 
        on_exec (cmdline, FALSE);
 
413
    on_exec (cmdline, FALSE);
414
414
}
415
415
 
416
416
 
417
417
void
418
418
gnome_cmd_cmdline_focus (GnomeCmdCmdline *cmdline)
419
419
{
420
 
        g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));      
421
 
        g_return_if_fail (cmdline->priv->combo != NULL);
 
420
    g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
 
421
    g_return_if_fail (cmdline->priv->combo != NULL);
422
422
 
423
 
        gtk_widget_grab_focus (GTK_WIDGET (GNOME_CMD_COMBO (cmdline->priv->combo)->entry));
424
 
        gtk_editable_set_position (GTK_EDITABLE (GNOME_CMD_COMBO (cmdline->priv->combo)->entry), -1);
 
423
    gtk_widget_grab_focus (GTK_WIDGET (GNOME_CMD_COMBO (cmdline->priv->combo)->entry));
 
424
    gtk_editable_set_position (GTK_EDITABLE (GNOME_CMD_COMBO (cmdline->priv->combo)->entry), -1);
425
425
}
426
426
 
427
427
 
428
428
void
429
429
gnome_cmd_cmdline_update_style (GnomeCmdCmdline *cmdline)
430
430
{
431
 
        g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
 
431
    g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
432
432
 
433
 
        gnome_cmd_combo_update_style (GNOME_CMD_COMBO (cmdline->priv->combo));
 
433
    gnome_cmd_combo_update_style (GNOME_CMD_COMBO (cmdline->priv->combo));
434
434
}
435
435
 
436
436
 
437
437
void
438
438
gnome_cmd_cmdline_show_history (GnomeCmdCmdline *cmdline)
439
439
{
440
 
        g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
441
 
        
442
 
        gnome_cmd_combo_popup_list (GNOME_CMD_COMBO (cmdline->priv->combo));
 
440
    g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
 
441
 
 
442
    gnome_cmd_combo_popup_list (GNOME_CMD_COMBO (cmdline->priv->combo));
443
443
}
444
444
 
445
445
 
446
446
GList *
447
447
gnome_cmd_cmdline_get_history (GnomeCmdCmdline *cmdline)
448
448
{
449
 
        g_return_val_if_fail (GNOME_CMD_IS_CMDLINE (cmdline), NULL);
450
 
        
451
 
        return cmdline->priv->history;
 
449
    g_return_val_if_fail (GNOME_CMD_IS_CMDLINE (cmdline), NULL);
 
450
 
 
451
    return cmdline->priv->history;
452
452
}
453
453
 
454
454
 
455
455
void
456
456
gnome_cmd_cmdline_set_history  (GnomeCmdCmdline *cmdline, GList *history)
457
457
{
458
 
        GList *tmp;
459
 
        
460
 
        g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
461
 
 
462
 
        /* free the old history */
463
 
        tmp = cmdline->priv->history;
464
 
        while (tmp) {
465
 
                g_free (tmp->data);
466
 
                tmp = tmp->next;
467
 
        }
468
 
        
469
 
        cmdline->priv->history = history;
 
458
    GList *tmp;
 
459
 
 
460
    g_return_if_fail (GNOME_CMD_IS_CMDLINE (cmdline));
 
461
 
 
462
    /* free the old history */
 
463
    tmp = cmdline->priv->history;
 
464
    while (tmp) {
 
465
        g_free (tmp->data);
 
466
        tmp = tmp->next;
 
467
    }
 
468
 
 
469
    cmdline->priv->history = history;
470
470
}
471
471
 
472
472
 
473
473
GtkWidget *
474
474
gnome_cmd_cmdline_get_entry    (GnomeCmdCmdline *cmdline)
475
475
{
476
 
        g_return_val_if_fail (GNOME_CMD_IS_CMDLINE (cmdline), NULL);
 
476
    g_return_val_if_fail (GNOME_CMD_IS_CMDLINE (cmdline), NULL);
477
477
 
478
 
        return GNOME_CMD_COMBO (cmdline->priv->combo)->entry;
 
478
    return GNOME_CMD_COMBO (cmdline->priv->combo)->entry;
479
479
}
480
480
 
481
481
 
482
482
gboolean
483
483
gnome_cmd_cmdline_keypressed   (GnomeCmdCmdline *cmdline,
484
 
                                                                GdkEventKey *event)
 
484
                                GdkEventKey *event)
485
485
{
486
 
        g_return_val_if_fail (GNOME_CMD_IS_CMDLINE (cmdline), FALSE);
487
 
        g_return_val_if_fail (event != NULL, FALSE);
488
 
 
489
 
        if (state_is_ctrl (event->state)) {
490
 
                switch (event->keyval)
491
 
                {
492
 
                        case GDK_Down:
493
 
                                gnome_cmd_cmdline_show_history (cmdline);
494
 
                                return TRUE;
495
 
 
496
 
                        case GDK_Return:
497
 
                                event->string[0] = '\0';
498
 
                                return FALSE;
499
 
                }
500
 
        }
501
 
        else if (state_is_shift (event->state)) {
502
 
                switch (event->keyval)
503
 
                {
504
 
                        case GDK_Return:
505
 
                                on_exec (cmdline, TRUE);
506
 
                                event->keyval = GDK_Escape;
507
 
                                return TRUE;
508
 
                }
509
 
        }
510
 
        else if (state_is_ctrl_shift (event->state)) {
511
 
                switch (event->keyval)
512
 
                {
513
 
                        case GDK_Return:
514
 
                                event->string[0] = '\0';
515
 
                                return FALSE;
516
 
                }
517
 
        }
518
 
        else if (state_is_blank (event->state))
519
 
        {
520
 
                switch (event->keyval)
521
 
                {
522
 
                        case GDK_Return:
523
 
                                on_exec (cmdline, FALSE);
524
 
                                event->keyval = GDK_Escape;
525
 
                                return TRUE;
526
 
                
527
 
                        case GDK_Escape:
528
 
                                gnome_cmd_cmdline_set_text (cmdline, "");
529
 
                                gnome_cmd_main_win_focus_file_lists (main_win);                         
530
 
                                return TRUE;
531
 
                                
532
 
                        case GDK_Up:
533
 
                        case GDK_Down:
534
 
                        {
535
 
                                gboolean ret;
536
 
                                GdkEventKey event2;
537
 
                                GnomeCmdFileSelector *fs = gnome_cmd_main_win_get_active_fs (main_win);
538
 
                                GtkWidget *file_list = fs->list_widget;
539
 
                                
540
 
                                gtk_widget_grab_focus (file_list);
541
 
                                gnome_cmd_file_selector_set_active (fs, TRUE);
542
 
                                
543
 
                                memcpy (&event2, event, sizeof (GdkEventKey));
544
 
                                gtk_signal_emit_by_name (
545
 
                                        GTK_OBJECT (file_list), "key-press-event", &event2, &ret);
546
 
                                event->keyval = 0;
547
 
                        }
548
 
                        break;
549
 
                }               
550
 
        }
551
 
 
552
 
        return FALSE;
 
486
    g_return_val_if_fail (GNOME_CMD_IS_CMDLINE (cmdline), FALSE);
 
487
    g_return_val_if_fail (event != NULL, FALSE);
 
488
 
 
489
    if (state_is_ctrl (event->state)) {
 
490
        switch (event->keyval)
 
491
        {
 
492
            case GDK_Down:
 
493
                gnome_cmd_cmdline_show_history (cmdline);
 
494
                return TRUE;
 
495
 
 
496
            case GDK_Return:
 
497
                event->string[0] = '\0';
 
498
                return FALSE;
 
499
        }
 
500
    }
 
501
    else if (state_is_shift (event->state)) {
 
502
        switch (event->keyval)
 
503
        {
 
504
            case GDK_Return:
 
505
                on_exec (cmdline, TRUE);
 
506
                event->keyval = GDK_Escape;
 
507
                return TRUE;
 
508
        }
 
509
    }
 
510
    else if (state_is_ctrl_shift (event->state)) {
 
511
        switch (event->keyval)
 
512
        {
 
513
            case GDK_Return:
 
514
                event->string[0] = '\0';
 
515
                return FALSE;
 
516
        }
 
517
    }
 
518
    else if (state_is_blank (event->state))
 
519
    {
 
520
        switch (event->keyval)
 
521
        {
 
522
            case GDK_Return:
 
523
                on_exec (cmdline, FALSE);
 
524
                event->keyval = GDK_Escape;
 
525
                return TRUE;
 
526
 
 
527
            case GDK_Escape:
 
528
                gnome_cmd_cmdline_set_text (cmdline, "");
 
529
                gnome_cmd_main_win_focus_file_lists (main_win);
 
530
                return TRUE;
 
531
 
 
532
            case GDK_Up:
 
533
            case GDK_Down:
 
534
            {
 
535
                gboolean ret;
 
536
                GdkEventKey event2;
 
537
                GnomeCmdFileSelector *fs = gnome_cmd_main_win_get_active_fs (main_win);
 
538
                GtkWidget *file_list = fs->list_widget;
 
539
 
 
540
                gtk_widget_grab_focus (file_list);
 
541
                gnome_cmd_file_selector_set_active (fs, TRUE);
 
542
 
 
543
                memcpy (&event2, event, sizeof (GdkEventKey));
 
544
                gtk_signal_emit_by_name (
 
545
                    GTK_OBJECT (file_list), "key-press-event", &event2, &ret);
 
546
                event->keyval = 0;
 
547
            }
 
548
            break;
 
549
        }
 
550
    }
 
551
 
 
552
    return FALSE;
553
553
}