Problemas com DELETE no WINE
Dica publicada em Linux / Configuração
Problemas com DELETE no WINE
Toda vez que iniciamos algum aplicativo emulado pelo WINE
com teclado ABNT2 e apertamos a tecla DEL com a intenção de
deletar algum caractere, o aplicativo deleta o caractere e
adiciona uma vírgula caso o Num-Lock esteja ligado.
Para revolver o problema, deve-se instalar um patch no código fonte do seu wine. Para não precisar recompilar o wine inteiro, iremos fazer apenas o necessário.
Digite o comando:
$ wine --version
Provavelmente irá retornar algo como:
Wine 20041201
Wine exited with a successful status
Sabemos que a minha versão do Wine é 20041201.
Agora entre em:
E faça o download da sua versão do wine[SUA_VERSAO].tar.gz
No meu caso, puxo o arquivo Wine-20041201.tar.gz.
Descompacto em um diretório qualquer com o comando:
$ tar -xvzf Wine-20041201.tar.gz
Edite o arquivo wine-XXXXXXX/dlls/x11drv/keyboard.c e procure pela linha que contem a seguinte string:
XLookupString(e, NULL, 0, &keysym, NULL);
Substitua as linhas:
XLookupString(e, NULL, 0, &keysym, NULL);
if ((keysym >= 0xFFAE) && (keysym <= 0xFFB9) && (keysym != 0xFFAF)
&& (e->state & NumLockMask))
/* Only the Keypad keys 0-9 and . send different keysyms
* depending on the NumLock state */
return nonchar_key_vkey[keysym & 0xFF];
TRACE_(key)("e->keycode = %x\n", e->keycode);
return keyc2vkey[e->keycode];
}
Pelas linhas:
Para revolver o problema, deve-se instalar um patch no código fonte do seu wine. Para não precisar recompilar o wine inteiro, iremos fazer apenas o necessário.
Digite o comando:
$ wine --version
Provavelmente irá retornar algo como:
Wine 20041201
Wine exited with a successful status
Sabemos que a minha versão do Wine é 20041201.
Agora entre em:
E faça o download da sua versão do wine[SUA_VERSAO].tar.gz
No meu caso, puxo o arquivo Wine-20041201.tar.gz.
Descompacto em um diretório qualquer com o comando:
$ tar -xvzf Wine-20041201.tar.gz
Edite o arquivo wine-XXXXXXX/dlls/x11drv/keyboard.c e procure pela linha que contem a seguinte string:
XLookupString(e, NULL, 0, &keysym, NULL);
Substitua as linhas:
XLookupString(e, NULL, 0, &keysym, NULL);
if ((keysym >= 0xFFAE) && (keysym <= 0xFFB9) && (keysym != 0xFFAF)
&& (e->state & NumLockMask))
/* Only the Keypad keys 0-9 and . send different keysyms
* depending on the NumLock state */
return nonchar_key_vkey[keysym & 0xFF];
TRACE_(key)("e->keycode = %x\n", e->keycode);
return keyc2vkey[e->keycode];
}
Pelas linhas:
XLookupString(e, NULL, 0, &keysym, NULL);
/* these fixmes allow you to see keysyms and keycodes
FIXME("keysym is %X\n",keysym);
FIXME("e->keycode is %X\n",e->keycode); */
/* about the numbers below:
0xFF9F: middle keyboard delete (keysym)
0x2C : keypad delete (keysym)
0x3B : comma (keycode)
*/
if ( ((keysym == 0xFF9F) || (keysym == 0x2C))
&& (e->state & NumLockMask))
{
if (keysym == 0xFF9F)
return nonchar_key_vkey[keysym & 0xFF];
if (keysym == 0x2C)
return keyc2vkey[0x3B];
}
if ((keysym >= 0xFFAE) && (keysym <= 0xFFB9) && (keysym != 0xFFAF)
&& (e->state & NumLockMask))
/* Only the Keypad keys 0-9 and . send different keysyms
* depending on the NumLock state */
return nonchar_key_vkey[keysym & 0xFF];
return keyc2vkey[e->keycode];
}
/* these fixmes allow you to see keysyms and keycodes
FIXME("keysym is %X\n",keysym);
FIXME("e->keycode is %X\n",e->keycode); */
/* about the numbers below:
0xFF9F: middle keyboard delete (keysym)
0x2C : keypad delete (keysym)
0x3B : comma (keycode)
*/
if ( ((keysym == 0xFF9F) || (keysym == 0x2C))
&& (e->state & NumLockMask))
{
if (keysym == 0xFF9F)
return nonchar_key_vkey[keysym & 0xFF];
if (keysym == 0x2C)
return keyc2vkey[0x3B];
}
if ((keysym >= 0xFFAE) && (keysym <= 0xFFB9) && (keysym != 0xFFAF)
&& (e->state & NumLockMask))
/* Only the Keypad keys 0-9 and . send different keysyms
* depending on the NumLock state */
return nonchar_key_vkey[keysym & 0xFF];
return keyc2vkey[e->keycode];
}
Salve o arquivo e vá ao diretório principal do código fonte do wine. Agora você irá à fase de compilação:
$ ./configure
Depois
$ make depend && make
Agora é esperar.. pode ir tomar um café, jogar um dominó... a compilação demora um pouco.
Após ter compilado corretamente, o programa gerará um arquivo x11drv.dll.so, que deve ser substituído pelo padrão do seu WINE.
Para localizá-lo, dê:
$ find / -name x11drv.dll.so
Que geralmente está em /usr/lib/wine/x11drv.dll.so.
E faça um backup dele caso precise:
$ mv /usr/lib/wine/x11drv.dll.so /usr/lib/wine/x11drv.dll.so2
Depois substitua o arquivo /usr/lib/wine/x11drv.dll.so padrão pelo seu novo arquivo com o comando:
$ sudo cp dlls/x11drv/x11drv.dll.so /usr/lib/wine/x11drv.dll.so
E pronto! Agora faça o teste, abra qualquer aplicação que rode sobre o wine e perceba que o problema do DELETE já não existe.
Essa dica funciona para teclado ABNT2. Pesquisando pela internet descobri que pode dar problemas com outros layouts de teclado, por isso é necessário que você faça backup dos seus arquivos de sistemas.
É isso, qualquer dúvida grite.
Abraços,
Danilo