2 * Copyright (C) 2004-2006 Andre Noll <maan@systemlinux.org>
4 * Licensed under the GPL v2. For licencing details see COPYING.
7 /** \file slider.c libzmw-based stream creator for paraslash */
15 #define SLIDER_RATIO 6
16 #define VAL_2_SL_VAL(v) (v) * (SLIDER_RATIO - 1.0) / SLIDER_RATIO
17 #define SL_VAL_2_VAL(v) (v) * SLIDER_RATIO / (SLIDER_RATIO - 1.0)
18 #define VAL_2_SCORE(v) (v) > 0.5? 1 / (1.03 - (v)) / (1.03 - (v)) :\
19 - 1 / ((v) + 0.03) / ((v) + 0.03)
21 #define RGB(R,G,B) (((R)<<12) + ((G)<<6) + (B))
24 #define LASTPLAYED_FORMULA(v) \
25 1 / (pow((v), 10) + EPSILON * EPSILON) - 1 / (1 + EPSILON) + EPSILON
27 #define NUMPLAYED_FORMULA(v)\
28 10 * (v) + (v) / (1 - (v) * (1 - EPSILON))
32 char *streamname
= NULL
;
33 static Zmw_Float_0_1
*slider_vals
, lastplayed_val
, numplayed_val
;
35 void para_log(int ll
, const char* fmt
,...) /* no logging */
42 for (i
= 1; argv
[i
]; i
++)
43 slider_vals
[i
] = VAL_2_SL_VAL(.5);
46 streamname
= para_strdup("slider");
50 static char *get_value_filename(void)
52 char *ret
, *home
=para_homedir();
53 ret
= make_message("%s/.paraslash/slide.values", home
);
58 static void load(void)
66 tmp
= get_value_filename();
71 while (fscanf(f
, "%900s %g", att
, &val
) == 2) {
72 if (!strcmp(att
, "lastplayed")) {
76 if (!strcmp(att
, "numplayed")) {
80 for (i
= 1; argv
[i
]; i
++)
81 if (!strcmp(argv
[i
], att
)) {
90 static void save(void)
96 filename
= get_value_filename();
97 f
= fopen(filename
, "w");
101 fprintf(f
, "lastplayed %g\n", lastplayed_val
);
102 fprintf(f
, "numplayed %g\n", numplayed_val
);
103 for (i
= 1; argv
[i
]; i
++)
104 fprintf(f
, "%s %g\n", argv
[i
], slider_vals
[i
]);
109 static void print_score(FILE *fd
)
113 for (i
= 1; argv
[i
]; i
++) {
114 if (SL_VAL_2_VAL(slider_vals
[i
]) > .99)
115 fprintf(fd
, "deny: IS_N_SET(%s)\n", argv
[i
]);
116 if (slider_vals
[i
] < .01)
117 fprintf(fd
, "deny: IS_SET(%s)\n", argv
[i
]);
119 fprintf(fd
, "score: 0 ");
120 for (i
= 1; argv
[i
]; i
++) {
121 if (slider_vals
[i
] < .01)
123 fprintf(fd
, "+ %i * IS_SET(%s) ",
124 (int) (VAL_2_SCORE(SL_VAL_2_VAL(slider_vals
[i
]))),
128 fprintf(fd
, " + round((LASTPLAYED()/1440 - 1000 / (LASTPLAYED()/1440 + 1)) / %f"
129 " - %f * NUMPLAYED(), 2)\n",
130 LASTPLAYED_FORMULA(SL_VAL_2_VAL(lastplayed_val
)),
131 NUMPLAYED_FORMULA(SL_VAL_2_VAL(numplayed_val
)));
134 static void stradd(void)
137 char *cmd
= make_message("para_client stradd %s", streamname
);
139 pipe
= popen(cmd
, "w");
147 static void b_save(void)
156 system("para_client cs slider");
157 system("para_client stop");
158 system("para_client play");
164 system("para_client cs slider");
165 system("para_client play");
167 zmw_main_quit(EXIT_SUCCESS
);
170 static void make_buttons(void)
172 /* Add a frame around the box */
173 ZMW(zmw_decorator(Zmw_Decorator_Border_Embossed
)) {
191 zmw_main_quit(EXIT_FAILURE
);
195 static void make_stream_input_field(void)
197 static char *text1
= NULL
;
198 static int cursor_pos
= 1; // Must be static
199 static int text1_length
;
202 if ( text1
== NULL
) {
203 // The initial value must be malloced
204 text1
= strdup("slider") ;
205 text1_length
= strlen(text1
) ;
210 zmw_label("stream: ");
211 zmw_color(Zmw_Color_Foreground
, RGB(63, 63, 63));
215 zmw_entry_with_cursor(&streamname
, &cursor_pos
);
217 text1_length
= strlen(text1
);
222 /* the sliders, one for each member in argv */
223 static void make_sliders(void)
228 zmw_height(ZMW_VALUE_UNDEFINED
);
229 // zmw_horizontal_expand(Zmw_True);
232 zmw_color(Zmw_Color_Foreground
, RGB(0, 63, 63)); /* font */
233 txt
= make_message("lp: (%i%%)",
234 (int)(.5 + 100 * SL_VAL_2_VAL(lastplayed_val
)));
237 txt
= make_message("np: (%i%%)",
238 (int)(.5 + 100 * SL_VAL_2_VAL(numplayed_val
)));
241 zmw_color(Zmw_Color_Foreground
, RGB(63, 63, 0)); /* font */
242 for (i
= 1; argv
[i
]; i
++) {
243 txt
= make_message("%s: (%i%%)", argv
[i
],
244 (int)(.5 + 100 * SL_VAL_2_VAL(slider_vals
[i
])));
251 zmw_hscrollbar(&lastplayed_val
, 1.0 / SLIDER_RATIO
);
252 zmw_hscrollbar(&numplayed_val
, 1.0 / SLIDER_RATIO
);
253 for (i
= 1; argv
[i
]; i
++) {
254 zmw_hscrollbar(&slider_vals
[i
],
261 static void anchor(void)
264 zmw_font_family("terminal");
266 zmw_rgb(0.1, 0.1, 0.1);
267 zmw_color(Zmw_Color_Foreground
, RGB(63, 63, 0)); /* font */
268 zmw_color(Zmw_Color_Background_Pushed
, RGB(0, 10, 4)); /* slider bg */
269 zmw_color(Zmw_Color_Background_Poped
, RGB(0, 42, 42)); /* button bg */
270 zmw_color(Zmw_Color_Border_Light
, RGB(0, 7, 63)); /* slider/button border */
272 ZMW(zmw_window("para_slider")) {
275 make_stream_input_field();
276 zmw_color(Zmw_Color_Foreground
, RGB(0, 63, 63)); /* font */
277 // make_special_sliders();
278 zmw_color(Zmw_Color_Foreground
, RGB(63, 63, 0)); /* font */
284 static void get_atts(void)
287 FILE *p
= popen("para_client laa", "r");
288 argv
= para_malloc(255 * sizeof(char *)); /* FIXME */
290 argv
[0] = para_strdup("all_attributes");
294 while (fgets(buf
, 255, p
)) {
296 argv
[argc
] = para_strdup(buf
);
303 return; /* success */
306 for (argc
= 1; argv
[argc
]; argc
++)
312 int main(int the_argc
, char *the_argv
[])
321 slider_vals
= para_malloc((argc
+ 1) * sizeof(int*));
324 // printf("argc: %d\n", argc);
325 // for (i = 1; argv[i]; i++)
326 // printf("argv[%d]: %s\n", i, argv[i]);
327 zmw_init(&argc
, &argv
);