2009-12-18 35 views
6

Tôi có cửa sổ bật lên (được tạo bằng loại WINDOW_POPUP) có chứa một số tiện ích con trên đó, bao gồm cả mục nhập văn bản. Vấn đề là các mục nhập không lấy được tiêu điểm khi tôi nhấp vào nó, vì vậy tôi không thể gõ bất cứ điều gì. Có cờ nào tôi phải đặt để cho phép cửa sổ lấy tiêu điểm bàn phím không?Cách lấy tiêu điểm bàn phím cho một cửa sổ bật lên Gtk.Window

Trả lời

-1
#include <gtk/gtk.h> 

static gboolean delete_event(GtkWidget *widget, 
           GdkEvent *event, 
           gpointer data) 
{ 
    g_print ("delete event occurred\n"); 
    gtk_main_quit(); 
    return TRUE; 
} 

static void destroy(GtkWidget *widget, 
        gpointer data) 
{ 
    gtk_main_quit(); 
} 

int main(int argc, 
      char *argv[]) 
{ 
    GtkWidget *window; 
    GtkWidget *windowpopup; 
    GtkWidget *button; 

    gtk_init (&argc, &argv); 

    /* create a new window */ 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    windowpopup = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_transient_for(GTK_WINDOW(windowpopup),GTK_WINDOW(window)); 
    gtk_window_set_destroy_with_parent(GTK_WINDOW(windowpopup),TRUE); 
    gtk_widget_show (windowpopup); 

    g_signal_connect (G_OBJECT (window), "delete_event", 
       G_CALLBACK (delete_event), NULL); 
    g_signal_connect (G_OBJECT (window), "destroy", 
       G_CALLBACK (destroy), NULL); 

    /* Creates a new button with the label "Hello World". */ 
    button = gtk_button_new_with_label ("Hello World"); 

    g_signal_connect_swapped (G_OBJECT (button), "clicked", 
        G_CALLBACK (gtk_widget_destroy), 
           G_OBJECT (window)); 

    gtk_container_add (GTK_CONTAINER (window), button); 

    gtk_widget_show (button); 
    gtk_widget_show (window); 

    gtk_main(); 

    return 0; 
} 
4

Bạn không thể sử dụng WINDOW_POPUP cho gtk-windows yêu cầu tiêu điểm. Thay vào đó bạn nên sử dụng một GWindow với loại GTK_WINDOW_TOPLEVEL và gọi chức năng tiếp theo (hoặc các phương pháp)

GtkWindow *result = g_object_new(GTK_TYPE_WINDOW, "type", GTK_WINDOW_TOPLEVEL, NULL); 
gtk_widget_set_can_focus(result, TRUE); 
gtk_window_set_decorated(GTK_WINDOW(result), FALSE); 
gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_POPUP_MENU); 
gtk_window_set_transient_for(GTK_WINDOW(result), main_top_level_window); 

này làm việc cho tôi ... tiếc là biểu tượng trong cửa sổ danh sách chớp mắt ngắn khi điều này 'popup' bị phá hủy

1

Mặc dù câu trả lời trước đó và tham chiếu GTK, có thể lấy tiêu điểm bàn phím khi sử dụng GTK_WINDOW_POPUP. Bạn cần phải kết nối với sự kiện "show" ...

GtkWindow *w = gtk_window_new(GTK_WINDOW_POPUP); 
g_signal_connect(G_OBJECT(w), "show", G_CALLBACK(on_window_show), NULL); 

... với một callback mà cố gắng để lấy bàn phím:

static void on_window_show(GtkWidget *w, gpointer user_data) { 
    /* grabbing might not succeed immediately... */ 
    while (gdk_keyboard_grab(w->window, FALSE, GDK_CURRENT_TIME) != GDK_GRAB_SUCCESS) { 
     /* ...wait a while and try again */ 
     sleep(0.1); 
    } 
} 

đó làm việc cho tôi khá tốt.

+0

Điều này sẽ lấy bàn phím độc quyền. Nhấp vào cửa sổ chương trình khác bằng chuột sẽ không chuyển tiêu điểm bàn phím vào chúng. Có thể có xung quanh, nhưng tôi không biết gì cả. –

Các vấn đề liên quan