📄 log.cc
字号:
if (kevent->keyval==GDK_Escape){// g_signal_emit_by_name(G_OBJECT(window),"delete_event"); log_window_destroy_by_log(log); return TRUE; }; }; return FALSE;};void log_window_set_split_info(tDownload *what){ if (what && what->split && what->who && what->CurrentLog && what->CurrentLog->Window){ tLogWindow *temp=(tLogWindow *)what->CurrentLog->Window; if (temp && temp->current && temp->label){ fsize_t loaded=0,begin=0,size=0; if (temp->current->who) loaded=temp->current->who->get_readed(); if (temp->current->split){ size=temp->current->split->LastByte; begin=temp->current->split->FirstByte; }; char text[100]; if (temp->current->thread_id) sprintf(text," %lli-%lli (%lli)",begin,size,loaded); else sprintf(text," %lli-%lli (not active)",begin,size); gtk_label_set_text(GTK_LABEL(temp->label),text); }; };};gint log_window_button(GtkWidget *button,int a){ tDownload *what=(tDownload *)g_object_get_data(G_OBJECT(button),"d4x_user_data"); tDownload *withlog=what; while (withlog){ if (withlog->LOG->Window) break; withlog=withlog->split->next_part; }; if (what->split==NULL){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(((tLogWindow *)(withlog->LOG->Window))->button),TRUE); return FALSE; }; if (withlog==NULL || withlog->LOG->Window==NULL) return FALSE; tDownload *forlog=what; int b=a; while (forlog){ a-=1; if (a==0) break; forlog=forlog->split->next_part; }; if (forlog && forlog!=withlog && forlog->LOG!=NULL){ withlog->LOG->lock(); forlog->LOG->lock(); forlog->LOG->Window=withlog->LOG->Window; withlog->LOG->Window=NULL; withlog->LOG->unlock(); tLogWindow *temp=(tLogWindow *)(forlog->LOG->Window); temp->current=forlog; g_object_set_data(G_OBJECT(temp->window),"d4x_user_data",forlog->LOG); gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(temp->view))); forlog->LOG->print(); forlog->LOG->unlock(); what->LOG->last_log=b; what->CurrentLog=forlog->LOG; /* FIXME: signal_connect again???? */ g_signal_handlers_disconnect_matched(GTK_OBJECT(temp->window), G_SIGNAL_MATCH_DATA, 0,0,NULL,NULL, withlog->LOG); g_signal_connect(G_OBJECT(temp->window), "delete_event", (GtkSignalFunc)log_window_destroy, forlog->LOG); g_signal_connect(G_OBJECT(temp->window), "key_press_event", (GtkSignalFunc)log_window_event_handler, forlog->LOG); g_signal_emit_by_name(G_OBJECT (temp->adj), "changed"); log_window_set_split_info(temp->papa); }; if (forlog==NULL || forlog->LOG==NULL){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(((tLogWindow *)(withlog->LOG->Window))->button),TRUE); what->LOG->last_log=1; }; return TRUE;};void log_window_init(tDownload *what) { if (what) { if (what->LOG==NULL){ what->LOG=new tLog; what->LOG->init(CFG.MAX_LOG_LENGTH); what->LOG->ref_inc(); }; if (what->LOG->Window) { tLogWindow *temp=(tLogWindow *)what->LOG->Window; gtk_window_present(GTK_WINDOW(temp->window)); return; }else{ if (what->split){ tDownload *next_part=what->split->next_part; while (next_part){ if (next_part->LOG && next_part->LOG->Window){ tLogWindow *temp=(tLogWindow *)(next_part->LOG->Window); gtk_window_present(GTK_WINDOW(temp->window)); return; }; next_part=next_part->split->next_part; }; }; }; what->LOG->lock(); tLogWindow *temp=new tLogWindow; temp->papa=temp->current=what; temp->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_wmclass(GTK_WINDOW(temp->window), "D4X_Log","D4X"); int a[4]; what->LOG->get_geometry(a); if (a[3]!=0 && a[2]!=0){ gtk_window_move(GTK_WINDOW(temp->window), a[0], a[1]); gtk_window_set_default_size( GTK_WINDOW (temp->window), a[2], a[3]); }; gtk_widget_set_size_request( GTK_WIDGET (temp->window), 400, 200); char title[MAX_LEN]; title[0]=0; strcat(title,_("Log: ")); char *rfile=unparse_percents(what->info->file.get()); strcat(title,rfile); delete[] rfile; gtk_window_set_title(GTK_WINDOW (temp->window), title); g_signal_connect(G_OBJECT(temp->window), "key_press_event", (GtkSignalFunc)log_window_event_handler, what->LOG); g_signal_connect(G_OBJECT(temp->window), "delete_event", (GtkSignalFunc)log_window_destroy, what->LOG); GtkListStore *list_store = gtk_list_store_new(L_COL_LAST+2, GDK_TYPE_PIXBUF, //L_COL_TYPE, G_TYPE_INT, //L_COL_NUM, G_TYPE_STRING, //L_COL_TIME, G_TYPE_STRING, //L_COL_STRING, GDK_TYPE_COLOR, //L_COL_LAST; GDK_TYPE_COLOR); temp->view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store))); GtkCellRenderer *renderer; GtkTreeViewColumn *col; renderer = gtk_cell_renderer_pixbuf_new(); col=gtk_tree_view_column_new_with_attributes ("Tittle", renderer, "pixbuf",0, NULL); gtk_tree_view_append_column(temp->view,col); for (int i=L_COL_NUM;i<L_COL_LAST;i++){ renderer = gtk_cell_renderer_text_new(); col=gtk_tree_view_column_new_with_attributes("Tittle", renderer, "text",i, "foreground-gdk",ML_COL_LAST, "background-gdk",ML_COL_LAST+1, NULL); gtk_tree_view_append_column(temp->view,col); }; gtk_tree_view_set_headers_visible(temp->view,FALSE); gtk_tree_view_set_reorderable(temp->view,FALSE); g_signal_connect(G_OBJECT(temp->view),"event",G_CALLBACK(log_list_event_handler),temp); temp->adj = (GtkAdjustment *)gtk_adjustment_new (0.0, 0.0, 0.0, 0.1, 1.0, 1.0); GtkWidget *swindow=gtk_scrolled_window_new((GtkAdjustment*)NULL,temp->adj); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(swindow),GTK_WIDGET(temp->view)); if (what->split){ GtkWidget *buttonsbar=temp->toolbar=gtk_toolbar_new(); gtk_toolbar_set_orientation(GTK_TOOLBAR(buttonsbar),GTK_ORIENTATION_HORIZONTAL); gtk_toolbar_set_style(GTK_TOOLBAR(buttonsbar),GTK_TOOLBAR_TEXT); GtkWidget *tmpbutton=NULL; for (int i=1;i<=what->split->NumOfParts;i++){ char data[MAX_LEN]; char tip[MAX_LEN]; g_snprintf(data,MAX_LEN," %i ",i); g_snprintf(tip,MAX_LEN,"Ctrl+%i",i); tmpbutton=gtk_toolbar_append_element (GTK_TOOLBAR (buttonsbar), GTK_TOOLBAR_CHILD_RADIOBUTTON, (GtkWidget *)tmpbutton, data,tip,"",NULL, G_CALLBACK (log_window_button), GINT_TO_POINTER(i)); if (what->LOG->last_log==i){ temp->button=tmpbutton; }; g_object_set_data(G_OBJECT(tmpbutton),"d4x_user_data",what); }; temp->label=gtk_label_new(""); gtk_toolbar_append_widget(GTK_TOOLBAR (buttonsbar),temp->label,NULL,NULL); GtkWidget *tmpvbox=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(tmpvbox),buttonsbar,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(tmpvbox),swindow,TRUE,TRUE,0); gtk_container_add(GTK_CONTAINER(temp->window),tmpvbox); }else{ temp->toolbar=NULL; temp->label=NULL; gtk_container_add(GTK_CONTAINER(temp->window),swindow); }; what->LOG->Window=temp; g_object_set_data(G_OBJECT(temp->window),"d4x_user_data",what->LOG);/* if (CFG.FIXED_LOG_FONT){ GtkStyle *current_style =gtk_style_copy(gtk_widget_get_style(GTK_WIDGET(temp->view))); GdkFont *font=gdk_fontset_load("-*-fixed-medium-r-*-*-*-120-*-*-*-*-*-*"); if (font==NULL){ font = gdk_fontset_load("-*-*-medium-r-*-*-*-120-*-*-m-*-*-*");; }; if (font) gtk_style_set_font(current_style,font); gtk_widget_set_style(GTK_WIDGET(temp->view), current_style); };*/ gtk_widget_show_all(temp->window); what->LOG->print(); what->LOG->unlock(); // unlock by main thread? what->CurrentLog=what->LOG; g_signal_connect(G_OBJECT(temp->adj), "changed",G_CALLBACK(my_gtk_auto_scroll), temp); temp->adj->value=temp->adj->upper-temp->adj->page_size; temp->value=temp->adj->value; g_signal_emit_by_name(G_OBJECT (temp->adj), "changed"); if (what->LOG->last_log>1 && what->split && what->LOG->last_log<=what->split->NumOfParts){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(temp->button),TRUE); log_window_button(temp->button, what->LOG->last_log); }else{ what->LOG->last_log=1; }; log_window_set_split_info(what); };};void log_window_set_title(tDownload *what,char *title) { if (what && what->CurrentLog && what->CurrentLog->Window) { tLogWindow *temp=(tLogWindow *)what->CurrentLog->Window; gtk_window_set_title(GTK_WINDOW (temp->window), title); };};void del_first_from_log(tLog *what) { tLogWindow *temp=(tLogWindow *)what->Window; if (temp) { GtkTreeIter iter; GtkListStore *store=(GtkListStore *)gtk_tree_view_get_model(temp->view); gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store),&iter); gtk_list_store_remove(store,&iter); };};GList *log_window_freeze(GList *list,tLog *what){ tLogWindow *temp=(tLogWindow *)what->Window; if (temp){ what->freezed_flag=1; GList *tlist=(GList *)g_malloc(sizeof(GList)); tlist->next=list; tlist->data=what; tlist->prev=NULL; return(tlist); }; return(list);};GList *log_window_unfreeze(GList *list){ tLog *what=(tLog *)list->data; tLogWindow *temp=(tLogWindow *)what->Window; GList *next=list->next; g_free(list); what->freezed_flag=0; if (temp){ gtk_widget_queue_draw(GTK_WIDGET(temp->view)); }; return(next);};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -