Прозрачный Плавающий GtkEntry - PullRequest
0 голосов
/ 08 января 2011

Я хочу разработать игру, которая может принимать многоязычный ввод, включая персонажей CJK. Возможно ли, чтобы GtkDrawingArea заполнял все окно и чтобы GtkEntry плавал «сверху»? Также возможно ли сделать фон и границу GtkEntry прозрачными? Спасибо за любую помощь.

1 Ответ

1 голос
/ 08 января 2011

Вот как я это сделал в моем приложении , с функцией для всплывающего GtkEntry, содержащего некоторый текст поверх родительского виджета в координатах (x, y) относительно родителя верхний левый угол виджета:

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 */
}

Чтобы сделать его прозрачным, вы должны просто сделать:

gtk_window_set_opacity(GTK_WINDOW(edit_popup), 0.5);

но помните, что ваш оконный менеджер может не поддерживать это или может игнорировать его.

Однако неужели вы считаете, что GTK имеет связанные библиотеки методов ввода, чтобы пользователи могли выбирать любой метод ввода, который они хотят для ввода символов CJK? Не нужно изобретать велосипед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...