手机探索者开发实录Broncho支持VNC.docx
- 文档编号:29847738
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:22
- 大小:94.09KB
手机探索者开发实录Broncho支持VNC.docx
《手机探索者开发实录Broncho支持VNC.docx》由会员分享,可在线阅读,更多相关《手机探索者开发实录Broncho支持VNC.docx(22页珍藏版)》请在冰豆网上搜索。
手机探索者开发实录Broncho支持VNC
手机探索者开发实录—Broncho支持VNC
作者联系方式:
李先静
在前段时间写的一篇BLOG中,我介绍了DirectFB同时显示到X11和VNC的方法。
那是一个有趣的实验,为此我兴奋了好一会儿,不过没有什么太大的实用价值,因为broncho平台使用的GTK/DirectFB作为GUI,显示通过fbdev(framebuffer)输出到LCD。
我们要做的是让DirectFB同时显示到fbdev和VNC上,这个功能作为手机探索者的一部分,现在是实现的时候了。
这并不难,由于一些小问题,我还是花了一整天时间才搞定。
一、下载libVNCServer,然后编译和安装。
要确保通过环境变量PATH能找到vncserver的配置脚本。
二、为DirectFB创建fbvnc的system模块。
1.把fbdev拷贝为fbvnc,把所有的文件名、变量名和函数名,从fbdev改名为fbvnc。
2.修改fbvnc.c,包含下列头文件。
1#include
2#include
3#include
4#include 3.修改fbvnc.c,声明下列函数和变量。 5staticrfbScreenInfoPtrrfb_screen=NULL; 6staticCoreInputDevice*vncPointerDevice=NULL; 7staticCoreInputDevice*vncKeyboardDevice=NULL; 8staticintg_vnc_client_nr=0; 9 10typedefstruct_ClientData 11{ 12intoldButtonMask; 13intpressed; 14intoldx; 15intoldy; 16}ClientData; 17 18staticvoidvnc_client_gone(rfbClientPtrcl); 19staticenumrfbNewClientActionvnc_client_new(rfbClientPtrcl); 20staticboolvnc_translate_key(rfbKeySymkey,DFBInputEvent*evt); 21staticvoid*vnc_server_thread(DirectThread*thread,void*data); 22staticvoid*vnc_refresh_thread(DirectThread*thread,void*data); 23staticvoidvnc_process_key_event(rfbBooldown,rfbKeySymkey,struct_rfbClientRec*cl); 24staticvoidvnc_process_pointer_event(intbuttonMask,intx,inty,struct_rfbClientRec*cl); 25staticDFBResultvnc_update_screen(unsignedshort*src,intx,inty,intw,inth); 26staticDFBResultvnc_set_video_mode(DFBDisplayLayerConfig*config); 27staticDFBEnumerationResultvnc_attach_keyboard_device(CoreInputDevice*device,void*ctx); 28staticDFBEnumerationResultvnc_attach_pointer_device(CoreInputDevice*device,void*ctx); 4.修改fbvnc.c,在primaryInitLayer中调用vnc_set_video_mode。 5.修改fbvnc.c,实现下列函数。 29staticDFBEnumerationResult 30vnc_attach_keyboard_device(CoreInputDevice*device, 31void*ctx) 32{ 33vncKeyboardDevice=device; 34returnDFENUM_OK; 35} 36 37staticDFBEnumerationResult 38vnc_attach_pointer_device(CoreInputDevice*device, 39void*ctx) 40{ 41vncPointerDevice=device; 42 43returnDFENUM_OK; 44} 45staticvoidvnc_client_gone(rfbClientPtrcl) 46{ 47g_vnc_client_nr--; 48free(cl->clientData); 49 50return; 51} 52 53staticenumrfbNewClientActionvnc_client_new(rfbClientPtrcl) 54{ 55g_vnc_client_nr++; 56cl->clientData=(void*)calloc(sizeof(ClientData),1); 57cl->clientGoneHook=vnc_client_gone; 58returnRFB_CLIENT_ACCEPT; 59} 60 61 62staticvoid 63vnc_process_pointer_event(intbuttonMask,intx,inty,rfbClientPtrcl) 64{ 65 66DFBInputEventevt={0}; 67intbutton=0; 68 69if(vncPointerDevice==NULL){ 70/*Attachtofirstinputdevice*/ 71dfb_input_enumerate_devices(vnc_attach_pointer_device,NULL, 72DICAPS_BUTTONS|DICAPS_AXES); 73D_ASSERT(vncPointerDevice); 74} 75 76ClientData*cd=cl->clientData; 77if(buttonMask! =cd->oldButtonMask){ 78intmask=buttonMask^cd->oldButtonMask; 79if(mask&(1<<0)){ 80button=DIBI_LEFT; 81}elseif(mask&(1<<1)){ 82button=DIBI_MIDDLE; 83}elseif(mask&(1<<2)){ 84button=DIBI_RIGHT; 85}else{ 86return; 87} 88evt.flags=DIEF_NONE; 89 90if(cd->pressed) 91{ 92evt.type=DIET_BUTTONRELEASE; 93cd->pressed=0; 94cd->oldButtonMask=0; 95}else{ 96evt.type=DIET_BUTTONPRESS; 97cd->pressed=1; 98cd->oldButtonMask=buttonMask; 99} 100evt.button=button; 101printf("%s%d%d%d%d/n",__func__,button,cd->pressed,x,y); 102dfb_input_dispatch(vncPointerDevice,&evt); 103cd->oldx=x; 104cd->oldy=y; 105return; 106} 107 108evt.type=DIET_AXISMOTION; 109evt.flags=DIEF_AXISABS; 110 111if(cd->oldx! =x){ 112evt.axis=DIAI_X; 113evt.axisabs=x; 114dfb_input_dispatch(vncPointerDevice,&evt); 115} 116 117if(cd->oldy! =y){ 118evt.axis=DIAI_Y; 119evt.axisabs=y; 120dfb_input_dispatch(vncPointerDevice,&evt); 121} 122cd->oldx=x; 123cd->oldy=y; 124 125dfb_input_dispatch(vncPointerDevice,&evt); 126rfbDefaultPtrAddEvent(buttonMask,x,y,cl); 127 128} 129 130/* 131*declarationofprivatedata 132*/ 133staticvoid 134vnc_process_key_event(rfbBooldown,rfbKeySymkey,rfbClientPtrcl) 135{ 136DFBInputEventevt; 137if(vncKeyboardDevice==NULL){ 138/*Attachtofirstinputdevice*/ 139dfb_input_enumerate_devices(vnc_attach_keyboard_device,NULL,DICAPS_KEYS); 140D_ASSERT(vncKeyboardDevice); 141} 142if(down) 143evt.type=DIET_KEYPRESS; 144else 145evt.type=DIET_KEYRELEASE; 146 147if(vnc_translate_key(key,&evt)){ 148dfb_input_dispatch(vncKeyboardDevice,&evt); 149} 150 151} 152 153 154staticbool 155vnc_translate_key(rfbKeySymkey,DFBInputEvent*evt) 156{ 157/*Unicode*/ 158if(key<=0xf000){ 159evt->flags=DIEF_KEYSYMBOL; 160evt->key_symbol=key; 161returntrue; 162} 163 164/*Deadkeys*/ 165/*todo*/ 166 167/*Numerickeypad*/ 168if(key>=XK_KP_0&&key<=XK_KP_9){ 169evt->flags=DIEF_KEYID; 170evt->key_id=DIKI_KP_0+key-XK_KP_0; 171returntrue; 172} 173 174/*Functionkeys*/ 175if(key>=XK_F1&&key<=XK_F11){ 176evt->flags=DIEF_KEYID; 177evt->key_id=DIKI_F1+key-XK_F1; 178returntrue; 179} 180 181switch(key){ 182/*Numerickeypad*/ 183caseXK_KP_Decimal: 184evt->flags=DIEF_KEYID; 185evt->key_id=DIKI_KP_DECIMAL; 186break; 187 188caseXK_KP_Separator: 189evt->flags=DIEF_KEYID; 190evt->key_id=DIKI_KP_SEPARATOR; 191break; 192 193caseXK_KP_Divide: 194evt->flags=DIEF_KEYID; 195evt->key_id=DIKI_KP_DIV; 196break; 197 198caseXK_KP_Multiply: 199evt->flags=DIEF_KEYID; 200evt->key_id=DIKI_KP_MULT; 201break; 202 203caseXK_KP_Subtract: 204evt->flags=DIEF_KEYID; 205evt->key_id=DIKI_KP_MINUS; 206break; 207 208caseXK_KP_Add: 209evt->flags=DIEF_KEYID; 210evt->key_id=DIKI_KP_PLUS; 211break; 212 213caseXK_KP_Enter: 214evt->flags=DIEF_KEYID; 215evt->key_id=DIKI_KP_ENTER; 216break; 217 218caseXK_KP_Equal: 219evt->flags=DIEF_KEYID; 220evt->key_id=DIKI_KP_EQUAL; 221break; 222 223 224/*Arrows+Home/Endpad*/ 225caseXK_Up: 226evt->flags=DIEF_KEYID; 227evt->key_id=DIKI_UP; 228break; 229 230caseXK_Down: 231evt->flags=DIEF_KEYID; 232evt->key_id=DIKI_DOWN; 233break; 234 235caseXK_Right: 236evt->flags=DIEF_KEYID; 237evt->key_id=DIKI_RIGHT; 238break; 239 240caseXK_Left: 241evt->flags=DIEF_KEYID; 242evt->key_id=DIKI_LEFT; 243break; 244 245caseXK_Insert: 246evt->flags=DIEF_KEYID; 247evt->key_id=DIKI_INSERT; 248break; 249 250caseXK_Delete: 251evt->flags=DIEF_KEYID; 252evt->key_id=DIKI_DELETE; 253break; 254 255caseXK_Home: 256evt->flags=DIEF_KEYID; 257evt->key_id=DIKI_HOME; 258break; 259 260caseXK_End: 261evt->flags=DIEF_KEYID; 262evt->key_id=DIKI_END; 263break; 264 265caseXK_Page_Up: 266evt->flags=DIEF_KEYID; 267evt->key_id=DIKI_PAGE_UP; 268break; 269 270caseXK_Page_Down: 271evt->flags=DIEF_KEYID; 272evt->key_id=DIKI_PAGE_DOWN; 273break; 274 275 276/*Keystatemodifierkeys*/ 277caseXK_Num_Lock: 278evt->flags=DIEF_KEYID; 279evt->key_id=DIKI_NUM_LOCK; 280break; 281 282caseXK_Caps_Lock: 283evt->flags=DIEF_KEYID; 284evt->key_id=DIKI_CAPS_LOCK; 285break; 286 287caseXK_Scroll_Lock: 288evt->flags=DIEF_KEYID; 289evt->key_id=DIKI_SCROLL_LOCK; 290break; 291 292caseXK_Shift_R: 293evt->flags=DIEF_KEYID; 294evt->key_id=DIKI_SHIFT_R; 295break; 296 297caseXK_Shift_L: 298evt->flags=DIEF_KEYID; 299evt->key_id=DIKI_SHIFT_L; 300break; 301 302caseXK_Control_R: 303evt->flags=DIEF_KEYID; 304evt->key_id=DIKI_CONTROL_R; 305break; 306 307caseXK_Control_L: 308evt->flags=DIEF_KEYID; 309evt->key_id=DIKI_CONTROL_L; 310break; 311 312caseXK_Alt_R: 313evt->flags=DIEF_KEYID; 314evt->key_id=DIKI_ALT_R; 315break; 316 317caseXK_Alt_L: 318evt->flags=DIEF_KEYID; 319evt->key_id=DIKI_ALT_L; 320break; 321 322caseXK_Meta_R: 323evt->flags=DIEF_KEYID; 324evt->key_id=DIKI_META_R; 325break; 326 327caseXK_Meta_L: 328evt->flags=DIEF_KEYID; 329evt->key_id=DIKI_META_L; 330break; 331 332caseXK_Super_L: 333evt->flags=DIEF_KEYID; 334evt->key_id=DIKI_SUPER_L; 335break; 336 337caseXK_Super_R: 338evt->flags=DIEF_KEYID; 339evt->key_id=DIKI_SUPER_R; 340break; 341 342caseXK_Hyper_L: 343evt->flags=DIEF_KEYID; 344evt->key_id=DIKI_HYPER_L; 345break; 346 347caseXK_Hyper_R: 348evt->flags=DIEF_KEYID; 349evt->key_id=DIKI_HYPER_R; 350break; 351 352/*case? ? : 353evt->flags=DIEF_KEYID; 354evt->key_id=DIKI_ALTGR; 355break;*/ 356 357caseXK_BackSpace: 358evt->flags=DIEF_KEYID; 359evt->key_id=DIKI_BACKSPACE; 360break; 361 362caseXK_Tab: 363evt->flags=DIEF_KEYID; 364evt->key_id=DIKI_HYPER_L; 365break; 366 367caseXK_Return: 368evt->flags=DIEF_KEYID; 369evt->key_id=DIKI_ENTER; 370break; 371 372caseXK_Escape: 373evt->flags=DIEF_KEYID; 374evt->key_id=DIKI_ESCAPE; 375break; 376 377caseXK_Pause: 378evt->flags=DIEF_KEYID; 379evt->key_id=DIKI_PAUSE; 380break; 381 382/*Miscellaneousfunctionkeys*/ 383caseXK_Help: 384evt->flags=DIEF_KEYSYMBOL; 385evt->key_symbol=DIKS_HEL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 手机 探索者 开发 实录 Broncho 支持 VNC
![提示](https://static.bdocx.com/images/bang_tan.gif)