7
votes

Comment donner la mise au point sur le clavier à une fenêtre contextuelle GTK.Window

J'ai une fenêtre contextuelle (créée à l'aide du type Window_Popup) qui contient des widgets dessus, y compris une entrée de texte. Le problème est que l'entrée ne se concentre pas lorsque je clique sur elle, donc je ne peux rien taper. Y a-t-il un indicateur que je dois définir pour permettre à la fenêtre d'obtenir la mise au point sur le clavier?

gtk

0 commentaires

3 Réponses :


-1
votes
#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;
}

0 commentaires

6
votes

Vous ne pouvez pas utiliser Window_Popup pour GTK-Windows nécessitant la mise au point. Au lieu de cela, vous devez utiliser un gtkwindow avec type gtk_window_toplevelvel et appeler les fonctions suivantes (ou méthodes) xxx

ceci a fonctionné pour moi ... Malheureusement, l'icône dans la liste des fenêtres clignote courte quand ce "popup 'est détruit


0 commentaires

1
votes

Malgré les réponses précédentes et la référence GTK, il est possible de saisir la mise au point du clavier lors de l'utilisation d'un GTK_Window_Popup. Vous devez vous connecter à l'événement "show" ... xxx pré>

... avec un rappel qui tente de saisir le clavier: P>

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);
    }
}


1 commentaires

Cela prendra le clavier exclusivement. En cliquant sur d'autres programmes, la souris ne transférera pas le clavier. Il pourrait y avoir du travail, mais je ne suis au courant d'aucun.