📄 gtkinputdialog.c
字号:
inputd->close_button = gtk_button_new_with_label (_("Close")); GTK_WIDGET_SET_FLAGS (inputd->close_button, GTK_CAN_DEFAULT); gtk_box_pack_start (GTK_BOX (GTK_DIALOG(inputd)->action_area), inputd->close_button, TRUE, TRUE, 0); gtk_widget_show (inputd->close_button); gtk_widget_grab_default (inputd->close_button); gtk_widget_show (vbox);}GtkWidget*gtk_input_dialog_new (void){ GtkInputDialog *inputd; inputd = gtk_type_new (GTK_TYPE_INPUT_DIALOG); return GTK_WIDGET (inputd);}static voidgtk_input_dialog_set_device(GtkWidget *widget, gpointer data){ guint32 deviceid = GPOINTER_TO_UINT(data); GdkDeviceInfo *info; GtkInputDialog *inputd = GTK_INPUT_DIALOG( gtk_object_get_user_data(GTK_OBJECT(widget))); inputd->current_device = deviceid; info = gtk_input_dialog_get_device_info (deviceid); gtk_input_dialog_fill_axes(inputd, info); gtk_input_dialog_fill_keys(inputd, info); gtk_option_menu_set_history(GTK_OPTION_MENU(inputd->mode_optionmenu), info->mode);}static voidgtk_input_dialog_finalize (GtkObject *object){ /* GtkInputDialog *inputd = GTK_INPUT_DIALOG (object); */ /* Clean up ? */ (* GTK_OBJECT_CLASS (parent_class)->finalize) (object);}static voidgtk_input_dialog_set_mapping_mode(GtkWidget *w, gpointer data){ GtkInputDialog *inputd = GTK_INPUT_DIALOG( gtk_object_get_user_data(GTK_OBJECT(w))); GdkDeviceInfo *info = gtk_input_dialog_get_device_info (inputd->current_device); GdkInputMode old_mode = info->mode; GdkInputMode mode = GPOINTER_TO_INT (data); if (mode != old_mode) { if (gdk_input_set_mode(inputd->current_device, mode)) { if (mode == GDK_MODE_DISABLED) gtk_signal_emit (GTK_OBJECT (inputd), input_dialog_signals[DISABLE_DEVICE], info->deviceid); else gtk_signal_emit (GTK_OBJECT (inputd), input_dialog_signals[ENABLE_DEVICE], info->deviceid); } else gtk_option_menu_set_history (GTK_OPTION_MENU (inputd->mode_optionmenu), old_mode); /* FIXME: error dialog ? */ }}static voidgtk_input_dialog_set_axis(GtkWidget *widget, gpointer data){ GdkAxisUse use = GPOINTER_TO_INT(data) & 0xFFFF; GdkAxisUse old_use; GdkAxisUse *new_axes; GtkInputDialog *inputd = GTK_INPUT_DIALOG (gtk_object_get_user_data (GTK_OBJECT (widget))); GdkDeviceInfo *info = gtk_input_dialog_get_device_info (inputd->current_device); gint axis = (GPOINTER_TO_INT(data) >> 16) - 1; gint old_axis; int i; new_axes = g_new (GdkAxisUse, info->num_axes); old_axis = -1; for (i=0;i<info->num_axes;i++) { new_axes[i] = info->axes[i]; if (info->axes[i] == use) old_axis = i; } if (axis != -1) old_use = info->axes[axis]; else old_use = GDK_AXIS_IGNORE; if (axis == old_axis) return; /* we must always have an x and a y axis */ if ((axis == -1 && (use == GDK_AXIS_X || use == GDK_AXIS_Y)) || (old_axis == -1 && (old_use == GDK_AXIS_X || old_use == GDK_AXIS_Y))) { gtk_option_menu_set_history ( GTK_OPTION_MENU (inputd->axis_items[use]), old_axis + 1); } else { if (axis != -1) new_axes[axis] = use; if (old_axis != -1) new_axes[old_axis] = old_use; if (old_use != GDK_AXIS_IGNORE) { gtk_option_menu_set_history ( GTK_OPTION_MENU (inputd->axis_items[old_use]), old_axis + 1); } gdk_input_set_axes (info->deviceid, new_axes); } g_free (new_axes);}static voidgtk_input_dialog_fill_axes(GtkInputDialog *inputd, GdkDeviceInfo *info){ static const char *axis_use_strings[GDK_AXIS_LAST] = { "", N_("X"), N_("Y"), N_("Pressure"), N_("X Tilt"), N_("Y Tilt") }; int i,j; GtkWidget *menu; GtkWidget *option_menu; GtkWidget *label; /* remove all the old items */ if (inputd->axis_list) { gtk_widget_hide (inputd->axis_list); /* suppress resizes (or get warnings) */ gtk_widget_destroy (inputd->axis_list); } inputd->axis_list = gtk_table_new (GDK_AXIS_LAST, 2, 0); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (inputd->axis_listbox), inputd->axis_list); gtk_widget_show (inputd->axis_list); gtk_widget_realize (inputd->axis_list); gdk_window_set_background (inputd->axis_list->window, &inputd->axis_list->style->base[GTK_STATE_NORMAL]); for (i=GDK_AXIS_X;i<GDK_AXIS_LAST;i++) { /* create the label */ label = gtk_label_new (_(axis_use_strings[i])); gtk_table_attach (GTK_TABLE (inputd->axis_list), label, 0, 1, i, i+1, 0, 0, 2, 2); /* and the use option menu */ menu = gtk_menu_new(); for (j = -1; j < info->num_axes; j++) { char buffer[16]; GtkWidget *menu_item; if (j == -1) menu_item = gtk_menu_item_new_with_label (_("none")); else { sprintf (buffer,"%d",j+1); menu_item = gtk_menu_item_new_with_label (buffer); } gtk_object_set_user_data (GTK_OBJECT (menu_item), inputd); gtk_signal_connect (GTK_OBJECT (menu_item), "activate", (GtkSignalFunc) gtk_input_dialog_set_axis, GINT_TO_POINTER (0x10000 * (j + 1) + i)); gtk_widget_show (menu_item); gtk_menu_append (GTK_MENU (menu), menu_item); } inputd->axis_items[i] = option_menu = gtk_option_menu_new (); gtk_table_attach (GTK_TABLE (inputd->axis_list), option_menu, 1, 2, i, i+1, 0, 0, 2, 2); gtk_widget_show (option_menu); gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu); for (j = 0; j < info->num_axes; j++) if (info->axes[j] == (GdkAxisUse) i) { gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), j+1); break; } gtk_widget_show (label); }}static void gtk_input_dialog_clear_key (GtkWidget *widget, GtkInputKeyInfo *key){ gtk_entry_set_text (GTK_ENTRY(key->entry), _("(disabled)")); gdk_input_set_key (key->inputd->current_device, key->index, 0, 0);}static void gtk_input_dialog_set_key (GtkInputKeyInfo *key, guint keyval, GdkModifierType modifiers){ GString *str; gchar chars[2]; if (keyval) { str = g_string_new(""); if (modifiers & GDK_SHIFT_MASK) g_string_append (str, "Shft+"); if (modifiers & GDK_CONTROL_MASK) g_string_append (str, "Ctl+"); if (modifiers & GDK_MOD1_MASK) g_string_append (str, "Alt+"); if ((keyval >= 0x20) && (keyval <= 0xFF)) { chars[0] = keyval; chars[1] = 0; g_string_append (str, chars); } else g_string_append (str, _("(unknown)")); gtk_entry_set_text (GTK_ENTRY(key->entry), str->str); g_string_free (str, TRUE); } else { gtk_entry_set_text (GTK_ENTRY(key->entry), _("(disabled)")); }}static gintgtk_input_dialog_key_press (GtkWidget *widget, GdkEventKey *event, GtkInputKeyInfo *key){ gtk_input_dialog_set_key (key, event->keyval, event->state & 0xFF); gdk_input_set_key (key->inputd->current_device, key->index, event->keyval, event->state & 0xFF); gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event"); return TRUE;}static void gtk_input_dialog_destroy_key (GtkWidget *widget, GtkInputKeyInfo *key){ g_free (key);}static voidgtk_input_dialog_fill_keys(GtkInputDialog *inputd, GdkDeviceInfo *info){ int i; GtkWidget *label; GtkWidget *button; char buffer[32]; /* remove all the old items */ if (inputd->keys_list) { gtk_widget_hide (inputd->keys_list); /* suppress resizes (or get warnings) */ gtk_widget_destroy (inputd->keys_list); } inputd->keys_list = gtk_table_new (info->num_keys, 3, FALSE); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (inputd->keys_listbox), inputd->keys_list); gtk_widget_show (inputd->keys_list); gtk_widget_realize (inputd->keys_list); gdk_window_set_background (inputd->keys_list->window, &inputd->keys_list->style->base[GTK_STATE_NORMAL]); for (i=0;i<info->num_keys;i++) { GtkInputKeyInfo *key = g_new (GtkInputKeyInfo, 1); key->index = i; key->inputd = inputd; /* create the label */ sprintf(buffer, "%d", i+1); label = gtk_label_new(buffer); gtk_table_attach (GTK_TABLE (inputd->keys_list), label, 0, 1, i, i+1, 0, 0, 2, 2); gtk_widget_show (label); /* the entry */ key->entry = gtk_entry_new (); gtk_table_attach (GTK_TABLE (inputd->keys_list), key->entry, 1, 2, i, i+1, GTK_EXPAND | GTK_FILL , 0, 2, 2); gtk_widget_show (key->entry); gtk_signal_connect (GTK_OBJECT(key->entry), "key_press_event", GTK_SIGNAL_FUNC (gtk_input_dialog_key_press), key); gtk_signal_connect (GTK_OBJECT(key->entry), "destroy", GTK_SIGNAL_FUNC (gtk_input_dialog_destroy_key), key); /* and clear button */ button = gtk_button_new_with_label (_("clear")); gtk_table_attach (GTK_TABLE (inputd->keys_list), button, 2, 3, i, i+1, 0, 0, 2, 2); gtk_widget_show (button); gtk_signal_connect (GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC (gtk_input_dialog_clear_key), key); gtk_input_dialog_set_key (key, info->keys[i].keyval, info->keys[i].modifiers); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -