📄 misc-gtk.c
字号:
/*****************************************************************************//* misc-gtk.c - misc stuff for the gtk+ 1.2 port of gftp *//* Copyright (C) 1998-2003 Brian Masney <masneyb@gftp.org> *//* *//* This program is free software; you can redistribute it and/or modify *//* it under the terms of the GNU General Public License as published by *//* the Free Software Foundation; either version 2 of the License, or *//* (at your option) any later version. *//* *//* This program is distributed in the hope that it will be useful, *//* but WITHOUT ANY WARRANTY; without even the implied warranty of *//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *//* GNU General Public License for more details. *//* *//* You should have received a copy of the GNU General Public License *//* along with this program; if not, write to the Free Software *//* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *//*****************************************************************************/#include "gftp-gtk.h"static const char cvsid[] = "$Id: misc-gtk.c,v 1.54 2004/11/05 03:27:23 masneyb Exp $";static GtkWidget * statuswid;voidremove_files_window (gftp_window_data * wdata){ wdata->show_selected = 0; gtk_clist_freeze (GTK_CLIST (wdata->listbox)); gtk_clist_clear (GTK_CLIST (wdata->listbox)); free_file_list (wdata->files); wdata->files = NULL; gtk_clist_thaw (GTK_CLIST (wdata->listbox));}voidftp_log (gftp_logging_level level, gftp_request * request, const char *string, ...){ uintptr_t max_log_window_size; int upd, free_logstr; gftp_log * newlog; gint delsize; char *logstr; va_list argp; size_t len;#if GTK_MAJOR_VERSION == 1 gftp_color * color; GdkColor fore;#else GtkTextBuffer * textbuf; GtkTextIter iter, iter2; const char *descr; char *utf8_str;#endif va_start (argp, string); if (strcmp (string, "%s") == 0) { logstr = va_arg (argp, char *); free_logstr = 0; } else { logstr = g_strdup_vprintf (string, argp); free_logstr = 1; } va_end (argp);#if GTK_MAJOR_VERSION > 1 if ((utf8_str = gftp_string_to_utf8 (request, logstr)) != NULL) { if (free_logstr) g_free (logstr); else free_logstr = 1; logstr = utf8_str; }#endif if (pthread_self () != main_thread_id) { newlog = g_malloc0 (sizeof (*newlog)); newlog->type = level; if (free_logstr) newlog->msg = logstr; else newlog->msg = g_strdup (logstr); pthread_mutex_lock (&log_mutex); gftp_file_transfer_logs = g_list_append (gftp_file_transfer_logs, newlog); pthread_mutex_unlock (&log_mutex); return; } if (gftp_logfd != NULL && level != gftp_logging_misc_nolog) { if (fwrite (logstr, strlen (logstr), 1, gftp_logfd) != 1) { fclose (gftp_logfd); gftp_logfd = NULL; } else { fflush (gftp_logfd); if (ferror (gftp_logfd)) { fclose (gftp_logfd); gftp_logfd = NULL; } } } upd = logwdw_vadj->upper - logwdw_vadj->page_size == logwdw_vadj->value; gftp_lookup_global_option ("max_log_window_size", &max_log_window_size);#if GTK_MAJOR_VERSION == 1 switch (level) { case gftp_logging_send: gftp_lookup_global_option ("send_color", &color); break; case gftp_logging_recv: gftp_lookup_global_option ("recv_color", &color); break; case gftp_logging_error: gftp_lookup_global_option ("error_color", &color); break; default: gftp_lookup_global_option ("misc_color", &color); break; } memset (&fore, 0, sizeof (fore)); fore.red = color->red; fore.green = color->green; fore.blue = color->blue; gtk_text_freeze (GTK_TEXT (logwdw)); gtk_text_insert (GTK_TEXT (logwdw), NULL, &fore, NULL, logstr, -1); len = gtk_text_get_length (GTK_TEXT (logwdw)); if (max_log_window_size > 0 && len > max_log_window_size) { delsize = len - max_log_window_size; gtk_text_set_point (GTK_TEXT (logwdw), delsize); gtk_text_backward_delete (GTK_TEXT (logwdw), delsize); len = max_log_window_size; } gtk_text_set_point (GTK_TEXT (logwdw), len); gtk_text_thaw (GTK_TEXT (logwdw)); if (upd) gtk_adjustment_set_value (logwdw_vadj, logwdw_vadj->upper);#else switch (level) { case gftp_logging_send: descr = "send"; break; case gftp_logging_recv: descr = "recv"; break; case gftp_logging_error: descr = "error"; break; default: descr = "misc"; break; } textbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logwdw)); len = gtk_text_buffer_get_char_count (textbuf); gtk_text_buffer_get_iter_at_offset (textbuf, &iter, len); gtk_text_buffer_insert_with_tags_by_name (textbuf, &iter, logstr, -1, descr, NULL); if (upd) { gtk_text_buffer_move_mark (textbuf, logwdw_textmark, &iter); gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (logwdw), logwdw_textmark, 0, 1, 1, 1); } if (max_log_window_size > 0) { delsize = len + g_utf8_strlen (logstr, -1) - max_log_window_size; if (delsize > 0) { gtk_text_buffer_get_iter_at_offset (textbuf, &iter, 0); gtk_text_buffer_get_iter_at_offset (textbuf, &iter2, delsize); gtk_text_buffer_delete (textbuf, &iter, &iter2); } }#endif if (free_logstr) g_free (logstr);}voidupdate_window_info (void){ char *tempstr, empty[] = ""; GtkWidget * tempwid; unsigned int port; int i; if (current_wdata->request != NULL) { if (GFTP_IS_CONNECTED (current_wdata->request)) { if ((tempstr = current_wdata->request->hostname) == NULL) tempstr = empty; gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (hostedit)->entry), tempstr); if ((tempstr = current_wdata->request->username) == NULL) tempstr = empty; gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (useredit)->entry), tempstr); if ((tempstr = current_wdata->request->password) == NULL) tempstr = empty; gtk_entry_set_text (GTK_ENTRY (passedit), tempstr); port = gftp_protocol_default_port (current_wdata->request); if (current_wdata->request->port != 0 && port != current_wdata->request->port) { tempstr = g_strdup_printf ("%d", current_wdata->request->port); gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (portedit)->entry), tempstr); g_free (tempstr); } else gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (portedit)->entry), ""); for (i=0; gftp_protocols[i].init != NULL; i++) { if (current_wdata->request->init == gftp_protocols[i].init) { gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), i); break; } } gtk_tooltips_set_tip (GTK_TOOLTIPS(openurl_tooltip), openurl_btn, _("Disconnect from the remote server"), NULL); } else gtk_tooltips_set_tip (GTK_TOOLTIPS(openurl_tooltip), openurl_btn, _("Connect to the site specified in the host entry. If the host entry is blank, then a dialog is presented that will allow you to enter a URL."), NULL); } update_window (&window1); update_window (&window2); tempwid = gtk_item_factory_get_widget (factory, menus[tools_start+2].path); gtk_widget_set_sensitive (tempwid, GFTP_IS_CONNECTED (window1.request) && GFTP_IS_CONNECTED (window2.request));}static voidset_menu_sensitive (gftp_window_data * wdata, char *path, int sensitive){ GtkWidget * tempwid; char * pos; tempwid = NULL; if (factory != NULL) tempwid = gtk_item_factory_get_widget (factory, path); if (tempwid) gtk_widget_set_sensitive (tempwid, sensitive); if (wdata != NULL) { if ((pos = strchr (path + 1, '/')) == NULL) pos = path; if (wdata->ifactory) tempwid = gtk_item_factory_get_widget (wdata->ifactory, pos); if (tempwid) gtk_widget_set_sensitive (tempwid, sensitive); }}voidupdate_window (gftp_window_data * wdata){ char *dir, *tempstr, *temp1str, *fspec, *utf8_directory; int connected, start; connected = GFTP_IS_CONNECTED (wdata->request); if (connected) { fspec = wdata->show_selected ? "Selected" : strcmp (wdata->filespec, "*") == 0 ? _("All Files") : wdata->filespec; if ((temp1str = wdata->request->hostname) == NULL || wdata->request->protonum == GFTP_LOCAL_NUM) temp1str = ""; tempstr = g_strconcat (temp1str, *temp1str == '\0' ? "[" : " [", gftp_protocols[wdata->request->protonum].name, wdata->request->cached ? _("] (Cached) [") : "] [", fspec, "]", current_wdata == wdata ? "*" : "", NULL); gtk_label_set (GTK_LABEL (wdata->hoststxt), tempstr); g_free (tempstr); utf8_directory = NULL; if ((dir = wdata->request->directory) == NULL) temp1str = ""; else { utf8_directory = gftp_string_to_utf8 (wdata->request, wdata->request->directory); if (utf8_directory != NULL) temp1str = utf8_directory; else temp1str = dir; } gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (wdata->combo)->entry),temp1str); if (utf8_directory != NULL) g_free (utf8_directory); } else if (wdata->hoststxt != NULL) { tempstr = g_strconcat (_("Not connected"), current_wdata == wdata ? "*" : "", NULL); gtk_label_set (GTK_LABEL (wdata->hoststxt), tempstr); g_free (tempstr); gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (wdata->combo)->entry), ""); } if (wdata == &window1) start = local_start; else start = remote_start; set_menu_sensitive (wdata, menus[start + 3].path, connected && strcmp (wdata->request->url_prefix, "file") != 0); set_menu_sensitive (wdata, menus[start + 5].path, connected); set_menu_sensitive (wdata, menus[start + 6].path, connected); set_menu_sensitive (wdata, menus[start + 7].path, connected); set_menu_sensitive (wdata, menus[start + 8].path, connected); set_menu_sensitive (wdata, menus[start + 9].path, connected); set_menu_sensitive (wdata, menus[start + 11].path, connected); set_menu_sensitive (wdata, menus[start + 12].path, connected && wdata->request->site != NULL); set_menu_sensitive (wdata, menus[start + 13].path, connected && wdata->request->chdir!= NULL); set_menu_sensitive (wdata, menus[start + 14].path, connected && wdata->request->chmod != NULL); set_menu_sensitive (wdata, menus[start + 15].path, connected && wdata->request->mkdir != NULL); set_menu_sensitive (wdata, menus[start + 16].path, connected && wdata->request->rename != NULL); set_menu_sensitive (wdata, menus[start + 17].path, connected && wdata->request->rmdir != NULL && wdata->request->rmfile != NULL); set_menu_sensitive (wdata, menus[start + 18].path, connected && wdata->request->get_file != NULL); set_menu_sensitive (wdata, menus[start + 19].path, connected && wdata->request->get_file != NULL); set_menu_sensitive (wdata, menus[start + 20].path, connected); connected = GFTP_IS_CONNECTED (window1.request) && GFTP_IS_CONNECTED (window2.request); start = trans_start; set_menu_sensitive (NULL, menus[start + 2].path, connected); set_menu_sensitive (NULL, menus[start + 3].path, connected); set_menu_sensitive (NULL, menus[start + 5].path, connected); set_menu_sensitive (NULL, menus[start + 6].path, connected); set_menu_sensitive (NULL, menus[start + 7].path, connected); set_menu_sensitive (NULL, menus[start + 8].path, connected); set_menu_sensitive (NULL, menus[start + 10].path, connected); set_menu_sensitive (NULL, menus[start + 11].path, connected); gtk_widget_set_sensitive (download_left_arrow, connected); gtk_widget_set_sensitive (upload_right_arrow, connected);} GtkWidget *toolbar_pixmap (GtkWidget * widget, char *filename){ gftp_graphic * graphic; GtkWidget *pix; if (filename == NULL || *filename == '\0') return (NULL); graphic = open_xpm (widget, filename); if (graphic == NULL) return (NULL); if ((pix = gtk_pixmap_new (graphic->pixmap, graphic->bitmap)) == NULL) return (NULL); gtk_widget_show (pix); return (pix);}gftp_graphic *open_xpm (GtkWidget * widget, char *filename){ gftp_graphic * graphic; GtkStyle *style; char *exfile; if ((graphic = g_hash_table_lookup (graphic_hash_table, filename)) != NULL) return (graphic); style = gtk_widget_get_style (widget); if ((exfile = get_xpm_path (filename, 0)) == NULL) return (NULL); graphic = g_malloc0 (sizeof (*graphic)); graphic->pixmap = gdk_pixmap_create_from_xpm (widget->window,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -