Last active
January 2, 2018 12:24
-
-
Save LucGoncalez/d2b7751a575fe7d6d533a47cac347afb to your computer and use it in GitHub Desktop.
Mouse Stuff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* ************************************************** | |
* mouseHandler: | |
* Handler de mouse. | |
* | |
* *Importante: | |
* Se estamos aqui é porque os dados disponíveis no controlador 8042 | |
* pertencem ao mouse. | |
* @todo: Essa rotina não pertence ao line discipline. | |
* | |
*/ | |
#define MOUSE_X_SIGN 0x10 | |
#define MOUSE_Y_SIGN 0x20 | |
void mouseHandler() | |
{ | |
//buffer | |
static int count_mouse=0; | |
static char buffer_mouse[3]; | |
//coordenadas.. | |
//isso pode ser global. | |
int posX = 0; | |
int posY = 0; | |
//local. | |
static int data = 0; | |
static int x = 0; | |
static int y = 0; | |
static int scroll = 0; | |
static int first_time=1; // Usado para ignorar a primeira IRQ12. | |
//cursor provisório. | |
static char mouse_char[] = "T"; | |
// Se o mouse for muito sensível use uma variável de escala | |
static int scale = 4; | |
// FIX: Por algum motivo nós "perdemos" os dois primeiros valores... | |
// descarto o terceiro aqui para que obtenhamos os 3 "na ordem"... | |
if (first_time) | |
{ | |
first_time = 0; | |
mouse_read(); //inportb(0x60); | |
goto exit_isr; | |
} | |
//buffer: definido como char. | |
buffer_mouse[count_mouse++] = mouse_read(); | |
// Contagem de interruções. | |
if(count_mouse >= 3) | |
{ | |
// | |
//@todo: Tentando encontrar os valores corretos das coordenadas. | |
// | |
//bytes: definidos como 'char' | |
data = buffer_mouse[0]; | |
x = buffer_mouse[1]; | |
y = buffer_mouse[2]; | |
//scroll = buffer_mouse[3]; | |
//++======= | |
if(data & 0x10) | |
{ | |
//.x_neg: | |
//not al | |
//inc al | |
//sub [mouse_x], eax | |
posX = (int) posX - (256 - x) ; | |
}else{ | |
//.x_pos: | |
//add [mouse_x], eax | |
posX = (int) posX + x; | |
}; | |
//--======= | |
//++======= | |
if(data & 0x20) | |
{ | |
//.y_neg: | |
//not al | |
//inc al | |
//add [mouse_y], eax | |
posY = (int) posY + (256 - y) ; | |
}else{ | |
//.y_pos: | |
//sub [mouse_y], eax | |
posY = (int) posY - y; | |
}; | |
//--======= | |
//update_mouse: | |
//.do_x: | |
//if( data & MOUSE_X_SIGN ) | |
//{ | |
// x = !x; | |
// x++; | |
// posX -= x; | |
//}else{ | |
// posX += x; | |
//} | |
//.do_y: | |
//if( data & MOUSE_Y_SIGN ) | |
//{ | |
// posY -= y; | |
//}else{ | |
// y = !y; | |
// y++; | |
// posY -= y; | |
//} | |
//#debug | |
//mostrando os resultados obtidos. | |
//printf("X={%d} Y={%d} \n",posX,posY); | |
//refresh_screen(); | |
if( posX < 0 ){ posX = 0; } | |
if( posY < 0 ){ posY = 0; } | |
if( posX > (800 - 8) * scale){ posX = (800 - 8) * scale; } | |
if( posY > (600 - 8) * scale){ posY = (600 - 8) * scale; } | |
g_cursor_x = (unsigned long) (posX / scale); | |
g_cursor_y = (unsigned long) (posY / scale); | |
printf("%c", (char) 'T'); | |
refresh_rectangle( g_cursor_x*8, g_cursor_y*8, 8, 8 ); | |
//Zerando a contagem de interrupções de mouse. | |
count_mouse=0; | |
}; | |
// | |
// *importante: | |
// Passamos a mensagem de mouse para o procedimento de janela do sistema. | |
// que deverá passar chamar o procedimento de janela da janela com o focod eentrada. | |
// | |
//Pegaremos aqui a janela com o foco de entrada e passaremos | |
//para o procedimento, que não deve pegar novamente. | |
struct window_d *w; | |
w = (void *) windowList[window_with_focus]; | |
if( (void*) w != NULL ) | |
{ | |
// Envia as mensagens para os aplicativos intercepta-las | |
//so mandamos mensagem para um aplicativo no estavo válido. | |
if( w->used == 1 && w->magic == 1234 ){ | |
//windowSendMessage( 0, 0, 0, 0); | |
}; | |
//Chama o procedimento de janelas do sistema. | |
//O procedimento de janela do terminal está em cascata. | |
//system_procedure( w, (int) 0, (unsigned long) 0, (unsigned long) 0 ); | |
}; | |
exit_isr: | |
// EOI. | |
outportb(0xa0, 0x20); | |
outportb(0x20, 0x20); | |
//return; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment