Re: How to capture keystrokes when GTK menu is open?



On Wed, Feb 21, 2007 at 08:54:05AM +1100, Justin Clift wrote:

This is the code for xkey, a very simple X keyboard sniffer Google
turned up last weekend while trying to figure out how to get around this
problem:

  http://wiki.hping.org/135

That's able to receive key events... again except for when a gtk menu is
open.  (ugh)

What exactly makes you think Gtk+ menus are special?  It
cannot catch key events when a Qt menu is open, it cannot
catch key events eaten by the window manager, etc.

The sniffer simply can read only keys they get to it.  Try
the (quite simplistic) attached example of a `safe' password
entry of which the sniffer cannot sniff the typed text.

Yeti


--
Whatever.


==========================================================================
#include <gtk/gtk.h>

static gboolean
entry_focused(GtkWidget *widget)
{
    if (gdk_keyboard_grab(widget->window, TRUE, GDK_CURRENT_TIME) != 0)
        g_printerr("Keyboard grab not successful, anyone can see the keys!\n");
    return FALSE;
}

static gboolean
entry_unfocused(G_GNUC_UNUSED GtkWidget *widget)
{
    gdk_keyboard_ungrab(GDK_CURRENT_TIME);
    return FALSE;
}

int
main(int argc, char *argv[])
{
    GtkWidget *dialog, *hbox, *entry;
    gint response;

    gtk_init(&argc, &argv);
    dialog = gtk_dialog_new_with_buttons("Password Dialog", NULL,
                                         GTK_DIALOG_NO_SEPARATOR,
                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                         GTK_STOCK_OK, GTK_RESPONSE_OK,
                                         NULL);
    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);

    hbox = gtk_hbox_new(FALSE, 6);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
                       FALSE, FALSE, 0);

    gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("Password:"),
                       FALSE, FALSE, 0);

    entry = gtk_entry_new();
    gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
    gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
    gtk_box_pack_start(GTK_BOX(hbox), entry,
                       TRUE, TRUE, 0);
    g_signal_connect(entry, "focus-in-event",
                     G_CALLBACK(entry_focused), NULL);
    g_signal_connect(entry, "focus-out-event",
                     G_CALLBACK(entry_unfocused), NULL);

    gtk_widget_show_all(dialog);
    response = gtk_dialog_run(GTK_DIALOG(dialog));
    /* Do something with the result... */

    return 0;
}




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]