📄 mainwindow.cpp
字号:
gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_attributes(column, renderer, "pixbuf", 0, NULL); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_attributes(column, renderer, "text", 1, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("IPv4")); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_attributes(column, renderer, "text", 2, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("user")); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_attributes(column, renderer, "text", 3, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("host")); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_attributes(column, renderer, "text", 4, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); g_signal_connect(view, "row-activated", G_CALLBACK(FindViewRowActivated), model); g_signal_connect(view, "button-press-event", G_CALLBACK(FindPopupPalMenu), model); g_signal_connect(view, "drag-data-received", G_CALLBACK(FindDragDataReceived), model); return view;}void MainWindow::SwitchWindowMode(){ extern struct interactive inter; GdkPixbuf *pixbuf; if (GTK_WIDGET_VISIBLE(inter.window)) { gtk_widget_hide(inter.window); pixbuf = gdk_pixbuf_new_from_file_at_size(__LOGO_DIR "/ip-penguin.png", 20, 20, NULL); if (pixbuf) { gtk_status_icon_set_from_pixbuf(inter.status_icon, pixbuf); g_object_unref(pixbuf); } else pwarning(Fail, "%s \"" __LOGO_DIR "/ip-penguin.png\" %s", _("The notify icon"), _("is lost!")); } else { gtk_widget_show(inter.window); pixbuf = gdk_pixbuf_new_from_file_at_size(__LOGO_DIR "/ip-tux.png", 20, 20, NULL); if (pixbuf) { gtk_status_icon_set_from_pixbuf(inter.status_icon, pixbuf); g_object_unref(pixbuf); } else pwarning(Fail, "%s \"" __LOGO_DIR "/ip-tux.png\" %s", _("The notify icon"), _("is lost!")); }}void MainWindow::AskSharedFiles(gpointer data){ extern struct interactive inter; Command cmd; cmd.SendAskShared(inter.udpsock, data);}void MainWindow::UpdatePalList(){ extern UdpData udt; GtkTreeIter iter; uint8_t count; GSList *tmp; pthread_mutex_lock(&udt.mutex); tmp = udt.pallist; while (tmp) { FLAG_CLR(((Pal *) tmp->data)->flags, 1); tmp = tmp->next; } g_queue_clear(udt.msgqueue); pthread_mutex_unlock(&udt.mutex); gtk_tree_store_clear(GTK_TREE_STORE(udt.pal_model)); udt.InitPalModel(); thread_create(ThreadFunc(CoreThread::NotifyAll), NULL, false);}void MainWindow::DeletePal(gpointer data){ extern UdpData udt; GtkTreeIter iter, parent; GList *tmp; Pal *pal; pal = (Pal *) data; if (!udt.Ipv4GetPalPos(pal->ipv4)) return; udt.Ipv4GetParent(pal->ipv4, &parent); if (udt.PalGetModelIter(pal, &parent, &iter)) gtk_tree_store_remove(GTK_TREE_STORE(udt.pal_model), &iter); tmp = (GList *) udt.PalGetMsgPos(pal); if (tmp) { pthread_mutex_lock(&udt.mutex); g_queue_delete_link(udt.msgqueue, tmp); pthread_mutex_unlock(&udt.mutex); } FLAG_CLR(pal->flags, 1); FLAG_SET(pal->flags, 3);}gboolean MainWindow::ViewQueryTooltip(GtkWidget * view, gint x, gint y, gboolean key, GtkTooltip * tooltip, GtkTreeModel * model){ extern Control ctr; GdkColor color = { 8, 65535, 65535, 55000 }; GtkWidget *text_view; GtkTextBuffer *buffer; GtkTreePath *path; GtkTreeIter iter; Pal *pal; if (key || !gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(view), x, y, &path, NULL, NULL, NULL)) return FALSE; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, 7, &pal, -1); if (!pal) return FALSE; text_view = create_text_view(); gtk_widget_modify_base(text_view, GTK_STATE_NORMAL, &color); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text_view), FALSE); gtk_text_view_set_editable(GTK_TEXT_VIEW(text_view), FALSE); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_view), GTK_WRAP_NONE); buffer = gtk_text_buffer_new(ctr.table); DialogPeer::FillPalInfoToBuffer(pal, buffer, false); gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view), buffer); gtk_tooltip_set_custom(tooltip, text_view); g_signal_connect_swapped(text_view, "destroy", G_CALLBACK(g_object_unref), buffer); return TRUE;}void MainWindow::ViewRowActivated(GtkWidget * view, GtkTreePath * path, GtkTreeViewColumn * column, GtkTreeModel * model){ GtkTreeIter iter; gpointer data; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, 7, &data, -1); if (data) DialogPeer::DialogEntry(data);}gboolean MainWindow::PopupPalMenu(GtkWidget * view, GdkEventButton * event, GtkTreeModel * model){ GtkTreePath *path; GtkTreeIter iter; gpointer data; if (event->button != 3 || !gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(view), GINT(event->x), GINT(event->y), &path, NULL, NULL, NULL)) return FALSE; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, 7, &data, -1); if (!data) return FALSE; gtk_menu_popup(GTK_MENU(CreatePopupMenu(data)), NULL, NULL, NULL, NULL, event->button, event->time); return TRUE;}gboolean MainWindow::ViewChangeStatus(GtkWidget * view, GdkEventButton * event, GtkTreeModel * model){ GtkTreePath *path; GdkPixbuf *pixbuf; GtkTreeIter iter; gboolean expend; if (event->button != 1 || !gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(view), GINT(event->x), GINT(event->y), &path, NULL, NULL, NULL) || gtk_tree_path_get_depth(path) != 1) return FALSE; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, 1, &expend, -1); if (expend) { pixbuf = gdk_pixbuf_new_from_file(__TIP_DIR "/hide.png", NULL); gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 0, pixbuf, 1, FALSE, -1); gtk_tree_view_collapse_row(GTK_TREE_VIEW(view), path); } else { pixbuf = gdk_pixbuf_new_from_file(__TIP_DIR "/show.png", NULL); gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 0, pixbuf, 1, TRUE, -1); gtk_tree_view_expand_row(GTK_TREE_VIEW(view), path, FALSE); } if (pixbuf) g_object_unref(pixbuf); gtk_tree_path_free(path);}void MainWindow::DragDataReceived(GtkWidget * view, GdkDragContext * context, gint x, gint y, GtkSelectionData * select, guint info, guint time, GtkTreeModel * model){ GtkTreePath *path; GtkTreeIter iter; gpointer data; if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(view), x, y, &path, NULL, NULL, NULL)) return; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, 7, &data, -1); if (data) DialogPeer::DragDataReceived(data, context, x, y, select, info, time);}void MainWindow::FindSpecifyPal(gpointer data){ MainWindow *mw; GtkWidget *sw, *view, *button, *image, *entry; GtkWidget *box, *hbox; mw = (MainWindow *) data; if (gtk_paned_get_child2(GTK_PANED(mw->client_paned))) return; box = create_box(); gtk_paned_pack2(GTK_PANED(mw->client_paned), box, TRUE, TRUE); sw = create_scrolled_window(); gtk_box_pack_start(GTK_BOX(box), sw, TRUE, TRUE, 0); view = CreateFindView(); gtk_container_add(GTK_CONTAINER(sw), view); hbox = create_box(FALSE); gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0); button = gtk_button_new(); g_object_set(button, "relief", GTK_RELIEF_NONE, NULL); image = gtk_image_new_from_file(__TIP_DIR "/cancel.png"); gtk_button_set_image(GTK_BUTTON(button), image); gtk_widget_show(button); g_signal_connect_swapped(button, "clicked", G_CALLBACK(g_object_unref), gtk_tree_view_get_model(GTK_TREE_VIEW(view))); g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), box); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); entry = my_entry::create_entry(NULL, _("search pals")); gtk_widget_add_events(entry, GDK_KEY_PRESS_MASK); g_signal_connect(entry, "key-press-event", G_CALLBACK(FindClearEntry), NULL); g_signal_connect(entry, "changed", G_CALLBACK(FindEntryChanged), view); gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); FindEntryChanged(entry, view); gtk_widget_grab_focus(entry);}gboolean MainWindow::FindClearEntry(GtkWidget * entry, GdkEventKey * event){ if (event->keyval != GDK_Escape) return FALSE; gtk_entry_set_text(GTK_ENTRY(entry), ""); return TRUE;}void MainWindow::FindEntryChanged(GtkWidget * entry, GtkWidget * view){ extern UdpData udt; char ipstr[INET_ADDRSTRLEN]; const gchar *text; GdkPixbuf *pixbuf; GtkTreeModel *model; GtkTreeIter iter; GSList *tmp; Pal *pal; model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); gtk_list_store_clear(GTK_LIST_STORE(model)); text = gtk_entry_get_text(GTK_ENTRY(entry)); pthread_mutex_lock(&udt.mutex); tmp = udt.pallist; while (tmp) { pal = (Pal *) tmp->data; tmp = tmp->next; inet_ntop(AF_INET, &pal->ipv4, ipstr, INET_ADDRSTRLEN); if (FLAG_ISSET(pal->flags, 1) && (*text == '\0' || strstr(pal->name, text) || strstr(ipstr, text) || strstr(pal->user, text) || strstr(pal->host, text))) { pixbuf = gdk_pixbuf_new_from_file_at_size(pal->iconfile, MAX_ICONSIZE, MAX_ICONSIZE, NULL); gtk_list_store_append(GTK_LIST_STORE(model), &iter); gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, pixbuf, 1, pal->name, 2, ipstr, 3, pal->user, 4, pal->host, 5, pal, -1); if (pixbuf) g_object_unref(pixbuf); } } pthread_mutex_unlock(&udt.mutex); gtk_tree_view_columns_autosize(GTK_TREE_VIEW(view));}void MainWindow::FindViewRowActivated(GtkWidget * view, GtkTreePath * path, GtkTreeViewColumn * column, GtkTreeModel * model){ GtkTreeIter iter; gpointer data; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, 5, &data, -1); DialogPeer::DialogEntry(data);}gboolean MainWindow::FindPopupPalMenu(GtkWidget * view, GdkEventButton * event, GtkTreeModel * model){ GtkTreePath *path; GtkTreeIter iter; gpointer data; if (event->button != 3 || !gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(view), GINT(event->x), GINT(event->y), &path, NULL, NULL, NULL)) return FALSE; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, 5, &data, -1); gtk_menu_popup(GTK_MENU(CreatePopupMenu(data)), NULL, NULL, NULL, NULL, event->button, event->time); return TRUE;}void MainWindow::FindDragDataReceived(GtkWidget * view, GdkDragContext * context, gint x, gint y, GtkSelectionData * select, guint info, guint time, GtkTreeModel * model){ GtkTreePath *path; GtkTreeIter iter; gpointer data; if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(view), x, y, &path, NULL, NULL, NULL)) return; gtk_tree_model_get_iter(model, &iter, path); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, 5, &data, -1); DialogPeer::DragDataReceived(data, context, x, y, select, info, time);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -