00001 #include <SDL/SDL_endian.h>
00002 #include "SDL_eventmap.h"
00003 #include "SDL_eventmap_internal.h"
00004 #include <map>
00005 using namespace std;
00006
00007 #define SDL_EM map<Uint32, int>
00008
00009 void SDLH_Clear(SDL_EventMap *emap)
00010 {
00011 SDL_EM *em=(SDL_EM *)emap;
00012
00013 if(em==NULL) return;
00014
00015 em->clear();
00016 }
00017
00021 int SDLH_RemoveID(SDL_EventMap *emap, int id)
00022 {
00023 SDL_EM *em=(SDL_EM *)emap;
00024 int removed=0;
00025
00026 if((em==NULL)||(id<0))
00027 return(-1);
00028
00029 SDL_EM::iterator i=em->begin();
00030
00031 while(i!=em->end())
00032 {
00033 SDL_EM::iterator next=i;
00034 ++next;
00035
00036 if((i->second)==(id+1))
00037 {
00038 em->erase(i);
00039 removed++;
00040 }
00041 i=next;
00042 }
00043
00044 return(removed);
00045 }
00046
00054 Uint32 SDLH_Learn(SDL_EventMap *emap, int id, Uint32 flag)
00055 {
00056 int running=1;
00057 SDL_Event event;
00058 if((emap==NULL)||(id<0))
00059 return(0);
00060
00061 while(running)
00062 {
00063 while(SDL_PollEvent(&event))
00064 {
00065 Uint32 hash=0;
00066 switch(event.type)
00067 {
00068 case SDL_QUIT:
00069 return(0);
00070
00071 default:
00072 hash=SDLH_HashEvent(&event,flag);
00073 break;
00074 }
00075
00076 if(hash!=0)
00077 {
00078 if(SDLH_AddHashEvent(emap,hash,id)<0)
00079 return(0);
00080 else
00081 return(hash);
00082 }
00083 }
00084
00085 SDL_Delay(10);
00086 }
00087 return(0);
00088 }
00089
00090 SDL_EventMap *SDLH_Load(SDL_RWops *stream)
00091 {
00092 SDL_EM *em=NULL;
00093 Uint32 maps=0;
00094 int n=0;
00095
00096 if(stream==NULL)
00097 return(NULL);
00098
00099 if(SDL_RWread(stream,&maps,sizeof(Uint32),1)<=0)
00100 return(NULL);
00101
00102 maps=SDL_SwapLE32(maps);
00103
00104 em=new SDL_EM;
00105
00106 for(n=0; n<maps; n++)
00107 {
00108 Uint32 hash;
00109 int id;
00110
00111 if(SDL_RWread(stream,&hash,sizeof(Uint32),1)<=0)
00112 {
00113 delete em;
00114 return(NULL);
00115 }
00116 else if(SDL_RWread(stream,&id,sizeof(int),1)<=0)
00117 {
00118 delete em;
00119 return(NULL);
00120 }
00121
00122 hash=SDL_SwapLE32(hash);
00123 id=SDL_SwapLE32(id);
00124
00125 (*em)[hash]=id;
00126 }
00127
00128 return((SDL_EventMap *)em);
00129 }
00130
00131 int SDLH_Save(SDL_EventMap *emap, SDL_RWops *stream)
00132 {
00133 SDL_EM *em=(SDL_EM *)emap;
00134
00135 if((stream==NULL)||(stream==NULL))
00136 return(-1);
00137 else if(em->size()==0)
00138 return(-1);
00139
00140 if(SDL_WriteLE32(stream,em->size())<0)
00141 return(-1);
00142
00143 SDL_EM::iterator i=em->begin();
00144 while(i!=em->end())
00145 {
00146 if(SDL_WriteLE32(stream,i->first)<0)
00147 return(-1);
00148 if(SDL_WriteLE32(stream,i->second)<0)
00149 return(-1);
00150
00151 i++;
00152 }
00153
00154 return(0);
00155 }
00156
00161 int SDLH_RemoveEvent(SDL_EventMap *eventmap, Uint32 hash)
00162 {
00163 SDL_EM *em=(SDL_EM *)eventmap;
00164
00165 if((em==NULL)||(hash==0))
00166 return(-1);
00167
00168 SDL_EM::iterator i=em->begin();
00169
00170 while(i!=em->end())
00171 {
00172 if(i->first==hash)
00173 {
00174 em->erase(i);
00175 return(0);
00176 }
00177
00178 i++;
00179 }
00180
00181 return(-1);
00182 }
00183
00188 int SDLH_AddEvent(SDL_EventMap *eventmap, SDL_Event *event, int id, Uint32 flag)
00189 {
00190 Uint32 hash=SDLH_HashEvent(event,flag);
00191
00192 return(SDLH_AddHashEvent(eventmap,hash,id));
00193 }
00194
00195
00199 int SDLH_AddHashEvent(SDL_EventMap *eventmap, Uint32 hash, int id)
00200 {
00201 SDL_EM *em=(SDL_EM *)eventmap;
00202
00203 if((eventmap==NULL)||(id<0)||(hash==0))
00204 return(-1);
00205
00206 (*em)[hash]=(id+1);
00207
00208 return(0);
00209 }
00210
00215 int SDLH_TranslateEvent(SDL_EventMap *emap, SDL_Event *event, Uint32 flag)
00216 {
00217 int hash;
00218 SDL_EM *em=(SDL_EM *)emap;
00219
00220 if((emap==NULL)||(event==NULL))
00221 return(-1);
00222
00223 hash=SDLH_HashEvent(event,flag);
00224 if(hash==0)
00225 return(-1);
00226
00227 if(!(*em)[hash])
00228 return(-1);
00229 else
00230 {
00231 SDL_Event uevent;
00232 uevent.type=SDL_USEREVENT;
00233 uevent.user.code=(*em)[hash]-1;
00234 uevent.user.data1=(void *)(long int)hash;
00235 uevent.user.data2=NULL;
00236 SDL_PushEvent(&uevent);
00237 return(0);
00238 }
00239 }
00240
00241 SDL_EventMap *SDLH_Create()
00242 {
00243 return((SDL_EventMap *)(new SDL_EM));
00244 }
00245
00246 void SDLH_Free(SDL_EventMap *eventmap)
00247 {
00248 if(eventmap!=NULL)
00249 {
00250 delete ((SDL_EM *)eventmap);
00251 }
00252 }