/* Copyright 2010 Fictive (Fictive's public key's fingerprint is "44:1a:41:70:b1:22:d4:93:3a:bb:84:62:60:0b:e4:a3")
This file is part of Sane Java Tablet.
Sane Java Tablet is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Sane Java Tablet is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Sane Java Tablet. If not, see <http://www.gnu.org/licenses/>.
*/
package asd;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.WString;
import com.sun.jna.platform.win32.Kernel32Util;
import domain.libs.sjt.winimpl.window.defs.Kernel32;
import domain.libs.sjt.winimpl.window.defs.MSGByReference;
import domain.libs.sjt.winimpl.window.defs.User32;
import domain.libs.sjt.winimpl.window.defs.User32Direct;
import domain.libs.sjt.winimpl.window.defs.WNDCLASSEX;
import domain.libs.sjt.winimpl.window.defs.WNDPROC;
import domain.libs.sjt.winimpl.wintab.defs.AXIS;
import domain.libs.sjt.winimpl.wintab.defs.LOGCONTEXTW;
import domain.libs.sjt.winimpl.wintab.defs.Wintab32;
public class Fuckyoutest implements WNDPROC {
public static void main(String[] args) {
Native.setProtected(true);
new Fuckyoutest();
}
private Pointer hInstance = Kernel32.INSTANCE.GetModuleHandleW(Pointer.NULL);
private Pointer hWnd;
private Pointer hCtx;
public Fuckyoutest() {
// AreaMappingConfig.lol();
//
long startTime = System.currentTimeMillis();
long oldTime = startTime;
int i=0;
int x;
while ((System.currentTimeMillis() - startTime) < 1000*5) {
double speedMulti = (System.currentTimeMillis() - startTime)/100d;
x = (int) (i+(100*speedMulti)) % 1280;
User32Direct.SetCursorPos(x, 100);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(1==1)return;
int ret;
WNDCLASSEX wc = new WNDCLASSEX();
wc.cbSize = wc.size();
wc.style = 0;
wc.lpfnWndProc = this;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = User32.INSTANCE.LoadIconW(Pointer.NULL, new Pointer(User32.IDI_APPLICATION));
wc.hCursor = User32.INSTANCE.LoadCursorW(Pointer.NULL, new Pointer(User32.IDC_ARROW));
wc.hbrBackground = new Pointer(User32.COLOR_APPWORKSPACE + 1);
wc.lpszMenuName = new WString("TiltTestMenu");
wc.lpszClassName = new WString("TiltTestWClass");
wc.hIconSm = Pointer.NULL;
ret = User32.INSTANCE.RegisterClassExW(wc);
if (ret == 0) {
new Exception("RegisterClassExW() failed. Last error is :" + Kernel32Util.formatMessageFromLastErrorCode(Native.getLastError())).printStackTrace();
return;
}
if (Wintab32.INSTANCE.WTInfoW(0, 0, Pointer.NULL) == 0) {
new Exception("WTInfoW() failed").printStackTrace();
return;
}
hWnd = User32.INSTANCE.CreateWindowExW(
0,
new WString("TiltTestWClass"),
new WString(String.format("TiltTest:%x", Pointer.nativeValue(hInstance))),
(int) User32.WS_OVERLAPPEDWINDOW,
(int) User32.CW_USEDEFAULT,
(int) User32.CW_USEDEFAULT,
(int) User32.CW_USEDEFAULT,
(int) User32.CW_USEDEFAULT,
Pointer.NULL,
Pointer.NULL,
hInstance,
Pointer.NULL);
hCtx = tabletInit();
if (hCtx == Pointer.NULL) {
new Exception("tabletInit() failed.").printStackTrace();
User32.INSTANCE.SendMessageW(hWnd, (int) User32.WM_DESTROY, User32.POINTER_ZERO, User32.POINTER_ZERO);
return;
}
if (hWnd == Pointer.NULL) {
new Exception("CreateWindowExW() failed. Last error is :" + Kernel32Util.formatMessageFromLastErrorCode(Native.getLastError())).printStackTrace();
return;
}
User32.INSTANCE.ShowWindow(hWnd, (int) User32.SW_SHOWNORMAL);
User32.INSTANCE.UpdateWindow(hWnd);
MSGByReference msg = new MSGByReference();
while((ret = User32.INSTANCE.GetMessageW(msg, Pointer.NULL, 0, 0 )) != 0) {
if (ret == -1) {
new Exception("GetMessageW() failed. Last error is :" + Kernel32Util.formatMessageFromLastErrorCode(Native.getLastError())).printStackTrace();
return;
}
else {
User32.INSTANCE.TranslateMessage(msg);
User32.INSTANCE.DispatchMessageW(msg);
}
} // while
}
@Override
public Pointer callback(Pointer hWnd, int uMsg, Pointer wParam, Pointer lParam) {
switch (uMsg) {
// case (int) User32.WM_CREATE: // optional
// break; /* should return zero to continue creation of the window*/
// case (int) User32.WM_ACTIVATE:
// break;
case (int) User32.WM_DESTROY:
tabletCleanup();
User32.INSTANCE.PostQuitMessage(0);
break; /* If an application processes this message, it should return zero. */
case (int) Wintab32.WT_PACKET:
// System.out.println("WT_PACKET");
handleWTPACKET(lParam, Pointer.nativeValue(wParam));
break; /* i assume that default window processing doesn't know (thus care) about WT_PACKET */
default:
return User32.INSTANCE.DefWindowProcW(hWnd, uMsg, wParam, lParam);
} // switch
return User32.POINTER_ZERO;
}
private Pointer tabletInit() {
LOGCONTEXTW lc = new LOGCONTEXTW();
Wintab32.INSTANCE.WTInfoW((int) Wintab32.WTI_DDCTXS, 0, lc);
String lcName = "TiltTest Digitizing %x";
"TiltTest Digitizing %x".getChars(
0,
(int) (lcName.length() > Wintab32.LCNAMELEN ? Wintab32.LCNAMELEN : lcName.length()),
lc.lcName,
0);
printLCInfo(lc);
lc.lcOptions |= Wintab32.CXO_MESSAGES;
lc.lcPktData = (int) (Wintab32.PK_CONTEXT | Wintab32.PK_X | Wintab32.PK_Y);
lc.lcPktMode = 0; // return all values as absolute (or set tablet to absolute mode?)
lc.lcMoveMask = Integer.MAX_VALUE;
lc.lcBtnUpMask = Integer.MAX_VALUE;
lc.lcBtnDnMask = Integer.MAX_VALUE;
// lc.lcInOrgX = new NativeLong(0);
// lc.lcInExtX = new NativeLong(30479);
//
// lc.lcInOrgY = new NativeLong(0);
// lc.lcInExtY = new NativeLong(22859);
//
// lc.lcOutOrgX = new NativeLong(0);
// lc.lcOutExtX = new NativeLong(30479);
////
// lc.lcOutOrgY = new NativeLong(0);
// lc.lcOutExtY = new NativeLong(22859);
//
// lc.lcSysOrgX = 0;
// lc.lcSysExtX = 100;
//
// lc.lcSysOrgY = 0;
// lc.lcSysExtY = 100;
// lc.lcInExtX = new NativeLong(30479);
// lc.lcOutOrgX = lc.lcInOrgX;
// lc.lcOutExtX = lc.lcInExtX;
//
// lc.lcOutOrgY = lc.lcInOrgY;
// lc.lcOutExtY = lc.lcInExtY;
// lc.lcOutOrgX = lc.lcOutOrgY = lc.lcOutExtX = lc.lcOutExtY =
// lc.lcInOrgX = lc.lcInExtX = lc.lcInOrgY = lc.lcInExtY = new NativeLong(0);
//
// lc.lcOutOrgX = lc.lcInOrgX = lc.lcOutOrgY = lc.lcInOrgY =
// lc.lcOutExtY = lc.lcInExtY = new NativeLong(0);
// Pointer hCtx = Wintab32.INSTANCE.WTOpenW(hWnd, lc, 1);
// printLCInfo(lc);
// Memory m = new Memory(128);
//
// for (int i=0; ; i++) {
// m.clear();
// if (Wintab32.INSTANCE.WTInfoW((int) Wintab32.WTI_DSCTXS+i, (int) Wintab32.CTX_INORGX, m) == 0) break;
// System.out.println("CTX_? for WTI_DSCTXS#"+(i)+": "+m.getNativeLong(0).longValue());
// }
//
// Wintab32.INSTANCE.WTInfoW((int) Wintab32.WTI_INTERFACE, (int) Wintab32.IFC_NDEVICES, m);
// System.out.println("IFC_NDEVICES: "+m.getNativeLong(0).longValue());
// LOGCONTEXTW lcw = new LOGCONTEXTW();
//
// for (int i=0; ; i++) {
// if (Wintab32.INSTANCE.WTInfoW((int) Wintab32.WTI_DSCTXS+i, 0, lcw) == 0) break;
// System.out.println("");
// System.out.println("------------------------------------");
// System.out.println("");
// System.out.println("LOGCONTEXTW for #"+i);
// System.out.println("lcName: "+new String(lcw.lcName, 0, getCharArrayStringLength(lcw.lcName)));
// printLCInfo(lcw);
// }
// Memory m = new Memory(128);
// for (int i=0; ; i++) {
// if (Wintab32.INSTANCE.WTInfoW((int) Wintab32.WTI_EXTENSIONS+i, (int) Wintab32.EXT_TAG, m) == 0) break;
// if (m.getInt(0) == Wintab32.WTX_CSRMASK) System.out.println("dounf");
// }
Memory m = new Memory(128);
for (int i=0; ; i++) {
m.clear();
if (Wintab32.INSTANCE.WTInfoW((int) Wintab32.WTI_EXTENSIONS+i, (int) Wintab32.EXT_NAME, m) == 0) break;
System.out.println("ext #"+i+" name: "+new String(m.getString(0, true)));
}
// Memory m = new Memory(Native.POINTER_SIZE);
// Wintab32.INSTANCE.WTInfoW((int) Wintab32.WTI_DSCTXS, (int) Wintab32.CTX_SYSEXTX, m);
// System.out.println(m.getNativeLong(0));
// IntByReference i = new IntByReference();
// int inOrgX, inExtX, inOrgY, inExtY,
// outOrgX, outExtX, outOrgY, outExtY,
// sysOrgX, sysExtX, sysOrgY, sysExtY;
//
// int iCat = (int) Wintab32.WTI_DSCTXS;
//
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_INORGX, i);
// inOrgX = i.getValue();
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_INEXTX, i);
// inExtX = i.getValue();
//
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_INORGY, i);
// inOrgY = i.getValue();
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_INEXTY, i);
// inExtY = i.getValue();
//
//
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_OUTORGX, i);
// outOrgX = i.getValue();
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_OUTEXTX, i);
// outExtX = i.getValue();
//
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_OUTORGY, i);
// outOrgY = i.getValue();
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_OUTEXTY, i);
// outExtY = i.getValue();
//
//
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_SYSORGX, i);
// sysOrgX = i.getValue();
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_SYSEXTX, i);
// sysExtX = i.getValue();
//
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_SYSORGY, i);
// sysOrgY = i.getValue();
// Wintab32.INSTANCE.WTInfoW(iCat, (int) Wintab32.CTX_SYSEXTY, i);
// sysExtY = i.getValue();
//
// System.out.println(String.format(
// " inOrgX = %d inExtX = %d%n" +
// "inOrgY = %d%n" +
// "inExtY = %d%n" +
// "%n" +
// "%n" +
// " outOrgX = %d outExtX = %d%n" +
// "outOrgY = %d%n" +
// "outExtY = %d%n" +
// "%n" +
// "%n" +
// " sysOrgX = %d sysExtX = %d%n" +
// "sysOrgY = %d%n" +
// "sysExtY = %d%n",
//
// inOrgX, inExtX,
// inOrgY,
// inExtY,
//
// outOrgX, outExtX,
// outOrgY,
// outExtY,
//
// sysOrgX, sysExtX,
// sysOrgY,
// sysExtY
// ));
Pointer hCtx = Wintab32.INSTANCE.WTOpenW(hWnd, lc, 1);
// byte csrMask[] = new byte[16];
// csrMask[0] = (byte)((1<<1)&255);
// Wintab32.INSTANCE.WTExtGet(hCtx, (int) Wintab32.WTX_CSRMASK, csrMask);
// Wintab32.INSTANCE.WTExtSet(hCtx, (int) Wintab32.WTX_CSRMASK, csrMask);
// Wintab32.INSTANCE.WTEnable(hCtx, 1);
//
// lc.clear();
// Wintab32.INSTANCE.WTGetW(hCtx, lc);
// printLCInfo(lc);
return hCtx;
}
public static int getCharArrayStringLength(char[] charArray) {
for (int i=0; i<charArray.length; i++) {
if (charArray[i] == 0) return i;
}
return 0;
}
private void printLCInfo(LOGCONTEXTW lc) {
AXIS axis = new AXIS();
Wintab32.INSTANCE.WTInfoW((int) Wintab32.WTI_DEVICES, (int) Wintab32.DVC_X, axis);
System.out.println(String.format(
"X Axis min = %d max = %d",
axis.axMin,
axis.axMax
));
Wintab32.INSTANCE.WTInfoW((int) Wintab32.WTI_DEVICES, (int) Wintab32.DVC_Y, axis);
System.out.println(String.format(
"Y Axis min = %d max = %d",
axis.axMin,
axis.axMax
));
System.out.println(String.format(
"%n%n=== TABLET'S ACTIVE AREA IN TABLET COORDINATES%n" +
" lcInOrgX = %d lcInExtX = %d%n" +
"lcInOrgY = %d%n" +
"lcInExtY = %d%n" +
"%n" +
"%n" +
"=== VALUE REPORTING RANGES%n" +
" lcOutOrgX = %d lcOutExtX = %d%n" +
"lcOutOrgY = %d%n" +
"lcOutExtY = %d%n" +
"%n" +
"%n" +
"=== SCREEN MAPPING AREA IN PIXELS (SCREEN COORDINATES)%n" +
" lcSysOrgX = %d lcSysExtX = %d%n" +
"lcSysOrgY = %d%n" +
"lcSysExtY = %d",
lc.lcInOrgX, lc.lcInExtX,
lc.lcInOrgY, lc.lcInExtY,
lc.lcOutOrgX, lc.lcOutExtX,
lc.lcOutOrgY, lc.lcOutExtY,
lc.lcSysOrgX, lc.lcSysExtX,
lc.lcSysOrgY, lc.lcSysExtY
));
}
private void tabletCleanup() {
if (hCtx != Pointer.NULL) {
Wintab32.INSTANCE.WTClose(hCtx);
}
}
// LOGCONTEXTW lpLogCtx = new LOGCONTEXTW();
// private Memory m = new Memory(512*1024);
private void handleWTPACKET(Pointer hCtx, long wSerial) {
// Wintab32.INSTANCE.WTPacket(hCtx, (int)wSerial, m);
// Wintab32.INSTANCE.WTGetW(m.getPointer(0), lpLogCtx);
// System.out.println(lpLogCtx.lcOutOrgX);
// System.out.println(String.format(
// "x:%d y:%d",
// m.getInt(8),
// m.getInt(12)
// ));
}
}