X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=gui%2Fcontrols.c;h=e07d84f1611e7b16001447b292dd24ba555db986;hb=79019aad669ca77a25adbe01bce22d21cd0f2e03;hp=0dedcc905653d6a9765dcdd63ef1d92ea36b8547;hpb=05def4fb028eb1ede3e945d07c85b1d5f21fd536;p=drnoksnes diff --git a/gui/controls.c b/gui/controls.c index 0dedcc9..e07d84f 100644 --- a/gui/controls.c +++ b/gui/controls.c @@ -20,285 +20,225 @@ * */ +#include #include #include -#include "../platform/hgw.h" +#if MAEMO_VERSION >= 5 +#include +#include +#include +#include +#include +#include +#include +#else +#include +#endif + #include "plugin.h" -#include "cellrendererkey.h" +#include "gconf.h" +#include "i18n.h" static GtkDialog* dialog; -static GtkComboBox* combo; -static GtkLabel* none_label; -static GtkScrolledWindow* keys_scroll; -static GtkListStore* keys_store; -static GtkTreeView* keys_list; -static GtkLabel* ts_label; - -enum -{ - BUTTON_COLUMN, - BUTTONENTRY_COLUMN, - N_COLUMNS -}; - -typedef struct ButtonEntry { - const char * name; - const char * gconf_key; - unsigned char scancode; - unsigned char default_scancode; -} ButtonEntry; -#define BUTTON_INITIALIZER(desc, name, default) \ - { desc, kGConfKeysPath "/" name, 0, default } -#define BUTTON_LAST \ - { 0 } -static ButtonEntry buttons[] = { - BUTTON_INITIALIZER("A", "a", 48), - BUTTON_INITIALIZER("B", "b", 20), - BUTTON_INITIALIZER("X", "x", 32), - BUTTON_INITIALIZER("Y", "y", 45), - BUTTON_INITIALIZER("L", "l", 24), - BUTTON_INITIALIZER("R", "r", 22), - BUTTON_INITIALIZER("Start", "start", 65), - BUTTON_INITIALIZER("Select", "select", 135), - BUTTON_INITIALIZER("Up", "up", 111), - BUTTON_INITIALIZER("Down", "down", 116), - BUTTON_INITIALIZER("Left", "left", 113), - BUTTON_INITIALIZER("Right", "right", 114), - BUTTON_INITIALIZER("Return to launcher", "quit", 9), - BUTTON_INITIALIZER("Fullscreen", "fullscreen", 72), - BUTTON_LAST -}; - -static void show_widgets() +static int current_player; +#if MAEMO_VERSION >= 5 +static HildonCheckButton* keys_chk; +static HildonButton* keys_btn; +static HildonCheckButton* touch_chk; +static HildonCheckButton* touch_show_chk; +#else + +#endif + +static void load_settings() { - gtk_widget_show_all(GTK_WIDGET(combo)); - gtk_widget_hide_all(GTK_WIDGET(none_label)); - gtk_widget_hide_all(GTK_WIDGET(keys_scroll)); - gtk_widget_hide_all(GTK_WIDGET(ts_label)); - switch (gtk_combo_box_get_active(combo)) { - case 0: - gtk_widget_show_all(GTK_WIDGET(none_label)); - break; - case 1: - gtk_widget_show_all(GTK_WIDGET(keys_scroll)); - break; - case 2: - gtk_widget_show_all(GTK_WIDGET(ts_label)); - break; - } + gchar key_base[kGConfPlayerPathBufferLen]; + const int key_len = sprintf(key_base, kGConfPlayerPath, current_player); + gchar *key = key_base + key_len; + +#if MAEMO_VERSION >= 5 + strcpy(key, kGConfPlayerKeyboardEnable); + hildon_check_button_set_active(keys_chk, + gconf_client_get_bool(gcc, key_base, NULL)); +#else +#endif } -static gboolean load_key_config(GtkTreeModel *model, GtkTreePath *path, - GtkTreeIter *iter, gpointer data) +static void save_settings() { - ButtonEntry *button_entry; - - gtk_tree_model_get(model, iter, - BUTTONENTRY_COLUMN, &button_entry, - -1); - - int scancode = gconf_client_get_int(gcc, button_entry->gconf_key, NULL); - button_entry->scancode = scancode; - - gtk_tree_model_row_changed(GTK_TREE_MODEL(keys_store), path, iter); - - return FALSE; + gchar key_base[kGConfPlayerPathBufferLen]; + const int key_len = sprintf(key_base, kGConfPlayerPath, current_player); + gchar *key = key_base + key_len; + +#if MAEMO_VERSION >= 5 + strcpy(key, kGConfPlayerKeyboardEnable); + gconf_client_set_bool(gcc, key_base, + hildon_check_button_get_active(keys_chk), NULL); +#else +#endif } -static void load_config() +static void keys_btn_callback(GtkWidget * button, gpointer data) { - GConfValue* mapping = gconf_client_get(gcc, kGConfMapping, NULL); - - if (!mapping) { - mapping = gconf_value_new(GCONF_VALUE_INT); - gconf_value_set_int(mapping, 1); - gconf_client_set(gcc, kGConfMapping, mapping, NULL); - } - - gtk_combo_box_set_active(combo, gconf_value_get_int(mapping)); - - gconf_client_preload(gcc, kGConfKeysPath, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gtk_tree_model_foreach(GTK_TREE_MODEL(keys_store), load_key_config, NULL); - - show_widgets(); - gconf_value_free(mapping); + keys_dialog(GTK_WINDOW(dialog), GPOINTER_TO_INT(data)); } -static void -accel_set_func (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data) +static void cb_dialog_response(GtkWidget * button, gint response, gpointer data) { - ButtonEntry *button_entry; - - gtk_tree_model_get (model, iter, - BUTTONENTRY_COLUMN, &button_entry, - -1); - - if (button_entry == NULL) { - g_object_set (G_OBJECT (cell), - "visible", FALSE, - NULL); - } else { - g_object_set (G_OBJECT (cell), - "visible", TRUE, - "editable", TRUE, - "scancode", button_entry->scancode, - "style", PANGO_STYLE_NORMAL, - NULL); + if (response == GTK_RESPONSE_OK) { + save_settings(); + settings_update_controls(current_player); } + + gtk_widget_destroy(GTK_WIDGET(dialog)); } -static void -cb_key_edited(GtkCellRendererText *cell, const char *path_string, - guint scancode, gpointer data) +#if MAEMO_VERSION >= 5 +static void set_button_layout(HildonButton* button, + GtkSizeGroup* titles_size_group, GtkSizeGroup* values_size_group) { - GtkTreePath *path = gtk_tree_path_new_from_string(path_string); - GtkTreeIter iter; - ButtonEntry *button_entry; - - gtk_tree_model_get_iter(GTK_TREE_MODEL(keys_store), &iter, path); - gtk_tree_model_get(GTK_TREE_MODEL(keys_store), &iter, - BUTTONENTRY_COLUMN, &button_entry, - -1); - - g_debug("Setting scancode for button %s to %u\n", - button_entry->name, scancode); - gconf_client_set_int(gcc, button_entry->gconf_key, scancode, NULL); - - button_entry->scancode = scancode; - gtk_tree_model_row_changed(GTK_TREE_MODEL(keys_store), path, &iter); - - gtk_tree_path_free(path); + hildon_button_add_title_size_group(button, titles_size_group); + hildon_button_add_value_size_group(button, values_size_group); + hildon_button_set_alignment(button, 0.0, 0.5, 1.0, 0.0); } +#endif -static void -cb_key_cleared(GtkCellRendererText *cell, const char *path_string, - gpointer data) +gchar* controls_describe(int player) { - GtkTreePath *path = gtk_tree_path_new_from_string(path_string); - GtkTreeIter iter; - ButtonEntry *button_entry; + static gchar description[128]; - gtk_tree_model_get_iter(GTK_TREE_MODEL(keys_store), &iter, path); - gtk_tree_path_free(path); - gtk_tree_model_get(GTK_TREE_MODEL(keys_store), &iter, - BUTTONENTRY_COLUMN, &button_entry, - -1); + gchar key_base[kGConfPlayerPathBufferLen]; + const int key_len = sprintf(key_base, kGConfPlayerPath, player); + gchar *key = key_base + key_len; - g_debug("Clearing scancode for button %s\n", button_entry->name); - gconf_client_set_int(gcc, button_entry->gconf_key, 0, NULL); - // prefer 0 value over unset key. + description[0] = '\0'; - button_entry->scancode = 0; -} - -static void cb_combo_changed(GtkComboBox * widget, gpointer data) -{ - show_widgets(); - gconf_client_set_int(gcc, kGConfMapping, - gtk_combo_box_get_active(combo), NULL); -} - -static void cb_dialog_response(GtkWidget * button, gpointer data) -{ - gtk_widget_destroy(GTK_WIDGET(dialog)); -} + strcpy(key, kGConfPlayerKeyboardEnable); + if (gconf_client_get_bool(gcc, key_base, NULL)) { + strcpy(description, _("Keyboard")); + } -void controls_setup() -{ - GConfValue* mapping = gconf_client_get(gcc, kGConfMapping, NULL); - - if (!mapping) { - // Key not set; setup defaults - int i; - for (i = 0; buttons[i].name; i++) { - gconf_client_set_int(gcc, - buttons[i].gconf_key, buttons[i].default_scancode, NULL); - } - - g_debug("Loading default key mappings\n"); - - gconf_client_set_int(gcc, kGConfMapping, 1, NULL); - } else { - // If this is set, consider defaults loaded. - gconf_value_free(mapping); + if (description[0] == '\0') { + strcpy(description, _("Disabled")); } + + return description; } -void controls_dialog(GtkWindow* parent) +void controls_dialog(GtkWindow* parent, int player) { - dialog = GTK_DIALOG(gtk_dialog_new_with_buttons("Controls", + gchar* title = g_strdup_printf(_("Player %d controls"), player); + dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(title, parent, GTK_DIALOG_MODAL, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL)); - - combo = GTK_COMBO_BOX(gtk_combo_box_new_text()); - gtk_combo_box_append_text(combo, "No controls/Use config file"); - gtk_combo_box_append_text(combo, "Use physical keys"); - gtk_combo_box_append_text(combo, "Use touchscreen"); - - none_label = GTK_LABEL(gtk_label_new("Check documentation for details.")); - - keys_scroll = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); - gtk_scrolled_window_set_policy(keys_scroll, - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - keys_store = GTK_LIST_STORE(gtk_list_store_new(N_COLUMNS, - G_TYPE_STRING, G_TYPE_POINTER)); - keys_list = GTK_TREE_VIEW( - gtk_tree_view_new_with_model(GTK_TREE_MODEL(keys_store))); - - GtkCellRenderer* renderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new()); - GtkTreeViewColumn * column = - gtk_tree_view_column_new_with_attributes ("Button", - gtk_cell_renderer_text_new(), - "text", BUTTON_COLUMN, - NULL); - gtk_tree_view_column_set_resizable(column, FALSE); - gtk_tree_view_column_set_expand(column, TRUE); - gtk_tree_view_append_column(keys_list, column); - - renderer = GTK_CELL_RENDERER(cell_renderer_key_new()); - column = gtk_tree_view_column_new_with_attributes("Key", renderer, NULL); - gtk_tree_view_column_set_cell_data_func(column, renderer, accel_set_func, NULL, NULL); - gtk_tree_view_column_set_resizable(column, FALSE); - gtk_tree_view_column_set_min_width(column, 240); - gtk_tree_view_append_column(keys_list, column); - gtk_tree_view_set_headers_visible(keys_list, TRUE); - - int i; - for (i = 0; buttons[i].name; i++) { - GtkTreeIter iter; - gtk_list_store_append(keys_store, &iter); - gtk_list_store_set(keys_store, &iter, - BUTTON_COLUMN, buttons[i].name, - BUTTONENTRY_COLUMN, &buttons[i], - -1); - } + GTK_STOCK_SAVE, GTK_RESPONSE_OK, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL)); + g_free(title); + + current_player = player; + +#if MAEMO_VERSION >= 5 + GtkBox * box = GTK_BOX(gtk_vbox_new(FALSE, HILDON_MARGIN_HALF)); + HildonPannableArea * pannable = + HILDON_PANNABLE_AREA(hildon_pannable_area_new()); + GtkSizeGroup * titles_size_group = + gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + GtkSizeGroup * values_size_group = + gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + PangoAttrList *pattrlist = pango_attr_list_new(); + PangoAttribute *attr = pango_attr_size_new(22 * PANGO_SCALE); + attr->start_index = 0; + attr->end_index = G_MAXINT; + pango_attr_list_insert(pattrlist, attr); + + GtkLabel* separator_1 = GTK_LABEL(gtk_label_new(_("Keys"))); + gtk_label_set_attributes(separator_1, pattrlist); + gtk_label_set_justify(separator_1, GTK_JUSTIFY_CENTER); + + keys_chk = HILDON_CHECK_BUTTON(hildon_check_button_new( + HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT)); + gtk_button_set_label(GTK_BUTTON(keys_chk), _("Enable keyboard")); + set_button_layout(HILDON_BUTTON(keys_chk), + titles_size_group, values_size_group); + + keys_btn = HILDON_BUTTON(hildon_button_new_with_text( + HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT, + HILDON_BUTTON_ARRANGEMENT_HORIZONTAL, + _("Configure keys..."), NULL)); + set_button_layout(HILDON_BUTTON(keys_btn), + titles_size_group, values_size_group); + g_signal_connect(G_OBJECT(keys_btn), "clicked", + G_CALLBACK(keys_btn_callback), GINT_TO_POINTER(player)); + + GtkLabel* separator_2 = GTK_LABEL(gtk_label_new(_("Touchscreen"))); + gtk_label_set_attributes(separator_2, pattrlist); + gtk_label_set_justify(separator_2, GTK_JUSTIFY_CENTER); + + touch_chk = HILDON_CHECK_BUTTON(hildon_check_button_new( + HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT)); + gtk_button_set_label(GTK_BUTTON(touch_chk), + _("Enable touchscreen buttons")); + set_button_layout(HILDON_BUTTON(touch_chk), + titles_size_group, values_size_group); + + touch_show_chk = HILDON_CHECK_BUTTON(hildon_check_button_new( + HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT)); + gtk_button_set_label(GTK_BUTTON(touch_show_chk), + _("Show on-screen button grid")); + set_button_layout(HILDON_BUTTON(touch_show_chk), + titles_size_group, values_size_group); + + GtkLabel* separator_3 = GTK_LABEL(gtk_label_new(_("Accelerometer"))); + gtk_label_set_attributes(separator_3, pattrlist); + gtk_label_set_justify(separator_3, GTK_JUSTIFY_CENTER); + + GtkLabel* separator_4 = GTK_LABEL(gtk_label_new(_("Wiimote"))); + gtk_label_set_attributes(separator_4, pattrlist); + gtk_label_set_justify(separator_4, GTK_JUSTIFY_CENTER); + + GtkLabel* separator_5 = GTK_LABEL(gtk_label_new(_("Zeemote"))); + gtk_label_set_attributes(separator_5, pattrlist); + gtk_label_set_justify(separator_5, GTK_JUSTIFY_CENTER); + + gtk_box_pack_start(box, GTK_WIDGET(separator_1), + FALSE, FALSE, HILDON_MARGIN_HALF); + gtk_box_pack_start(box, GTK_WIDGET(keys_chk), + FALSE, FALSE, 0); + gtk_box_pack_start(box, GTK_WIDGET(keys_btn), + FALSE, FALSE, 0); + gtk_box_pack_start(box, GTK_WIDGET(separator_2), + FALSE, FALSE, HILDON_MARGIN_HALF); + gtk_box_pack_start(box, GTK_WIDGET(touch_chk), + FALSE, FALSE, 0); + gtk_box_pack_start(box, GTK_WIDGET(touch_show_chk), + FALSE, FALSE, 0); + gtk_box_pack_start(box, GTK_WIDGET(separator_3), + FALSE, FALSE, HILDON_MARGIN_HALF); + gtk_box_pack_start(box, GTK_WIDGET(separator_4), + FALSE, FALSE, HILDON_MARGIN_HALF); + gtk_box_pack_start(box, GTK_WIDGET(separator_5), + FALSE, FALSE, HILDON_MARGIN_HALF); - ts_label = GTK_LABEL(gtk_label_new("Not implemented.")); + hildon_pannable_area_add_with_viewport(pannable, GTK_WIDGET(box)); + gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(pannable)); - gtk_window_resize(GTK_WINDOW(dialog), 600, 340); - gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(combo), - FALSE, FALSE, HILDON_MARGIN_HALF); - gtk_container_add(GTK_CONTAINER(keys_scroll), GTK_WIDGET(keys_list)); - gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(none_label)); - gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(keys_scroll)); - gtk_box_pack_start_defaults(GTK_BOX(dialog->vbox), GTK_WIDGET(ts_label)); + pango_attr_list_unref(pattrlist); + g_object_unref(titles_size_group); + g_object_unref(values_size_group); +#else +#endif + + load_settings(); - load_config(); +#if MAEMO_VERSION >= 5 + gtk_window_resize(GTK_WINDOW(dialog), 800, 360); +#else + gtk_window_resize(GTK_WINDOW(dialog), 400, 200); +#endif g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK (cb_dialog_response), NULL); - g_signal_connect(G_OBJECT(combo), "changed", - G_CALLBACK(cb_combo_changed), NULL); - g_signal_connect(G_OBJECT(renderer), "accel_edited", - G_CALLBACK(cb_key_edited), NULL); - g_signal_connect(G_OBJECT(renderer), "accel_cleared", - G_CALLBACK(cb_key_cleared), NULL); - - gtk_widget_show(GTK_WIDGET(dialog)); + + gtk_widget_show_all(GTK_WIDGET(dialog)); }