4 * build: gcc -o dfb-photoshow -O3 -Wall -I/usr/X11/include \
5 * -I/usr/include/directfb dfb-photoshow.c
6 * usage: ./showdir <seconds> <directory>
9 * hackbard@hackdaworld.dyndns.org
11 * cvs -d:pserver:anonymous@hackdaworld.dyndns.org:/my-code co dfb-photoshow
20 IDirectFB *dfb = NULL;
21 IDirectFBSurface *primary = NULL;
23 int screen_height = 0;
25 #define DFBCHECK(x...) \
29 fprintf(stderr,"file: %s , line: %d !\n\t",__FILE__,__LINE__); \
30 DirectFBErrorFatal( #x, err ); \
34 IDirectFBInputDevice *keyboard=NULL;
35 IDirectFBSurface *logo=NULL;
36 IDirectFBFont *font=NULL;
37 IDirectFBEventBuffer *k_buf=NULL;
39 char *title_txt="directfb photoshow";
40 char *exp_txt="an image presenter ...";
41 char *hp_txt="http://hackdaworld.dyndns.org";
42 char *msg1_txt="(press key to continue ...)";
44 void clear_primary(void) {
45 DFBCHECK(primary->SetColor(primary,0x00,0x00,0x00,0x00));
46 DFBCHECK(primary->FillRectangle(primary,0,0,screen_width,screen_height));
49 int main(int argc,char **argv) {
51 DFBInputEvent k_event;
52 DFBSurfaceDescription dsc;
53 DFBFontDescription font_dsc;
54 IDirectFBImageProvider *img_prov;
56 DFBCHECK(DirectFBInit (&argc, &argv));
58 DFBCHECK(DirectFBCreate(&dfb));
59 DFBCHECK(dfb->SetCooperativeLevel(dfb,DFSCL_FULLSCREEN));
61 dsc.flags=DSDESC_CAPS;
62 dsc.caps=DSCAPS_PRIMARY|DSCAPS_FLIPPING;
63 DFBCHECK(dfb->CreateSurface(dfb,&dsc,&primary));
65 DFBCHECK(primary->GetSize(primary,&screen_width,&screen_height));
66 fprintf(stdout,"dimensions: %dx%d\n",screen_width,screen_height);
68 DFBCHECK(dfb->GetInputDevice(dfb,DIDID_KEYBOARD,&keyboard));
69 DFBCHECK(keyboard->CreateEventBuffer(keyboard,&k_buf));
72 font_dsc.flags=DFDESC_HEIGHT;
73 font_dsc.height=screen_height/20;
74 DFBCHECK(dfb->CreateFont(dfb,"/usr/share/DFBSee/decker.ttf",&font_dsc,&font));
75 DFBCHECK(primary->SetFont(primary,font));
76 DFBCHECK(font->GetStringWidth(font,title_txt,-1,&str_width));
78 DFBCHECK(primary->SetColor(primary,0x80,0x80,0xff,0xff));
79 DFBCHECK(primary->DrawString(primary,title_txt,-1,(screen_width-str_width)/2,screen_height/4,DSTF_LEFT));
80 /* explanation,homepage,msg */
81 font_dsc.height=screen_height/40;
82 DFBCHECK(dfb->CreateFont(dfb,"/usr/share/DFBSee/decker.ttf",&font_dsc,&font));
83 DFBCHECK(primary->SetFont(primary,font));
84 DFBCHECK(font->GetStringWidth(font,exp_txt,-1,&str_width));
85 DFBCHECK(primary->DrawString(primary,exp_txt,-1,(screen_width-str_width)/2,screen_height/2,DSTF_LEFT));
86 DFBCHECK(font->GetStringWidth(font,hp_txt,-1,&str_width));
87 DFBCHECK(primary->DrawString(primary,hp_txt,-1,(screen_width-str_width)/2,(screen_height/2)+font_dsc.height,DSTF_LEFT));
88 DFBCHECK(font->GetStringWidth(font,msg1_txt,-1,&str_width));
89 DFBCHECK(primary->DrawString(primary,msg1_txt,-1,(screen_width-str_width)/2,(screen_height/2)+3*font_dsc.height,DSTF_LEFT));
90 DFBCHECK(primary->Flip(primary,NULL,DSFLIP_WAITFORSYNC));
91 DFBCHECK(k_buf->WaitForEvent(k_buf));
93 /* display pictures */
94 DFBCHECK(k_buf->Reset(k_buf));
98 if(k_event.type==DIET_KEYPRESS) {
100 puts("debug: key pressed!");
101 a=(int)k_event.key_id;
102 printf("debug: key id -> %d\n",a);
103 printf("\tp=%d,' '=%d\n",(int)DIKI_ESCAPE,(int)DIKI_SPACE);
104 if(a==(int)DIKI_ESCAPE) {
108 if(a==(int)DIKI_SPACE) {
109 char *pause_txt="paused (press button to continue)";
110 DFBCHECK(font->GetStringWidth(font,pause_txt,-1,&str_width));
111 DFBCHECK(primary->DrawString(primary,pause_txt,-1,(screen_width-str_width)/2,screen_height/2,DSTF_LEFT));
112 DFBCHECK(primary->Flip(primary,NULL,DSFLIP_WAITFORSYNC));
113 DFBCHECK(k_buf->Reset(k_buf));
114 DFBCHECK(k_buf->WaitForEvent(k_buf));
116 DFBCHECK(k_buf->Reset(k_buf)); /* destroy space press */
117 DFBCHECK(k_buf->Reset(k_buf)); /* destroy space release */
119 DFBCHECK(dfb->CreateImageProvider(dfb,argv[i],&img_prov));
120 DFBCHECK(img_prov->GetSurfaceDescription(img_prov,&dsc));
121 DFBCHECK(dfb->CreateSurface(dfb,&dsc,&logo ));
122 DFBCHECK(img_prov->RenderTo(img_prov,logo,NULL));
123 img_prov->Release(img_prov);
124 DFBCHECK (primary->SetColor(primary,0x00,0x00,0x00,0x00));
125 DFBCHECK(primary->FillRectangle(primary,0,0,screen_width,screen_height));
126 DFBCHECK(primary->SetColor(primary,0x80,0x80,0xff,0xff));
127 DFBCHECK(primary->DrawLine(primary,0,0,screen_width-1,screen_height-1));
128 if((screen_width>=dsc.width)&&(screen_height>=dsc.height)) {
129 DFBCHECK(primary->Blit(primary,logo,NULL,(screen_width-dsc.width)/2,(screen_height-dsc.height)/2));
132 DFBCHECK(primary->StretchBlit(primary,logo,NULL,NULL));
134 DFBCHECK(primary->Flip(primary,NULL,DSFLIP_WAITFORSYNC));
135 // sleep(atoi(argv[1]));
136 k_buf->WaitForEventWithTimeout(k_buf,atoi(argv[1]),0);
140 } while(k_buf->GetEvent(k_buf,DFB_EVENT(&k_event))==DFB_OK);
144 k_buf->Release(k_buf);
145 keyboard->Release(keyboard);
147 primary->Release(primary);