A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 813 lines 26 kB view raw
1/* Copyright (c) 1997-1999 Miller Puckette. 2 * For information on usage and redistribution, and for a DISCLAIMER OF ALL 3 * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ 4 5/* g_7_guis.c written by Thomas Musil (c) IEM KUG Graz Austria 2000-2001 */ 6/* thanks to Miller Puckette, Guenther Geiger and Krzystof Czaja */ 7 8/* name change to hradio by MSP and changed to 9put out a "float" as in sliders, toggles, etc. */ 10 11#ifdef ROCKBOX 12#include "plugin.h" 13#include "../../pdbox.h" 14#include "m_pd.h" 15#include "g_canvas.h" 16#include "g_all_guis.h" 17#else /* ROCKBOX */ 18#include <stdlib.h> 19#include <string.h> 20#include <stdio.h> 21#include <ctype.h> 22#include "m_pd.h" 23#include "g_canvas.h" 24#include "t_tk.h" 25#include "g_all_guis.h" 26#include <math.h> 27 28#ifdef MSW 29#include <io.h> 30#else 31#include <unistd.h> 32#endif 33#endif /* ROCKBOX */ 34 35/* ------------- hdl gui-horicontal dial ---------------------- */ 36 37t_widgetbehavior hradio_widgetbehavior; 38static t_class *hradio_class, *hradio_old_class; 39 40/* widget helper functions */ 41 42void hradio_draw_update(t_hradio *x, t_glist *glist) 43{ 44#ifdef ROCKBOX 45 (void) x; 46 (void) glist; 47#else /* ROCKBOX */ 48 if(glist_isvisible(glist)) 49 { 50 t_canvas *canvas=glist_getcanvas(glist); 51 52 sys_vgui(".x%x.c itemconfigure %xBUT%d -fill #%6.6x -outline #%6.6x\n", 53 canvas, x, x->x_on_old, 54 x->x_gui.x_bcol, x->x_gui.x_bcol); 55 sys_vgui(".x%x.c itemconfigure %xBUT%d -fill #%6.6x -outline #%6.6x\n", 56 canvas, x, x->x_on, 57 x->x_gui.x_fcol, x->x_gui.x_fcol); 58 } 59#endif /* ROCKBOX */ 60} 61 62void hradio_draw_new(t_hradio *x, t_glist *glist) 63{ 64#ifdef ROCKBOX 65 (void) x; 66 (void) glist; 67#else /* ROCKBOX */ 68 t_canvas *canvas=glist_getcanvas(glist); 69 int n=x->x_number, i, dx=x->x_gui.x_w, s4=dx/4; 70 int yy11=text_ypix(&x->x_gui.x_obj, glist), yy12=yy11+dx; 71 int yy21=yy11+s4, yy22=yy12-s4; 72 int xx11b=text_xpix(&x->x_gui.x_obj, glist), xx11=xx11b, xx21=xx11b+s4; 73 int xx22=xx11b+dx-s4; 74 75 for(i=0; i<n; i++) 76 { 77 sys_vgui(".x%x.c create rectangle %d %d %d %d -fill #%6.6x -tags %xBASE%d\n", 78 canvas, xx11, yy11, xx11+dx, yy12, 79 x->x_gui.x_bcol, x, i); 80 sys_vgui(".x%x.c create rectangle %d %d %d %d -fill #%6.6x -outline #%6.6x -tags %xBUT%d\n", 81 canvas, xx21, yy21, xx22, yy22, 82 (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol, 83 (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol, x, i); 84 xx11 += dx; 85 xx21 += dx; 86 xx22 += dx; 87 } 88 sys_vgui(".x%x.c create text %d %d -text {%s} -anchor w \ 89 -font {%s %d bold} -fill #%6.6x -tags %xLABEL\n", 90 canvas, xx11b+x->x_gui.x_ldx, yy11+x->x_gui.x_ldy, 91 strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"", 92 x->x_gui.x_font, x->x_gui.x_fontsize, 93 x->x_gui.x_lcol, x); 94 if(!x->x_gui.x_fsf.x_snd_able) 95 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xOUT%d\n", 96 canvas, xx11b, yy12-1, xx11b + IOWIDTH, yy12, x, 0); 97 if(!x->x_gui.x_fsf.x_rcv_able) 98 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xIN%d\n", 99 canvas, xx11b, yy11, xx11b + IOWIDTH, yy11+1, x, 0); 100#endif /* ROCKBOX */ 101} 102 103void hradio_draw_move(t_hradio *x, t_glist *glist) 104{ 105#ifdef ROCKBOX 106 (void) x; 107 (void) glist; 108#else /* ROCKBOX */ 109 t_canvas *canvas=glist_getcanvas(glist); 110 int n=x->x_number, i, dx=x->x_gui.x_w, s4=dx/4; 111 int yy11=text_ypix(&x->x_gui.x_obj, glist), yy12=yy11+dx; 112 int yy21=yy11+s4, yy22=yy12-s4; 113 int xx11b=text_xpix(&x->x_gui.x_obj, glist), xx11=xx11b, xx21=xx11b+s4; 114 int xx22=xx11b+dx-s4; 115 116 xx11 = xx11b; 117 xx21=xx11b+s4; 118 xx22=xx11b+dx-s4; 119 for(i=0; i<n; i++) 120 { 121 sys_vgui(".x%x.c coords %xBASE%d %d %d %d %d\n", 122 canvas, x, i, xx11, yy11, xx11+dx, yy12); 123 sys_vgui(".x%x.c coords %xBUT%d %d %d %d %d\n", 124 canvas, x, i, xx21, yy21, xx22, yy22); 125 xx11 += dx; 126 xx21 += dx; 127 xx22 += dx; 128 } 129 sys_vgui(".x%x.c coords %xLABEL %d %d\n", 130 canvas, x, xx11b+x->x_gui.x_ldx, yy11+x->x_gui.x_ldy); 131 if(!x->x_gui.x_fsf.x_snd_able) 132 sys_vgui(".x%x.c coords %xOUT%d %d %d %d %d\n", 133 canvas, x, 0, xx11b, yy12-1, xx11b + IOWIDTH, yy12); 134 if(!x->x_gui.x_fsf.x_rcv_able) 135 sys_vgui(".x%x.c coords %xIN%d %d %d %d %d\n", 136 canvas, x, 0, xx11b, yy11, xx11b + IOWIDTH, yy11+1); 137#endif /* ROCKBOX */ 138} 139 140void hradio_draw_erase(t_hradio* x, t_glist* glist) 141{ 142#ifdef ROCKBOX 143 (void) x; 144 (void) glist; 145#else /* ROCKBOX */ 146 t_canvas *canvas=glist_getcanvas(glist); 147 int n=x->x_number, i; 148 149 for(i=0; i<n; i++) 150 { 151 sys_vgui(".x%x.c delete %xBASE%d\n", canvas, x, i); 152 sys_vgui(".x%x.c delete %xBUT%d\n", canvas, x, i); 153 } 154 sys_vgui(".x%x.c delete %xLABEL\n", canvas, x); 155 if(!x->x_gui.x_fsf.x_snd_able) 156 sys_vgui(".x%x.c delete %xOUT%d\n", canvas, x, 0); 157 if(!x->x_gui.x_fsf.x_rcv_able) 158 sys_vgui(".x%x.c delete %xIN%d\n", canvas, x, 0); 159#endif /* ROCKBOX */ 160} 161 162void hradio_draw_config(t_hradio* x, t_glist* glist) 163{ 164#ifdef ROCKBOX 165 (void) x; 166 (void) glist; 167#else /* ROCKBOX */ 168 t_canvas *canvas=glist_getcanvas(glist); 169 int n=x->x_number, i; 170 171 sys_vgui(".x%x.c itemconfigure %xLABEL -font {%s %d bold} -fill #%6.6x -text {%s} \n", 172 canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, 173 x->x_gui.x_fsf.x_selected?IEM_GUI_COLOR_SELECTED:x->x_gui.x_lcol, 174 strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:""); 175 for(i=0; i<n; i++) 176 { 177 sys_vgui(".x%x.c itemconfigure %xBASE%d -fill #%6.6x\n", canvas, x, i, 178 x->x_gui.x_bcol); 179 sys_vgui(".x%x.c itemconfigure %xBUT%d -fill #%6.6x -outline #%6.6x\n", canvas, x, i, 180 (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol, 181 (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol); 182 } 183#endif 184} 185 186void hradio_draw_io(t_hradio* x, t_glist* glist, int old_snd_rcv_flags) 187{ 188#ifdef ROCKBOX 189 (void) x; 190 (void) glist; 191 (void) old_snd_rcv_flags; 192#else /* ROCKBOX */ 193 t_canvas *canvas=glist_getcanvas(glist); 194 int xpos=text_xpix(&x->x_gui.x_obj, glist); 195 int ypos=text_ypix(&x->x_gui.x_obj, glist); 196 197 if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able) 198 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xOUT%d\n", 199 canvas, 200 xpos, ypos + x->x_gui.x_w-1, 201 xpos + IOWIDTH, ypos + x->x_gui.x_w, 202 x, 0); 203 if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able) 204 sys_vgui(".x%x.c delete %xOUT%d\n", canvas, x, 0); 205 if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able) 206 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xIN%d\n", 207 canvas, 208 xpos, ypos, 209 xpos + IOWIDTH, ypos+1, x, 0); 210 if(!(old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && x->x_gui.x_fsf.x_rcv_able) 211 sys_vgui(".x%x.c delete %xIN%d\n", canvas, x, 0); 212#endif /* ROCKBOX */ 213} 214 215void hradio_draw_select(t_hradio* x, t_glist* glist) 216{ 217#ifdef ROCKBOX 218 (void) x; 219 (void) glist; 220#else /* ROCKBOX */ 221 t_canvas *canvas=glist_getcanvas(glist); 222 int n=x->x_number, i; 223 224 if(x->x_gui.x_fsf.x_selected) 225 { 226 for(i=0; i<n; i++) 227 { 228 sys_vgui(".x%x.c itemconfigure %xBASE%d -outline #%6.6x\n", canvas, x, i, 229 IEM_GUI_COLOR_SELECTED); 230 } 231 sys_vgui(".x%x.c itemconfigure %xLABEL -fill #%6.6x\n", canvas, x, IEM_GUI_COLOR_SELECTED); 232 } 233 else 234 { 235 for(i=0; i<n; i++) 236 { 237 sys_vgui(".x%x.c itemconfigure %xBASE%d -outline #%6.6x\n", canvas, x, i, 238 IEM_GUI_COLOR_NORMAL); 239 } 240 sys_vgui(".x%x.c itemconfigure %xLABEL -fill #%6.6x\n", canvas, x, 241 x->x_gui.x_lcol); 242 } 243#endif /* ROCKBOX */ 244} 245 246void hradio_draw(t_hradio *x, t_glist *glist, int mode) 247{ 248 if(mode == IEM_GUI_DRAW_MODE_UPDATE) 249 hradio_draw_update(x, glist); 250 else if(mode == IEM_GUI_DRAW_MODE_MOVE) 251 hradio_draw_move(x, glist); 252 else if(mode == IEM_GUI_DRAW_MODE_NEW) 253 hradio_draw_new(x, glist); 254 else if(mode == IEM_GUI_DRAW_MODE_SELECT) 255 hradio_draw_select(x, glist); 256 else if(mode == IEM_GUI_DRAW_MODE_ERASE) 257 hradio_draw_erase(x, glist); 258 else if(mode == IEM_GUI_DRAW_MODE_CONFIG) 259 hradio_draw_config(x, glist); 260 else if(mode >= IEM_GUI_DRAW_MODE_IO) 261 hradio_draw_io(x, glist, mode - IEM_GUI_DRAW_MODE_IO); 262} 263 264/* ------------------------ hdl widgetbehaviour----------------------------- */ 265 266static void hradio_getrect(t_gobj *z, t_glist *glist, int *xp1, int *yp1, int *xp2, int *yp2) 267{ 268 t_hradio *x = (t_hradio *)z; 269 270 *xp1 = text_xpix(&x->x_gui.x_obj, glist); 271 *yp1 = text_ypix(&x->x_gui.x_obj, glist); 272 *xp2 = *xp1 + x->x_gui.x_w*x->x_number; 273 *yp2 = *yp1 + x->x_gui.x_h; 274} 275 276static void hradio_save(t_gobj *z, t_binbuf *b) 277{ 278 t_hradio *x = (t_hradio *)z; 279 int bflcol[3]; 280 t_symbol *srl[3]; 281 282 iemgui_save(&x->x_gui, srl, bflcol); 283 binbuf_addv(b, "ssiisiiiisssiiiiiiii", gensym("#X"),gensym("obj"), 284 (t_int)text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist), 285 (t_int)text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist), 286 (pd_class(&x->x_gui.x_obj.ob_pd) == hradio_old_class ? 287 gensym("hdl") : gensym("hradio")), 288 x->x_gui.x_w, 289 x->x_change, iem_symargstoint(&x->x_gui.x_isa), x->x_number, 290 srl[0], srl[1], srl[2], 291 x->x_gui.x_ldx, x->x_gui.x_ldy, 292 iem_fstyletoint(&x->x_gui.x_fsf), x->x_gui.x_fontsize, 293 bflcol[0], bflcol[1], bflcol[2], x->x_on); 294 binbuf_addv(b, ";"); 295} 296 297static void hradio_properties(t_gobj *z, t_glist *owner) 298{ 299#ifdef ROCKBOX 300 (void) z; 301 (void) owner; 302#else /* ROCKBOX */ 303 t_hradio *x = (t_hradio *)z; 304 char buf[800]; 305 t_symbol *srl[3]; 306 int hchange=-1; 307 308 iemgui_properties(&x->x_gui, srl); 309 if (pd_class(&x->x_gui.x_obj.ob_pd) == hradio_old_class) 310 hchange = x->x_change; 311 sprintf(buf, "pdtk_iemgui_dialog %%s hradio \ 312 ----------dimensions(pix):----------- %d %d size: 0 0 empty \ 313 empty 0.0 empty 0.0 empty %d \ 314 %d new-only new&old %d %d number: %d \ 315 %s %s \ 316 %s %d %d \ 317 %d %d \ 318 %d %d %d\n", 319 x->x_gui.x_w, IEM_GUI_MINSIZE, 320 0,/*no_schedule*/ 321 hchange, x->x_gui.x_isa.x_loadinit, -1, x->x_number, 322 srl[0]->s_name, srl[1]->s_name, 323 srl[2]->s_name, x->x_gui.x_ldx, x->x_gui.x_ldy, 324 x->x_gui.x_fsf.x_font_style, x->x_gui.x_fontsize, 325 0xffffff & x->x_gui.x_bcol, 0xffffff & x->x_gui.x_fcol, 0xffffff & x->x_gui.x_lcol); 326 gfxstub_new(&x->x_gui.x_obj.ob_pd, x, buf); 327#endif /* ROCKBOX */ 328} 329 330static void hradio_dialog(t_hradio *x, t_symbol *s, int argc, t_atom *argv) 331{ 332 t_symbol *srl[3]; 333 int a = (int)atom_getintarg(0, argc, argv); 334 int chg = (int)atom_getintarg(4, argc, argv); 335 int num = (int)atom_getintarg(6, argc, argv); 336 int sr_flags; 337 338#ifdef ROCKBOX 339 (void) s; 340#endif 341 342 if(chg != 0) chg = 1; 343 x->x_change = chg; 344 sr_flags = iemgui_dialog(&x->x_gui, srl, argc, argv); 345 x->x_gui.x_w = iemgui_clip_size(a); 346 x->x_gui.x_h = x->x_gui.x_w; 347 if(x->x_number != num) 348 { 349 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE); 350 x->x_number = num; 351 if(x->x_on >= x->x_number) 352 { 353 x->x_on = x->x_number - 1; 354 x->x_on_old = x->x_on; 355 } 356 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_NEW); 357 } 358 else 359 { 360 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG); 361 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_IO + sr_flags); 362 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE); 363 canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x); 364 } 365 366} 367 368static void hradio_set(t_hradio *x, t_floatarg f) 369{ 370 int i=(int)f; 371 int old=x->x_on_old; 372 373 if(i < 0) 374 i = 0; 375 if(i >= x->x_number) 376 i = x->x_number-1; 377 if(x->x_on != x->x_on_old) 378 { 379 old = x->x_on_old; 380 x->x_on_old = x->x_on; 381 x->x_on = i; 382 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); 383 x->x_on_old = old; 384 } 385 else 386 { 387 x->x_on = i; 388 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); 389 } 390} 391 392static void hradio_bang(t_hradio *x) 393{ 394 /* compatibility with earlier "hdial" behavior */ 395 if (pd_class(&x->x_gui.x_obj.ob_pd) == hradio_old_class) 396 { 397 if((x->x_change)&&(x->x_on != x->x_on_old)) 398 { 399 SETFLOAT(x->x_at, (float)x->x_on_old); 400 SETFLOAT(x->x_at+1, 0.0); 401 outlet_list(x->x_gui.x_obj.ob_outlet, &s_list, 2, x->x_at); 402 if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) 403 pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at); 404 } 405 x->x_on_old = x->x_on; 406 SETFLOAT(x->x_at, (float)x->x_on); 407 SETFLOAT(x->x_at+1, 1.0); 408 outlet_list(x->x_gui.x_obj.ob_outlet, &s_list, 2, x->x_at); 409 if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) 410 pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at); 411 } 412 else 413 { 414 outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on); 415 if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) 416 pd_float(x->x_gui.x_snd->s_thing, x->x_on); 417 } 418} 419 420static void hradio_fout(t_hradio *x, t_floatarg f) 421{ 422 int i=(int)f; 423 424 if(i < 0) 425 i = 0; 426 if(i >= x->x_number) 427 i = x->x_number-1; 428 429 if (pd_class(&x->x_gui.x_obj.ob_pd) == hradio_old_class) 430 { 431 if((x->x_change)&&(i != x->x_on_old)) 432 { 433 SETFLOAT(x->x_at, (float)x->x_on_old); 434 SETFLOAT(x->x_at+1, 0.0); 435 outlet_list(x->x_gui.x_obj.ob_outlet, &s_list, 2, x->x_at); 436 if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) 437 pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at); 438 } 439 if(x->x_on != x->x_on_old) 440 x->x_on_old = x->x_on; 441 x->x_on = i; 442 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); 443 x->x_on_old = x->x_on; 444 SETFLOAT(x->x_at, (float)x->x_on); 445 SETFLOAT(x->x_at+1, 1.0); 446 outlet_list(x->x_gui.x_obj.ob_outlet, &s_list, 2, x->x_at); 447 if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) 448 pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at); 449 } 450 else 451 { 452 x->x_on_old = x->x_on; 453 x->x_on = i; 454 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); 455 outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on); 456 if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) 457 pd_float(x->x_gui.x_snd->s_thing, x->x_on); 458 } 459} 460 461static void hradio_float(t_hradio *x, t_floatarg f) 462{ 463 int i=(int)f; 464 465 if(i < 0) 466 i = 0; 467 if(i >= x->x_number) 468 i = x->x_number-1; 469 470 if (pd_class(&x->x_gui.x_obj.ob_pd) == hradio_old_class) 471 { 472 /* compatibility with earlier "vdial" behavior */ 473 if((x->x_change)&&(i != x->x_on_old)) 474 { 475 if(x->x_gui.x_fsf.x_put_in2out) 476 { 477 SETFLOAT(x->x_at, (float)x->x_on_old); 478 SETFLOAT(x->x_at+1, 0.0); 479 outlet_list(x->x_gui.x_obj.ob_outlet, &s_list, 2, x->x_at); 480 if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) 481 pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at); 482 } 483 } 484 if(x->x_on != x->x_on_old) 485 x->x_on_old = x->x_on; 486 x->x_on = i; 487 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); 488 x->x_on_old = x->x_on; 489 if(x->x_gui.x_fsf.x_put_in2out) 490 { 491 SETFLOAT(x->x_at, (float)x->x_on); 492 SETFLOAT(x->x_at+1, 1.0); 493 outlet_list(x->x_gui.x_obj.ob_outlet, &s_list, 2, x->x_at); 494 if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) 495 pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at); 496 } 497 } 498 else 499 { 500 x->x_on_old = x->x_on; 501 x->x_on = i; 502 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); 503 if (x->x_gui.x_fsf.x_put_in2out) 504 { 505 outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on); 506 if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) 507 pd_float(x->x_gui.x_snd->s_thing, x->x_on); 508 } 509 } 510} 511 512static void hradio_click(t_hradio *x, t_floatarg xpos, t_floatarg ypos, t_floatarg shift, t_floatarg ctrl, t_floatarg alt) 513{ 514 int xx = (int)xpos - (int)text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist); 515 516#ifdef ROCKBOX 517 (void) ypos; 518 (void) shift; 519 (void) ctrl; 520 (void) alt; 521#endif 522 523 hradio_fout(x, (float)(xx / x->x_gui.x_w)); 524} 525 526static int hradio_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix, int shift, int alt, int dbl, int doit) 527{ 528#ifdef ROCKBOX 529 (void) glist; 530 (void) dbl; 531#endif 532 if(doit) 533 hradio_click((t_hradio *)z, (t_floatarg)xpix, (t_floatarg)ypix, (t_floatarg)shift, 0, (t_floatarg)alt); 534 return (1); 535} 536 537static void hradio_loadbang(t_hradio *x) 538{ 539 if(!sys_noloadbang && x->x_gui.x_isa.x_loadinit) 540 hradio_bang(x); 541} 542 543static void hradio_number(t_hradio *x, t_floatarg num) 544{ 545 int n=(int)num; 546 547 if(n < 1) 548 n = 1; 549 if(n > IEM_RADIO_MAX) 550 n = IEM_RADIO_MAX; 551 if(n != x->x_number) 552 { 553 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE); 554 x->x_number = n; 555 if(x->x_on >= x->x_number) 556 x->x_on = x->x_number - 1; 557 x->x_on_old = x->x_on; 558 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_NEW); 559 } 560} 561 562static void hradio_size(t_hradio *x, t_symbol *s, int ac, t_atom *av) 563{ 564#ifdef ROCKBOX 565 (void) s; 566#endif 567 x->x_gui.x_w = iemgui_clip_size((int)atom_getintarg(0, ac, av)); 568 x->x_gui.x_h = x->x_gui.x_w; 569 iemgui_size((void *)x, &x->x_gui); 570} 571 572static void hradio_delta(t_hradio *x, t_symbol *s, int ac, t_atom *av) 573{iemgui_delta((void *)x, &x->x_gui, s, ac, av);} 574 575static void hradio_pos(t_hradio *x, t_symbol *s, int ac, t_atom *av) 576{iemgui_pos((void *)x, &x->x_gui, s, ac, av);} 577 578static void hradio_color(t_hradio *x, t_symbol *s, int ac, t_atom *av) 579{iemgui_color((void *)x, &x->x_gui, s, ac, av);} 580 581static void hradio_send(t_hradio *x, t_symbol *s) 582{iemgui_send(x, &x->x_gui, s);} 583 584static void hradio_receive(t_hradio *x, t_symbol *s) 585{iemgui_receive(x, &x->x_gui, s);} 586 587static void hradio_label(t_hradio *x, t_symbol *s) 588{iemgui_label((void *)x, &x->x_gui, s);} 589 590static void hradio_label_pos(t_hradio *x, t_symbol *s, int ac, t_atom *av) 591{iemgui_label_pos((void *)x, &x->x_gui, s, ac, av);} 592 593static void hradio_label_font(t_hradio *x, t_symbol *s, int ac, t_atom *av) 594{iemgui_label_font((void *)x, &x->x_gui, s, ac, av);} 595 596static void hradio_init(t_hradio *x, t_floatarg f) 597{ 598 x->x_gui.x_isa.x_loadinit = (f==0.0)?0:1; 599} 600 601static void hradio_double_change(t_hradio *x) 602{x->x_change = 1;} 603 604static void hradio_single_change(t_hradio *x) 605{x->x_change = 0;} 606 607static void *hradio_donew(t_symbol *s, int argc, t_atom *argv, int old) 608{ 609 t_hradio *x = (t_hradio *)pd_new(old? hradio_old_class : hradio_class); 610 int bflcol[]={-262144, -1, -1}; 611#ifdef ROCKBOX 612 int a=IEM_GUI_DEFAULTSIZE, on=0; 613#else 614 int a=IEM_GUI_DEFAULTSIZE, on=0, f=0; 615#endif 616 int ldx=0, ldy=-6, chg=1, num=8; 617 int fs=8; 618#ifndef ROCKBOX 619 int ftbreak=IEM_BNG_DEFAULTBREAKFLASHTIME, fthold=IEM_BNG_DEFAULTHOLDFLASHTIME; 620 char str[144]; 621#endif 622 623#ifdef ROCKBOX 624 (void) s; 625#endif 626 627 iem_inttosymargs(&x->x_gui.x_isa, 0); 628 iem_inttofstyle(&x->x_gui.x_fsf, 0); 629 630 if((argc == 15)&&IS_A_FLOAT(argv,0)&&IS_A_FLOAT(argv,1)&&IS_A_FLOAT(argv,2) 631 &&IS_A_FLOAT(argv,3) 632 &&(IS_A_SYMBOL(argv,4)||IS_A_FLOAT(argv,4)) 633 &&(IS_A_SYMBOL(argv,5)||IS_A_FLOAT(argv,5)) 634 &&(IS_A_SYMBOL(argv,6)||IS_A_FLOAT(argv,6)) 635 &&IS_A_FLOAT(argv,7)&&IS_A_FLOAT(argv,8) 636 &&IS_A_FLOAT(argv,9)&&IS_A_FLOAT(argv,10)&&IS_A_FLOAT(argv,11) 637 &&IS_A_FLOAT(argv,12)&&IS_A_FLOAT(argv,13)&&IS_A_FLOAT(argv,14)) 638 { 639 a = (int)atom_getintarg(0, argc, argv); 640 chg = (int)atom_getintarg(1, argc, argv); 641 iem_inttosymargs(&x->x_gui.x_isa, atom_getintarg(2, argc, argv)); 642 num = (int)atom_getintarg(3, argc, argv); 643 iemgui_new_getnames(&x->x_gui, 4, argv); 644 ldx = (int)atom_getintarg(7, argc, argv); 645 ldy = (int)atom_getintarg(8, argc, argv); 646 iem_inttofstyle(&x->x_gui.x_fsf, atom_getintarg(9, argc, argv)); 647 fs = (int)atom_getintarg(10, argc, argv); 648 bflcol[0] = (int)atom_getintarg(11, argc, argv); 649 bflcol[1] = (int)atom_getintarg(12, argc, argv); 650 bflcol[2] = (int)atom_getintarg(13, argc, argv); 651 on = (int)atom_getintarg(14, argc, argv); 652 } 653 else iemgui_new_getnames(&x->x_gui, 4, 0); 654 x->x_gui.x_draw = (t_iemfunptr)hradio_draw; 655 x->x_gui.x_fsf.x_snd_able = 1; 656 x->x_gui.x_fsf.x_rcv_able = 1; 657 x->x_gui.x_glist = (t_glist *)canvas_getcurrent(); 658 if (!strcmp(x->x_gui.x_snd->s_name, "empty")) 659 x->x_gui.x_fsf.x_snd_able = 0; 660 if (!strcmp(x->x_gui.x_rcv->s_name, "empty")) 661 x->x_gui.x_fsf.x_rcv_able = 0; 662 if(x->x_gui.x_fsf.x_font_style == 1) strcpy(x->x_gui.x_font, "helvetica"); 663 else if(x->x_gui.x_fsf.x_font_style == 2) strcpy(x->x_gui.x_font, "times"); 664 else { x->x_gui.x_fsf.x_font_style = 0; 665 strcpy(x->x_gui.x_font, "courier"); } 666 if(num < 1) 667 num = 1; 668 if(num > IEM_RADIO_MAX) 669 num = IEM_RADIO_MAX; 670 x->x_number = num; 671 if(on < 0) 672 on = 0; 673 if(on >= x->x_number) 674 on = x->x_number - 1; 675 if(x->x_gui.x_isa.x_loadinit) 676 x->x_on = on; 677 else 678 x->x_on = 0; 679 x->x_on_old = x->x_on; 680 x->x_change = (chg==0)?0:1; 681 if (x->x_gui.x_fsf.x_rcv_able) 682 pd_bind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv); 683 x->x_gui.x_ldx = ldx; 684 x->x_gui.x_ldy = ldy; 685 if(fs < 4) 686 fs = 4; 687 x->x_gui.x_fontsize = fs; 688 x->x_gui.x_w = iemgui_clip_size(a); 689 x->x_gui.x_h = x->x_gui.x_w; 690 iemgui_verify_snd_ne_rcv(&x->x_gui); 691 iemgui_all_colfromload(&x->x_gui, bflcol); 692 outlet_new(&x->x_gui.x_obj, &s_list); 693 return (x); 694} 695 696static void *hradio_new(t_symbol *s, int argc, t_atom *argv) 697{ 698 return (hradio_donew(s, argc, argv, 0)); 699} 700 701static void *hdial_new(t_symbol *s, int argc, t_atom *argv) 702{ 703 return (hradio_donew(s, argc, argv, 1)); 704} 705 706static void hradio_ff(t_hradio *x) 707{ 708 if(x->x_gui.x_fsf.x_rcv_able) 709 pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv); 710#ifndef ROCKBOX 711 gfxstub_deleteforkey(x); 712#endif 713} 714 715void g_hradio_setup(void) 716{ 717 hradio_class = class_new(gensym("hradio"), (t_newmethod)hradio_new, 718 (t_method)hradio_ff, sizeof(t_hradio), 0, A_GIMME, 0); 719 class_addbang(hradio_class, hradio_bang); 720 class_addfloat(hradio_class, hradio_float); 721 class_addmethod(hradio_class, (t_method)hradio_click, gensym("click"), 722 A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0); 723 class_addmethod(hradio_class, (t_method)hradio_dialog, gensym("dialog"), 724 A_GIMME, 0); 725 class_addmethod(hradio_class, (t_method)hradio_loadbang, 726 gensym("loadbang"), 0); 727 class_addmethod(hradio_class, (t_method)hradio_set, 728 gensym("set"), A_FLOAT, 0); 729 class_addmethod(hradio_class, (t_method)hradio_size, 730 gensym("size"), A_GIMME, 0); 731 class_addmethod(hradio_class, (t_method)hradio_delta, 732 gensym("delta"), A_GIMME, 0); 733 class_addmethod(hradio_class, (t_method)hradio_pos, 734 gensym("pos"), A_GIMME, 0); 735 class_addmethod(hradio_class, (t_method)hradio_color, 736 gensym("color"), A_GIMME, 0); 737 class_addmethod(hradio_class, (t_method)hradio_send, 738 gensym("send"), A_DEFSYM, 0); 739 class_addmethod(hradio_class, (t_method)hradio_receive, 740 gensym("receive"), A_DEFSYM, 0); 741 class_addmethod(hradio_class, (t_method)hradio_label, 742 gensym("label"), A_DEFSYM, 0); 743 class_addmethod(hradio_class, (t_method)hradio_label_pos, 744 gensym("label_pos"), A_GIMME, 0); 745 class_addmethod(hradio_class, (t_method)hradio_label_font, 746 gensym("label_font"), A_GIMME, 0); 747 class_addmethod(hradio_class, (t_method)hradio_init, 748 gensym("init"), A_FLOAT, 0); 749 class_addmethod(hradio_class, (t_method)hradio_number, 750 gensym("number"), A_FLOAT, 0); 751 class_addmethod(hradio_class, (t_method)hradio_single_change, 752 gensym("single_change"), 0); 753 class_addmethod(hradio_class, (t_method)hradio_double_change, 754 gensym("double_change"), 0); 755 hradio_widgetbehavior.w_getrectfn = hradio_getrect; 756 hradio_widgetbehavior.w_displacefn = iemgui_displace; 757 hradio_widgetbehavior.w_selectfn = iemgui_select; 758 hradio_widgetbehavior.w_activatefn = NULL; 759 hradio_widgetbehavior.w_deletefn = iemgui_delete; 760 hradio_widgetbehavior.w_visfn = iemgui_vis; 761 hradio_widgetbehavior.w_clickfn = hradio_newclick; 762 class_setwidget(hradio_class, &hradio_widgetbehavior); 763 class_sethelpsymbol(hradio_class, gensym("hradio")); 764 class_setsavefn(hradio_class, hradio_save); 765 class_setpropertiesfn(hradio_class, hradio_properties); 766 767 /*obsolete version (0.34-0.35) */ 768 hradio_old_class = class_new(gensym("hdl"), (t_newmethod)hdial_new, 769 (t_method)hradio_ff, sizeof(t_hradio), 0, A_GIMME, 0); 770 class_addcreator((t_newmethod)hradio_new, gensym("rdb"), A_GIMME, 0); 771 class_addcreator((t_newmethod)hradio_new, gensym("radiobut"), A_GIMME, 0); 772 class_addcreator((t_newmethod)hradio_new, gensym("radiobutton"), 773 A_GIMME, 0); 774 class_addbang(hradio_old_class, hradio_bang); 775 class_addfloat(hradio_old_class, hradio_float); 776 class_addmethod(hradio_old_class, (t_method)hradio_click, gensym("click"), 777 A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0); 778 class_addmethod(hradio_old_class, (t_method)hradio_dialog, gensym("dialog"), 779 A_GIMME, 0); 780 class_addmethod(hradio_old_class, (t_method)hradio_loadbang, 781 gensym("loadbang"), 0); 782 class_addmethod(hradio_old_class, (t_method)hradio_set, 783 gensym("set"), A_FLOAT, 0); 784 class_addmethod(hradio_old_class, (t_method)hradio_size, 785 gensym("size"), A_GIMME, 0); 786 class_addmethod(hradio_old_class, (t_method)hradio_delta, 787 gensym("delta"), A_GIMME, 0); 788 class_addmethod(hradio_old_class, (t_method)hradio_pos, 789 gensym("pos"), A_GIMME, 0); 790 class_addmethod(hradio_old_class, (t_method)hradio_color, 791 gensym("color"), A_GIMME, 0); 792 class_addmethod(hradio_old_class, (t_method)hradio_send, 793 gensym("send"), A_DEFSYM, 0); 794 class_addmethod(hradio_old_class, (t_method)hradio_receive, 795 gensym("receive"), A_DEFSYM, 0); 796 class_addmethod(hradio_old_class, (t_method)hradio_label, 797 gensym("label"), A_DEFSYM, 0); 798 class_addmethod(hradio_old_class, (t_method)hradio_label_pos, 799 gensym("label_pos"), A_GIMME, 0); 800 class_addmethod(hradio_old_class, (t_method)hradio_label_font, 801 gensym("label_font"), A_GIMME, 0); 802 class_addmethod(hradio_old_class, (t_method)hradio_init, 803 gensym("init"), A_FLOAT, 0); 804 class_addmethod(hradio_old_class, (t_method)hradio_number, 805 gensym("number"), A_FLOAT, 0); 806 class_addmethod(hradio_old_class, (t_method)hradio_single_change, 807 gensym("single_change"), 0); 808 class_addmethod(hradio_old_class, (t_method)hradio_double_change, 809 gensym("double_change"), 0); 810 class_setwidget(hradio_old_class, &hradio_widgetbehavior); 811 class_sethelpsymbol(hradio_old_class, gensym("hradio")); 812} 813