dbus function is done
[shermanaquarium] / sherman-aquarium / shermans / xmms_sn.c
1
2 /* Displays the currently loaded/played song by XMMS */
3
4 #include <gai/gai.h>
5 #include <xmmsctrl.h>
6 #include <string.h>
7
8 #include "aquarium.h"
9 #include "draw.h"
10 #include "xmms_sn.h"
11
12
13 static Xmms_sn_settings xmms_sn_settings;
14 static SA_Image xmms_font;
15 static AquariumData *ad;
16
17 Xmms_sn_settings *xmms_sn_get_settings_ptr(void)
18 {
19     return &xmms_sn_settings;
20 }
21
22 void xmms_sn_exit(void)
23 {
24     if(xmms_font.pixbuf!=NULL)
25         g_object_unref(xmms_font.pixbuf);
26
27     memset(&xmms_font,0,sizeof(SA_Image));
28
29 }
30 void xmms_sn_init(void)
31 {
32     ad = aquarium_get_settings_ptr();
33
34
35     if(xmms_font.pixbuf!=NULL) 
36         xmms_sn_exit();
37
38     load_image("small_letters.png",&xmms_font,1);
39
40     /* Some changes cause this image is horizontal ordered */
41
42     xmms_font.frames = XMMS_SN_NUM_LETTERS;
43     xmms_font.width = xmms_font.width/xmms_font.frames;
44
45     change_colour_to(xmms_sn_settings.c.r,
46                      xmms_sn_settings.c.g,
47                      xmms_sn_settings.c.b,
48                      xmms_font.image,
49                      xmms_font.pixbuf, FALSE);
50
51 }
52
53 void xmms_sn_update(int beforeorafter)
54 {
55     int i,x=0,y=0,a;
56     static float start_display = 0.0;
57
58     int session_id = 0;
59     char *xmms_str, *disp_str;
60
61     if(beforeorafter!=xmms_sn_settings.draw)
62         return;
63
64     if(!xmms_sn_settings.on)
65         return;
66
67     if(!xmms_remote_is_running(session_id)) 
68         return;
69
70     xmms_str = xmms_remote_get_playlist_title(session_id, 
71                                              xmms_remote_get_playlist_pos(session_id));
72     if(xmms_str==NULL) 
73         return;
74
75     disp_str = g_strdup_printf(" %d. %s (%d:%.2d) *** ",
76                                xmms_remote_get_playlist_pos(session_id)+1,
77                                xmms_str,
78                                xmms_remote_get_playlist_time(session_id, 
79                                                              xmms_remote_get_playlist_pos(session_id))/(60*1000),
80                                xmms_remote_get_playlist_time(session_id, 
81                                                              xmms_remote_get_playlist_pos(session_id))/1000 %60);
82     g_free(xmms_str);
83
84
85
86     if(xmms_sn_settings.direction == XMMS_SN_HORIZONTAL) {
87
88         if(xmms_sn_settings.fb == XMMS_SN_BACKWARDS){
89             if(((int)start_display) > (strlen(disp_str)-2)*xmms_font.width) start_display = 0.0;
90         }
91         else{
92             if(start_display <0.0) start_display = (strlen(disp_str)-1)*xmms_font.width;
93         }
94
95         switch(xmms_sn_settings.vert){
96         case TOP:
97             y=2;
98             break;
99         case CENTER:
100             y=ad->ymax/2-xmms_font.height/2;
101             break;
102         case BOTTOM:
103             y=ad->ymax-xmms_font.height-2;
104             break;
105         }
106         x = -(((int)start_display) % xmms_font.width);
107
108         for(i=0;i<=(ad->xmax/xmms_font.width);i++){
109             if((strlen(disp_str)-1)==i) break;
110             a=((int)start_display)/xmms_font.width+i;
111             if(a>=strlen(disp_str)) a-=strlen(disp_str);
112             if(a<0) a=strlen(disp_str)-1;
113             if(disp_str[a]!=' ' && disp_str[a]<='z')
114                 draw_image_alpha_h(x,y,((int)disp_str[a]-(int)'!'),xmms_sn_settings.c.alpha,&xmms_font);
115             x+=xmms_font.width; 
116         }
117     }
118     else {
119
120         if(xmms_sn_settings.fb == XMMS_SN_BACKWARDS){
121             if(((int)start_display) > (strlen(disp_str)-2)*xmms_font.height) start_display = 0.0;
122         }
123         else{
124             if(start_display <0.0) start_display = (strlen(disp_str)-1)*xmms_font.height;
125         }
126
127         switch(xmms_sn_settings.horz){
128         case LEFT:
129             x=2;
130             break;
131         case CENTER:
132             x=ad->xmax/2-xmms_font.width/2;
133             break;
134         case RIGHT:
135             x=ad->ymax-xmms_font.width-2;
136             break;
137         }
138
139         y = -(((int)start_display) % xmms_font.height);
140
141         for(i=0;i<=(ad->ymax/xmms_font.height);i++){
142             if((strlen(disp_str)-1)==i) break;
143             a=((int)start_display)/xmms_font.height+i;
144             if(a>=strlen(disp_str)) a-=strlen(disp_str);
145             if(a<0) a=strlen(disp_str)-1;
146
147             if(disp_str[a]!=' ' && disp_str[a]<='z')
148                 draw_image_alpha_h(x,y,((int)disp_str[a]-(int)'!'),xmms_sn_settings.c.alpha,&xmms_font);
149             y+=xmms_font.height;        
150         }
151     }
152
153     if(xmms_sn_settings.fb == XMMS_SN_BACKWARDS)
154         start_display+=0.5*(float)xmms_sn_settings.speed/100.0;
155     else
156         start_display-=0.5*(float)xmms_sn_settings.speed/100.0;
157
158     g_free(disp_str);
159
160 }