* 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.
This commit is contained in:
parent
52f0f64384
commit
9f1d654e67
5 changed files with 51 additions and 1 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
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>
|
2012-06-19 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
Avoid unnecessary memcpy of whole video buffer.
|
Avoid unnecessary memcpy of whole video buffer.
|
||||||
|
|
|
@ -92,6 +92,17 @@ grub_ieee1275_find_options (void)
|
||||||
if (rc >= 0 && grub_strncmp (tmp, "IBM", 3) == 0)
|
if (rc >= 0 && grub_strncmp (tmp, "IBM", 3) == 0)
|
||||||
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS);
|
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",
|
rc = grub_ieee1275_get_property (root, "compatible",
|
||||||
tmp, sizeof (tmp), &actual);
|
tmp, sizeof (tmp), &actual);
|
||||||
if (rc >= 0)
|
if (rc >= 0)
|
||||||
|
|
|
@ -33,6 +33,9 @@
|
||||||
#include <grub/extcmd.h>
|
#include <grub/extcmd.h>
|
||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
#include <grub/time.h>
|
#include <grub/time.h>
|
||||||
|
#ifdef __powerpc__
|
||||||
|
#include <grub/ieee1275/ieee1275.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
@ -560,11 +563,30 @@ grub_terminfo_getkey (struct grub_term_input *termi)
|
||||||
grub_terminfo_readkey (termi, data->input_buf,
|
grub_terminfo_readkey (termi, data->input_buf,
|
||||||
&data->npending, data->readkey);
|
&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)
|
if (data->npending)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
data->npending--;
|
data->npending--;
|
||||||
ret = data->input_buf[0];
|
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
|
grub_memmove (data->input_buf, data->input_buf + 1, data->npending
|
||||||
* sizeof (data->input_buf[0]));
|
* sizeof (data->input_buf[0]));
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -121,7 +121,9 @@ enum grub_ieee1275_flag
|
||||||
|
|
||||||
GRUB_IEEE1275_FLAG_NO_OFNET_SUFFIX,
|
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);
|
extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag);
|
||||||
|
|
|
@ -32,6 +32,10 @@ struct grub_terminfo_input_state
|
||||||
{
|
{
|
||||||
int input_buf[GRUB_TERMINFO_READKEY_MAX_LEN];
|
int input_buf[GRUB_TERMINFO_READKEY_MAX_LEN];
|
||||||
int npending;
|
int npending;
|
||||||
|
#ifdef __powerpc__
|
||||||
|
int last_key;
|
||||||
|
grub_uint64_t last_key_time;
|
||||||
|
#endif
|
||||||
int (*readkey) (struct grub_term_input *term);
|
int (*readkey) (struct grub_term_input *term);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue