Как иметь управление gtk + c или нет? - PullRequest
1 голос
/ 14 августа 2010

Я использую pygtk и хотел бы обрабатывать control + c иногда для выполнения специального действия копирования, но в других случаях, чтобы gtk мог его обработать. Например, я хотел бы поместить объект в буфер обмена, если он доступен, или просто использовать control + c обычным образом в текстовой записи.

В настоящее время у меня есть ActionGroup, связанная с "c", но она всегда съедает нажатие клавиши, даже если я возвращаю False. Если я удаляю ActionGroup, она всегда работает в текстовых областях. Если я добавляю группу ActionGroup, она всегда обрабатывает ее, и копирование не работает в текстовых областях.

Как правильно, чтобы control + c появлялся в меню, иногда обрабатывал нажатие клавиши, но в других случаях позволяло ему попадать в текстовый виджет?

1 Ответ

1 голос
/ 14 августа 2010

Я не знаю, является ли это "правильным" способом, но вот как я это делаю. Я передаю окно приложения в качестве параметра пользовательских данных в обратный вызов действия. Затем я выясняю, какой виджет сфокусирован в окне, и я передаю команду копирования этому виджету, если это имеет смысл (т.е. сфокусированный виджет представляет собой текстовую запись, как вы говорите). Если это не имеет смысла, я копирую текстовое представление окна по умолчанию.

void
action_copy(GtkAction *action, gpointer user_data)
{
    GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW(user_data));

    /* What actually happens depends on the type of widget that is focused */
    if(WEBKIT_IS_WEB_VIEW(widget))
        webkit_web_view_copy_clipboard(WEBKIT_WEB_VIEW(widget));
    else if((GTK_IS_LABEL(widget) && gtk_label_get_selectable(GTK_LABEL(widget)))
        || GTK_IS_ENTRY(widget) || GTK_IS_TEXT_VIEW(widget))
        g_signal_emit_by_name(widget, "copy-clipboard", NULL);
    else
        g_signal_emit_by_name(/* ...default text view... */, "copy-clipboard", NULL);
}

(Получение текстового представления по умолчанию на самом деле выполняется путем вызова метода get_default_view() в моем классе приложения, который является подклассом GtkWindow; но я не хотел усложнять ситуацию.)

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