Initial push
[shermanaquarium] / sherman-aquarium / shermans / xmms_sn.c
diff --git a/sherman-aquarium/shermans/xmms_sn.c b/sherman-aquarium/shermans/xmms_sn.c
new file mode 100644 (file)
index 0000000..d0b21ec
--- /dev/null
@@ -0,0 +1,160 @@
+
+/* Displays the currently loaded/played song by XMMS */
+
+#include <gai/gai.h>
+#include <xmmsctrl.h>
+#include <string.h>
+
+#include "aquarium.h"
+#include "draw.h"
+#include "xmms_sn.h"
+
+
+static Xmms_sn_settings xmms_sn_settings;
+static SA_Image xmms_font;
+static AquariumData *ad;
+
+Xmms_sn_settings *xmms_sn_get_settings_ptr(void)
+{
+    return &xmms_sn_settings;
+}
+
+void xmms_sn_exit(void)
+{
+    if(xmms_font.pixbuf!=NULL)
+       g_object_unref(xmms_font.pixbuf);
+
+    memset(&xmms_font,0,sizeof(SA_Image));
+
+}
+void xmms_sn_init(void)
+{
+    ad = aquarium_get_settings_ptr();
+
+
+    if(xmms_font.pixbuf!=NULL) 
+       xmms_sn_exit();
+
+    load_image("small_letters.png",&xmms_font,1);
+
+    /* Some changes cause this image is horizontal ordered */
+
+    xmms_font.frames = XMMS_SN_NUM_LETTERS;
+    xmms_font.width = xmms_font.width/xmms_font.frames;
+
+    change_colour_to(xmms_sn_settings.c.r,
+                    xmms_sn_settings.c.g,
+                    xmms_sn_settings.c.b,
+                    xmms_font.image,
+                    xmms_font.pixbuf, FALSE);
+
+}
+
+void xmms_sn_update(int beforeorafter)
+{
+    int i,x=0,y=0,a;
+    static float start_display = 0.0;
+
+    int session_id = 0;
+    char *xmms_str, *disp_str;
+
+    if(beforeorafter!=xmms_sn_settings.draw)
+       return;
+
+    if(!xmms_sn_settings.on)
+       return;
+
+    if(!xmms_remote_is_running(session_id)) 
+       return;
+
+    xmms_str = xmms_remote_get_playlist_title(session_id, 
+                                            xmms_remote_get_playlist_pos(session_id));
+    if(xmms_str==NULL) 
+       return;
+
+    disp_str = g_strdup_printf(" %d. %s (%d:%.2d) *** ",
+                              xmms_remote_get_playlist_pos(session_id)+1,
+                              xmms_str,
+                              xmms_remote_get_playlist_time(session_id, 
+                                                            xmms_remote_get_playlist_pos(session_id))/(60*1000),
+                              xmms_remote_get_playlist_time(session_id, 
+                                                            xmms_remote_get_playlist_pos(session_id))/1000 %60);
+    g_free(xmms_str);
+
+
+
+    if(xmms_sn_settings.direction == XMMS_SN_HORIZONTAL) {
+
+       if(xmms_sn_settings.fb == XMMS_SN_BACKWARDS){
+           if(((int)start_display) > (strlen(disp_str)-2)*xmms_font.width) start_display = 0.0;
+       }
+       else{
+           if(start_display <0.0) start_display = (strlen(disp_str)-1)*xmms_font.width;
+       }
+
+       switch(xmms_sn_settings.vert){
+       case TOP:
+           y=2;
+           break;
+       case CENTER:
+           y=ad->ymax/2-xmms_font.height/2;
+           break;
+       case BOTTOM:
+           y=ad->ymax-xmms_font.height-2;
+           break;
+       }
+       x = -(((int)start_display) % xmms_font.width);
+
+       for(i=0;i<=(ad->xmax/xmms_font.width);i++){
+           if((strlen(disp_str)-1)==i) break;
+           a=((int)start_display)/xmms_font.width+i;
+           if(a>=strlen(disp_str)) a-=strlen(disp_str);
+           if(a<0) a=strlen(disp_str)-1;
+           if(disp_str[a]!=' ' && disp_str[a]<='z')
+               draw_image_alpha_h(x,y,((int)disp_str[a]-(int)'!'),xmms_sn_settings.c.alpha,&xmms_font);
+           x+=xmms_font.width; 
+       }
+    }
+    else {
+
+       if(xmms_sn_settings.fb == XMMS_SN_BACKWARDS){
+           if(((int)start_display) > (strlen(disp_str)-2)*xmms_font.height) start_display = 0.0;
+       }
+       else{
+           if(start_display <0.0) start_display = (strlen(disp_str)-1)*xmms_font.height;
+       }
+
+       switch(xmms_sn_settings.horz){
+       case LEFT:
+           x=2;
+           break;
+       case CENTER:
+           x=ad->xmax/2-xmms_font.width/2;
+           break;
+       case RIGHT:
+           x=ad->ymax-xmms_font.width-2;
+           break;
+       }
+
+       y = -(((int)start_display) % xmms_font.height);
+
+       for(i=0;i<=(ad->ymax/xmms_font.height);i++){
+           if((strlen(disp_str)-1)==i) break;
+           a=((int)start_display)/xmms_font.height+i;
+           if(a>=strlen(disp_str)) a-=strlen(disp_str);
+           if(a<0) a=strlen(disp_str)-1;
+
+           if(disp_str[a]!=' ' && disp_str[a]<='z')
+               draw_image_alpha_h(x,y,((int)disp_str[a]-(int)'!'),xmms_sn_settings.c.alpha,&xmms_font);
+           y+=xmms_font.height;        
+       }
+    }
+
+    if(xmms_sn_settings.fb == XMMS_SN_BACKWARDS)
+       start_display+=0.5*(float)xmms_sn_settings.speed/100.0;
+    else
+       start_display-=0.5*(float)xmms_sn_settings.speed/100.0;
+
+    g_free(disp_str);
+
+}