2014-08-27 2 views
1

У меня довольно странная проблема с использованием GTK 3.0 в Windows XP, 32-разрядная версия и компиляция с MinGW. Я разработал небольшое всплывающее окно для конфигурации сети с тремя текстовыми записями, которые заполнены конфигурацией conf (не показаны здесь).Предотвращение ввода GTK из скрытого ввода текста при нажатии TAB

На первом появлении, значение первого для ввода текста (в 10) невидимо, и открыться левой кнопкой мыши на поле:

Screenshot showing GUI

После левой кнопкой мыши: enter image description here

Кроме того, повторно нажав TAB, я могу скрыть все текстовые записи! Однако, как только запись была изменена, она больше не скрывается.

Я пробовал много вещей (set_visibility, set_overwrite, "activation" signal, "focus" signal), но до сих пор я не был в состоянии решить эту проблему.

Вот исходный код: Github Gist

И Makefile (изменить папку Src Gtk на вашем компьютере): Github Gist

#include <gtk/gtk.h> 
#include <glib/gstdio.h> 

/* 
* Network Configuration window being popped-up 
*/ 
typedef struct network_conf_t 
{ 
    GtkWidget *window  ; 
    GtkWidget *vbox_frames   ; 
    GtkWidget *recv_frame   ; 
    GtkWidget *send_frame   ; 
    GtkWidget *recv_frame_hbox  ; 
    GtkWidget *recv_port_number_label; 
    GtkWidget *recv_port_number_entry; 
    GtkWidget *vbox     ; 
    GtkWidget *hbox     ; 
    GtkWidget *hbox2     ; 
    GtkWidget * ip_address_label  ; 
    GtkWidget * port_number_label ; 
    GtkWidget *ip_address_entry  ; 
    GtkWidget *port_number_entry  ; 

} network_conf; 


unsigned int launch_netconf_popup() 
{ 
    network_conf netconf; 


    /* 
     Window configuration 
    */ 
    netconf.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_widget_set_events   (   netconf.window , GDK_FOCUS_CHANGE_MASK); 
    gtk_window_set_resizable  (GTK_WINDOW(netconf.window), FALSE); 
    gtk_window_set_skip_taskbar_hint(GTK_WINDOW(netconf.window), TRUE); 
    gtk_window_set_title   (GTK_WINDOW(netconf.window), "Network Configuration"); 
    gtk_window_set_skip_pager_hint (GTK_WINDOW(netconf.window), TRUE); 
    g_signal_connect(G_OBJECT (netconf.window), "delete-event", G_CALLBACK(gtk_main_quit), NULL); 

    gtk_window_set_position   (GTK_WINDOW(netconf.window), GTK_WIN_POS_MOUSE); 



    netconf.vbox_frames = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); 
    netconf.recv_frame = gtk_frame_new("Receive Options"); 
    netconf.send_frame = gtk_frame_new("Send Options" ); 

    gtk_container_add (GTK_CONTAINER (netconf.window),   netconf.vbox_frames); 
    gtk_container_add (GTK_CONTAINER (netconf.vbox_frames),  netconf.recv_frame); 
    gtk_container_add (GTK_CONTAINER (netconf.vbox_frames),  netconf.send_frame); 


    /* 
     Reception Port 
    */ 
    netconf.recv_frame_hbox   = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 20); 
    netconf.recv_port_number_label = gtk_label_new ("Port :"); 
    netconf.recv_port_number_entry = gtk_entry_new_with_buffer(gtk_entry_buffer_new("10", 8 )); 

    //gtk_entry_set_alignment (GTK_ENTRY(netconf.recv_port_number_entry), 0x1); 


    gtk_container_add (GTK_CONTAINER (netconf.recv_frame), netconf.recv_frame_hbox); 
    gtk_box_pack_start (GTK_BOX (netconf.recv_frame_hbox) , netconf.recv_port_number_label, FALSE, FALSE, 5); 
    gtk_box_pack_end (GTK_BOX (netconf.recv_frame_hbox) , netconf.recv_port_number_entry, FALSE, FALSE, 5); 

    /* 
     Send Port and IP 
    */ 
    netconf.vbox    = gtk_box_new(GTK_ORIENTATION_VERTICAL , 2); 
    netconf.hbox    = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 20); 
    netconf.hbox2    = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 20); 
    netconf.ip_address_label = gtk_label_new("IP address :" ); 
    netconf.port_number_label = gtk_label_new("Port :"  ); 
    netconf.port_number_entry = gtk_entry_new_with_buffer(gtk_entry_buffer_new("0", 8 )); 
    netconf.ip_address_entry = gtk_entry_new_with_buffer(gtk_entry_buffer_new("127.0.0.1", 16)); 


    //gtk_entry_set_alignment(GTK_ENTRY(netconf.ip_address_entry) , 0x1 ); 
    //gtk_entry_set_alignment(GTK_ENTRY(netconf.port_number_entry), 0x1 ); 

    gtk_container_add (GTK_CONTAINER (netconf.send_frame), netconf.vbox);  
    gtk_container_add (GTK_CONTAINER (netconf.vbox)  , netconf.hbox); 
    gtk_container_add (GTK_CONTAINER (netconf.vbox)  , netconf.hbox2); 

    gtk_box_pack_start (GTK_BOX (netconf.hbox) , netconf.ip_address_label , FALSE, FALSE, 5); 
    gtk_box_pack_start (GTK_BOX (netconf.hbox2), netconf.port_number_label, FALSE, FALSE, 5); 
    gtk_box_pack_end (GTK_BOX (netconf.hbox) , netconf.ip_address_entry , FALSE, FALSE, 5); 
    gtk_box_pack_end (GTK_BOX (netconf.hbox2), netconf.port_number_entry, FALSE, FALSE, 5); 

    gtk_widget_show_all(netconf.window); 


    return 0x00; 
} 



int main(int argc, char **argv) { 

    gtk_init(0, NULL); 

    launch_netconf_popup(); 

    gtk_main(); 
    return 0; 
} 
+0

Очевидно, что первая коробка ввода («Порт») * не * скрыта на первом снимке экрана. Я не понимаю, что вы пытаетесь сказать. :/Вы имеете в виду «сфокусированный»? – unwind

+0

Метка «Порт» - нет, это скрытое числовое значение (здесь «10»). На мой взгляд, «сфокусированный» означает получение курсора редактирования, также называемого «карет», указывающего на текстовое поле. – lucasg

+0

Получил, спасибо. Я сделаю крошечное редактирование на ваш вопрос, чтобы сделать это более ясным (потому что для меня, говоря «первая текстовая запись скрыта» означает, что окно ввода скрыто). – unwind

ответ

1

Это:

gtk_entry_new_with_buffer(gtk_entry_buffer_new("10", 8)) 

это ошибка.

Если вы check the documentation for gtk_entry_buffer_new(), вы увидите, что второй аргумент не максимальная длина содержимого буфера; это длина содержимого по умолчанию, то есть первого аргумента. И "10" is не 8 символов, очевидно. Это должно быть 2 (или -1, чтобы сделать GTK + выяснить длину).

Я ожидаю, что это вызовет некоторую путаницу, когда GTK + попытается обработать вашу строку как более длинную, чем она есть, вероятно, вызывает некоторое неопределенное поведение (но я этого не пробовал).

+0

Я проверил ваш ответ, что правильно. Как говорится, решение прямо под носом ... – lucasg

Смежные вопросы