📄 log.cc
字号:
/* WebDownloader for X-Window * Copyright (C) 1999-2002 Koshelev Maxim * This Program is free but not GPL!!! You can't modify it * without agreement with author. You can't distribute modified * program but you can distribute unmodified program. * * 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. */#include <stdio.h>#include <gtk/gtk.h>#include <gdk/gdkkeysyms.h>#include <pthread.h>#include <string.h>#include "../dlist.h"#include "../locstr.h"#include "../var.h"#include "../ntlocale.h"#include "list.h"#include "colors.h"#include "about.h"#include "misc.h"enum LOG_COLUMNS{ L_COL_TYPE, L_COL_NUM, L_COL_TIME, L_COL_STRING, L_COL_LAST};GdkPixbuf *log_pixbufs[5];struct tLogWindow { GtkWidget *window; GtkTreeView *view; GtkAdjustment *adj; GtkWidget *button; GtkWidget *toolbar; GtkWidget *label; tDownload *papa; // :)) tDownload *current; float value; tStringDialog *string; tLogWindow(); ~tLogWindow();};tLogWindow::tLogWindow() { string=(tStringDialog *)NULL;};tLogWindow::~tLogWindow() { if (string) delete string;};gint log_window_button(GtkWidget *button,int a);void init_pixmaps_for_log() {#include "pixmaps2/ok.xpm"#include "pixmaps2/from_server.xpm"#include "pixmaps2/to_server.xpm"#include "pixmaps2/error.xpm"#include "pixmaps2/warning.xpm" log_pixbufs[0]=gdk_pixbuf_new_from_xpm_data((const char **)ok_xpm); log_pixbufs[1]=gdk_pixbuf_new_from_xpm_data((const char **)to_server_xpm); log_pixbufs[2]=gdk_pixbuf_new_from_xpm_data((const char **)from_server_xpm); log_pixbufs[3]=gdk_pixbuf_new_from_xpm_data((const char **)error_xpm); log_pixbufs[4]=gdk_pixbuf_new_from_xpm_data((const char **)warning_xpm);};void log_window_remember_geometry(GtkWidget *window, tLogWindow *temp){ if (window->window) { int a[4]; gdk_window_get_root_origin(window->window,&a[0],&a[1]); gdk_window_get_size(window->window,&a[2],&a[3]); if (temp->papa && temp->papa->LOG) temp->papa->LOG->store_geometry(a); };};void log_window_destroy_by_log(void *a) { tLog *log=(tLog *) a; if (log==NULL) return; tLogWindow *temp=(tLogWindow *)log->Window; if (temp) { log->Window=NULL; log_window_remember_geometry(temp->window,temp); temp->papa->CurrentLog=temp->papa->LOG; gtk_widget_destroy(GTK_WIDGET(temp->window)); delete (temp); };};int log_window_destroy(GtkWidget *window,GdkEvent *event, tLog *log) { if (log) { tLogWindow *temp=(tLogWindow *)log->Window; if (temp) { temp->papa->CurrentLog=NULL; log->Window=NULL; log_window_remember_geometry(window,temp); gtk_widget_destroy(GTK_WIDGET(window)); delete (temp); }; }; return TRUE;};void log_window_add_string(tLog *log,tLogString *str) { tLogWindow *temp=(tLogWindow *)log->Window; if (!temp) return; char useful[MAX_LEN+1]; struct tm msgtime; localtime_r(&(str->time),&msgtime); strftime(useful,MAX_LEN,"%T",&msgtime); /* replace all nonprint symbols by space */ char *str_temp=copy_string(str->body); str_non_print_replace(str_temp,' '); GtkTreeIter iter; GtkListStore *list_store=GTK_LIST_STORE(gtk_tree_view_get_model(temp->view)); gtk_list_store_append(list_store, &iter); gtk_list_store_set(list_store, &iter, L_COL_NUM,str->temp, L_COL_TIME,useful, L_COL_STRING,str_temp, -1); delete[] str_temp; const GdkColor *color,*back_color; switch (str->type) { case LOG_OK:{ gtk_list_store_set(list_store,&iter,L_COL_TYPE,log_pixbufs[0],-1); color=&BLACK; back_color=&WHITE; break; }; case LOG_TO_SERVER: { gtk_list_store_set(list_store,&iter,L_COL_TYPE,log_pixbufs[1],-1); color=&CYAN; back_color=&LCYAN; break; }; case LOG_FROM_SERVER: { gtk_list_store_set(list_store,&iter,L_COL_TYPE,log_pixbufs[2],-1); color=&BLUE; back_color=&LBLUE; break; }; case LOG_WARNING:{ gtk_list_store_set(list_store,&iter,L_COL_TYPE,log_pixbufs[4],-1); color=&GREEN; back_color=&LGREEN; break; }; case LOG_ERROR: { gtk_list_store_set(list_store,&iter,L_COL_TYPE,log_pixbufs[3],-1); color=&RED; back_color=&LRED; break; }; default: color=&BLACK; back_color=&WHITE; }; gtk_list_store_set(list_store,&iter, L_COL_LAST,color, L_COL_LAST+1,back_color, -1);};static gint log_list_event_handler(GtkWidget *widget,GdkEventButton *event,tLogWindow *temp) { if (temp && event && event->type==GDK_2BUTTON_PRESS && event->button==1 && temp->papa) { GtkTreeSelection *sel=gtk_tree_view_get_selection(temp->view); GtkTreeIter iter; if (!gtk_tree_selection_get_selected(sel,NULL,&iter)) return FALSE; if (temp->string==NULL) temp->string=new tStringDialog; GValue val={0,}; GtkTreeModel *model=gtk_tree_view_get_model(temp->view); gtk_tree_model_get_value(model,&iter,L_COL_NUM,&val); int num=g_value_get_int(&val); char data[MAX_LEN]; char *rfile=unparse_percents(temp->papa->info->file.get()); sprintf(data,_("Row number %i [log of %s]"),num,rfile); delete[] rfile; g_value_unset(&val); gtk_tree_model_get_value(model,&iter,L_COL_STRING,&val); char *text=(char*)g_value_get_string(&val);/* int err_code=0;//GPOINTER_TO_INT(gtk_clist_get_row_data(GTK_CLIST(temp->clist),row)); char *error_name=NULL; switch(err_code){ case LOG_ERROR: error_name=_("Erorr!"); break; case LOG_WARNING: error_name=_("Warning!"); break; case LOG_TO_SERVER: error_name=_("Message to server"); break; case LOG_FROM_SERVER: error_name=_("Message from server"); break; default: case LOG_OK: error_name=_("All ok"); break; };*/ temp->string->init(text,data,""); g_value_unset(&val); return TRUE; }; return FALSE;};static void my_gtk_auto_scroll( GtkAdjustment *get,tLogWindow *temp){ if (get==NULL || temp==NULL) return; if (temp->value==get->value && get->value<get->upper-get->page_size) { get->value=get->upper-get->page_size; temp->value=get->value; g_signal_emit_by_name(G_OBJECT (get), "value_changed"); } else temp->value=get->value;}gint log_window_button(GtkWidget *button,int a);static gint log_window_event_handler(GtkWidget *window,GdkEvent *event,tLog *log){ if (event && event->type == GDK_KEY_PRESS) { GdkEventKey *kevent=(GdkEventKey *)event; tLogWindow *wnd=(tLogWindow *)log->Window; int num=0; if (kevent->state & GDK_CONTROL_MASK){ switch(kevent->keyval) { case GDK_1: num=1; break; case GDK_2: num=2; break; case GDK_3: num=3; break; case GDK_4: num=4; break; case GDK_5: num=5; break; case GDK_6: num=6; break; case GDK_7: num=7; break; case GDK_8: num=8; break; case GDK_9: num=9; break; case GDK_0: num=10; break; }; }; if (num && wnd->toolbar){ GList *list=GTK_TOOLBAR(wnd->toolbar)->children; int a=1; while (list && num>a){ list=list->next; a++; }; if (list){ GtkToolbarChild *chld=(GtkToolbarChild*)list->data; if (GTK_IS_BUTTON(chld->widget)) g_signal_emit_by_name(G_OBJECT(chld->widget),"clicked",num); }; };
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -