X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkinputdialog.c;h=ffb35e807f1619a3a501b992ba0711ae97bf9496;hb=30b328e79aada4b0d029879e11b58cf6ca2b0073;hp=ba0901fdd05701e2864f443a228119dcddb0acc8;hpb=207e3bb9771b9e28c93cf2da5edebab543ed6a36;p=~andy%2Fgtk diff --git a/gtk/gtkinputdialog.c b/gtk/gtkinputdialog.c index ba0901fdd..ffb35e807 100644 --- a/gtk/gtkinputdialog.c +++ b/gtk/gtkinputdialog.c @@ -34,7 +34,6 @@ #include #include -#include #include "gdk/gdkkeysyms.h" #include "gtkbutton.h" #include "gtkentry.h" @@ -44,22 +43,35 @@ #include "gtklabel.h" #include "gtklistitem.h" #include "gtkmain.h" +#include "gtkmarshalers.h" #include "gtkmenu.h" #include "gtkmenuitem.h" #include "gtknotebook.h" #include "gtkoptionmenu.h" #include "gtkscrolledwindow.h" -#include "gtksignal.h" +#include "gtkstock.h" #include "gtktable.h" #include "gtkvbox.h" #include "gtkintl.h" -typedef struct { +typedef struct _GtkInputDialogPrivate GtkInputDialogPrivate; +typedef struct _GtkInputKeyInfo GtkInputKeyInfo; + +struct _GtkInputDialogPrivate +{ + GtkWidget *device_menu; + GtkWidget *device_optionmenu; + GtkWidget *no_devices_label; + GtkWidget *main_vbox; +}; + +struct _GtkInputKeyInfo +{ gint index; GtkWidget *entry; GtkInputDialog *inputd; -} GtkInputKeyInfo; +}; enum { @@ -79,6 +91,8 @@ enum static void gtk_input_dialog_class_init (GtkInputDialogClass *klass); static void gtk_input_dialog_init (GtkInputDialog *inputd); +static void gtk_input_dialog_screen_changed (GtkWidget *widget, + GdkScreen *previous_screen); static void gtk_input_dialog_set_device (GtkWidget *widget, gpointer data); static void gtk_input_dialog_set_mapping_mode (GtkWidget *w, @@ -90,7 +104,7 @@ static void gtk_input_dialog_fill_axes (GtkInputDialog *inputd, static void gtk_input_dialog_set_key (GtkInputKeyInfo *key, guint keyval, GdkModifierType modifiers); -static gint gtk_input_dialog_key_press (GtkWidget *widget, +static gboolean gtk_input_dialog_key_press (GtkWidget *widget, GdkEventKey *event, GtkInputKeyInfo *key); static void gtk_input_dialog_clear_key (GtkWidget *widget, @@ -103,237 +117,244 @@ static void gtk_input_dialog_fill_keys (GtkInputDialog *inputd, static GtkObjectClass *parent_class = NULL; static guint input_dialog_signals[LAST_SIGNAL] = { 0 }; -GtkType +GType gtk_input_dialog_get_type (void) { - static GtkType input_dialog_type = 0; + static GType input_dialog_type = 0; if (!input_dialog_type) { - static const GtkTypeInfo input_dialog_info = + static const GTypeInfo input_dialog_info = { - "GtkInputDialog", - sizeof (GtkInputDialog), sizeof (GtkInputDialogClass), - (GtkClassInitFunc) gtk_input_dialog_class_init, - (GtkObjectInitFunc) gtk_input_dialog_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gtk_input_dialog_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GtkInputDialog), + 0, /* n_preallocs */ + (GInstanceInitFunc) gtk_input_dialog_init, }; - input_dialog_type = gtk_type_unique (GTK_TYPE_DIALOG, - &input_dialog_info); + input_dialog_type = + g_type_register_static (GTK_TYPE_DIALOG, "GtkInputDialog", + &input_dialog_info, 0); } return input_dialog_type; } -static void -gtk_input_dialog_class_init (GtkInputDialogClass *klass) +GtkInputDialogPrivate * +gtk_input_dialog_get_private (GtkInputDialog *input_dialog) { - GtkObjectClass *object_class; + GtkInputDialogPrivate *private; + static GQuark private_quark = 0; + + if (!private_quark) + private_quark = g_quark_from_static_string ("gtk-input-dialog-private"); + + private = g_object_get_qdata (G_OBJECT (input_dialog), private_quark); + + if (!private) + { + private = g_new0 (GtkInputDialogPrivate, 1); + g_object_set_qdata_full (G_OBJECT (input_dialog), private_quark, + private, g_free); + } + + return private; +} + +static GtkInputDialog * +input_dialog_from_widget (GtkWidget *widget) +{ + GtkWidget *toplevel; + + if (GTK_IS_MENU_ITEM (widget)) + { + GtkMenu *menu = GTK_MENU (widget->parent); + widget = gtk_menu_get_attach_widget (menu); + } - object_class = (GtkObjectClass*) klass; + toplevel = gtk_widget_get_toplevel (widget); + return GTK_INPUT_DIALOG (toplevel); +} - parent_class = gtk_type_class (GTK_TYPE_DIALOG); +static void +gtk_input_dialog_class_init (GtkInputDialogClass *klass) +{ + GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; + + parent_class = g_type_class_peek_parent (klass); + widget_class->screen_changed = gtk_input_dialog_screen_changed; + klass->enable_device = NULL; klass->disable_device = NULL; input_dialog_signals[ENABLE_DEVICE] = - gtk_signal_new ("enable_device", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkInputDialogClass, enable_device), - gtk_marshal_VOID__POINTER, - GTK_TYPE_NONE, 1, GTK_TYPE_POINTER); + g_signal_new ("enable_device", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkInputDialogClass, enable_device), + NULL, NULL, + _gtk_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GDK_TYPE_DEVICE); input_dialog_signals[DISABLE_DEVICE] = - gtk_signal_new ("disable_device", - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkInputDialogClass, disable_device), - gtk_marshal_VOID__POINTER, - GTK_TYPE_NONE, 1, GTK_TYPE_POINTER); + g_signal_new ("disable_device", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkInputDialogClass, disable_device), + NULL, NULL, + _gtk_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GDK_TYPE_DEVICE); } static void gtk_input_dialog_init (GtkInputDialog *inputd) { - GtkWidget *vbox; + GtkInputDialogPrivate *private = gtk_input_dialog_get_private (inputd); GtkWidget *util_box; GtkWidget *label; - GtkWidget *device_menu; GtkWidget *mapping_menu; GtkWidget *menuitem; - GtkWidget *optionmenu; GtkWidget *separator; GtkWidget *notebook; - GList *tmp_list; - GList *device_info; - - device_info = gdk_devices_list (); - - /* shell and main vbox */ + gtk_widget_push_composite_child (); gtk_window_set_title (GTK_WINDOW (inputd), _("Input")); - vbox = gtk_vbox_new (FALSE, 4); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (inputd)->vbox), vbox, TRUE, TRUE, 0); - - if (g_list_length(device_info) <= 1) /* only core device */ - { - label = gtk_label_new (_("No input devices")); - gtk_container_add (GTK_CONTAINER (vbox), label); - - gtk_widget_show (label); - } - else - { - /* menu for selecting device */ + /* main vbox */ - device_menu = gtk_menu_new (); + private->main_vbox = gtk_vbox_new (FALSE, 4); + gtk_container_set_border_width (GTK_CONTAINER (private->main_vbox), 5); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (inputd)->vbox), private->main_vbox, + TRUE, TRUE, 0); - for (tmp_list = device_info; tmp_list; tmp_list = tmp_list->next) { - GdkDevice *info = (GdkDevice *)(tmp_list->data); - if (info != gdk_core_pointer) - { - menuitem = gtk_menu_item_new_with_label(info->name); + private->no_devices_label = gtk_label_new (_("No input devices")); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (inputd)->vbox), + private->no_devices_label, + TRUE, TRUE, 0); - gtk_menu_shell_append (GTK_MENU_SHELL (device_menu), menuitem); - gtk_widget_show (menuitem); - gtk_object_set_user_data (GTK_OBJECT (menuitem), inputd); - gtk_signal_connect (GTK_OBJECT (menuitem), "activate", - (GtkSignalFunc) gtk_input_dialog_set_device, - info); - } - } + /* menu for selecting device */ - util_box = gtk_hbox_new (FALSE, 2); - gtk_box_pack_start (GTK_BOX (vbox), util_box, FALSE, FALSE, 0); + private->device_menu = gtk_menu_new (); - label = gtk_label_new(_("_Device:")); - gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); + util_box = gtk_hbox_new (FALSE, 2); + gtk_box_pack_start (GTK_BOX (private->main_vbox), util_box, FALSE, FALSE, 0); - optionmenu = gtk_option_menu_new (); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), optionmenu); - gtk_box_pack_start (GTK_BOX (util_box), optionmenu, TRUE, TRUE, 2); - gtk_widget_show (optionmenu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), device_menu); + label = gtk_label_new_with_mnemonic (_("_Device:")); + gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); - gtk_widget_show (label); + private->device_optionmenu = gtk_option_menu_new (); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), private->device_optionmenu); + gtk_box_pack_start (GTK_BOX (util_box), private->device_optionmenu, TRUE, TRUE, 2); + gtk_widget_show (private->device_optionmenu); + gtk_option_menu_set_menu (GTK_OPTION_MENU (private->device_optionmenu), private->device_menu); - /* Device options */ + gtk_widget_show (label); - /* mapping mode option menu */ + /* Device options */ - mapping_menu = gtk_menu_new (); + /* mapping mode option menu */ - menuitem = gtk_menu_item_new_with_label(_("Disabled")); - gtk_menu_shell_append (GTK_MENU_SHELL (mapping_menu), menuitem); - gtk_object_set_user_data (GTK_OBJECT (menuitem), inputd); - gtk_widget_show (menuitem); - gtk_signal_connect (GTK_OBJECT (menuitem), "activate", - (GtkSignalFunc) gtk_input_dialog_set_mapping_mode, - GINT_TO_POINTER (GDK_MODE_DISABLED)); + mapping_menu = gtk_menu_new (); - menuitem = gtk_menu_item_new_with_label(_("Screen")); - gtk_menu_shell_append (GTK_MENU_SHELL (mapping_menu), menuitem); - gtk_object_set_user_data (GTK_OBJECT (menuitem), inputd); - gtk_widget_show (menuitem); - gtk_signal_connect (GTK_OBJECT (menuitem), "activate", - (GtkSignalFunc) gtk_input_dialog_set_mapping_mode, - GINT_TO_POINTER (GDK_MODE_SCREEN)); + menuitem = gtk_menu_item_new_with_label(_("Disabled")); + gtk_menu_shell_append (GTK_MENU_SHELL (mapping_menu), menuitem); + gtk_widget_show (menuitem); + g_signal_connect (menuitem, "activate", + G_CALLBACK (gtk_input_dialog_set_mapping_mode), + GINT_TO_POINTER (GDK_MODE_DISABLED)); - menuitem = gtk_menu_item_new_with_label(_("Window")); - gtk_menu_shell_append (GTK_MENU_SHELL (mapping_menu), menuitem); - gtk_object_set_user_data (GTK_OBJECT (menuitem), inputd); - gtk_widget_show (menuitem); - gtk_signal_connect (GTK_OBJECT (menuitem), "activate", - (GtkSignalFunc) gtk_input_dialog_set_mapping_mode, - GINT_TO_POINTER (GDK_MODE_WINDOW)); + menuitem = gtk_menu_item_new_with_label(_("Screen")); + gtk_menu_shell_append (GTK_MENU_SHELL (mapping_menu), menuitem); + gtk_widget_show (menuitem); + g_signal_connect (menuitem, "activate", + G_CALLBACK (gtk_input_dialog_set_mapping_mode), + GINT_TO_POINTER (GDK_MODE_SCREEN)); - label = gtk_label_new(_("_Mode: ")); - gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); + menuitem = gtk_menu_item_new_with_label(_("Window")); + gtk_menu_shell_append (GTK_MENU_SHELL (mapping_menu), menuitem); + gtk_widget_show (menuitem); + g_signal_connect (menuitem, "activate", + G_CALLBACK (gtk_input_dialog_set_mapping_mode), + GINT_TO_POINTER (GDK_MODE_WINDOW)); - inputd->mode_optionmenu = gtk_option_menu_new (); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), inputd->mode_optionmenu); - gtk_box_pack_start (GTK_BOX (util_box), inputd->mode_optionmenu, FALSE, FALSE, 2); - gtk_widget_show (inputd->mode_optionmenu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (inputd->mode_optionmenu), mapping_menu); + label = gtk_label_new_with_mnemonic (_("_Mode: ")); + gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 2); + + inputd->mode_optionmenu = gtk_option_menu_new (); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), inputd->mode_optionmenu); + gtk_box_pack_start (GTK_BOX (util_box), inputd->mode_optionmenu, FALSE, FALSE, 2); + gtk_widget_show (inputd->mode_optionmenu); + gtk_option_menu_set_menu (GTK_OPTION_MENU (inputd->mode_optionmenu), mapping_menu); - gtk_widget_show(label); + gtk_widget_show(label); - gtk_widget_show (util_box); + gtk_widget_show (util_box); - util_box = gtk_hbox_new (FALSE, 2); - gtk_box_pack_start (GTK_BOX(vbox), util_box, FALSE, FALSE, 0); + util_box = gtk_hbox_new (FALSE, 2); + gtk_box_pack_start (GTK_BOX(private->main_vbox), util_box, FALSE, FALSE, 0); - gtk_widget_show (label); - gtk_widget_show (util_box); + gtk_widget_show (label); + gtk_widget_show (util_box); - separator = gtk_hseparator_new(); - gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0); - gtk_widget_show (separator); + separator = gtk_hseparator_new(); + gtk_box_pack_start (GTK_BOX (private->main_vbox), separator, FALSE, TRUE, 0); + gtk_widget_show (separator); - /* Notebook */ + /* Notebook */ - notebook = gtk_notebook_new (); - gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0); - gtk_widget_show (notebook); + notebook = gtk_notebook_new (); + gtk_box_pack_start (GTK_BOX (private->main_vbox), notebook, TRUE, TRUE, 0); + gtk_widget_show (notebook); - /* The axis listbox */ + /* The axis listbox */ - label = gtk_label_new (_("_Axes")); + label = gtk_label_new_with_mnemonic (_("_Axes")); - inputd->axis_listbox = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(inputd->axis_listbox), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + inputd->axis_listbox = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(inputd->axis_listbox), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_widget_set_usize (inputd->axis_listbox, AXIS_LIST_WIDTH, AXIS_LIST_HEIGHT); - gtk_notebook_append_page (GTK_NOTEBOOK(notebook), - inputd->axis_listbox, label); - - gtk_widget_show (inputd->axis_listbox); + gtk_widget_set_size_request (inputd->axis_listbox, + AXIS_LIST_WIDTH, AXIS_LIST_HEIGHT); + gtk_notebook_append_page (GTK_NOTEBOOK(notebook), + inputd->axis_listbox, label); - inputd->axis_list = 0; + gtk_widget_show (inputd->axis_listbox); - /* Keys listbox */ + inputd->axis_list = 0; - label = gtk_label_new (_("_Keys")); + /* Keys listbox */ - inputd->keys_listbox = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_set_usize (inputd->keys_listbox, KEYS_LIST_WIDTH, KEYS_LIST_HEIGHT); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(inputd->keys_listbox), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_notebook_append_page (GTK_NOTEBOOK(notebook), - inputd->keys_listbox, label); + label = gtk_label_new_with_mnemonic (_("_Keys")); - gtk_widget_show (inputd->keys_listbox); + inputd->keys_listbox = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_size_request (inputd->keys_listbox, + KEYS_LIST_WIDTH, KEYS_LIST_HEIGHT); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (inputd->keys_listbox), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), + inputd->keys_listbox, label); - inputd->keys_list = 0; + gtk_widget_show (inputd->keys_listbox); - /* ...set_device expects to get input dialog from widget user data */ - gtk_object_set_user_data (GTK_OBJECT (inputd), inputd); - gtk_input_dialog_set_device (GTK_WIDGET(inputd), device_info->data); + inputd->keys_list = 0; - } - - /* We create the save button in any case, so that clients can - connect to it, without paying attention to whether it exits */ - inputd->save_button = gtk_button_new_with_label (_("Save")); + inputd->save_button = gtk_button_new_from_stock (GTK_STOCK_SAVE); GTK_WIDGET_SET_FLAGS (inputd->save_button, GTK_CAN_DEFAULT); gtk_box_pack_start (GTK_BOX (GTK_DIALOG(inputd)->action_area), inputd->save_button, TRUE, TRUE, 0); gtk_widget_show (inputd->save_button); - if (g_list_length(device_info) <= 1) /* only core device */ - gtk_widget_set_sensitive(inputd->save_button, FALSE); - - inputd->close_button = gtk_button_new_with_label (_("Close")); + inputd->close_button = gtk_button_new_from_stock (GTK_STOCK_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); @@ -341,59 +362,122 @@ gtk_input_dialog_init (GtkInputDialog *inputd) gtk_widget_show (inputd->close_button); gtk_widget_grab_default (inputd->close_button); - gtk_widget_show (vbox); + gtk_widget_pop_composite_child (); + + gtk_input_dialog_screen_changed (GTK_WIDGET (inputd), NULL); } +static void +gtk_input_dialog_screen_changed (GtkWidget *widget, + GdkScreen *previous_screen) +{ + GtkInputDialog *inputd = GTK_INPUT_DIALOG (widget); + GtkInputDialogPrivate *private = gtk_input_dialog_get_private (inputd); + + GList *device_info = NULL; + GdkDevice *core_pointer = NULL; + GList *tmp_list; + + if (gtk_widget_has_screen (widget)) + { + GdkDisplay *display; + + display = gtk_widget_get_display (widget); + device_info = gdk_display_list_devices (display); + core_pointer = gdk_display_get_core_pointer (display); + } + + inputd->current_device = NULL; + gtk_container_foreach (GTK_CONTAINER (private->device_menu), + (GtkCallback)gtk_widget_destroy, NULL); + + if (g_list_length(device_info) <= 1) /* only core device */ + { + gtk_widget_hide (private->main_vbox); + gtk_widget_show (private->no_devices_label); + gtk_widget_set_sensitive(inputd->save_button, FALSE); + } + else + { + gtk_widget_show (private->main_vbox); + gtk_widget_hide (private->no_devices_label); + gtk_widget_set_sensitive(inputd->save_button, TRUE); + for (tmp_list = device_info; tmp_list; tmp_list = tmp_list->next) + { + GdkDevice *info = tmp_list->data; + if (info != core_pointer) + { + GtkWidget *menuitem; + + menuitem = gtk_menu_item_new_with_label (info->name); + + gtk_menu_shell_append (GTK_MENU_SHELL (private->device_menu), + menuitem); + gtk_widget_show (menuitem); + g_signal_connect (menuitem, "activate", + G_CALLBACK (gtk_input_dialog_set_device), + info); + } + } + + gtk_input_dialog_set_device (widget, device_info->data); + gtk_option_menu_set_history (GTK_OPTION_MENU (private->device_optionmenu), 0); + } +} + GtkWidget* gtk_input_dialog_new (void) { GtkInputDialog *inputd; - inputd = gtk_type_new (GTK_TYPE_INPUT_DIALOG); + inputd = g_object_new (GTK_TYPE_INPUT_DIALOG, NULL); return GTK_WIDGET (inputd); } static void -gtk_input_dialog_set_device(GtkWidget *widget, gpointer data) +gtk_input_dialog_set_device (GtkWidget *w, + gpointer data) { GdkDevice *device = data; - - GtkInputDialog *inputd = GTK_INPUT_DIALOG( - gtk_object_get_user_data(GTK_OBJECT(widget))); + GtkInputDialog *inputd = input_dialog_from_widget (w); inputd->current_device = device; - gtk_input_dialog_fill_axes(inputd, device); - gtk_input_dialog_fill_keys(inputd, device); + gtk_input_dialog_fill_axes (inputd, device); + gtk_input_dialog_fill_keys (inputd, device); - gtk_option_menu_set_history(GTK_OPTION_MENU(inputd->mode_optionmenu), - device->mode); + gtk_option_menu_set_history (GTK_OPTION_MENU (inputd->mode_optionmenu), + device->mode); } static void gtk_input_dialog_set_mapping_mode (GtkWidget *w, gpointer data) { - GtkInputDialog *inputd = GTK_INPUT_DIALOG( - gtk_object_get_user_data(GTK_OBJECT(w))); + GtkInputDialog *inputd = input_dialog_from_widget (w); GdkDevice *info = inputd->current_device; GdkInputMode old_mode = info->mode; GdkInputMode mode = GPOINTER_TO_INT (data); + if (!info) + return; + if (mode != old_mode) { - if (gdk_device_set_mode (inputd->current_device, mode)) + if (gdk_device_set_mode (info, mode)) { if (mode == GDK_MODE_DISABLED) - gtk_signal_emit (GTK_OBJECT (inputd), - input_dialog_signals[DISABLE_DEVICE], - info); + g_signal_emit (inputd, + input_dialog_signals[DISABLE_DEVICE], + 0, + info); else - gtk_signal_emit (GTK_OBJECT (inputd), - input_dialog_signals[ENABLE_DEVICE], - info); + g_signal_emit (inputd, + input_dialog_signals[ENABLE_DEVICE], + 0, + info); } else gtk_option_menu_set_history (GTK_OPTION_MENU (inputd->mode_optionmenu), @@ -404,18 +488,22 @@ gtk_input_dialog_set_mapping_mode (GtkWidget *w, } static void -gtk_input_dialog_set_axis(GtkWidget *widget, gpointer data) +gtk_input_dialog_set_axis (GtkWidget *w, + 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))); + GtkInputDialog *inputd = input_dialog_from_widget (w); GdkDevice *info = inputd->current_device; gint axis = (GPOINTER_TO_INT(data) >> 16) - 1; gint old_axis; int i; + if (!info) + return; + new_axes = g_new (GdkAxisUse, info->num_axes); old_axis = -1; for (i=0;inum_axes;i++) @@ -517,10 +605,9 @@ gtk_input_dialog_fill_axes(GtkInputDialog *inputd, GdkDevice *info) 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)); + g_signal_connect (menu_item, "activate", + G_CALLBACK (gtk_input_dialog_set_axis), + GINT_TO_POINTER (0x10000 * (j + 1) + i)); gtk_widget_show (menu_item); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); } @@ -545,6 +632,9 @@ gtk_input_dialog_fill_axes(GtkInputDialog *inputd, GdkDevice *info) static void gtk_input_dialog_clear_key (GtkWidget *widget, GtkInputKeyInfo *key) { + if (!key->inputd->current_device) + return; + gtk_entry_set_text (GTK_ENTRY(key->entry), _("(disabled)")); gdk_device_set_key (key->inputd->current_device, key->index, 0, 0); } @@ -561,9 +651,9 @@ gtk_input_dialog_set_key (GtkInputKeyInfo *key, str = g_string_new(""); if (modifiers & GDK_SHIFT_MASK) - g_string_append (str, "Shft+"); + g_string_append (str, "Shift+"); if (modifiers & GDK_CONTROL_MASK) - g_string_append (str, "Ctl+"); + g_string_append (str, "Ctrl+"); if (modifiers & GDK_MOD1_MASK) g_string_append (str, "Alt+"); @@ -585,16 +675,19 @@ gtk_input_dialog_set_key (GtkInputKeyInfo *key, } } -static gint +static gboolean gtk_input_dialog_key_press (GtkWidget *widget, GdkEventKey *event, GtkInputKeyInfo *key) { + if (!key->inputd->current_device) + return FALSE; + gtk_input_dialog_set_key (key, event->keyval, event->state & 0xFF); gdk_device_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"); + g_signal_stop_emission_by_name (widget, "key_press_event"); return TRUE; } @@ -638,8 +731,8 @@ gtk_input_dialog_fill_keys(GtkInputDialog *inputd, GdkDevice *info) /* create the label */ - sprintf(buffer, "%d", i+1); - label = gtk_label_new(buffer); + 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); @@ -651,11 +744,10 @@ gtk_input_dialog_fill_keys(GtkInputDialog *inputd, GdkDevice *info) 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); + g_signal_connect (key->entry, "key_press_event", + G_CALLBACK (gtk_input_dialog_key_press), key); + g_signal_connect (key->entry, "destroy", + G_CALLBACK (gtk_input_dialog_destroy_key), key); /* and clear button */ @@ -664,8 +756,8 @@ gtk_input_dialog_fill_keys(GtkInputDialog *inputd, GdkDevice *info) 0, 0, 2, 2); gtk_widget_show (button); - gtk_signal_connect (GTK_OBJECT(button), "clicked", - GTK_SIGNAL_FUNC (gtk_input_dialog_clear_key), key); + g_signal_connect (button, "clicked", + G_CALLBACK (gtk_input_dialog_clear_key), key); gtk_input_dialog_set_key (key, info->keys[i].keyval, info->keys[i].modifiers);