GRUB_IEEE1275_FLAG_BROKEN_REPEAT.
* grub-core/kern/ieee1275/cmain.c (grub_ieee1275_find_options): Set
GRUB_IEEE1275_FLAG_BROKEN_REPEAT on PowerBook3,3.
* include/grub/terminfo.h (grub_terminfo_input_state) [__powerpc__]:
New fields last_key and last_key_time.
* grub-core/term/terminfo.c (grub_terminfo_getkey): Transform
extended key-esc into extended key-extended key.
+2012-06-20 Vladimir Serbinenko <phcoder@gmail.com>
+
+ * include/grub/ieee1275/ieee1275.h (grub_ieee1275_flag): New enum value
+ GRUB_IEEE1275_FLAG_BROKEN_REPEAT.
+ * grub-core/kern/ieee1275/cmain.c (grub_ieee1275_find_options): Set
+ GRUB_IEEE1275_FLAG_BROKEN_REPEAT on PowerBook3,3.
+ * include/grub/terminfo.h (grub_terminfo_input_state) [__powerpc__]:
+ New fields last_key and last_key_time.
+ * grub-core/term/terminfo.c (grub_terminfo_getkey): Transform
+ extended key-esc into extended key-extended key.
+
2012-06-19 Vladimir Serbinenko <phcoder@gmail.com>
Avoid unnecessary memcpy of whole video buffer.
if (rc >= 0 && grub_strncmp (tmp, "IBM", 3) == 0)
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS);
+ /* Old Macs have no key repeat, newer ones have fully working one.
+ The ones inbetween when repeated key generates an escaoe sequence
+ only the escape is repeated. With this workaround however a fast
+ e.g. down arrow-ESC is perceived as down arrow-down arrow which is
+ also annoying but is less so than the original bug of exiting from
+ the current window on arrow repeat. To avoid unaffected users suffering
+ from this workaround match only exact models known to have this bug.
+ */
+ if (rc >= 0 && grub_strcmp (tmp, "PowerBook3,3") == 0)
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_BROKEN_REPEAT);
+
rc = grub_ieee1275_get_property (root, "compatible",
tmp, sizeof (tmp), &actual);
if (rc >= 0)
#include <grub/extcmd.h>
#include <grub/i18n.h>
#include <grub/time.h>
+#ifdef __powerpc__
+#include <grub/ieee1275/ieee1275.h>
+#endif
GRUB_MOD_LICENSE ("GPLv3+");
grub_terminfo_readkey (termi, data->input_buf,
&data->npending, data->readkey);
+#ifdef __powerpc__
+ if (data->npending == 1 && data->input_buf[0] == '\e'
+ && grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_BROKEN_REPEAT)
+ && grub_get_time_ms () - data->last_key_time < 1000
+ && (data->last_key & GRUB_TERM_EXTENDED))
+ {
+ data->npending = 0;
+ data->last_key_time = grub_get_time_ms ();
+ return data->last_key;
+ }
+#endif
+
if (data->npending)
{
int ret;
data->npending--;
ret = data->input_buf[0];
+#ifdef __powerpc__
+ if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_BROKEN_REPEAT))
+ {
+ data->last_key = ret;
+ data->last_key_time = grub_get_time_ms ();
+ }
+#endif
grub_memmove (data->input_buf, data->input_buf + 1, data->npending
* sizeof (data->input_buf[0]));
return ret;
GRUB_IEEE1275_FLAG_NO_OFNET_SUFFIX,
- GRUB_IEEE1275_FLAG_VIRT_TO_REAL_BROKEN
+ GRUB_IEEE1275_FLAG_VIRT_TO_REAL_BROKEN,
+
+ GRUB_IEEE1275_FLAG_BROKEN_REPEAT
};
extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag);
{
int input_buf[GRUB_TERMINFO_READKEY_MAX_LEN];
int npending;
+#ifdef __powerpc__
+ int last_key;
+ grub_uint64_t last_key_time;
+#endif
int (*readkey) (struct grub_term_input *term);
};