1
|
1 /*****************************************************************************/
|
|
2 /* gftp-gtk.c - GTK+ 1.2 port of gftp */
|
|
3 /* Copyright (C) 1998-2002 Brian Masney <masneyb@gftp.org> */
|
|
4 /* */
|
|
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. */
|
|
9 /* */
|
|
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. */
|
|
14 /* */
|
|
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 USA */
|
|
18 /*****************************************************************************/
|
|
19
|
|
20 #include "gftp-gtk.h"
|
|
21
|
|
22 static gint delete_event ( GtkWidget * widget,
|
|
23 GdkEvent * event,
|
|
24 gpointer data );
|
|
25 static void destroy ( GtkWidget * widget,
|
|
26 gpointer data );
|
|
27 static RETSIGTYPE sig_child ( int signo );
|
|
28 static GtkWidget * CreateFTPWindows ( GtkWidget * ui );
|
|
29 static GtkWidget * CreateMenus ( GtkWidget * parent );
|
|
30 static GtkWidget * CreateToolbar ( GtkWidget * parent );
|
|
31 static void doexit ( GtkWidget * widget,
|
|
32 gpointer data );
|
|
33 static int get_column ( GtkCListColumn * col );
|
|
34 static void init_gftp ( int argc,
|
|
35 char *argv[],
|
|
36 GtkWidget * parent );
|
|
37 static void menu_exit ( GtkWidget * widget,
|
|
38 gpointer data );
|
|
39 static GtkWidget * CreateFTPWindow ( gftp_window_data * wdata,
|
|
40 int width,
|
|
41 int columns[6] );
|
|
42 static void setup_column ( GtkWidget * listbox,
|
|
43 int column,
|
|
44 int width );
|
|
45 static gint menu_mouse_click ( GtkWidget * widget,
|
|
46 GdkEventButton * event,
|
|
47 gpointer data );
|
|
48 static gint list_dblclick ( GtkWidget * widget,
|
|
49 GdkEventButton * event,
|
|
50 gpointer data );
|
|
51 static void list_doaction ( gftp_window_data * wdata );
|
|
52 static gint list_enter ( GtkWidget * widget,
|
|
53 GdkEventKey * event,
|
|
54 gpointer data );
|
|
55 static void chfunc ( gpointer data );
|
|
56
|
|
57 static GtkItemFactory *log_factory, *dl_factory;
|
|
58 static GtkWidget * local_frame, * remote_frame, * log_table, * transfer_scroll,
|
|
59 * openurl_btn;
|
|
60
|
|
61 gftp_window_data window1, window2, *other_wdata, *current_wdata;
|
|
62 GtkWidget * stop_btn, * hostedit, * useredit, * passedit, * portedit, * logwdw,
|
|
63 * dlwdw, * protocol_menu, * optionmenu;
|
|
64 GtkAdjustment * logwdw_vadj;
|
|
65 #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION == 0
|
|
66 GtkTextMark * logwdw_textmark;
|
|
67 #endif
|
|
68 int local_start, remote_start, trans_start, log_start, tools_start;
|
|
69 GHashTable * graphic_hash_table = NULL;
|
|
70 GtkItemFactoryEntry * menus = NULL;
|
|
71 GtkItemFactory * factory = NULL;
|
|
72 pthread_mutex_t transfer_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
73 pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
74
|
|
75 int
|
|
76 main (int argc, char **argv)
|
|
77 {
|
|
78 GtkWidget *window, *ui;
|
|
79 gftp_graphic * graphic;
|
|
80
|
|
81 #ifdef HAVE_GETTEXT
|
|
82 setlocale (LC_ALL, "");
|
|
83 bindtextdomain ("gftp", LOCALE_DIR);
|
12
|
84 #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION == 0
|
7
|
85 bind_textdomain_codeset ("gftp", "UTF-8");
|
12
|
86 #endif
|
1
|
87 textdomain ("gftp");
|
|
88 #endif
|
|
89 gtk_set_locale ();
|
|
90
|
|
91 gtk_init (&argc, &argv);
|
|
92 signal (SIGCHLD, sig_child);
|
|
93 signal (SIGPIPE, SIG_IGN);
|
|
94 signal (SIGALRM, SIG_IGN);
|
|
95 graphic_hash_table = g_hash_table_new (string_hash_function, string_hash_compare);
|
|
96 gftp_read_config_file (argv, 1);
|
|
97 if (gftp_parse_command_line (&argc, &argv) != 0)
|
|
98 exit (0);
|
|
99
|
|
100 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
101 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
|
|
102 GTK_SIGNAL_FUNC (delete_event), NULL);
|
|
103 gtk_signal_connect (GTK_OBJECT (window), "destroy",
|
|
104 GTK_SIGNAL_FUNC (destroy), NULL);
|
|
105 gtk_window_set_title (GTK_WINDOW (window), version);
|
|
106 gtk_window_set_wmclass (GTK_WINDOW(window), "main", "gFTP");
|
|
107 gtk_widget_set_name (window, version);
|
|
108 gtk_window_set_policy (GTK_WINDOW (window), TRUE, TRUE, FALSE);
|
|
109 gtk_widget_realize (window);
|
|
110
|
|
111 graphic = open_xpm (window, "gftp.xpm");
|
|
112 if (graphic != NULL)
|
|
113 {
|
|
114 gdk_window_set_icon (window->window, NULL, graphic->pixmap,
|
|
115 graphic->bitmap);
|
|
116 gdk_window_set_icon_name (window->window, _("gFTP Icon"));
|
|
117 }
|
|
118
|
|
119 other_wdata = &window1;
|
|
120 current_wdata = &window2;
|
|
121 ui = CreateFTPWindows (window);
|
|
122 gtk_container_add (GTK_CONTAINER (window), ui);
|
|
123 gtk_widget_show (window);
|
|
124
|
|
125 ftp_log (gftp_logging_misc, NULL,
|
|
126 "%s, Copyright (C) 1998-2002 Brian Masney <", version);
|
|
127 ftp_log (gftp_logging_recv, NULL, "masneyb@gftp.org");
|
|
128 ftp_log (gftp_logging_misc, NULL,
|
|
129 _(">. If you have any questions, comments, or suggestions about this program, please feel free to email them to me. You can always find out the latest news about gFTP from my website at http://www.gftp.org/\n"));
|
|
130 ftp_log (gftp_logging_misc, NULL,
|
|
131 _("gFTP comes with ABSOLUTELY NO WARRANTY; for details, see the COPYING file. This is free software, and you are welcome to redistribute it under certain conditions; for details, see the COPYING file\n"));
|
|
132
|
|
133 init_gftp (argc, argv, window);
|
|
134 gtk_timeout_add (1000, update_downloads, NULL);
|
|
135 gftp_protocols[GFTP_LOCAL_NUM].init (window1.request);
|
|
136 if (startup_directory != NULL && *startup_directory != '\0')
|
|
137 gftp_set_directory (window1.request, startup_directory);
|
|
138 gftp_connect (window1.request);
|
|
139 ftp_list_files (&window1, 0);
|
|
140
|
|
141 gtk_main ();
|
|
142 return (0);
|
|
143 }
|
|
144
|
|
145
|
|
146 static gint
|
|
147 delete_event (GtkWidget * widget, GdkEvent * event, gpointer data)
|
|
148 {
|
|
149 if (file_transfers == NULL)
|
|
150 doexit (NULL, NULL);
|
|
151 else
|
|
152 {
|
|
153 MakeYesNoDialog (_("Exit"),
|
|
154 _("There are file transfers in progress.\nAre you sure you want to exit?"),
|
|
155 1, 2, _("Exit"), doexit, NULL, _("Don't Exit"), NULL,
|
|
156 NULL);
|
|
157 return (TRUE);
|
|
158 }
|
|
159 return (FALSE);
|
|
160 }
|
|
161
|
|
162
|
|
163 static void
|
|
164 destroy (GtkWidget * widget, gpointer data)
|
|
165 {
|
|
166 exit (0);
|
|
167 }
|
|
168
|
|
169
|
|
170 static RETSIGTYPE
|
|
171 sig_child (int signo)
|
|
172 {
|
|
173 viewedit_process_done = 1;
|
|
174 }
|
|
175
|
|
176
|
|
177 static GtkWidget *
|
|
178 CreateFTPWindows (GtkWidget * ui)
|
|
179 {
|
|
180 GtkWidget *box, *dlbox, *winpane, *dlpane, *logpane, *mainvbox, *tempwid,
|
|
181 *button;
|
|
182 char *dltitles[2];
|
|
183 #if !(GTK_MAJOR_VERSION == 1 && GTK_MINOR_VERSION == 2)
|
|
184 GtkTextBuffer * textbuf;
|
|
185 GtkTextIter iter;
|
|
186 GtkTextTag *tag;
|
|
187 GdkColor fore;
|
|
188 #endif
|
|
189
|
|
190 memset (&window1, 0, sizeof (window1));
|
|
191 memset (&window2, 0, sizeof (window2));
|
|
192 window1.history = &localhistory;
|
|
193 window1.histlen = &localhistlen;
|
|
194 window2.history = &remotehistory;
|
|
195 window2.histlen = &remotehistlen;
|
|
196
|
|
197 mainvbox = gtk_vbox_new (FALSE, 0);
|
|
198
|
|
199 tempwid = CreateMenus (ui);
|
|
200 gtk_box_pack_start (GTK_BOX (mainvbox), tempwid, FALSE, FALSE, 0);
|
|
201
|
|
202 tempwid = CreateToolbar (ui);
|
|
203 gtk_box_pack_start (GTK_BOX (mainvbox), tempwid, FALSE, FALSE, 0);
|
|
204
|
|
205 winpane = gtk_hpaned_new ();
|
|
206
|
|
207 box = gtk_hbox_new (FALSE, 0);
|
|
208
|
|
209 local_frame = CreateFTPWindow (&window1, listbox_local_width, local_columns);
|
|
210 gtk_box_pack_start (GTK_BOX (box), local_frame, TRUE, TRUE, 0);
|
|
211
|
|
212 dlbox = gtk_vbox_new (FALSE, 0);
|
|
213 gtk_container_border_width (GTK_CONTAINER (dlbox), 5);
|
|
214 gtk_box_pack_start (GTK_BOX (box), dlbox, FALSE, FALSE, 0);
|
|
215
|
|
216 tempwid = toolbar_pixmap (ui, "right.xpm");
|
|
217 button = gtk_button_new ();
|
|
218 gtk_box_pack_start (GTK_BOX (dlbox), button, TRUE, FALSE, 0);
|
|
219 gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
|
|
220 GTK_SIGNAL_FUNC (put_files), NULL);
|
|
221 gtk_container_add (GTK_CONTAINER (button), tempwid);
|
|
222
|
|
223 tempwid = toolbar_pixmap (ui, "left.xpm");
|
|
224 button = gtk_button_new ();
|
|
225 gtk_box_pack_start (GTK_BOX (dlbox), button, TRUE, FALSE, 0);
|
|
226 gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
|
|
227 GTK_SIGNAL_FUNC (get_files), NULL);
|
|
228 gtk_container_add (GTK_CONTAINER (button), tempwid);
|
|
229
|
|
230 gtk_paned_pack1 (GTK_PANED (winpane), box, 1, 1);
|
|
231
|
|
232 remote_frame = CreateFTPWindow (&window2, listbox_remote_width,
|
|
233 remote_columns);
|
|
234 gtk_paned_pack2 (GTK_PANED (winpane), remote_frame, 1, 1);
|
|
235
|
|
236 dlpane = gtk_vpaned_new ();
|
|
237 gtk_paned_pack1 (GTK_PANED (dlpane), winpane, 1, 1);
|
|
238
|
|
239 transfer_scroll = gtk_scrolled_window_new (NULL, NULL);
|
|
240 gtk_widget_set_size_request (transfer_scroll, -1, transfer_height);
|
|
241 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (transfer_scroll),
|
|
242 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
|
243
|
|
244 dltitles[0] = _("Filename");
|
|
245 dltitles[1] = _("Progress");
|
|
246 dlwdw = gtk_ctree_new_with_titles (2, 0, dltitles);
|
|
247 gtk_clist_set_selection_mode (GTK_CLIST (dlwdw), GTK_SELECTION_SINGLE);
|
|
248 gtk_clist_set_reorderable (GTK_CLIST (dlwdw), 0);
|
|
249
|
|
250 if (file_trans_column == 0)
|
|
251 gtk_clist_set_column_auto_resize (GTK_CLIST (dlwdw), 0, TRUE);
|
|
252 else
|
|
253 gtk_clist_set_column_width (GTK_CLIST (dlwdw), 0, file_trans_column);
|
|
254
|
|
255 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (transfer_scroll), dlwdw);
|
|
256 gtk_signal_connect (GTK_OBJECT (dlwdw), "button_press_event",
|
|
257 GTK_SIGNAL_FUNC (menu_mouse_click), (gpointer) dl_factory);
|
|
258 gtk_paned_pack2 (GTK_PANED (dlpane), transfer_scroll, 1, 1);
|
|
259
|
|
260 logpane = gtk_vpaned_new ();
|
|
261 gtk_paned_pack1 (GTK_PANED (logpane), dlpane, 1, 1);
|
|
262
|
|
263 log_table = gtk_table_new (1, 2, FALSE);
|
|
264 gtk_widget_set_size_request (log_table, -1, log_height);
|
|
265
|
|
266 #if GTK_MAJOR_VERSION == 1 && GTK_MINOR_VERSION == 2
|
|
267 logwdw = gtk_text_new (NULL, NULL);
|
|
268
|
|
269 gtk_text_set_editable (GTK_TEXT (logwdw), FALSE);
|
|
270 gtk_text_set_word_wrap (GTK_TEXT (logwdw), TRUE);
|
|
271
|
|
272 gtk_table_attach (GTK_TABLE (log_table), logwdw, 0, 1, 0, 1,
|
|
273 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
|
|
274 0, 0);
|
|
275 gtk_signal_connect (GTK_OBJECT (logwdw), "button_press_event",
|
|
276 GTK_SIGNAL_FUNC (menu_mouse_click),
|
|
277 (gpointer) log_factory);
|
|
278
|
|
279 tempwid = gtk_vscrollbar_new (GTK_TEXT (logwdw)->vadj);
|
|
280 gtk_table_attach (GTK_TABLE (log_table), tempwid, 1, 2, 0, 1,
|
|
281 GTK_FILL, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0);
|
|
282 logwdw_vadj = GTK_TEXT (logwdw)->vadj;
|
|
283 #else
|
|
284 logwdw = gtk_text_view_new ();
|
|
285 gtk_text_view_set_editable (GTK_TEXT_VIEW (logwdw), FALSE);
|
|
286 gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (logwdw), FALSE);
|
|
287 gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (logwdw), GTK_WRAP_WORD);
|
|
288
|
|
289 textbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logwdw));
|
|
290
|
|
291 tag = gtk_text_buffer_create_tag (textbuf, "send", NULL);
|
|
292 fore.red = send_color.red;
|
|
293 fore.green = send_color.green;
|
|
294 fore.blue = send_color.blue;
|
|
295 g_object_set (G_OBJECT (tag), "foreground_gdk", &fore, NULL);
|
|
296
|
|
297 tag = gtk_text_buffer_create_tag (textbuf, "recv", NULL);
|
|
298 fore.red = recv_color.red;
|
|
299 fore.green = recv_color.green;
|
|
300 fore.blue = recv_color.blue;
|
|
301 g_object_set (G_OBJECT (tag), "foreground_gdk", &fore, NULL);
|
|
302
|
|
303 tag = gtk_text_buffer_create_tag (textbuf, "error", NULL);
|
|
304 fore.red = error_color.red;
|
|
305 fore.green = error_color.green;
|
|
306 fore.blue = error_color.blue;
|
|
307 g_object_set (G_OBJECT (tag), "foreground_gdk", &fore, NULL);
|
|
308
|
|
309 tag = gtk_text_buffer_create_tag (textbuf, "misc", NULL);
|
|
310 fore.red = misc_color.red;
|
|
311 fore.green = misc_color.green;
|
|
312 fore.blue = misc_color.blue;
|
|
313 g_object_set (G_OBJECT (tag), "foreground_gdk", &fore, NULL);
|
|
314
|
|
315 tempwid = gtk_scrolled_window_new (NULL, NULL);
|
|
316 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (tempwid),
|
|
317 GTK_POLICY_AUTOMATIC,
|
|
318 GTK_POLICY_AUTOMATIC);
|
|
319 gtk_container_add (GTK_CONTAINER (tempwid), logwdw);
|
|
320 gtk_table_attach (GTK_TABLE (log_table), tempwid, 0, 1, 0, 1,
|
|
321 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
|
|
322 0, 0);
|
|
323 logwdw_vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (tempwid));
|
|
324 gtk_text_buffer_get_iter_at_offset (textbuf, &iter, 0);
|
|
325 logwdw_textmark = gtk_text_buffer_create_mark (textbuf, "end", &iter, 1);
|
|
326 #endif
|
|
327 gtk_paned_pack2 (GTK_PANED (logpane), log_table, 1, 1);
|
|
328 gtk_box_pack_start (GTK_BOX (mainvbox), logpane, TRUE, TRUE, 0);
|
|
329
|
|
330 gtk_widget_show_all (mainvbox);
|
|
331 return (mainvbox);
|
|
332 }
|
|
333
|
|
334
|
12
|
335 #if GTK_MAJOR_VERSION < 2
|
|
336 #define MS_(a) NULL
|
|
337 #define MN_(a) a
|
|
338 #else
|
|
339 #define MS_(a) "<StockItem>",a
|
|
340 #define MN_(a) a,NULL
|
|
341 #endif
|
|
342
|
1
|
343 static GtkWidget *
|
|
344 CreateMenus (GtkWidget * parent)
|
|
345 {
|
|
346 int local_len, remote_len, len, i, trans_len, log_len, tools_len;
|
|
347 GtkAccelGroup *accel_group;
|
|
348 GtkWidget * tempwid;
|
7
|
349 static GtkItemFactoryEntry menu_items[] = {
|
12
|
350 {N_("/_FTP"), NULL, 0, 0, MN_("<Branch>")},
|
|
351 {N_("/FTP/tearoff"), NULL, 0, 0, MN_("<Tearoff>")},
|
|
352 {N_("/FTP/Window 1"), NULL, change_setting, 3, MN_("<RadioItem>")},
|
|
353 {N_("/FTP/Window 2"), NULL, change_setting, 4, MN_("/FTP/Window 1")},
|
|
354 {N_("/FTP/sep"), NULL, 0, 0, MN_("<Separator>")},
|
|
355 {N_("/FTP/Ascii"), NULL, change_setting, 1, MN_("<RadioItem>")},
|
|
356 {N_("/FTP/Binary"), NULL, change_setting, 2, MN_("/FTP/Ascii")},
|
|
357 {N_("/FTP/sep"), NULL, 0, 0, MN_("<Separator>")},
|
|
358 {N_("/FTP/_Options..."), "<control>O", options_dialog, 0,
|
|
359 MS_(GTK_STOCK_PREFERENCES)},
|
|
360 {N_("/FTP/sep"), NULL, 0, 0, MN_("<Separator>")},
|
|
361 {N_("/FTP/_Quit"), "<control>Q", menu_exit, 0, MS_(GTK_STOCK_QUIT)},
|
|
362 {N_("/_Local"), NULL, 0, 0, MN_("<Branch>")},
|
|
363 {N_("/Local/tearoff"), NULL, 0, 0, MN_("<Tearoff>")},
|
|
364 {N_("/Local/Open _URL..."), NULL, openurl_dialog, 0, MS_(GTK_STOCK_OPEN)},
|
|
365 {N_("/Local/Disconnect"), NULL, disconnect, 0, MS_(GTK_STOCK_CLOSE)},
|
|
366 {N_("/Local/sep"), NULL, 0, 0, MN_("<Separator>")},
|
|
367 {N_("/Local/Change Filespec..."), NULL, change_filespec, 0, MN_(NULL)},
|
|
368 {N_("/Local/Show selected"), NULL, show_selected, 0, MN_(NULL)},
|
|
369 {N_("/Local/Select All"), NULL, selectall, 0, MN_(NULL)},
|
|
370 {N_("/Local/Select All Files"), NULL, selectallfiles, 0, MN_(NULL)},
|
|
371 {N_("/Local/Deselect All"), NULL, deselectall, 0, MN_(NULL)},
|
|
372 {N_("/Local/sep"), NULL, 0, 0, MN_("<Separator>")},
|
|
373 {N_("/Local/Send SITE Command..."), NULL, site_dialog, 0, MN_(NULL)},
|
|
374 {N_("/Local/Change Directory"), NULL, chfunc, 0, MN_(NULL)},
|
|
375 {N_("/Local/Chmod..."), NULL, chmod_dialog, 0, MN_(NULL)},
|
|
376 {N_("/Local/Make Directory..."), NULL, mkdir_dialog, 0, MN_(NULL)},
|
|
377 {N_("/Local/Rename..."), NULL, rename_dialog, 0, MN_(NULL)},
|
|
378 {N_("/Local/Delete..."), NULL, delete_dialog, 0, MN_(NULL)},
|
|
379 {N_("/Local/Edit..."), NULL, edit_dialog, 0, MN_(NULL)},
|
|
380 {N_("/Local/View..."), NULL, view_dialog, 0, MN_(NULL)},
|
|
381 {N_("/Local/Refresh"), NULL, refresh, 0, MS_(GTK_STOCK_REFRESH)},
|
|
382 {N_("/_Remote"), NULL, 0, 0, MN_("<Branch>")},
|
|
383 {N_("/Remote/tearoff"), NULL, 0, 0, MN_("<Tearoff>")},
|
|
384 {N_("/Remote/Open _URL..."), "<control>U", openurl_dialog, 0,
|
|
385 MS_(GTK_STOCK_OPEN)},
|
|
386 {N_("/Remote/Disconnect"), "<control>D", disconnect, 0,
|
|
387 MS_(GTK_STOCK_CLOSE)},
|
|
388 {N_("/Remote/sep"), NULL, 0, 0, MN_("<Separator>")},
|
|
389 {N_("/Remote/Change Filespec..."), NULL, change_filespec, 0, MN_(NULL)},
|
|
390 {N_("/Remote/Show selected"), NULL, show_selected, 0, MN_(NULL)},
|
|
391 {N_("/Remote/Select All"), NULL, selectall, 0, MN_(NULL)},
|
|
392 {N_("/Remote/Select All Files"), NULL, selectallfiles, 0, MN_(NULL)},
|
|
393 {N_("/Remote/Deselect All"), NULL, deselectall, 0, MN_(NULL)},
|
|
394 {N_("/Remote/sep"), NULL, 0, 0, MN_("<Separator>")},
|
|
395 {N_("/Remote/Send SITE Command..."), NULL, site_dialog, 0, MN_(NULL)},
|
|
396 {N_("/Remote/Change Directory"), NULL, chfunc, 0, MN_(NULL)},
|
|
397 {N_("/Remote/Chmod..."), NULL, chmod_dialog, 0, MN_(NULL)},
|
|
398 {N_("/Remote/Make Directory..."), NULL, mkdir_dialog, 0, MN_(NULL)},
|
|
399 {N_("/Remote/Rename..."), NULL, rename_dialog, 0, MN_(NULL)},
|
|
400 {N_("/Remote/Delete..."), NULL, delete_dialog, 0, MN_(NULL)},
|
|
401 {N_("/Remote/Edit..."), NULL, edit_dialog, 0, MN_(NULL)},
|
|
402 {N_("/Remote/View..."), NULL, view_dialog, 0, MN_(NULL)},
|
|
403 {N_("/Remote/Refresh"), NULL, refresh, 0, MS_(GTK_STOCK_REFRESH)},
|
|
404 {N_("/_Bookmarks"), NULL, 0, 0, MN_("<Branch>")},
|
|
405 {N_("/Bookmarks/tearoff"), NULL, 0, 0, MN_("<Tearoff>")},
|
|
406 {N_("/Bookmarks/Add bookmark"), "<control>A", add_bookmark, 0,
|
|
407 MS_(GTK_STOCK_ADD)},
|
|
408 {N_("/Bookmarks/Edit bookmarks"), NULL, edit_bookmarks, 0, MN_(NULL)},
|
|
409 {N_("/Bookmarks/sep"), NULL, 0, 0, MN_("<Separator>")},
|
|
410 {N_("/_Transfers"), NULL, 0, 0, MN_("<Branch>")},
|
|
411 {N_("/Transfers/tearoff"), NULL, 0, 0, MN_("<Tearoff>")},
|
|
412 {N_("/Transfers/Start Transfer"), NULL, start_transfer, 0, MN_(NULL)},
|
|
413 {N_("/Transfers/Stop Transfer"), NULL, stop_transfer, 0,
|
|
414 MS_(GTK_STOCK_STOP)},
|
|
415 {N_("/Transfers/sep"), NULL, 0, 0, MN_("<Separator>")},
|
|
416 {N_("/Transfers/Skip Current File"), NULL, skip_transfer, 0, MN_(NULL)},
|
|
417 {N_("/Transfers/Remove File"), NULL, remove_file_transfer, 0,
|
|
418 MS_(GTK_STOCK_DELETE)},
|
|
419 {N_("/Transfers/Move File _Up"), NULL, move_transfer_up, 0,
|
|
420 MS_(GTK_STOCK_GO_UP)},
|
|
421 {N_("/Transfers/Move File _Down"), NULL, move_transfer_down, 0,
|
|
422 MS_(GTK_STOCK_GO_DOWN)},
|
|
423 {N_("/Transfers/sep"), NULL, 0, 0, MN_("<Separator>")},
|
|
424 {N_("/Transfers/Retrieve Files"), "<control>R", get_files, 0, MN_(NULL)},
|
|
425 {N_("/Transfers/Put Files"), "<control>P", put_files, 0, MN_(NULL)},
|
|
426 {N_("/L_ogging"), NULL, 0, 0, MN_("<Branch>")},
|
|
427 {N_("/Logging/tearoff"), NULL, 0, 0, MN_("<Tearoff>")},
|
|
428 {N_("/Logging/Clear"), NULL, clearlog, 0, MS_(GTK_STOCK_CLEAR)},
|
|
429 {N_("/Logging/View log..."), NULL, viewlog, 0, MN_(NULL)},
|
|
430 {N_("/Logging/Save log..."), NULL, savelog, 0, MS_(GTK_STOCK_SAVE)},
|
|
431 {N_("/Tool_s"), NULL, 0, 0, MN_("<Branch>")},
|
|
432 {N_("/Tools/tearoff"), NULL, 0, 0, MN_("<Tearoff>")},
|
|
433 {N_("/Tools/Compare Windows"), NULL, compare_windows, 0, MN_(NULL)},
|
|
434 {N_("/Tools/Clear Cache"), NULL, clear_cache, 0, MS_(GTK_STOCK_CLEAR)},
|
|
435 {N_("/_Help"), NULL, 0, 0, MN_("<LastBranch>")},
|
|
436 {N_("/Help/tearoff"), NULL, 0, 0, MN_("<Tearoff>")},
|
|
437 {N_("/Help/About..."), NULL, about_dialog, 0, MS_(GTK_STOCK_HELP)}
|
1
|
438 };
|
|
439
|
|
440 menus = menu_items;
|
|
441
|
|
442 accel_group = gtk_accel_group_new ();
|
7
|
443 factory = item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group, NULL);
|
1
|
444
|
|
445 i = 0;
|
|
446 len = 11;
|
|
447 /* FTP Menu */
|
|
448 create_item_factory (factory, len, menu_items, &window2);
|
|
449
|
|
450 i += len;
|
|
451 /* Local Menu */
|
|
452 local_start = i;
|
|
453 local_len = 20;
|
|
454 create_item_factory (factory, local_len, menu_items + i, &window1);
|
|
455
|
|
456 i += local_len;
|
|
457 /* Remote Menu */
|
|
458 remote_start = i;
|
|
459 remote_len = 20;
|
|
460 create_item_factory (factory, remote_len, menu_items + i, &window2);
|
|
461
|
|
462 i += remote_len;
|
|
463 len = 5;
|
|
464 /* Bookmarks Menu */
|
|
465 create_item_factory (factory, len, menu_items + i, &window2);
|
|
466
|
|
467 i += len;
|
|
468 /* Transfers Menu */
|
|
469 trans_start = i;
|
|
470 trans_len = 12;
|
|
471 create_item_factory (factory, trans_len, menu_items + i, NULL);
|
|
472
|
|
473 i += trans_len;
|
|
474 /* Logging Menu */
|
|
475 log_start = i;
|
|
476 log_len = 5;
|
|
477 create_item_factory (factory, log_len, menu_items + i, NULL);
|
|
478
|
|
479 i += log_len;
|
|
480 /* Tools Menu */
|
|
481 tools_start = i;
|
|
482 tools_len = 4;
|
|
483 create_item_factory (factory, tools_len, menu_items + i, NULL);
|
|
484
|
|
485 i += tools_len;
|
|
486 /* Help Menu */
|
|
487 create_item_factory (factory, 3, menu_items + i, NULL);
|
|
488
|
|
489 build_bookmarks_menu ();
|
|
490
|
|
491 #if GTK_MAJOR_VERSION == 1 && GTK_MINOR_VERSION == 2
|
|
492 gtk_accel_group_attach (accel_group, GTK_OBJECT (parent));
|
|
493 #else
|
12
|
494 _gtk_accel_group_attach (accel_group, G_OBJECT (parent));
|
1
|
495 #endif
|
|
496
|
7
|
497 tempwid = gtk_item_factory_get_widget (factory, menu_items[6].path);
|
1
|
498 gtk_check_menu_item_set_state (GTK_CHECK_MENU_ITEM (tempwid), TRUE);
|
|
499
|
7
|
500 tempwid = gtk_item_factory_get_widget (factory, menu_items[3].path);
|
1
|
501 gtk_check_menu_item_set_state (GTK_CHECK_MENU_ITEM (tempwid), TRUE);
|
|
502
|
7
|
503 window1.ifactory = item_factory_new (GTK_TYPE_MENU, "<local>", NULL, "/Local");
|
|
504 create_item_factory (window1.ifactory, local_len - 2, menu_items + local_start + 2, &window1);
|
|
505
|
|
506 window2.ifactory = item_factory_new (GTK_TYPE_MENU, "<remote>", NULL, "/Remote");
|
|
507 create_item_factory (window2.ifactory, remote_len - 2, menu_items + remote_start + 2, &window2);
|
1
|
508
|
7
|
509 log_factory = item_factory_new (GTK_TYPE_MENU, "<log>", NULL, "/Logging");
|
|
510 create_item_factory (log_factory, log_len - 2, menu_items + log_start + 2, NULL);
|
1
|
511
|
7
|
512 dl_factory = item_factory_new (GTK_TYPE_MENU, "<download>", NULL, "/Transfers");
|
|
513 create_item_factory (dl_factory, trans_len - 2, menu_items + trans_start + 2, NULL);
|
1
|
514
|
|
515 return (factory->widget);
|
|
516 }
|
|
517
|
|
518
|
|
519 static GtkWidget *
|
|
520 CreateToolbar (GtkWidget * parent)
|
|
521 {
|
|
522 const GtkTargetEntry possible_types[] = {
|
|
523 {"STRING", 0, 0},
|
|
524 {"text/plain", 0, 0},
|
|
525 {"application/x-rootwin-drop", 0, 1}
|
|
526 };
|
|
527 GtkWidget *toolbar, *box, *tempwid;
|
|
528 int i, num;
|
|
529
|
|
530 toolbar = gtk_handle_box_new ();
|
|
531
|
|
532 box = gtk_hbox_new (FALSE, 4);
|
|
533 gtk_container_add (GTK_CONTAINER (toolbar), box);
|
|
534 gtk_container_border_width (GTK_CONTAINER (box), 5);
|
|
535
|
|
536 tempwid = toolbar_pixmap (parent, "connect.xpm");
|
|
537 openurl_btn = gtk_button_new ();
|
|
538 gtk_container_add (GTK_CONTAINER (openurl_btn), tempwid);
|
|
539 gtk_signal_connect_object (GTK_OBJECT (openurl_btn), "clicked",
|
|
540 GTK_SIGNAL_FUNC (tb_openurl_dialog), NULL);
|
|
541 gtk_signal_connect (GTK_OBJECT (openurl_btn), "drag_data_received",
|
|
542 GTK_SIGNAL_FUNC (openurl_get_drag_data), NULL);
|
|
543 gtk_drag_dest_set (openurl_btn, GTK_DEST_DEFAULT_ALL, possible_types, 2,
|
|
544 GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
|
545 gtk_container_border_width (GTK_CONTAINER (openurl_btn), 1);
|
|
546 gtk_box_pack_start (GTK_BOX (box), openurl_btn, FALSE, FALSE, 0);
|
|
547
|
|
548 tempwid = gtk_label_new (_("Host: "));
|
|
549 gtk_box_pack_start (GTK_BOX (box), tempwid, FALSE, FALSE, 0);
|
|
550
|
|
551 hostedit = gtk_combo_new ();
|
|
552 gtk_combo_set_case_sensitive (GTK_COMBO (hostedit), 1);
|
|
553 gtk_widget_set_size_request (hostedit, 130, -1);
|
|
554
|
|
555 gtk_signal_connect (GTK_OBJECT (GTK_COMBO (hostedit)->entry), "activate",
|
|
556 GTK_SIGNAL_FUNC (toolbar_hostedit), NULL);
|
|
557 if (host_history)
|
|
558 gtk_combo_set_popdown_strings (GTK_COMBO (hostedit), host_history);
|
|
559 gtk_combo_disable_activate (GTK_COMBO (hostedit));
|
|
560 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (hostedit)->entry), "");
|
|
561 gtk_box_pack_start (GTK_BOX (box), hostedit, TRUE, TRUE, 0);
|
|
562
|
|
563 tempwid = gtk_label_new (_("Port: "));
|
|
564 gtk_box_pack_start (GTK_BOX (box), tempwid, FALSE, FALSE, 0);
|
|
565
|
|
566 portedit = gtk_combo_new ();
|
|
567 gtk_combo_set_case_sensitive (GTK_COMBO (portedit), 1);
|
|
568 gtk_widget_set_size_request (portedit, 40, -1);
|
|
569
|
|
570 gtk_signal_connect (GTK_OBJECT (GTK_COMBO (portedit)->entry), "activate",
|
|
571 GTK_SIGNAL_FUNC (toolbar_hostedit), NULL);
|
|
572 if (port_history)
|
|
573 gtk_combo_set_popdown_strings (GTK_COMBO (portedit), port_history);
|
|
574 gtk_combo_disable_activate (GTK_COMBO (portedit));
|
|
575 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (portedit)->entry), "");
|
|
576 gtk_box_pack_start (GTK_BOX (box), portedit, FALSE, FALSE, 0);
|
|
577
|
|
578 tempwid = gtk_label_new (_("User: "));
|
|
579 gtk_box_pack_start (GTK_BOX (box), tempwid, FALSE, FALSE, 0);
|
|
580
|
|
581 useredit = gtk_combo_new ();
|
|
582 gtk_combo_set_case_sensitive (GTK_COMBO (useredit), 1);
|
|
583 gtk_widget_set_size_request (useredit, 75, -1);
|
|
584
|
|
585 gtk_signal_connect (GTK_OBJECT (GTK_COMBO (useredit)->entry), "activate",
|
|
586 GTK_SIGNAL_FUNC (toolbar_hostedit), NULL);
|
|
587 if (user_history)
|
|
588 gtk_combo_set_popdown_strings (GTK_COMBO (useredit), user_history);
|
|
589 gtk_combo_disable_activate (GTK_COMBO (useredit));
|
|
590 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (useredit)->entry), "");
|
|
591 gtk_box_pack_start (GTK_BOX (box), useredit, TRUE, TRUE, 0);
|
|
592
|
|
593 tempwid = gtk_label_new (_("Pass: "));
|
|
594 gtk_box_pack_start (GTK_BOX (box), tempwid, FALSE, FALSE, 0);
|
|
595
|
|
596 passedit = gtk_entry_new ();
|
|
597 gtk_widget_set_size_request (passedit, 55, -1);
|
|
598
|
|
599 gtk_entry_set_visibility (GTK_ENTRY (passedit), FALSE);
|
|
600 gtk_signal_connect (GTK_OBJECT (passedit), "activate",
|
|
601 GTK_SIGNAL_FUNC (toolbar_hostedit), NULL);
|
|
602 gtk_box_pack_start (GTK_BOX (box), passedit, FALSE, FALSE, 0);
|
|
603
|
|
604 tempwid = gtk_vbox_new (FALSE, 0);
|
|
605 gtk_box_pack_start (GTK_BOX (box), tempwid, FALSE, FALSE, 0);
|
|
606
|
|
607 optionmenu = gtk_option_menu_new ();
|
|
608 gtk_box_pack_start (GTK_BOX (tempwid), optionmenu, TRUE, FALSE, 0);
|
|
609
|
|
610 num = 0;
|
|
611 protocol_menu = gtk_menu_new ();
|
|
612 for (i = 0; gftp_protocols[i].name; i++)
|
|
613 {
|
|
614 if (!gftp_protocols[i].shown)
|
|
615 continue;
|
|
616
|
|
617 if (strcmp (gftp_protocols[i].name, default_protocol) == 0)
|
|
618 num = i;
|
|
619
|
|
620 tempwid = gtk_menu_item_new_with_label (gftp_protocols[i].name);
|
|
621 gtk_object_set_user_data (GTK_OBJECT (tempwid), (gpointer) i);
|
|
622 gtk_menu_append (GTK_MENU (protocol_menu), tempwid);
|
|
623 gtk_widget_show (tempwid);
|
|
624 }
|
|
625 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), protocol_menu);
|
|
626 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), num);
|
|
627
|
|
628 tempwid = toolbar_pixmap (parent, "stop.xpm");
|
|
629 stop_btn = gtk_button_new ();
|
|
630 gtk_container_add (GTK_CONTAINER (stop_btn), tempwid);
|
|
631 gtk_widget_set_sensitive (stop_btn, 0);
|
|
632 gtk_signal_connect_object (GTK_OBJECT (stop_btn), "clicked",
|
|
633 GTK_SIGNAL_FUNC (stop_button), NULL);
|
|
634 gtk_container_border_width (GTK_CONTAINER (stop_btn), 1);
|
|
635 gtk_box_pack_start (GTK_BOX (box), stop_btn, FALSE, FALSE, 0);
|
|
636
|
|
637 return (toolbar);
|
|
638 }
|
|
639
|
|
640
|
|
641 static void
|
|
642 doexit (GtkWidget * widget, gpointer data)
|
|
643 {
|
|
644 listbox_local_width = GTK_WIDGET (local_frame)->allocation.width;
|
|
645 listbox_remote_width = GTK_WIDGET (remote_frame)->allocation.width;
|
|
646 listbox_file_height = GTK_WIDGET (remote_frame)->allocation.height;
|
|
647 log_height = GTK_WIDGET (log_table)->allocation.height;
|
|
648 transfer_height = GTK_WIDGET (transfer_scroll)->allocation.height;
|
|
649
|
|
650 local_columns[0] = get_column (>K_CLIST (window1.listbox)->column[1]);
|
|
651 local_columns[1] = get_column (>K_CLIST (window1.listbox)->column[2]);
|
|
652 local_columns[2] = get_column (>K_CLIST (window1.listbox)->column[3]);
|
|
653 local_columns[3] = get_column (>K_CLIST (window1.listbox)->column[4]);
|
|
654 local_columns[4] = get_column (>K_CLIST (window1.listbox)->column[5]);
|
|
655 local_columns[5] = get_column (>K_CLIST (window1.listbox)->column[6]);
|
|
656
|
|
657 remote_columns[0] = get_column (>K_CLIST (window2.listbox)->column[1]);
|
|
658 remote_columns[1] = get_column (>K_CLIST (window2.listbox)->column[2]);
|
|
659 remote_columns[2] = get_column (>K_CLIST (window2.listbox)->column[3]);
|
|
660 remote_columns[3] = get_column (>K_CLIST (window2.listbox)->column[4]);
|
|
661 remote_columns[4] = get_column (>K_CLIST (window2.listbox)->column[5]);
|
|
662 remote_columns[5] = get_column (>K_CLIST (window2.listbox)->column[6]);
|
|
663
|
|
664 file_trans_column = get_column (>K_CLIST (dlwdw)->column[0]);
|
|
665
|
|
666 gftp_write_config_file ();
|
|
667 gftp_clear_cache_files ();
|
|
668 exit (0);
|
|
669 }
|
|
670
|
|
671
|
|
672 static int
|
|
673 get_column (GtkCListColumn * col)
|
|
674 {
|
|
675 if (col->auto_resize)
|
|
676 return (0);
|
|
677 else if (!col->visible)
|
|
678 return (-1);
|
|
679 else
|
|
680 return (col->width);
|
|
681 }
|
|
682
|
|
683
|
|
684 void
|
|
685 init_gftp (int argc, char *argv[], GtkWidget * parent)
|
|
686 {
|
|
687 GtkWidget *sort_wid;
|
|
688
|
|
689 if (window1.sortasds)
|
|
690 sort_wid = toolbar_pixmap (parent, "down.xpm");
|
|
691 else
|
|
692 sort_wid = toolbar_pixmap (parent, "up.xpm");
|
|
693 gtk_clist_set_column_widget (GTK_CLIST (window1.listbox), 0, sort_wid);
|
|
694
|
|
695 if (window2.sortasds)
|
|
696 sort_wid = toolbar_pixmap (parent, "down.xpm");
|
|
697 else
|
|
698 sort_wid = toolbar_pixmap (parent, "up.xpm");
|
|
699 gtk_clist_set_column_widget (GTK_CLIST (window2.listbox), 0, sort_wid);
|
|
700
|
|
701 if (argc == 2 && strncmp (argv[1], "--", 2) != 0)
|
|
702 {
|
|
703 if (gftp_parse_url (window2.request, argv[1]) == 0)
|
|
704 ftp_connect (&window2, window2.request, 1);
|
|
705 else
|
|
706 gftp_usage ();
|
|
707 }
|
|
708 }
|
|
709
|
|
710
|
|
711 static void
|
|
712 menu_exit (GtkWidget * widget, gpointer data)
|
|
713 {
|
|
714 if (!delete_event (widget, NULL, data))
|
|
715 doexit (widget, data);
|
|
716 }
|
|
717
|
|
718
|
|
719 static GtkWidget *
|
|
720 CreateFTPWindow (gftp_window_data * wdata, int width, int columns[6])
|
|
721 {
|
|
722 const GtkTargetEntry possible_types[] = {
|
|
723 {"STRING", 0, 0},
|
|
724 {"text/plain", 0, 0},
|
|
725 {"application/x-rootwin-drop", 0, 1}
|
|
726 };
|
|
727 GtkWidget *box, *scroll_list, *parent;
|
|
728 char *titles[7];
|
|
729
|
|
730 titles[0] = "";
|
|
731 titles[1] = _("Filename");
|
|
732 titles[2] = _("Size");
|
|
733 titles[3] = _("User");
|
|
734 titles[4] = _("Group");
|
|
735 titles[5] = _("Date");
|
|
736 titles[6] = _("Attribs");
|
|
737
|
|
738 wdata->request = gftp_request_new ();
|
|
739 wdata->request->logging_function = ftp_log;
|
|
740 wdata->filespec = g_malloc0 (2);
|
|
741 *wdata->filespec = '*';
|
|
742 wdata->sortcol = 1;
|
|
743 wdata->sortasds = 1;
|
|
744
|
|
745 parent = gtk_frame_new (NULL);
|
|
746 gtk_widget_set_size_request (parent, width, listbox_file_height);
|
|
747
|
|
748 gtk_container_border_width (GTK_CONTAINER (parent), 5);
|
|
749
|
|
750 box = gtk_vbox_new (FALSE, 0);
|
|
751 gtk_container_border_width (GTK_CONTAINER (box), 5);
|
|
752 gtk_container_add (GTK_CONTAINER (parent), box);
|
|
753
|
|
754 wdata->combo = gtk_combo_new ();
|
|
755 gtk_combo_set_case_sensitive (GTK_COMBO (wdata->combo), 1);
|
|
756 gtk_box_pack_start (GTK_BOX (box), wdata->combo, FALSE, FALSE, 0);
|
|
757 gtk_signal_connect (GTK_OBJECT (GTK_COMBO (wdata->combo)->entry),
|
|
758 "activate", GTK_SIGNAL_FUNC (chdir_edit),
|
|
759 (gpointer) wdata);
|
|
760 if (*wdata->history)
|
|
761 gtk_combo_set_popdown_strings (GTK_COMBO (wdata->combo), *wdata->history);
|
|
762 gtk_combo_disable_activate (GTK_COMBO (wdata->combo));
|
|
763 gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (wdata->combo)->entry), "");
|
|
764
|
|
765 wdata->hoststxt = gtk_label_new (NULL);
|
|
766 gtk_misc_set_alignment (GTK_MISC (wdata->hoststxt), 0, 0);
|
|
767 gtk_box_pack_start (GTK_BOX (box), wdata->hoststxt, FALSE, FALSE, 0);
|
|
768
|
|
769 scroll_list = gtk_scrolled_window_new (NULL, NULL);
|
|
770 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_list),
|
|
771 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
|
772 wdata->listbox = gtk_clist_new_with_titles (7, titles);
|
|
773 gtk_container_add (GTK_CONTAINER (scroll_list), wdata->listbox);
|
|
774 gtk_drag_source_set (wdata->listbox, GDK_BUTTON1_MASK, possible_types, 3,
|
|
775 GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
|
776 gtk_drag_dest_set (wdata->listbox, GTK_DEST_DEFAULT_ALL, possible_types, 2,
|
|
777 GDK_ACTION_COPY | GDK_ACTION_MOVE);
|
|
778
|
|
779 gtk_clist_set_selection_mode (GTK_CLIST (wdata->listbox),
|
|
780 GTK_SELECTION_EXTENDED);
|
|
781
|
|
782 gtk_clist_set_column_width (GTK_CLIST (wdata->listbox), 0, 16);
|
|
783 gtk_clist_set_column_justification (GTK_CLIST (wdata->listbox), 0,
|
|
784 GTK_JUSTIFY_CENTER);
|
|
785 setup_column (wdata->listbox, 1, columns[0]);
|
|
786 gtk_clist_set_column_justification (GTK_CLIST (wdata->listbox), 2,
|
|
787 GTK_JUSTIFY_RIGHT);
|
|
788 setup_column (wdata->listbox, 2, columns[1]);
|
|
789 setup_column (wdata->listbox, 3, columns[2]);
|
|
790 setup_column (wdata->listbox, 4, columns[3]);
|
|
791 setup_column (wdata->listbox, 5, columns[4]);
|
|
792 setup_column (wdata->listbox, 6, columns[5]);
|
|
793 gtk_box_pack_start (GTK_BOX (box), scroll_list, TRUE, TRUE, 0);
|
|
794 gtk_signal_connect (GTK_OBJECT (wdata->listbox), "click_column",
|
|
795 GTK_SIGNAL_FUNC (sortrows), (gpointer) wdata);
|
|
796 gtk_signal_connect (GTK_OBJECT (wdata->listbox), "drag_data_get",
|
|
797 GTK_SIGNAL_FUNC (listbox_drag), (gpointer) wdata);
|
|
798 gtk_signal_connect (GTK_OBJECT (wdata->listbox), "drag_data_received",
|
|
799 GTK_SIGNAL_FUNC (listbox_get_drag_data),
|
|
800 (gpointer) wdata);
|
|
801 gtk_signal_connect_after (GTK_OBJECT (wdata->listbox), "key_press_event",
|
|
802 GTK_SIGNAL_FUNC (list_enter), (gpointer) wdata);
|
|
803 #if GTK_MAJOR_VERSION == 1 && GTK_MINOR_VERSION == 2
|
|
804 gtk_signal_connect_after (GTK_OBJECT (wdata->listbox), "button_press_event",
|
|
805 GTK_SIGNAL_FUNC (list_dblclick), (gpointer) wdata);
|
|
806 #else
|
|
807 g_signal_connect_after (G_OBJECT (wdata->listbox), "button_release_event",
|
|
808 G_CALLBACK (list_dblclick), (gpointer) wdata);
|
|
809 #endif
|
|
810 return (parent);
|
|
811 }
|
|
812
|
|
813
|
|
814 static void
|
|
815 setup_column (GtkWidget * listbox, int column, int width)
|
|
816 {
|
|
817 if (width == 0)
|
|
818 gtk_clist_set_column_auto_resize (GTK_CLIST (listbox), column, TRUE);
|
|
819 else if (width == -1)
|
|
820 gtk_clist_set_column_visibility (GTK_CLIST (listbox), column, FALSE);
|
|
821 else
|
|
822 gtk_clist_set_column_width (GTK_CLIST (listbox), column, width);
|
|
823 }
|
|
824
|
|
825
|
|
826 static gint
|
|
827 menu_mouse_click (GtkWidget * widget, GdkEventButton * event, gpointer data)
|
|
828 {
|
|
829 GtkItemFactory *factory;
|
|
830
|
|
831 factory = (GtkItemFactory *) data;
|
|
832 if (event->button == 3)
|
|
833 gtk_item_factory_popup (factory, (guint) event->x_root,
|
|
834 (guint) event->y_root, 3, event->time);
|
|
835 return (FALSE);
|
|
836 }
|
|
837
|
|
838
|
|
839 static gint
|
|
840 list_dblclick (GtkWidget * widget, GdkEventButton * event, gpointer data)
|
|
841 {
|
|
842 gftp_window_data * wdata;
|
|
843
|
|
844 wdata = data;
|
|
845 if (event->button == 3)
|
|
846 gtk_item_factory_popup (wdata->ifactory, (guint) event->x_root,
|
|
847 (guint) event->y_root, 3, event->time);
|
|
848 else if (!GFTP_IS_CONNECTED (wdata->request) || !IS_ONE_SELECTED (wdata))
|
|
849 return (TRUE);
|
|
850
|
|
851 #if GTK_MAJOR_VERSION == 1 && GTK_MINOR_VERSION == 2
|
|
852 if (event->type == GDK_2BUTTON_PRESS && event->button == 1)
|
|
853 {
|
|
854 list_doaction (wdata);
|
|
855 return (FALSE);
|
|
856 }
|
|
857 return (TRUE);
|
|
858 #else
|
|
859 /* If we're using GTK 2.0, if I connect to the button_press_event signal,
|
|
860 whenever I get the GDK_2BUTTON_PRESS event, nothing is selected inside
|
|
861 the clist. But if I connect_after to the button_release_event, it seems
|
|
862 to only get called when we double click */
|
|
863 if (event->button == 1)
|
|
864 {
|
|
865 list_doaction (wdata);
|
|
866 return (FALSE);
|
|
867 }
|
|
868 return (TRUE);
|
|
869 #endif
|
|
870 }
|
|
871
|
|
872
|
|
873 static void
|
|
874 list_doaction (gftp_window_data * wdata)
|
|
875 {
|
|
876 GList *templist, *filelist;
|
|
877 int num, dir, success;
|
|
878 gftp_file *tempfle;
|
|
879
|
|
880 filelist = g_list_first (wdata->files);
|
|
881 templist = GTK_CLIST (wdata->listbox)->selection;
|
|
882 num = 0;
|
|
883 templist = get_next_selection (templist, &filelist, &num);
|
|
884 tempfle = (gftp_file *) filelist->data;
|
|
885
|
|
886 dir = tempfle->isdir;
|
|
887 success = 0;
|
|
888
|
|
889 if (tempfle->islink || tempfle->isdir)
|
|
890 success = chdir_dialog (wdata);
|
|
891
|
|
892 if (!dir && !success)
|
|
893 {
|
|
894 switch (listbox_dblclick_action)
|
|
895 {
|
|
896 case 0:
|
|
897 view_dialog (wdata);
|
|
898 break;
|
|
899 case 1:
|
|
900 edit_dialog (wdata);
|
|
901 break;
|
|
902 case 2:
|
|
903 if (wdata == &window2)
|
|
904 get_files (wdata);
|
|
905 else
|
|
906 put_files (wdata);
|
|
907 break;
|
|
908 }
|
|
909 }
|
|
910 }
|
|
911
|
|
912
|
|
913 static gint
|
|
914 list_enter (GtkWidget * widget, GdkEventKey * event, gpointer data)
|
|
915 {
|
|
916 gftp_window_data * wdata;
|
|
917
|
|
918 wdata = data;
|
|
919 if (!GFTP_IS_CONNECTED (wdata->request))
|
|
920 return (TRUE);
|
|
921
|
|
922 if (event->type == GDK_KEY_PRESS &&
|
|
923 (event->keyval == GDK_KP_Delete || event->keyval == GDK_Delete))
|
|
924 {
|
|
925 delete_dialog (wdata);
|
|
926 return (FALSE);
|
|
927 }
|
|
928 else if (IS_ONE_SELECTED (wdata) && event->type == GDK_KEY_PRESS &&
|
|
929 event->keyval == GDK_Return)
|
|
930 {
|
|
931 list_doaction (wdata);
|
|
932 return (FALSE);
|
|
933 }
|
|
934 return (TRUE);
|
|
935 }
|
|
936
|
|
937
|
|
938 static void
|
|
939 chfunc (gpointer data)
|
|
940 {
|
|
941 chdir_dialog (data);
|
|
942 }
|
|
943
|
|
944
|
|
945 void
|
|
946 toolbar_hostedit (GtkWidget * widget, gpointer data)
|
|
947 {
|
|
948 void (*init) (gftp_request * request);
|
|
949 GtkWidget *tempwid;
|
|
950 const char *txt;
|
|
951 int num;
|
|
952
|
|
953 if (current_wdata->request->stopable)
|
|
954 {
|
|
955 ftp_log (gftp_logging_misc, NULL,
|
|
956 _("%s: Please hit the stop button first to do anything else\n"),
|
|
957 _("Connect"));
|
|
958 return;
|
|
959 }
|
|
960
|
|
961 if (GFTP_IS_CONNECTED (current_wdata->request))
|
|
962 disconnect (current_wdata);
|
|
963
|
|
964 tempwid = gtk_menu_get_active (GTK_MENU (protocol_menu));
|
|
965 num = (int) gtk_object_get_user_data (GTK_OBJECT (tempwid));
|
|
966 init = gftp_protocols[num].init;
|
|
967 init (current_wdata->request);
|
|
968
|
|
969 gftp_set_hostname (current_wdata->request, gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (hostedit)->entry)));
|
|
970 alltrim (current_wdata->request->hostname);
|
|
971
|
|
972 if (current_wdata->request->need_hostport &&
|
|
973 *current_wdata->request->hostname == '\0')
|
|
974 {
|
|
975 ftp_log (gftp_logging_error, NULL,
|
|
976 _("Error: You must type in a host to connect to\n"));
|
|
977 return;
|
|
978 }
|
|
979
|
|
980 add_history (hostedit, &host_history, &host_len,
|
|
981 current_wdata->request->hostname);
|
|
982
|
|
983 if (strchr (current_wdata->request->hostname, '/') != NULL &&
|
|
984 gftp_parse_url (current_wdata->request,
|
|
985 current_wdata->request->hostname) == 0)
|
|
986 {
|
|
987 ftp_connect (current_wdata, current_wdata->request, 1);
|
|
988 return;
|
|
989 }
|
|
990
|
|
991 txt = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (portedit)->entry));
|
|
992 gftp_set_port (current_wdata->request, strtol (txt, NULL, 10));
|
|
993 add_history (portedit, &port_history, &port_len, txt);
|
|
994
|
|
995 gftp_set_username (current_wdata->request, gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (useredit)->entry)));
|
|
996 alltrim (current_wdata->request->username);
|
|
997
|
|
998 add_history (useredit, &user_history, &user_len,
|
|
999 current_wdata->request->username);
|
|
1000
|
|
1001 gftp_set_password (current_wdata->request,
|
|
1002 gtk_entry_get_text (GTK_ENTRY (passedit)));
|
|
1003
|
|
1004 gftp_set_directory (current_wdata->request, gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (current_wdata->combo)->entry)));
|
|
1005 alltrim (current_wdata->request->directory);
|
|
1006
|
|
1007 add_history (current_wdata->combo, current_wdata->history,
|
|
1008 current_wdata->histlen, current_wdata->request->directory);
|
|
1009
|
|
1010 ftp_connect (current_wdata, current_wdata->request, 1);
|
|
1011 }
|
|
1012
|
|
1013
|
|
1014 void
|
|
1015 sortrows (GtkCList * clist, gint column, gpointer data)
|
|
1016 {
|
|
1017 GList *templist, *curlist, *files, *dirs, *dotdot;
|
|
1018 gftp_file * tempfle, * curfle;
|
|
1019 gftp_window_data * wdata;
|
|
1020 GtkWidget *sort_wid;
|
|
1021 int sortdir, pos;
|
|
1022
|
|
1023 wdata = data;
|
|
1024 if (wdata->files == NULL)
|
|
1025 return;
|
|
1026
|
|
1027 if (!check_status (_("Sort"), wdata, 0, 0, 0, 1))
|
|
1028 return;
|
|
1029
|
|
1030 gtk_label_set (GTK_LABEL (wdata->hoststxt), _("Sorting..."));
|
|
1031 fix_display ();
|
|
1032
|
|
1033 curlist = wdata->files;
|
|
1034 templist = GTK_CLIST (wdata->listbox)->selection;
|
|
1035 pos = 0;
|
|
1036 while (curlist != NULL && templist != NULL)
|
|
1037 {
|
|
1038 templist = get_next_selection (templist, &curlist, &pos);
|
|
1039 tempfle = curlist->data;
|
|
1040 tempfle->was_sel = 1;
|
|
1041 }
|
|
1042
|
|
1043 if (column == 0 || (column == wdata->sortcol && wdata->sorted))
|
|
1044 {
|
|
1045 wdata->sortasds = !wdata->sortasds;
|
|
1046 column = wdata->sortcol;
|
|
1047 sort_wid = gtk_clist_get_column_widget (clist, 0);
|
|
1048 gtk_widget_destroy (sort_wid);
|
|
1049 if (wdata->sortasds)
|
|
1050 sort_wid = toolbar_pixmap (wdata->listbox, "down.xpm");
|
|
1051 else
|
|
1052 sort_wid = toolbar_pixmap (wdata->listbox, "up.xpm");
|
|
1053 gtk_clist_set_column_widget (clist, 0, sort_wid);
|
|
1054 }
|
|
1055 else
|
|
1056 wdata->sortcol = column;
|
|
1057 sortdir = wdata->sortasds;
|
|
1058 dirs = files = dotdot = NULL;
|
|
1059 while (wdata->files != NULL)
|
|
1060 {
|
|
1061 curlist = wdata->files;
|
|
1062 curfle = curlist->data;
|
|
1063 wdata->files = g_list_remove_link (wdata->files, curlist);
|
|
1064 if (strcmp (curfle->file, "..") == 0)
|
|
1065 {
|
|
1066 dotdot = curlist;
|
|
1067 continue;
|
|
1068 }
|
|
1069 templist = sort_dirs_first && curfle->isdir ? dirs : files;
|
|
1070 pos = 0;
|
|
1071 tempfle = NULL;
|
|
1072 if (column == 1)
|
|
1073 {
|
|
1074 while (templist != NULL && (tempfle = templist->data)
|
|
1075 && (sortdir ? strcmp (tempfle->file, curfle->file) <=
|
|
1076 0 : strcmp (tempfle->file, curfle->file) >= 0))
|
|
1077 {
|
|
1078 pos++;
|
|
1079 templist = templist->next;
|
|
1080 }
|
|
1081 }
|
|
1082 else if (column == 2)
|
|
1083 {
|
|
1084 while (templist != NULL && (tempfle = templist->data)
|
|
1085 && (sortdir ? tempfle->size <=
|
|
1086 curfle->size : tempfle->size >= curfle->size))
|
|
1087 {
|
|
1088 pos++;
|
|
1089 templist = templist->next;
|
|
1090 }
|
|
1091 }
|
|
1092 else if (column == 3)
|
|
1093 {
|
|
1094 while (templist != NULL && (tempfle = templist->data)
|
|
1095 && (sortdir ? strcmp (tempfle->user, curfle->user) <=
|
|
1096 0 : strcmp (tempfle->user, curfle->user) >= 0))
|
|
1097 {
|
|
1098 pos++;
|
|
1099 templist = templist->next;
|
|
1100 }
|
|
1101 }
|
|
1102 else if (column == 4)
|
|
1103 {
|
|
1104 while (templist != NULL && (tempfle = templist->data)
|
|
1105 && (sortdir ? strcmp (tempfle->group, curfle->group) <=
|
|
1106 0 : strcmp (tempfle->group, curfle->group) >= 0))
|
|
1107 {
|
|
1108 pos++;
|
|
1109 templist = templist->next;
|
|
1110 }
|
|
1111 }
|
|
1112 else if (column == 5)
|
|
1113 {
|
|
1114 while (templist != NULL && (tempfle = templist->data)
|
|
1115 && (sortdir ? tempfle->datetime <=
|
|
1116 curfle->datetime : tempfle->datetime >= curfle->datetime))
|
|
1117 {
|
|
1118 pos++;
|
|
1119 templist = templist->next;
|
|
1120 }
|
|
1121 }
|
|
1122 else if (column == 6)
|
|
1123 {
|
|
1124 while (templist != NULL && (tempfle = templist->data)
|
|
1125 && (sortdir ? strcmp (tempfle->attribs, curfle->attribs) <=
|
|
1126 0 : strcmp (tempfle->attribs, curfle->attribs) >= 0))
|
|
1127 {
|
|
1128 pos++;
|
|
1129 templist = templist->next;
|
|
1130 }
|
|
1131 }
|
|
1132 if (sort_dirs_first && curfle->isdir)
|
|
1133 dirs = g_list_insert (dirs, curfle, pos);
|
|
1134 else
|
|
1135 files = g_list_insert (files, curfle, pos);
|
|
1136 }
|
|
1137
|
|
1138 gtk_clist_freeze (clist);
|
|
1139 gtk_clist_clear (clist);
|
|
1140 wdata->files = NULL;
|
|
1141 if (dotdot != NULL)
|
|
1142 {
|
|
1143 dotdot->next = NULL;
|
|
1144 wdata->files = dotdot;
|
|
1145 add_file_listbox (wdata, dotdot->data);
|
|
1146 }
|
|
1147
|
|
1148 templist = NULL;
|
|
1149 if (dirs != NULL)
|
|
1150 {
|
|
1151 if (wdata->files != NULL)
|
|
1152 {
|
|
1153 wdata->files->next = dirs;
|
|
1154 dirs->prev = wdata->files;
|
|
1155 }
|
|
1156 else
|
|
1157 wdata->files = dirs;
|
|
1158
|
|
1159 templist = dirs;
|
|
1160 while (templist->next != NULL)
|
|
1161 {
|
|
1162 add_file_listbox (wdata, templist->data);
|
|
1163 templist = templist->next;
|
|
1164 }
|
|
1165 add_file_listbox (wdata, templist->data);
|
|
1166 }
|
|
1167
|
|
1168 if (files != NULL)
|
|
1169 {
|
|
1170 if (templist != NULL)
|
|
1171 {
|
|
1172 templist->next = files;
|
|
1173 files->prev = templist;
|
|
1174 }
|
|
1175 else if (wdata->files != NULL)
|
|
1176 {
|
|
1177 wdata->files->next = files;
|
|
1178 files->prev = wdata->files;
|
|
1179 }
|
|
1180 else
|
|
1181 wdata->files = files;
|
|
1182
|
|
1183 templist = files;
|
|
1184 while (templist != NULL)
|
|
1185 {
|
|
1186 add_file_listbox (wdata, templist->data);
|
|
1187 templist = templist->next;
|
|
1188 }
|
|
1189 }
|
|
1190
|
|
1191 wdata->sorted = 1;
|
|
1192 gtk_clist_thaw (clist);
|
|
1193 update_window_info ();
|
|
1194 }
|
|
1195
|
|
1196
|
|
1197 void
|
|
1198 stop_button (GtkWidget * widget, gpointer data)
|
|
1199 {
|
|
1200 pthread_t comptid;
|
|
1201
|
|
1202 memset (&comptid, 0, sizeof (comptid));
|
|
1203 if (!pthread_equal (comptid, window1.tid))
|
|
1204 pthread_kill (window1.tid, SIGINT);
|
|
1205 else if (!pthread_equal (comptid, window2.tid))
|
|
1206 pthread_kill (window2.tid, SIGINT);
|
|
1207 }
|
|
1208
|