No entiendo SHIFT_STATUS

Started by Drumpi, May 15, 2016, 06:41:28 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola de nuevo (¿yo pidiendo ayuda dos veces el mismo día? debo estar enfermo :P):

Pues mientras espero vuestro consejo sobre la lista de deshacer, me ha surgido una nueva duda, esta vez, relacionada con la pulsación de las teclas, SHIFT concretamente.
Iba a implementar la llamada a "rehacer" usando la combinación SHIFT+BACKSPACE (como en DIV), pero cuando lo iba a integrar en mi código identificador de teclas me he dado cuenta que cada tecla shift tiene un código de tecla diferente. No es que no lo soporte, pero no puedo asignar dos teclas diferentes a la misma función sin tratarlas de forma especial (puedo, pero no quiero).
Así que he mirado la otra alternativa y... no la entiendo. Según esto:
http://wiki.bennugd.org/index.php?title=Shift_status
Shift_status devuelve un valor diferente en función de la tecla pulsada, lo cual tampoco me conviene, pero me he puesto a leerlo y ¿qué valores son esos?. Según el hilo:
http://forum.bennugd.org/index.php?topic=102.msg12184#msg12184
Son valores hexadecimales que usan las "decenas" y "centenas" como bit-flag, pero o mi calculadora está estropeada o 0x010 no es 20 ni en hexadecimal ni en octal.

¿Cómo identifico a través de SHIFT_STATUS que está pulsada cualquiera de las teclas shift, independientemente de que el resto de "estados" estén activos o no? No puedo usar máscaras de bits ¿o sí?
O mejor dicho ¿Hay alguna forma de saber si alguna está pulsada sin hacer dos comprobaciones diferentes? Pero me interesa conocer el funcionamiento de SHIFT_STATUS de todas maneras.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

mascaras de bits

STAT_RSHIFT             1
STAT_LSHIFT             2
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Gracias, Splinter. Gracias a eso ya lo he entendido. Lo explico para el resto:

SHIFT_STATUS, a pesar de tener unos valores tan "raros":
Key - Value
Right Control - 20 *
Left Control - 36
Right Alt - 72 *
Left Alt - 136
NUM LOCK - 256
CAPS LOCK - 512
Right Shift - 1025
Left Shift - 1026

Tiene cierta lógica.
Cada botón tiene DOS bits de máscara. Uno que lo identifica por tipo (shift, control...) y otro que lo identifica como tecla única (shift izquierdo, shift derecho...).
Sin embargo, son tres los bits los que comparten, por ejemplo SHIFT izquierdo y derecho: en hexadecimal, SHIFT izquierdo es 0x401 y SHIFT derecho es 0x402, por lo tanto, si aplicamos la máscara 0x400 a SHIFT_STATUS tanto uno como el otro darán true al activarse, pero si aplicamos la máscara 0x001, sólo se identificará el botón shift izquierdo (no se comprobará ni shift derecho, ni control izquierdo, ni caps-lock...).

Espero que esté tan claro como lo he entendido yo :)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

creo que aprovechare y lo cambiare...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

El sistema en sí tiene cierta lógica, te sirve tanto para identificar la tecla como la función, pero no está del todo bien explicado. Convendría que los bits relacionados estuvieran más juntos (shift, shift_l y shift_r podrían usar los bits 0x07), o que estuvieran los bits de función (shift, ctrl, alt...) juntos en los bits menos significativos y los de los botones (shift_left, ctrl_right...) en los más significativos... y añadir las máscaras para todos ellos (en la lista de antes faltaría la máscara para shift (0x400), alt y ctrl (lo siento, no las recuerdo ahora ^^U).

Por ejemplo:
mask_shift  0x04
mask_shift_left  0x02 o bien 0x06
mask_shift_right 0x01 o bien 0x05
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)