📄 xwin.c.svn-base
字号:
#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/shm.h>#include <string.h>#include <X11/Xlib.h>#include <X11/keysym.h>#include <X11/cursorfont.h>#include <X11/Xutil.h>#include <X11/extensions/XShm.h>#include <assert.h>#include "base_types.h"#include "swf_file_pub.h"#include "player_pub.h"#include "xwin_pub.h"//extern GraphicDevice gd;//extern void RenderPrepare(GraphicDevice *gd,FlashDisplay *fd);long FlashGraphicInitX11(xwin_t *xwin_p) { XPixmapFormatValues *pf; long bpl; // Bytes per line long bpp; // Bytes per pixel long pad; // Scanline pad in byte int n; bpp = 0; pad = 0; // Get screen info for(pf=XListPixmapFormats(xwin_p->dpy, &n); n--; pf++) { if (pf->depth == DefaultDepth(xwin_p->dpy, DefaultScreen(xwin_p->dpy))) { bpp = pf->bits_per_pixel/8; pad = pf->scanline_pad/8; } } xwin_p->win_ox = 0; xwin_p->win_oy = 0; if (bpp) { bpl = (xwin_p->win_width*bpp + pad-1)/pad*pad; } else { bpl = (xwin_p->win_width/8 + pad-1)/pad*pad; } XSelectInput(xwin_p->dpy, xwin_p->movie, ExposureMask|ButtonReleaseMask|ButtonPressMask|PointerMotionMask); // Prepare data for Direct Graphics xwin_p->segInfo.readOnly = False; //xwin_p->segInfo.shmid = shmget(IPC_PRIVATE,xwin_p->win_height*bpl,IPC_CREAT|0777); xwin_p->segInfo.shmid = shmget(IPC_PRIVATE,4000*bpl,IPC_CREAT|0777); assert(xwin_p->segInfo.shmid >=0); xwin_p->segInfo.shmaddr = (unsigned char*)shmat(xwin_p->segInfo.shmid, 0, 0); assert((long)xwin_p->segInfo.shmaddr != -1); XShmAttach(xwin_p->dpy, &xwin_p->segInfo); XSync(xwin_p->dpy, False); xwin_p->fd.pixels = (unsigned char*)malloc(4000*bpl); xwin_p->fd.pixels1 = (unsigned char*)xwin_p->segInfo.shmaddr; xwin_p->fd.width = xwin_p->win_width; xwin_p->fd.height = xwin_p->win_height; xwin_p->fd.bpl = bpl; printf("width=%d height is %d bpl is %d\n",xwin_p->fd.width,xwin_p->fd.height,xwin_p->fd.bpl); xwin_p->fd.depth = DefaultDepth(xwin_p->dpy, DefaultScreen(xwin_p->dpy)); xwin_p->fd.bpp = bpp; xwin_p->canvas = XShmCreatePixmap(xwin_p->dpy ,xwin_p->movie ,xwin_p->segInfo.shmaddr ,&xwin_p->segInfo ,xwin_p->fd.width ,xwin_p->fd.height ,DefaultDepth(xwin_p->dpy, DefaultScreen(xwin_p->dpy))); xwin_p->gc = DefaultGC(xwin_p->dpy, DefaultScreen(xwin_p->dpy)); XSync(xwin_p->dpy, False); // buttonCursor = XCreateFontCursor(dpy, XC_hand2); XFlush(xwin_p->dpy); return 0;}void xwin_draw_frame(xwin_t *xwin_p,int all) { XLockDisplay(xwin_p->dpy); XSetFunction(xwin_p->dpy,xwin_p->gc,GXcopy); //all=1; unsigned char *test; unsigned short *p1; unsigned long *p; int x,y; if (all) { for(y=0;y<=xwin_p->fd.height;y++) { p1=(unsigned short *)((unsigned char*)(xwin_p->fd.pixels1)+(xwin_p->fd.bpl)*y); p= (unsigned long *)((unsigned char*)(xwin_p->fd.pixels)+xwin_p->fd.bpl*y*2); for(x=0;x<=xwin_p->fd.width;x++) { *(p1+x)=(((*(p+x))>>8)&0x0000F800)|(((*(p+x))>>5)&0x000007E0)|(((*(p+x))>>3)&0x0000001F); } } XCopyArea(xwin_p->dpy,xwin_p->canvas,xwin_p->movie,xwin_p->gc, 0,0, xwin_p->fd.width,xwin_p->fd.height, xwin_p->win_ox, xwin_p->win_oy ); } else { for(y=xwin_p->fd.clip_y;y<=(xwin_p->fd.clip_y+xwin_p->fd.clip_height);y++) { p1=(unsigned short *)((unsigned char*)(xwin_p->fd.pixels1)+(xwin_p->fd.bpl)*y)+xwin_p->fd.clip_x; p= (unsigned long *)((unsigned char*)(xwin_p->fd.pixels)+xwin_p->fd.bpl*y*2)+xwin_p->fd.clip_x; for(x=0;x<=xwin_p->fd.width;x++) { *(p1+x)=(((*(p+x))>>8)&0x0000F800)|(((*(p+x))>>5)&0x000007E0)|(((*(p+x))>>3)&0x0000001F); } } XCopyArea(xwin_p->dpy,xwin_p->canvas,xwin_p->movie,xwin_p->gc, xwin_p->fd.clip_x,xwin_p->fd.clip_y, xwin_p->fd.clip_width,xwin_p->fd.clip_height, xwin_p->fd.clip_x + xwin_p->win_ox, xwin_p->fd.clip_y + xwin_p->win_oy ); } XFlush(xwin_p->dpy); XUnlockDisplay(xwin_p->dpy);}xwin_t* xwin_new(player_t *player_p) { xwin_t *xwin_p; swf_file_t *swf_p = (swf_file_t*)(player_p->_level0_p); XTextProperty windowProp; XInitThreads; xwin_p = g_new0(xwin_t,1); xwin_p->player_p = player_p; xwin_p->twips_per_pixel = 20; xwin_p->win_width = (swf_p->frame_size.Xmax - swf_p->frame_size.Xmin) / xwin_p->twips_per_pixel; xwin_p->win_height = (swf_p->frame_size.Ymax - swf_p->frame_size.Ymin) / xwin_p->twips_per_pixel; xwin_p->win_visable = 1;#ifdef WITH_RC xwin_p->win_visable = 0; xwin_p->win_destory = FALSE;#endif pthread_mutex_init(&xwin_p->win_mutex,NULL); xwin_p->dpy = XOpenDisplay(getenv("DISPLAY")); if (xwin_p->dpy == 0) { fprintf(stderr,"Can't open X display\n"); exit(1); } xwin_p->movie = XCreateSimpleWindow( xwin_p->dpy , RootWindow(xwin_p->dpy, DefaultScreen(xwin_p->dpy)) , 0, 0 , xwin_p->win_width , xwin_p->win_height , 0 , WhitePixel(xwin_p->dpy, DefaultScreen(xwin_p->dpy)) , BlackPixel(xwin_p->dpy, DefaultScreen(xwin_p->dpy)) ); XMapWindow(xwin_p->dpy, xwin_p->movie);#ifdef WITH_RC XMoveResizeWindow(xwin_p->dpy, xwin_p->movie, 3000, 3000, 1, 1);#endif FlashGraphicInitX11(xwin_p); //XXX 屏蔽掉的 Exposure 消息是做什么用的? XSetGraphicsExposures(xwin_p->dpy,xwin_p->gc,FALSE); assert( XStringListToTextProperty( &player_p->play_filename_p, 1, &windowProp ) > 0 ); XSetWMName(xwin_p->dpy, xwin_p->movie, &windowProp); XFree( windowProp.value ); // RenderPrepare(&gd,&(xwin->fd)); // setBackgroundColor(&gd,swf_p->BackgroundColor); // clearCanvas16(&gd); // setMovieDimension(&gd,swf_p->frame_size->Xmax - swf_p->frame_size->Xmin,swf_p->frame_size->Ymax - swf_p->frame_size->Ymin); // XMoveResizeWindow(xwin_p->dpy, xwin_p->movie, 3000, 3000, 1, 1); return xwin_p;};void xwin_destory(xwin_t *xwin_p) { // XShmDetach (dpy, segInfo); // XDestroyImage (image); // shmdt (xwin_p->segInfo.shmaddr); // shmctl (xwin_p->segInfo.shmid, IPC_RMID, 0); XLockDisplay(xwin_p->dpy); XShmDetach(xwin_p->dpy, &xwin_p->segInfo); // XFreePixmap(xwin_p->dpy, xwin_p->canvas); // XSync(xwin_p->dpy,True); assert(shmdt(xwin_p->segInfo.shmaddr)==0); assert(shmctl(xwin_p->segInfo.shmid, IPC_RMID, 0)==0); XUnmapWindow(xwin_p->dpy,xwin_p->movie); XDestroyWindow(xwin_p->dpy,xwin_p->movie); // printf("p1\n"); // XSync(xwin_p->dpy,False); // printf("p2\n"); XUnlockDisplay(xwin_p->dpy); XCloseDisplay(xwin_p->dpy); printf("p3\n");};/*int render_frame(void) { if(clipRect.Xmin==LONG_MAX&&clipRect.Ymin == LONG_MAX&&clipRect.Xmax == LONG_MIN&&clipRect.Ymax == LONG_MIN) return 0; updateClippingRegion(&gd,&clipRect); clearCanvas16(&gd); DoRender(_root.ChildrenP); FlashCopyX11(1);} */void xwin_move_position(xwin_t *xwin_p) {#ifdef WITH_RC if (xwin_p->win_dirty == 0) return; assert(pthread_mutex_lock(&xwin_p->win_mutex) == 0); XLockDisplay(xwin_p->dpy); if (xwin_p->win_visable == 0) { XMoveResizeWindow(xwin_p->dpy, xwin_p->movie, 3000, 3000, 1, 1); //XXX urlg hack 仅移动窗口还不能将图片隐藏,必须再画一次 // clearCanvas16(&gd); // FlashCopyX11(1); } else { XMoveResizeWindow(xwin_p->dpy, xwin_p->movie, xwin_p->win_x, xwin_p->win_y, xwin_p->win_width, xwin_p->win_height); } XFlush(xwin_p->dpy); XUnlockDisplay(xwin_p->dpy); xwin_p->win_dirty = 0; assert(pthread_mutex_unlock(&xwin_p->win_mutex) == 0);#endif return;};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -