Cierre de pestañas en el Bloc de notas GTK 3
Lo que estoy tratando de hacer es cerrar pestañas en un cuaderno GTK con un botón agregado a la pestaña, pero la función para obtener el número de página parece no funcionar y parece que las páginas se cierran desde la última creada hacia atrás.
void close_tab(GtkWidget *button, gpointer data){
gint pg_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), button);
gtk_notebook_remove_page(GTK_NOTEBOOK(notebook) , pg_num);
}
void add_tab (char *name){
GtkWidget *textview = gtk_text_view_new();
GtkWidget *text = gtk_label_new(name);
GtkWidget *label = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
GtkWidget *icon = gtk_image_new_from_file ("close.png");
GtkWidget *button = gtk_button_new();
gtk_button_set_image(GTK_BUTTON(button), icon);
gtk_widget_set_tooltip_text(button , "Close Tab");
gtk_box_pack_start(GTK_BOX(label), text, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(label), button, FALSE, FALSE, 0);
g_signal_connect(GTK_WIDGET(button), "clicked",
G_CALLBACK(close_tab),
NULL);
GtkWidget *scrollwindow = gtk_scrolled_window_new(NULL, NULL);
gtk_container_add(GTK_CONTAINER(scrollwindow), textview);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrollwindow, label);
gtk_widget_show_all(label);
gtk_widget_show_all(scrollwindow);
}
void button_click(GtkWidget *button, gpointer data){
char *btn = (char *) data;
if (strcmp(btn, "New") == 0);
add_tab("new tab");
}
Mi experimento es con dos pestañas, la primera se crea automáticamente con la etiqueta “text” como “untitled”, y la segunda como “new tab” y traté de darle al botón el nombre pasado a la función de agregar pestaña, pero el resultado fue el mismo, así que no sé cómo hacer que el botón sepa en qué página pertenece.
davy.ai
El problema en el código proporcionado es que la línea
gint pg_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), button);
intenta obtener el número de página en función del widget del botón, lo cual no es el enfoque correcto ya que el botón no es un hijo del widget del cuaderno.Para solucionar este problema y cerrar la pestaña desde el botón agregado a la pestaña, puede utilizar la función
g_signal_connect_swapped
en lugar deg_signal_connect
para conectar la funciónclose_tab
al widget del botón, con el widget del cuaderno como su parámetro de datos.Aquí se encuentra el código actualizado de la función
close_tab
:Y aquí se encuentra el código modificado de la función
add_tab
:Con esta modificación, el widget
scrollwindow
se pasa a la funciónclose_tab
a través de la funcióng_signal_connect_swapped
, y se obtiene el número de página utilizando este widget en lugar del widget del botón.Tenga en cuenta que la función
g_signal_connect_swapped
intercambia el orden del parámetrodata
y el parámetrouser_data
, por lo que el widgetscrollwindow
se pasa como parámetrouser_data
a la funciónclose_tab
.