Package: gtetrinet Version: 0.7.11 Severity: wishlist Tags: patch I would like to be able to use an alternate method for changing rotation and selecting the drop column for gtetrinet. This would have three actions per drop, each requiring a single keypress: 1) rotate piece to desired rotation 2) move piece to desired column 3) drop piece
Such an input method reduces the number of keypresses required to put pieces into the ideal location, making the game a bit faster (although this alternative method needs a fair amount of training to get used to). I have attached a patch that does this. There are now 13 new keys that can be configured: * Rotate piece 180 degrees * Move piece 0-5 blocks away from left wall (i.e. 6 keys) * Move piece 0-5 blocks away from right wall (i.e. 6 keys) The 180 degrees rotation is implemented as two left rotations, the move away from walls are implemented as a twelve step shift to the respective wall, then the required number of movements in the opposite direction, i.e. leftwall4: move left 12, then right 4. In other words, the new keys are merely macros for particular key sequences. This means that if there is a tall barrier in the middle and the piece is going down one side, it can't jump over the barrier (which should be impossible).
diff -ur gtetrinet-0.7.11/src/config.c gtetrinet-0.7.11-new/src/config.c --- gtetrinet-0.7.11/src/config.c 2006-11-04 01:49:49.000000000 +1300 +++ gtetrinet-0.7.11-new/src/config.c 2009-12-31 18:29:29.000000000 +1300 @@ -62,6 +62,7 @@ GDK_Right, GDK_Left, GDK_Up, + GDK_x, GDK_Control_R, GDK_Down, GDK_space, @@ -72,7 +73,19 @@ GDK_3, GDK_4, GDK_5, - GDK_6 + GDK_6, + GDK_y, + GDK_h, + GDK_n, + GDK_u, + GDK_j, + GDK_m, + GDK_i, + GDK_k, + GDK_comma, + GDK_o, + GDK_l, + GDK_period, }; guint keys[K_NUM]; @@ -268,6 +281,15 @@ else keys[K_ROTRIGHT] = defaultkeys[K_ROTRIGHT]; + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/rotate_up", NULL); + if (p) + { + keys[K_ROTUP] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_ROTUP] = defaultkeys[K_ROTUP]; + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/rotate_left", NULL); if (p) { @@ -368,6 +390,114 @@ keys[K_SPECIAL6] = defaultkeys[K_SPECIAL6]; + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/leftwall0", NULL); + if (p) + { + keys[K_L0] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_L0] = defaultkeys[K_L0]; + + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/leftwall1", NULL); + if (p) + { + keys[K_L1] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_L1] = defaultkeys[K_L1]; + + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/leftwall2", NULL); + if (p) + { + keys[K_L2] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_L2] = defaultkeys[K_L2]; + + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/leftwall3", NULL); + if (p) + { + keys[K_L3] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_L3] = defaultkeys[K_L3]; + + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/leftwall4", NULL); + if (p) + { + keys[K_L4] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_L4] = defaultkeys[K_L4]; + + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/leftwall5", NULL); + if (p) + { + keys[K_L5] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_L5] = defaultkeys[K_L5]; + + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/rightwall0", NULL); + if (p) + { + keys[K_R0] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_R0] = defaultkeys[K_R0]; + + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/rightwall1", NULL); + if (p) + { + keys[K_R1] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_R1] = defaultkeys[K_R1]; + + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/rightwall2", NULL); + if (p) + { + keys[K_R2] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_R2] = defaultkeys[K_R2]; + + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/rightwall3", NULL); + if (p) + { + keys[K_R3] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_R3] = defaultkeys[K_R3]; + + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/rightwall4", NULL); + if (p) + { + keys[K_R4] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_R4] = defaultkeys[K_R4]; + + p = gconf_client_get_string (gconf_client, "/apps/gtetrinet/keys/rightwall5", NULL); + if (p) + { + keys[K_R5] = gdk_keyval_to_lower (gdk_keyval_from_name (p)); + g_free (p); + } + else + keys[K_R5] = defaultkeys[K_R5]; + /* Get the timestamp option. */ timestampsenable = gconf_client_get_bool (gconf_client, "/apps/gtetrinet/partyline/enable_timestamps", NULL); @@ -517,6 +647,18 @@ } void +keys_rotate_up_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; /* Suppress compile warnings */ + cnxn_id = cnxn_id; /* Suppress compile warnings */ + + keys[K_ROTUP] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void keys_rotate_right_changed (GConfClient *client, guint cnxn_id, GConfEntry *entry) @@ -625,6 +767,150 @@ } void +keys_leftwall0_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_L0] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void +keys_leftwall1_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_L1] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void +keys_leftwall2_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_L2] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void +keys_leftwall3_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_L3] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void +keys_leftwall4_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_L4] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void +keys_leftwall5_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_L5] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void +keys_rightwall0_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_R0] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void +keys_rightwall1_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_R1] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void +keys_rightwall2_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_R2] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void +keys_rightwall3_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_R3] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void +keys_rightwall4_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_R4] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void +keys_rightwall5_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry) +{ + + client = client; + cnxn_id = cnxn_id; + + keys[K_R5] = gdk_keyval_to_lower (gdk_keyval_from_name (gconf_value_get_string (gconf_entry_get_value (entry)))); +} + +void partyline_enable_timestamps_changed (GConfClient *client, guint cnxn_id, GConfEntry *entry) diff -ur gtetrinet-0.7.11/src/config.h gtetrinet-0.7.11-new/src/config.h --- gtetrinet-0.7.11/src/config.h 2005-03-19 10:19:17.000000000 +1300 +++ gtetrinet-0.7.11-new/src/config.h 2009-12-31 18:27:40.000000000 +1300 @@ -57,6 +57,11 @@ GConfEntry *entry); void +keys_rotate_up_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void keys_rotate_right_changed (GConfClient *client, guint cnxn_id, GConfEntry *entry); @@ -102,6 +107,66 @@ GConfEntry *entry); void +keys_leftwall0_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void +keys_leftwall1_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void +keys_leftwall2_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void +keys_leftwall3_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void +keys_leftwall4_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void +keys_leftwall5_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void +keys_rightwall0_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void +keys_rightwall1_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void +keys_rightwall2_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void +keys_rightwall3_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void +keys_rightwall4_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void +keys_rightwall5_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry); + +void partyline_enable_timestamps_changed (GConfClient *client, guint cnxn_id, GConfEntry *entry); @@ -118,8 +183,9 @@ typedef enum { K_RIGHT, - K_LEFT, + K_LEFT, K_ROTRIGHT, + K_ROTUP, K_ROTLEFT, K_DOWN, K_DROP, @@ -131,6 +197,18 @@ K_SPECIAL4, K_SPECIAL5, K_SPECIAL6, + K_L0, + K_L1, + K_L2, + K_L3, + K_L4, + K_L5, + K_R5, + K_R4, + K_R3, + K_R2, + K_R1, + K_R0, /* not a key but the number of configurable keys */ K_NUM } GTetrinetKeys; diff -ur gtetrinet-0.7.11/src/dialogs.c gtetrinet-0.7.11-new/src/dialogs.c --- gtetrinet-0.7.11/src/dialogs.c 2006-11-04 01:49:49.000000000 +1300 +++ gtetrinet-0.7.11-new/src/dialogs.c 2009-12-31 18:02:02.000000000 +1300 @@ -538,6 +538,7 @@ actions[K_LEFT] = _("Move left"); actions[K_DOWN] = _("Move down"); actions[K_ROTRIGHT] = _("Rotate right"); + actions[K_ROTUP] = _("Rotate 180"); actions[K_ROTLEFT] = _("Rotate left"); actions[K_DROP] = _("Drop piece"); actions[K_DISCARD] = _("Discard special"); @@ -548,11 +549,24 @@ actions[K_SPECIAL4] = _("Special to field 4"); actions[K_SPECIAL5] = _("Special to field 5"); actions[K_SPECIAL6] = _("Special to field 6"); + actions[K_L0] = _("Move to left wall"); + actions[K_L1] = _("Move 1 away from left wall"); + actions[K_L2] = _("Move 2 away from left wall"); + actions[K_L3] = _("Move 3 away from left wall"); + actions[K_L4] = _("Move 4 away from left wall"); + actions[K_L5] = _("Move 5 away from left wall"); + actions[K_R0] = _("Move to right wall"); + actions[K_R1] = _("Move 1 away from right wall"); + actions[K_R2] = _("Move 2 away from right wall"); + actions[K_R3] = _("Move 3 away from right wall"); + actions[K_R4] = _("Move 4 away from right wall"); + actions[K_R5] = _("Move 5 away from right wall"); gconf_keys[K_RIGHT] = g_strdup ("/apps/gtetrinet/keys/right"); gconf_keys[K_LEFT] = g_strdup ("/apps/gtetrinet/keys/left"); gconf_keys[K_DOWN] = g_strdup ("/apps/gtetrinet/keys/down"); gconf_keys[K_ROTRIGHT] = g_strdup ("/apps/gtetrinet/keys/rotate_right"); + gconf_keys[K_ROTUP] = g_strdup ("/apps/gtetrinet/keys/rotate_up"); gconf_keys[K_ROTLEFT] = g_strdup ("/apps/gtetrinet/keys/rotate_left"); gconf_keys[K_DROP] = g_strdup ("/apps/gtetrinet/keys/drop"); gconf_keys[K_DISCARD] = g_strdup ("/apps/gtetrinet/keys/discard"); @@ -563,6 +577,18 @@ gconf_keys[K_SPECIAL4] = g_strdup ("/apps/gtetrinet/keys/special4"); gconf_keys[K_SPECIAL5] = g_strdup ("/apps/gtetrinet/keys/special5"); gconf_keys[K_SPECIAL6] = g_strdup ("/apps/gtetrinet/keys/special6"); + gconf_keys[K_L0] = g_strdup ("/apps/gtetrinet/keys/leftwall0"); + gconf_keys[K_L1] = g_strdup ("/apps/gtetrinet/keys/leftwall1"); + gconf_keys[K_L2] = g_strdup ("/apps/gtetrinet/keys/leftwall2"); + gconf_keys[K_L3] = g_strdup ("/apps/gtetrinet/keys/leftwall3"); + gconf_keys[K_L4] = g_strdup ("/apps/gtetrinet/keys/leftwall4"); + gconf_keys[K_L5] = g_strdup ("/apps/gtetrinet/keys/leftwall5"); + gconf_keys[K_R0] = g_strdup ("/apps/gtetrinet/keys/rightwall0"); + gconf_keys[K_R1] = g_strdup ("/apps/gtetrinet/keys/rightwall1"); + gconf_keys[K_R2] = g_strdup ("/apps/gtetrinet/keys/rightwall2"); + gconf_keys[K_R3] = g_strdup ("/apps/gtetrinet/keys/rightwall3"); + gconf_keys[K_R4] = g_strdup ("/apps/gtetrinet/keys/rightwall4"); + gconf_keys[K_R5] = g_strdup ("/apps/gtetrinet/keys/rightwall5"); for (i = 0; i < K_NUM; i ++) { gtk_list_store_append (keys_store, &iter); diff -ur gtetrinet-0.7.11/src/gtetrinet.c gtetrinet-0.7.11-new/src/gtetrinet.c --- gtetrinet-0.7.11/src/gtetrinet.c 2005-03-19 10:19:18.000000000 +1300 +++ gtetrinet-0.7.11-new/src/gtetrinet.c 2009-12-31 18:14:27.000000000 +1300 @@ -170,6 +170,10 @@ (GConfClientNotifyFunc) keys_rotate_left_changed, NULL, NULL, NULL); + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/rotate_up", + (GConfClientNotifyFunc) keys_rotate_up_changed, + NULL, NULL, NULL); + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/rotate_right", (GConfClientNotifyFunc) keys_rotate_right_changed, NULL, NULL, NULL); @@ -210,6 +214,54 @@ (GConfClientNotifyFunc) keys_special6_changed, NULL, NULL, NULL); + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/leftwall0", + (GConfClientNotifyFunc) keys_leftwall0_changed, + NULL, NULL, NULL); + + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/leftwall1", + (GConfClientNotifyFunc) keys_leftwall1_changed, + NULL, NULL, NULL); + + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/leftwall2", + (GConfClientNotifyFunc) keys_leftwall2_changed, + NULL, NULL, NULL); + + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/leftwall3", + (GConfClientNotifyFunc) keys_leftwall3_changed, + NULL, NULL, NULL); + + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/leftwall4", + (GConfClientNotifyFunc) keys_leftwall4_changed, + NULL, NULL, NULL); + + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/leftwall5", + (GConfClientNotifyFunc) keys_leftwall5_changed, + NULL, NULL, NULL); + + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/rightwall0", + (GConfClientNotifyFunc) keys_rightwall0_changed, + NULL, NULL, NULL); + + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/rightwall1", + (GConfClientNotifyFunc) keys_rightwall1_changed, + NULL, NULL, NULL); + + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/rightwall2", + (GConfClientNotifyFunc) keys_rightwall2_changed, + NULL, NULL, NULL); + + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/rightwall3", + (GConfClientNotifyFunc) keys_rightwall3_changed, + NULL, NULL, NULL); + + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/rightwall4", + (GConfClientNotifyFunc) keys_rightwall4_changed, + NULL, NULL, NULL); + + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/keys/rightwall5", + (GConfClientNotifyFunc) keys_rightwall5_changed, + NULL, NULL, NULL); + gconf_client_notify_add (gconf_client, "/apps/gtetrinet/partyline/enable_timestamps", (GConfClientNotifyFunc) partyline_enable_timestamps_changed, NULL, NULL, NULL); diff -ur gtetrinet-0.7.11/src/tetrinet.c gtetrinet-0.7.11-new/src/tetrinet.c --- gtetrinet-0.7.11/src/tetrinet.c 2006-09-02 22:59:13.000000000 +1200 +++ gtetrinet-0.7.11-new/src/tetrinet.c 2009-12-31 19:01:07.000000000 +1300 @@ -1736,6 +1736,14 @@ tetris_drawcurrentblock (); return TRUE; } + else if (gdk_keyval_to_lower (keyval) == keys[K_ROTUP]) { + if (!nextblocktimeout) + sound_playsound (S_ROTATE); + tetris_blockrotate (-1); + tetris_blockrotate (-1); + tetris_drawcurrentblock (); + return TRUE; + } else if (gdk_keyval_to_lower (keyval) == keys[K_ROTLEFT]) { if (!nextblocktimeout) sound_playsound (S_ROTATE); @@ -1753,6 +1761,44 @@ tetris_drawcurrentblock (); return TRUE; } + else if ((gdk_keyval_to_lower (keyval) >= keys[K_L0]) || + (gdk_keyval_to_lower (keyval) >= keys[K_L1]) || + (gdk_keyval_to_lower (keyval) >= keys[K_L2]) || + (gdk_keyval_to_lower (keyval) >= keys[K_L3]) || + (gdk_keyval_to_lower (keyval) >= keys[K_L4]) || + (gdk_keyval_to_lower (keyval) >= keys[K_L5]) || + (gdk_keyval_to_lower (keyval) >= keys[K_R5]) || + (gdk_keyval_to_lower (keyval) >= keys[K_R4]) || + (gdk_keyval_to_lower (keyval) >= keys[K_R3]) || + (gdk_keyval_to_lower (keyval) >= keys[K_R2]) || + (gdk_keyval_to_lower (keyval) >= keys[K_R1]) || + (gdk_keyval_to_lower (keyval) >= keys[K_R0])){ + int i, keypos, gkv; + gkv = gdk_keyval_to_lower (keyval); + for(i = K_L0; i <= K_R0; i++){ + if(keys[i] == gkv){ + keypos = i; + } + } + if(keypos <= K_L5){ + for (i = 0; i < 12; i++){ + tetris_blockmove (-1); + } + for (i = keypos; i > K_L0; i--){ + tetris_blockmove (1); + } + } + else if(keypos > K_L5){ + for (i = 0; i < 12; i++){ + tetris_blockmove (1); + } + for (i = keypos; i < K_R0; i++){ + tetris_blockmove (-1); + } + } + tetris_drawcurrentblock (); + return TRUE; + } else if (gdk_keyval_to_lower (keyval) == keys[K_DOWN]) { if (!downpressed) { tetrinet_timeout ();