2011-01-07 7 views
0

Ich möchte ein Spiel entwickeln, das mehrsprachige Eingabe, einschließlich CJK-Zeichen nehmen kann. Ist es möglich, dass eine GtkDrawingArea das gesamte Fenster ausfüllt und ein GtkEntry darüber "schwebt"? Ist es auch möglich, den Hintergrund und die Grenze des GtkEntry transparent zu machen? Danke für jede Hilfe.Transparent Floating GtkEntry

Antwort

1

Hier ist, wie ich tat es in my application, mit einer Funktion eine GtkEntry enthält einen Text Pop-up, auf einem übergeordneten Widget, an den Koordinaten (x, y) in Bezug auf die linke obere Ecke des übergeordneten widget:

GtkWidget * 
popup_edit_window(GtkWidget *parent, gint x, gint y, const gchar *text) 
{ 
    gint px, py; 
    gdk_window_get_origin(gtk_widget_get_window(parent), &px, &py); 

    GtkWidget *edit_popup = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    /* stackoverflow.com/questions/1925568/how-to-give-keyboard-focus-to-a-pop-up-gtk-window */ 
    GTK_WIDGET_SET_FLAGS(edit_popup, GTK_CAN_FOCUS); 
    gtk_window_set_decorated(GTK_WINDOW(edit_popup), FALSE); 
    gtk_window_set_has_frame(GTK_WINDOW(edit_popup), FALSE); 
    gtk_window_set_type_hint(GTK_WINDOW(edit_popup), GDK_WINDOW_TYPE_HINT_POPUP_MENU); 
    gtk_window_set_transient_for(GTK_WINDOW(edit_popup), GTK_WINDOW(parent)); 
    gtk_window_set_gravity(GTK_WINDOW(edit_popup), GDK_GRAVITY_CENTER); 

    GtkWidget *entry = gtk_entry_new(); 
    gtk_widget_add_events(entry, GDK_FOCUS_CHANGE_MASK); 
    gtk_entry_set_text(GTK_ENTRY(entry), text); 

    gtk_editable_select_region(GTK_EDITABLE(entry), 0, -1); 
    gtk_container_add(GTK_CONTAINER(edit_popup), entry); 
    g_signal_connect_swapped(entry, "focus-out-event", G_CALLBACK(gtk_widget_destroy), edit_popup); 
    g_signal_connect(entry, "key-press-event", G_CALLBACK(on_edit_popup_key_press), edit_popup); 

    gtk_widget_show_all(edit_popup); 
    gtk_window_move(GTK_WINDOW(edit_popup), x + px, y + py); 
    /* GDK_GRAVITY_CENTER seems to have no effect? */ 
    gtk_widget_grab_focus(entry); 
    gtk_window_present(GTK_WINDOW(edit_popup)); 

    return edit_popup; 
} 

gboolean 
on_edit_popup_key_press(GtkWidget *entry, GdkEventKey *event, GtkWidget *edit_popup) 
{ 
    switch(event->keyval) { 
    case GDK_Escape: 
     gtk_widget_destroy(edit_popup); 
     return TRUE; 
    case GDK_Return: 
    case GDK_KP_Enter: 
     /* here, do whatever you need to do when finished editing */ 
     gtk_widget_destroy(edit_popup); 
     return TRUE; 
    } 
    return FALSE; /* event not handled */ 
} 

um transparent zu machen, sollen Sie nur in der Lage sein zu tun:

gtk_window_set_opacity(GTK_WINDOW(edit_popup), 0.5); 

aber bewusst sein, dass die Fenster-Manager, dass nicht unterstützen können oder wählen sie zu ignorieren.

Haben Sie jedoch in Betracht gezogen, dass GTK verwandte Eingabemethodenbibliotheken enthält, damit Benutzer die Eingabemethode für die Eingabe von CJK-Zeichen auswählen können? Keine Notwendigkeit, das Rad neu zu erfinden.