src/events/SDL_mouse.c
branchgsoc2008_manymouse
changeset 3764 2970fcfbdd54
parent 3763 81ea7d9a6624
child 3765 ed9b7fe8f902
equal deleted inserted replaced
3763:81ea7d9a6624 3764:2970fcfbdd54
    31 static int SDL_num_mice;
    31 static int SDL_num_mice;
    32 static int SDL_current_mouse;
    32 static int SDL_current_mouse;
    33 static SDL_Mouse **SDL_mice;
    33 static SDL_Mouse **SDL_mice;
    34 int *SDL_IdIndex;
    34 int *SDL_IdIndex;
    35 int SDL_highestId;
    35 int SDL_highestId;
    36 
    36 int last_x, last_y;
    37 
    37 int x_max, y_max;
    38 /* Public functions */
    38 /* Public functions */
    39 int
    39 int
    40 SDL_MouseInit(void)
    40 SDL_MouseInit(void)
    41 {
    41 {
    42     return (0);
    42     return (0);
    83     SDL_mice[index]->cur_cursor = NULL;
    83     SDL_mice[index]->cur_cursor = NULL;
    84     SDL_mice[index]->def_cursor =
    84     SDL_mice[index]->def_cursor =
    85         SDL_CreateCursor(default_cdata, default_cmask, DEFAULT_CWIDTH,
    85         SDL_CreateCursor(default_cdata, default_cmask, DEFAULT_CWIDTH,
    86                          DEFAULT_CHEIGHT, DEFAULT_CHOTX, DEFAULT_CHOTY);
    86                          DEFAULT_CHEIGHT, DEFAULT_CHOTX, DEFAULT_CHOTY);
    87     SDL_SetCursor(SDL_mice[index]->def_cursor);
    87     SDL_SetCursor(SDL_mice[index]->def_cursor);
       
    88     SDL_mice[index]->proximity=SDL_TRUE;
       
    89     SDL_mice[index]->relative_mode=SDL_FALSE;
    88     SDL_SelectMouse(selected_mouse);
    90     SDL_SelectMouse(selected_mouse);
    89 
    91 
    90     return index;
    92     return index;
    91 }
    93 }
    92 
    94 
   178         return 1;
   180         return 1;
   179     }
   181     }
   180 }
   182 }
   181 
   183 
   182 int
   184 int
   183 SDL_SetRelativeMouseMode(SDL_bool enabled)
   185 SDL_SetRelativeMouseMode(SDL_bool enabled, int index)
   184 {
   186 {
   185     SDL_Mouse *mouse = SDL_GetMouse(SDL_current_mouse);
   187     SDL_Mouse *mouse = SDL_GetMouse(index);
   186 
   188 
   187     if (!mouse) {
   189     if (!mouse) {
   188         return -1;
   190         return -1;
   189     }
   191     }
   190 
   192 
   324     int index=SDL_GetIndexById(id);
   326     int index=SDL_GetIndexById(id);
   325     int posted=0;
   327     int posted=0;
   326     if(SDL_ProcessEvents[type]==SDL_ENABLE)
   328     if(SDL_ProcessEvents[type]==SDL_ENABLE)
   327     {
   329     {
   328         SDL_Event event;
   330         SDL_Event event;
   329         event.proximity.which=index;
   331         event.proximity.which=(Uint8)index;
   330         event.proximity.x=x;
   332         event.proximity.x=x;
   331         event.proximity.y=y;
   333         event.proximity.y=y;
   332         event.type=type;
   334         event.type=type;
   333         event.proximity.type=type;
   335         event.proximity.type=type;
   334         posted = (SDL_PushEvent(&event) > 0);
   336         posted = (SDL_PushEvent(&event) > 0);
       
   337         if(type==SDL_PROXIMITYIN)
       
   338         {
       
   339             SDL_mice[index]->proximity=SDL_TRUE;
       
   340         }
       
   341         else
       
   342         {
       
   343             SDL_mice[index]->proximity=SDL_FALSE;
       
   344         }
   335     }
   345     }
   336     return posted;
   346     return posted;
   337 }
   347 }
   338 
   348 
   339 int
   349 int
   346     int yrel;
   356     int yrel;
   347 
   357 
   348     if (!mouse || mouse->flush_motion) {
   358     if (!mouse || mouse->flush_motion) {
   349         return 0;
   359         return 0;
   350     }
   360     }
   351 
   361     if(mouse->proximity==SDL_FALSE)
   352     if (relative) {
   362     {
       
   363         last_x=x;
       
   364         last_y=y;
       
   365         return 0;
       
   366     }
       
   367     if (mouse->relative_mode==SDL_TRUE && mouse->proximity==SDL_TRUE) {
   353         /* Push the cursor around */
   368         /* Push the cursor around */
   354         xrel = x;
   369         xrel = x - last_x;
   355         yrel = y;
   370         yrel = y - last_y;
   356         x = (mouse->x + xrel);
   371         //x = (mouse->x + xrel);
   357         y = (mouse->y + yrel);
   372         //y = (mouse->y + yrel);
   358     } else {
   373     } else {
   359         xrel = x - mouse->x;
   374         xrel = x - last_x;
   360         yrel = y - mouse->y;
   375         yrel = y - last_y;
   361     }
   376     }
   362 
   377 
   363     /* Drop events that don't change state */
   378     /* Drop events that don't change state */
   364     if (!xrel && !yrel) {
   379     if (!xrel && !yrel) {
   365 #if 0
   380 #if 0
   367 #endif
   382 #endif
   368         return 0;
   383         return 0;
   369     }
   384     }
   370 
   385 
   371     /* Update internal mouse state */
   386     /* Update internal mouse state */
   372     if (!mouse->relative_mode) {
   387     if (mouse->relative_mode==SDL_FALSE) {
   373         mouse->x = x;
   388         mouse->x = x;
   374         mouse->y = y;
   389         mouse->y = y;
       
   390     }
       
   391     else
       
   392     {
       
   393         if(mouse->x+xrel>x_max)
       
   394         {
       
   395             mouse->x=x_max;
       
   396         }
       
   397         else if(mouse->x+xrel<0)
       
   398         {
       
   399             mouse->x=0;
       
   400         }
       
   401         else
       
   402         {
       
   403             mouse->x+=xrel;
       
   404         }
       
   405         if(mouse->y+yrel>y_max)
       
   406         {
       
   407             mouse->y=y_max;
       
   408         }
       
   409         else if(mouse->y+yrel<0)
       
   410         {
       
   411             mouse->y=0;
       
   412         }
       
   413         else
       
   414         {
       
   415             mouse->y+=yrel;
       
   416         }
   375     }
   417     }
   376     mouse->xdelta += xrel;
   418     mouse->xdelta += xrel;
   377     mouse->ydelta += yrel;
   419     mouse->ydelta += yrel;
   378     mouse->z=z;
   420     mouse->z=z;
   379 
   421 
   383         mouse->MoveCursor(mouse->cur_cursor);
   425         mouse->MoveCursor(mouse->cur_cursor);
   384     }
   426     }
   385 
   427 
   386     /* Post the event, if desired */
   428     /* Post the event, if desired */
   387     posted = 0;
   429     posted = 0;
   388     if (SDL_ProcessEvents[SDL_MOUSEMOTION] == SDL_ENABLE) {
   430     if (SDL_ProcessEvents[SDL_MOUSEMOTION] == SDL_ENABLE && SDL_mice[index]->proximity==SDL_TRUE) {
   389         SDL_Event event;
   431         SDL_Event event;
   390         event.motion.type = SDL_MOUSEMOTION;
   432         event.motion.type = SDL_MOUSEMOTION;
   391         event.motion.which = (Uint8) index;
   433 event.motion.which = (Uint8) index;
   392         event.motion.state = mouse->buttonstate;
   434         event.motion.state = mouse->buttonstate;
   393         event.motion.x = mouse->x;
   435         event.motion.x = mouse->x;
   394         event.motion.y = mouse->y;
   436         event.motion.y = mouse->y;
   395         event.motion.z = mouse->z;
   437         event.motion.z = mouse->z;
   396         event.motion.xrel = xrel;
   438         event.motion.xrel = xrel;
   397         event.motion.yrel = yrel;
   439         event.motion.yrel = yrel;
   398         event.motion.windowID = mouse->focus;
   440         event.motion.windowID = mouse->focus;
   399         posted = (SDL_PushEvent(&event) > 0);
   441         posted = (SDL_PushEvent(&event) > 0);
   400     }
   442     }
       
   443     last_x=x;
       
   444     last_y=y;
   401     return posted;
   445     return posted;
   402 }
   446 }
   403 
   447 
   404 int
   448 int
   405 SDL_SendMouseButton(int id, Uint8 state, Uint8 button)
   449 SDL_SendMouseButton(int id, Uint8 state, Uint8 button)
   722         return NULL;
   766         return NULL;
   723     }
   767     }
   724     return mouse->name;
   768     return mouse->name;
   725 }
   769 }
   726 
   770 
   727 
   771 void SDL_UpdateCoordinates(int x, int y)
       
   772 {
       
   773     x_max=x;
       
   774     y_max=y;
       
   775 }
   728 /* vi: set ts=4 sw=4 expandtab: */
   776 /* vi: set ts=4 sw=4 expandtab: */