📄 mywidget.cc
字号:
"head", "iframe", "img", "input", "ins", "layer", "link", "meta", "object", "overlay", "q", "table", "tbody", "td", "tfoot", "th", "thead", "script", "sound", "span" }; for (unsigned int i=0;i<sizeof(tags)/sizeof(char*);i++) list = g_list_append (list, tags[i]); gtk_combo_set_popdown_strings (GTK_COMBO (edit->tag), list); g_list_free(list); gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(edit->tag)->entry),FALSE); gtk_box_pack_start(GTK_BOX(hbox),edit->tag,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),hbox,FALSE,FALSE,0); hbox=gtk_hbox_new(FALSE,0); edit->include=gtk_radio_button_new_with_label((GSList *)NULL, _("include")); edit->exclude=gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(edit->include)), _("exclude")); gtk_box_pack_start(GTK_BOX(hbox),edit->include,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),edit->exclude,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),hbox,FALSE,FALSE,0); edit->ok_button=gtk_button_new_with_label(_("Ok")); edit->cancel_button=gtk_button_new_with_label(_("Cancel")); GTK_WIDGET_SET_FLAGS(edit->ok_button,GTK_CAN_DEFAULT); GTK_WIDGET_SET_FLAGS(edit->cancel_button,GTK_CAN_DEFAULT); hbox=gtk_hbutton_box_new(); gtk_box_set_spacing(GTK_BOX(hbox),5); gtk_box_pack_start(GTK_BOX(hbox),edit->ok_button,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),edit->cancel_button,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),hbox,TRUE,FALSE,0); gtk_container_add(GTK_CONTAINER(edit),edit->vbox); gtk_window_set_default(GTK_WINDOW(edit),edit->cancel_button);};guint d4x_rule_edit_get_type(){ static guint d4x_rule_edit_type=0; if (!d4x_rule_edit_type){ GTypeInfo info={ sizeof(d4xRuleEditClass), NULL,NULL, (GClassInitFunc) d4x_rule_edit_class_init, NULL,NULL, sizeof(d4xRuleEdit), 0, (GInstanceInitFunc)d4x_rule_edit_init }; d4x_rule_edit_type=g_type_register_static(GTK_TYPE_WINDOW,"d4xRuleEdit",&info,(GTypeFlags)0); }; return d4x_rule_edit_type;};GtkWidget *d4x_rule_edit_new(d4xRule *rule){ d4xRuleEdit *edit=(d4xRuleEdit *)g_object_new(d4x_rule_edit_get_type(),NULL); edit->rule=rule; if (rule){ if (rule->host.get()) text_to_combo(edit->host,rule->host.get()); if (rule->proto) text_to_combo(edit->proto,get_name_by_proto(rule->proto)); if (rule->path.get()) text_to_combo(edit->path,rule->path.get()); if (rule->file.get()) text_to_combo(edit->file,rule->file.get()); if (rule->params.get()) text_to_combo(edit->params,rule->params.get()); if (rule->tag.get()) text_to_combo(edit->tag,rule->tag.get()); GTK_TOGGLE_BUTTON(edit->include)->active=rule->include; GTK_TOGGLE_BUTTON(edit->exclude)->active=!rule->include; }; return GTK_WIDGET(edit);};void d4x_rule_edit_delete(GtkWidget *widget, GdkEvent *event,GtkWidget *edit){ gtk_widget_destroy(edit);};GtkWidget *d4x_rule_edit_new_full(d4xRule *rule){ d4xRuleEdit *edit=(d4xRuleEdit *)d4x_rule_edit_new(rule); g_signal_connect(G_OBJECT(edit->ok_button),"clicked", G_CALLBACK(d4x_rule_edit_ok),edit); g_signal_connect(G_OBJECT(edit->cancel_button),"clicked", G_CALLBACK(d4x_rule_edit_cancel),edit); g_signal_connect(G_OBJECT(edit),"delete_event", G_CALLBACK(d4x_rule_edit_delete), edit); d4x_eschandler_init(GTK_WIDGET(edit),edit); return GTK_WIDGET(edit);};/************************************************************/enum { FE_COL_INC, FE_COL_PROTO, FE_COL_HOST, FE_COL_PATH, FE_COL_FILE, FE_COL_PARAMS, FE_COL_TAG, FE_COL_RULE, FE_COL_LAST};static void d4x_filter_edit_destroy(GtkObject *widget){ g_return_if_fail(widget!=NULL); if (GTK_OBJECT_CLASS (filter_parent_class)->destroy) (* GTK_OBJECT_CLASS (filter_parent_class)->destroy) (widget);};void d4x_filter_edit_add_rule(d4xFilterEdit *edit,d4xRule *rule){ gtk_list_store_append(edit->store,&(rule->iter)); gtk_list_store_set(edit->store,&(rule->iter), FE_COL_INC,rule->include?(char*)"+":(char*)("-"), FE_COL_PROTO,rule->proto?get_name_by_proto(rule->proto):(char*)(""), FE_COL_HOST,rule->host.get()?rule->host.get():(char*)(""), FE_COL_PATH,rule->path.get()?rule->path.get():(char*)(""), FE_COL_FILE,rule->file.get()?rule->file.get():(char*)(""), FE_COL_PARAMS,rule->params.get()?rule->params.get():(char*)(""), FE_COL_TAG,rule->tag.get()?rule->tag.get():(char*)(""), FE_COL_RULE,rule, -1);};static void d4x_filter_edit_add_ok(GtkWidget *widget,d4xRuleEdit *edit){ ((d4xFilterEdit *)(edit->filter_edit))->node->filter->insert(edit->rule); d4x_rule_edit_apply(edit); d4x_filter_edit_add_rule((d4xFilterEdit *)(edit->filter_edit), edit->rule); gtk_widget_destroy(GTK_WIDGET(edit));};static void d4x_filter_edit_add_cancel(GtkWidget *widget,d4xRuleEdit *edit){ delete(edit->rule); gtk_widget_destroy(GTK_WIDGET(edit));};static void d4x_filter_edit_add_delete(GtkWidget *widget, GdkEvent *event, d4xRuleEdit *edit){ delete(edit->rule); gtk_widget_destroy(GTK_WIDGET(edit));};void d4x_filter_edit_add(GtkWidget *widget,d4xFilterEdit *edit){ d4xRule *rule=new d4xRule; d4xRuleEdit *ruleedit=(d4xRuleEdit *)d4x_rule_edit_new(rule); gtk_widget_show_all(GTK_WIDGET(ruleedit)); gtk_window_set_modal (GTK_WINDOW(ruleedit),TRUE); gtk_window_set_transient_for (GTK_WINDOW (ruleedit), GTK_WINDOW (edit)); ruleedit->filter_edit=(GtkWidget *)edit; g_signal_connect(G_OBJECT(ruleedit->ok_button),"clicked", G_CALLBACK(d4x_filter_edit_add_ok), ruleedit); g_signal_connect(G_OBJECT(ruleedit->cancel_button),"clicked", G_CALLBACK(d4x_filter_edit_add_cancel), ruleedit); g_signal_connect(G_OBJECT(ruleedit),"delete_event", G_CALLBACK(d4x_filter_edit_add_delete), ruleedit); d4x_eschandler_init(GTK_WIDGET(ruleedit),ruleedit);};static void d4x_filter_edit_edit_ok(GtkWidget *widget,d4xRuleEdit *edit){ d4xFilterEdit *filtedit=(d4xFilterEdit *)(edit->filter_edit); d4x_rule_edit_apply(edit); d4xRule *rule=edit->rule; gtk_list_store_set(filtedit->store,&(rule->iter), FE_COL_INC,rule->include?"+":"-", FE_COL_PROTO,rule->proto?get_name_by_proto(rule->proto):"", FE_COL_HOST,rule->host.get()?rule->host.get():"", FE_COL_PATH,rule->path.get()?rule->path.get():"", FE_COL_FILE,rule->file.get()?rule->file.get():"", FE_COL_PARAMS,rule->params.get()?rule->params.get():"", FE_COL_TAG,rule->tag.get()?rule->tag.get():"", -1); gtk_widget_destroy(GTK_WIDGET(edit));};static void d4x_filter_edit_edit(GtkWidget *widget,d4xFilterEdit *edit){ GtkTreeSelection *sel=gtk_tree_view_get_selection(edit->view); GtkTreeModel *model; GtkTreeIter iter; if (gtk_tree_selection_get_selected(sel,&model,&iter)){ GValue val={0,}; gtk_tree_model_get_value(model,&iter,FE_COL_RULE,&val); d4xRule *rule=(d4xRule *)g_value_get_pointer(&val); g_value_unset(&val); d4xRuleEdit *ruleedit=(d4xRuleEdit *)d4x_rule_edit_new(rule); ruleedit->filter_edit=(GtkWidget *)edit; g_signal_connect(G_OBJECT(ruleedit->ok_button),"clicked", G_CALLBACK(d4x_filter_edit_edit_ok), ruleedit); g_signal_connect(G_OBJECT(ruleedit->cancel_button),"clicked", G_CALLBACK(d4x_rule_edit_cancel), ruleedit); g_signal_connect(G_OBJECT(ruleedit),"delete_event", G_CALLBACK(d4x_rule_edit_delete), ruleedit); d4x_eschandler_init(GTK_WIDGET(ruleedit),ruleedit); gtk_widget_show_all(GTK_WIDGET(ruleedit)); gtk_window_set_modal (GTK_WINDOW(ruleedit),TRUE); gtk_window_set_transient_for (GTK_WINDOW (ruleedit), GTK_WINDOW (edit)); };};static void d4x_filter_edit_del(GtkWidget *widget,d4xFilterEdit *edit){ GtkTreeSelection *sel=gtk_tree_view_get_selection(edit->view); GtkTreeModel *model; GtkTreeIter iter; if (gtk_tree_selection_get_selected(sel,&model,&iter)){ GValue val={0,}; gtk_tree_model_get_value(model,&iter,FE_COL_RULE,&val); d4xRule *rule=(d4xRule *)g_value_get_pointer(&val); g_value_unset(&val); gtk_list_store_remove(edit->store,&(rule->iter)); edit->node->filter->del(rule); delete(rule); };};static void d4x_filter_edit_down(GtkWidget *widget,d4xFilterEdit *edit){ GtkTreeSelection *sel=gtk_tree_view_get_selection(edit->view); GtkTreeModel *model; GtkTreeIter iter; if (gtk_tree_selection_get_selected(sel,&model,&iter)){ GValue val={0,}; gtk_tree_model_get_value(model,&iter,FE_COL_RULE,&val); d4xRule *rule=(d4xRule *)g_value_get_pointer(&val); g_value_unset(&val); if (rule->prev){ tNode *next=rule->prev; gtk_tree_model_swap_rows_l(GTK_TREE_MODEL(edit->store), &(rule->iter),&(((d4xRule*)next)->iter)); d4xFilter *filter=edit->node->filter; filter->del(next); filter->insert_before(next,rule); GtkTreeIter iter_tmp; memcpy(&iter_tmp,&(((d4xRule*)next)->iter),sizeof(rule->iter)); memcpy(&(((d4xRule*)next)->iter),&(rule->iter),sizeof(rule->iter)); memcpy(&(rule->iter),&iter_tmp,sizeof(rule->iter)); gtk_tree_selection_select_iter(sel,&(rule->iter)); }; };};static void d4x_filter_edit_up(GtkWidget *widget,d4xFilterEdit *edit){ GtkTreeSelection *sel=gtk_tree_view_get_selection(edit->view); GtkTreeModel *model; GtkTreeIter iter; if (gtk_tree_selection_get_selected(sel,&model,&iter)){ GValue val={0,}; gtk_tree_model_get_value(model,&iter,FE_COL_RULE,&val); d4xRule *rule=(d4xRule *)g_value_get_pointer(&val); g_value_unset(&val); if (rule->next){ tNode *next=rule->next; gtk_tree_model_swap_rows_l(GTK_TREE_MODEL(edit->store), &(rule->iter),&(((d4xRule*)next)->iter)); d4xFilter *filter=edit->node->filter; filter->del(rule); filter->insert_before(rule,next); GtkTreeIter iter_tmp; memcpy(&iter_tmp,&(((d4xRule*)next)->iter),sizeof(rule->iter)); memcpy(&(((d4xRule*)next)->iter),&(rule->iter),sizeof(rule->iter)); memcpy(&(rule->iter),&iter_tmp,sizeof(rule->iter)); gtk_tree_selection_select_iter(sel,&(rule->iter)); }; };};static gboolean d4x_filter_edit_select(GtkTreeView *view,GdkEventButton *event,d4xFilterEdit *edit) { if (event && event->type==GDK_2BUTTON_PRESS && event->button==1){ d4x_filter_edit_edit(GTK_WIDGET(view),edit); return TRUE; }; return FALSE;};static void d4x_filter_edit_init(d4xFilterEdit *edit){ gtk_window_set_title(GTK_WINDOW (edit),_("Modify filter")); gtk_widget_set_size_request(GTK_WIDGET (edit),-1,400); edit->vbox=gtk_vbox_new(FALSE,0); gchar *titles[]={"",_("protocol"),_("host"),_("path"),_("file"),"?",_("tag")}; edit->store=gtk_list_store_new(FE_COL_LAST, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); edit->view=GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(edit->store))); GtkCellRenderer *renderer; GtkTreeViewColumn *col; for (int i=0;i<FE_COL_RULE;i++){ renderer = gtk_cell_renderer_text_new (); col=gtk_tree_view_column_new_with_attributes (titles[i], renderer, "text",i, NULL); gtk_tree_view_append_column (edit->view, col); };// gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_EXTENDED); g_signal_connect(G_OBJECT(edit->view), "event", G_CALLBACK(d4x_filter_edit_select), edit); GtkWidget *scroll_window=gtk_scrolled_window_new((GtkAdjustment *)NULL,(GtkAdjustment *)NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_window), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(scroll_window),GTK_WIDGET(edit->view)); gtk_box_pack_start(GTK_BOX(edit->vbox),scroll_window,TRUE,TRUE,0); edit->include=gtk_radio_button_new_with_label((GSList *)NULL, _("include by default")); edit->exclude=gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(edit->include)), _("exclude by default"));// edit->include=gtk_check_button_new_with_label(_("include by default")); gtk_box_pack_start(GTK_BOX(edit->vbox),edit->include,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),edit->exclude,FALSE,FALSE,0); GtkWidget *hbox=gtk_hbox_new(FALSE,0); GtkWidget *label=gtk_label_new(_("Name of filter")); edit->name=gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),edit->name,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),hbox,FALSE,FALSE,0); GtkWidget *up=gtk_button_new_with_label(_("Up")); GtkWidget *add=gtk_button_new_with_label(_("Add rule")); GtkWidget *down=gtk_button_new_with_label(_("Down")); hbox=gtk_hbutton_box_new(); gtk_box_set_spacing(GTK_BOX(hbox),5); gtk_box_pack_start(GTK_BOX(hbox),up,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),down,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),add,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),hbox,FALSE,FALSE,0); edit->ok=gtk_button_new_with_label(_("Ok")); GtkWidget *del=gtk_button_new_with_label(_("Remove")); edit->edit=gtk_button_new_with_label(_("Edit")); GTK_WIDGET_SET_FLAGS(edit->ok,GTK_CAN_DEFAULT); GTK_WIDGET_SET_FLAGS(del,GTK_CAN_DEFAULT); GTK_WIDGET_SET_FLAGS(edit->edit,GTK_CAN_DEFAULT); hbox=gtk_hbutton_box_new(); gtk_box_set_spacing(GTK_BOX(hbox),5); gtk_box_pack_start(GTK_BOX(hbox),edit->ok,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),del,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),edit->edit,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),hbox,FALSE,FALSE,0); gtk_container_add(GTK_CONTAINER(edit),edit->vbox); gtk_window_set_default(GTK_WINDOW(edit),edit->ok); g_signal_connect(G_OBJECT(edit->edit),"clicked", G_CALLBACK(d4x_filter_edit_edit),edit); g_signal_connect(G_OBJECT(del),"clicked", G_CALLBACK(d4x_filter_edit_del),edit); g_signal_connect(G_OBJECT(add),"clicked", G_CALLBACK(d4x_filter_edit_add),edit); g_signal_connect(G_OBJECT(up),"clicked", G_CALLBACK(d4x_filter_edit_up),edit); g_signal_connect(G_OBJECT(down),"clicked", G_CALLBACK(d4x_filter_edit_down),edit);};static void d4x_filter_edit_class_init(d4xFilterEditClass *klass){ GtkObjectClass *object_class=(GtkObjectClass *)klass; object_class->destroy=d4x_filter_edit_destroy; filter_parent_class=(GtkWidgetClass *)gtk_type_class(gtk_window_get_type());};guint d4x_filter_edit_get_type(){ static guint d4x_filter_edit_type=0; if (!d4x_filter_edit_type){ GTypeInfo info={ sizeof(d4xFilterEditClass), NULL,NULL, (GClassInitFunc) d4x_filter_edit_class_init, NULL,NULL, sizeof(d4xFilterEdit), 0, (GInstanceInitFunc)d4x_filter_edit_init
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -