develop
Petr Mrázek 2009-12-12 23:56:28 +00:00
parent 337d42e15a
commit 1ea77b477e
2 changed files with 1353 additions and 1316 deletions

@ -65,6 +65,8 @@ using namespace std;
#include <X11/Xlib.h> //need for X11 functions
#include <X11/extensions/XTest.h> //need for Xtest
#include <X11/Xatom.h> //for the atom stuff
#define XK_MISCELLANY
#include <X11/keysymdef.h>
#else
#define _WIN32_WINNT 0x0500 // needed for INPUT struct
#define WINVER 0x0500 // OpenThread(), PSAPI, Toolhelp32

@ -278,11 +278,13 @@ bool API::getCurrentCursorCreatures(vector<uint32_t> &addresses)
{
assert (d->cursorWindowInited);
DfVector creUnderCursor = d->dm->readVector (d->current_cursor_creature_offset, 4);
if(creUnderCursor.getSize() == 0){
if (creUnderCursor.getSize() == 0)
{
return false;
}
addresses.clear();
for(int i =0;i<creUnderCursor.getSize();i++){
for (int i = 0;i < creUnderCursor.getSize();i++)
{
uint32_t temp = * (uint32_t *) creUnderCursor.at (i);
addresses.push_back (temp);
}
@ -305,7 +307,8 @@ Window EnumerateWindows (Display *display, Window rootWindow,const char *searchS
char * win_name;
status = XFetchName (display, rootWindow, &win_name);
if ((status >= Success) && (win_name) && strcmp(win_name,searchString) == 0){
if ( (status >= Success) && (win_name) && strcmp (win_name, searchString) == 0)
{
return rootWindow;
}
@ -325,7 +328,8 @@ Window EnumerateWindows (Display *display, Window rootWindow,const char *searchS
for (i = 0; i < noOfChildren; i++)
{
Window tempWindow = EnumerateWindows (display, children[i], searchString);
if(tempWindow != BadWindow){
if (tempWindow != BadWindow)
{
retWindow = tempWindow;
break;
}
@ -335,17 +339,21 @@ Window EnumerateWindows (Display *display, Window rootWindow,const char *searchS
return retWindow;
}
// END ENUMERATE WINDOWS
Window getDFWindow(Display *dpy){
bool getDFWindow (Display *dpy, Window& dfWindow, Window & rootWindow)
{
// int numScreeens = ScreenCount(dpy);
for(int i = 0;i < ScreenCount(dpy);i++){
Window currWin = RootWindow(dpy, i);
Window retWindow = EnumerateWindows(dpy,currWin,"Dwarf Fortress");
if(retWindow != BadWindow){
return (retWindow);
for (int i = 0;i < ScreenCount (dpy);i++)
{
rootWindow = RootWindow (dpy, i);
Window retWindow = EnumerateWindows (dpy, rootWindow, "Dwarf Fortress");
if (retWindow != BadWindow)
{
dfWindow = retWindow;
return true;
}
//I would ideally like to find the dfwindow using the PID, but X11 Windows only know their processes pid if the _NET_WM_PID attribute is set, which it is not for SDL 1.2. Supposedly SDL 1.3 will set this, but who knows when that will occur.
}
return(BadWindow);
return false;
}
bool setWMClientLeaderProperty (Display *dpy, Window &dfWin, Window &currentFocus)
{
@ -373,7 +381,8 @@ bool setWMClientLeaderProperty(Display *dpy, Window &dfWin, Window &currentFocus
else
{
Window curr = currentFocus;
while(data == 0){
while (data == 0)
{
Window parent;
Window root;
Window *children;
@ -393,8 +402,9 @@ void API::TypeStr(const char *lpszString,int delay,bool useShift)
{
ForceResume();
Display *dpy = XOpenDisplay (NULL); // null opens the display in $DISPLAY
Window dfWin = getDFWindow(dpy);
if(dfWin != BadWindow)
Window dfWin;
Window rootWin;
if (getDFWindow (dpy, dfWin, rootWin))
{
XWindowAttributes currAttr;
@ -403,10 +413,12 @@ void API::TypeStr(const char *lpszString,int delay,bool useShift)
XGetInputFocus (dpy, &currentFocus, &currentRevert); //get current focus
setWMClientLeaderProperty (dpy, dfWin, currentFocus);
XGetWindowAttributes (dpy, dfWin, &currAttr);
if(currAttr.map_state == IsUnmapped){
if (currAttr.map_state == IsUnmapped)
{
XMapRaised (dpy, dfWin);
}
if(currAttr.map_state == IsUnviewable){
if (currAttr.map_state == IsUnviewable)
{
XRaiseWindow (dpy, dfWin);
}
XSync (dpy, false);
@ -422,7 +434,8 @@ void API::TypeStr(const char *lpszString,int delay,bool useShift)
xkeycode = XKeysymToKeycode (dpy, cChar);
//HACK add an extra shift up event, this fixes the problem of the same character twice in a row being displayed in df
XTestFakeKeyEvent (dpy, XKeysymToKeycode (dpy, XStringToKeysym ("Shift_L")), false, CurrentTime);
if(useShift || cChar >= 'A' && cChar <= 'Z'){
if (useShift || cChar >= 'A' && cChar <= 'Z')
{
XTestFakeKeyEvent (dpy, XKeysymToKeycode (dpy, XStringToKeysym ("Shift_L")), true, CurrentTime);
XSync (dpy, false);
}
@ -430,13 +443,15 @@ void API::TypeStr(const char *lpszString,int delay,bool useShift)
XSync (dpy, false);
XTestFakeKeyEvent (dpy, xkeycode, false, CurrentTime);
XSync (dpy, false);
if(useShift || cChar >= 'A' && cChar <= 'Z'){
if (useShift || cChar >= 'A' && cChar <= 'Z')
{
XTestFakeKeyEvent (dpy, XKeysymToKeycode (dpy, XStringToKeysym ("Shift_L")), false, CurrentTime);
XSync (dpy, false);
}
}
if(currAttr.map_state == IsUnmapped){
if (currAttr.map_state == IsUnmapped)
{
// XUnmapWindow(dpy,dfWin); if I unmap the window, it is no longer on the task bar, so just lower it instead
XLowerWindow (dpy, dfWin);
}
@ -449,12 +464,14 @@ void API::TypeStr(const char *lpszString,int delay,bool useShift)
void API::TypeSpecial (t_special command, int count, int delay)
{
ForceResume();
if(command != WAIT){
if (command != WAIT)
{
KeySym mykeysym;
KeyCode xkeycode;
Display *dpy = XOpenDisplay (NULL); // null opens the display in $DISPLAY
Window dfWin = getDFWindow(dpy);
if(dfWin != BadWindow)
Window dfWin;
Window rootWin;
if (getDFWindow (dpy, dfWin, rootWin))
{
XWindowAttributes currAttr;
Window currentFocus;
@ -462,10 +479,12 @@ void API::TypeSpecial(t_special command,int count,int delay)
XGetInputFocus (dpy, &currentFocus, &currentRevert); //get current focus
setWMClientLeaderProperty (dpy, dfWin, currentFocus);
XGetWindowAttributes (dpy, dfWin, &currAttr);
if(currAttr.map_state == IsUnmapped){
if (currAttr.map_state == IsUnmapped)
{
XMapRaised (dpy, dfWin);
}
if(currAttr.map_state == IsUnviewable){
if (currAttr.map_state == IsUnviewable)
{
XRaiseWindow (dpy, dfWin);
}
XSync (dpy, false);
@ -496,7 +515,8 @@ void API::TypeSpecial(t_special command,int count,int delay)
break;
case BACK_SPACE:
mykeysym = XStringToKeysym ("BackSpace");
xkeycode = XKeysymToKeycode(dpy,mykeysym);
xkeycode = XK_BackSpace;
xkeycode = XKeysymToKeycode (dpy, XK_BackSpace);
XTestFakeKeyEvent (dpy, xkeycode, true, CurrentTime);
XSync (dpy, true);
XTestFakeKeyEvent (dpy, xkeycode, false, CurrentTime);
@ -862,16 +882,15 @@ void API::TypeSpecial(t_special command,int count,int delay)
XSync (dpy, true);
break;
}
usleep(20000);
}
if(currAttr.map_state == IsUnmapped){
if (currAttr.map_state == IsUnmapped)
{
XLowerWindow (dpy, dfWin); // can't unmap, because you lose task bar
}
XSetInputFocus (dpy, currentFocus, currentRevert, CurrentTime);
XSync (dpy, false);
}
if(command != WAIT){
usleep(delay*1000);
}
}
else
{
@ -880,15 +899,18 @@ void API::TypeSpecial(t_special command,int count,int delay)
}
#else
//Windows key handlers
struct window{
struct window
{
HWND windowHandle;
uint32_t pid;
};
BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam){
BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam)
{
uint32_t pid;
GetWindowThreadProcessId (hwnd, (LPDWORD) &pid);
if(pid == ((window *) lParam)->pid){
if (pid == ( (window *) lParam)->pid)
{
( (window *) lParam)->windowHandle = hwnd;
return FALSE;
}
@ -915,7 +937,8 @@ void API::TypeStr(const char *lpszString,int delay, bool useShift)
while ( (cChar = *lpszString++)) // loops through chars
{
short vk = VkKeyScan (cChar); // keycode of char
if(useShift || (vk>>8)&1){ // char is capital, so need to hold down shift
if (useShift || (vk >> 8) &1) // char is capital, so need to hold down shift
{
//shift down
INPUT input[4] = {0};
input[0].type = INPUT_KEYBOARD;
@ -935,7 +958,8 @@ void API::TypeStr(const char *lpszString,int delay, bool useShift)
SendInput (4, input, sizeof (input[0]));
}
else{
else
{
INPUT input[2] = {0};
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = vk;
@ -1174,7 +1198,8 @@ void API::TypeSpecial(t_special command,int count,int delay)
input[1].ki.wVk = VK_SEPARATOR;
break;
}
for(int i = 0; i<count;i++){
for (int i = 0; i < count;i++)
{
SendInput (2, input, sizeof (input[0]));
}
SetForegroundWindow (currentWindow);
@ -1182,7 +1207,8 @@ void API::TypeSpecial(t_special command,int count,int delay)
SetWindowPos (myWindow.windowHandle, nextWindow, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
Sleep (delay);
}
else{
else
{
Sleep (delay*count);
}
}
@ -1980,7 +2006,8 @@ void API::InitReadNameTables(map< string, vector<string> > & nameTable)
DfVector transVec (d->dm->readVector (transAddress, 4));
uint32_t dwarf_entry = 0;
for(int32_t i =0;i < genericVec.getSize();i++){
for (int32_t i = 0;i < genericVec.getSize();i++)
{
uint32_t genericNamePtr = * (uint32_t *) genericVec.at (i);
string genericName = d->dm->readSTLString (genericNamePtr);
nameTable["GENERIC"].push_back (genericName);
@ -1991,7 +2018,8 @@ void API::InitReadNameTables(map< string, vector<string> > & nameTable)
uint32_t transPtr = * (uint32_t *) transVec.at (i);
string transName = d->dm->readSTLString (transPtr);
DfVector trans_names_vec (d->dm->readVector (transPtr + word_table_offset, 4));
for(uint32_t j =0;j<trans_names_vec.getSize();j++){
for (uint32_t j = 0;j < trans_names_vec.getSize();j++)
{
uint32_t transNamePtr = * (uint32_t *) trans_names_vec.at (j);
string name = d->dm->readSTLString (transNamePtr);
nameTable[transName].push_back (name);
@ -2006,9 +2034,12 @@ string API::TranslateName(const t_lastname & last, const map<string, vector<stri
assert (d->nameTablesInited);
map<string, vector<string> >::const_iterator it;
it = nameTable.find (language);
if(it != nameTable.end()){
for(int i =0;i<7;i++){
if(last.names[i] == -1){
if (it != nameTable.end())
{
for (int i = 0;i < 7;i++)
{
if (last.names[i] == -1)
{
break;
}
trans_last.append (it->second[last.names[i]]);
@ -2022,8 +2053,10 @@ string API::TranslateName(const t_squadname & squad, const map<string, vector<st
assert (d->nameTablesInited);
map<string, vector<string> >::const_iterator it;
it = nameTable.find (language);
if(it != nameTable.end()){
for(int i =0;i<7;i++){
if (it != nameTable.end())
{
for (int i = 0;i < 7;i++)
{
if (squad.names[i] == 0xFFFFFFFF)
{
continue;
@ -2032,7 +2065,8 @@ string API::TranslateName(const t_squadname & squad, const map<string, vector<st
{
break;
}
if(i ==4){
if (i == 4)
{
trans_squad.append (" ");
}
trans_squad.append (it->second[squad.names[i]]);
@ -2294,7 +2328,8 @@ bool API::ReadViewScreen(t_viewscreen &screen)
uint32_t last = MreadDWord (d->view_screen_offset);
uint32_t screenAddr = MreadDWord (last);
uint32_t nextScreenPtr = MreadDWord (last + 4);
while(nextScreenPtr != 0){
while (nextScreenPtr != 0)
{
last = nextScreenPtr;
screenAddr = MreadDWord (nextScreenPtr);
nextScreenPtr = MreadDWord (nextScreenPtr + 4);