我一直在寻找如何使用转义键关闭我的程序。并不是很多人使用GTK +我认为。此外,如果不是要求太多,有人可以告诉我如何使用Gnome开发者网站,以便我可以自己找到这些东西吗?谢谢。所以,用转义键关闭窗口,这是我的代码:
#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>
#include <stdlib.h>
#include <ctype.h>
#include <curses.h>
#define KEY_ESC '\033'
static GtkWidget *entry;
static gboolean kill_window(GtkWidget *widget, GdkEvent *event, gpointer data)
{
gtk_main_quit();
return FALSE;
}
static void button_press(GtkWidget *widget, gpointer data)
{
const char *text = gtk_entry_get_text(GTK_ENTRY(entry));
//system("cd" text);
//printf("%s\n", text);
const char *text2 = "&";
char *concatenation;
concatenation = malloc(strlen(text)+2);
strcpy(concatenation, text);
strcat(concatenation, text2);
system(concatenation);
gtk_main_quit();
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *button1;
GtkWidget *hbox;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
button = gtk_button_new_with_label("Run");
button1 = gtk_button_new_with_label("Cancel");
entry = gtk_entry_new();
hbox = gtk_vbox_new(FALSE, 2);
gtk_window_set_title(GTK_WINDOW(window), "Run..");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS);
g_signal_connect(window, "delete_event", G_CALLBACK(kill_window), NULL);
g_signal_connect(button, "clicked", G_CALLBACK(button_press), NULL);
g_signal_connect(button1, "clicked", G_CALLBACK(kill_window), NULL);
g_signal_connect(entry, "activate", G_CALLBACK(button_press), NULL);
g_signal_connect(button1, "delete_event", G_CALLBACK(kill_window), NULL);
gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
gtk_window_set_default_size(GTK_WINDOW(window), 250, 100);
gtk_window_set_decorated(GTK_WINDOW(window), TRUE);
gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 2);
gtk_box_pack_start(GTK_BOX(hbox), button1, FALSE, FALSE, 2);
gtk_container_add(GTK_CONTAINER(window), hbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
答案 0 :(得分:3)
连接到顶级窗口上的key_press_event
信号:
g_signal_connect(window, "key_press_event", G_CALLBACK(check_escape), NULL);
check_escape
回调将如下所示:
#include <gdk/gdkkeysyms.h>
...
static gboolean check_escape(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
if (event->keyval == GDK_KEY_Escape) {
gtk_main_quit();
return TRUE;
}
return FALSE;
}
此外,您不需要<curses.h>
包含,也不需要KEY_ESC
定义。
如果您的顶级窗口基本上是一个对话框,您可以考虑使用GtkDialog
而不是GtkWindow
。对话框提供库存响应,例如“确定”和“取消”,使用输入和转义键调用预期响应。
答案 1 :(得分:1)
对于您的应用程序,我会考虑使用GtkDialog和stock按钮而不是GtkWindow,这样您只需要在用户按下按钮而不是设置任何信号处理程序时从GTK设置的对话框中测试返回变量。它还会自动设置它,以便在取消对话框时返回GTK_RESPONSE_CANCEL,然后可以销毁窗口。