diff options
author | Alessio Treglia <alessio@debian.org> | 2011-03-24 09:13:51 +0100 |
---|---|---|
committer | Alessio Treglia <alessio@debian.org> | 2011-03-24 09:13:51 +0100 |
commit | e5328e59987b90c4e98959510b810510e384650d (patch) | |
tree | 0f140b79d942c4654701d8fb4cfe2f1dd904f9f0 /snd-draw.c | |
parent | 36cf8384e5699cda3f1ca607753fe4d4a8515b01 (diff) |
Imported Upstream version 12.0
Diffstat (limited to 'snd-draw.c')
-rw-r--r-- | snd-draw.c | 650 |
1 files changed, 402 insertions, 248 deletions
@@ -4,12 +4,14 @@ #if (!USE_NO_GUI) #if USE_MOTIF -#define XEN_WRAP_PIXEL(Value) XEN_LIST_2(C_STRING_TO_XEN_SYMBOL("Pixel"), C_TO_XEN_INT((int)Value)) - /* not ulong here! -- messes up the equal? check */ -#define XEN_UNWRAP_PIXEL(Value) (unsigned long)XEN_TO_C_INT(XEN_CADR(Value)) -#define XEN_PIXEL_P(Value) (XEN_LIST_P(Value) && (XEN_LIST_LENGTH(Value) >= 2) && (XEN_SYMBOL_P(XEN_CAR(Value))) && \ - (strcmp("Pixel", XEN_SYMBOL_TO_C_STRING(XEN_CAR(Value))) == 0)) -#else + #define XEN_WRAP_PIXEL(Value) XEN_LIST_2(C_STRING_TO_XEN_SYMBOL("Pixel"), C_TO_XEN_INT((int)Value)) + /* not ulong here! -- messes up the equal? check */ + #define XEN_UNWRAP_PIXEL(Value) (unsigned long)XEN_TO_C_INT(XEN_CADR(Value)) + #define XEN_PIXEL_P(Value) (XEN_LIST_P(Value) && (XEN_LIST_LENGTH(Value) >= 2) && (XEN_SYMBOL_P(XEN_CAR(Value))) && \ + (strcmp("Pixel", XEN_SYMBOL_TO_C_STRING(XEN_CAR(Value))) == 0)) +#endif + +#if USE_GTK #define XEN_WRAP_PIXEL(Value) XEN_LIST_2(C_STRING_TO_XEN_SYMBOL("color_t"), XEN_WRAP_C_POINTER((unsigned long)Value)) #define XEN_UNWRAP_PIXEL(Value) (color_t)(XEN_UNWRAP_C_POINTER(XEN_CADR(Value))) #define XEN_PIXEL_P(Value) (XEN_LIST_P(Value) && (XEN_LIST_LENGTH(Value) >= 2) && (XEN_SYMBOL_P(XEN_CAR(Value))) && \ @@ -161,15 +163,11 @@ void draw_cursor(chan_info *cp) if (!ax) { fprintf(stderr,"axis->ax is null..."); - ap->ax = cp->cgx->ax; + ap->ax = cp->ax; ax = ap->ax; } old_color = get_foreground_color(ax); - set_foreground_color(ax, ss->sgx->cursor_color); - - if (ax->cr) cairo_destroy(ax->cr); - ax->cr = gdk_cairo_create(ax->wn); /* this is needed to force the cursor to be displayed! */ - free_cursor_pix(cp); + set_foreground_color(ax, ss->cursor_color); if (cp->cx > cp->cursor_size) cx0 = cp->cx - cp->cursor_size; if (cp->cy > cp->cursor_size) cy0 = cp->cy - cp->cursor_size; @@ -178,16 +176,13 @@ void draw_cursor(chan_info *cp) ax = cursor_context(cp); #endif - if ((cp->tracking) && (with_tracking_cursor(ss) != DONT_TRACK)) + if (ss->tracking) cur = cp->tracking_cursor_style; else cur = cp->cursor_style; switch (cur) { case CURSOR_CROSS: -#if USE_GTK - save_cursor_pix(cp, ax, csize, csize, cx0, cy0); -#endif draw_line(ax, cp->cx, cp->cy - cp->cursor_size, cp->cx, cp->cy + cp->cursor_size); draw_line(ax, cp->cx - cp->cursor_size, cp->cy, cp->cx + cp->cursor_size, cp->cy); break; @@ -196,56 +191,107 @@ void draw_cursor(chan_info *cp) if ((with_inset_graph(ss)) && (cp->inset_graph)) draw_inset_line_cursor(cp, ax); - else - { -#if USE_GTK - save_cursor_pix(cp, ax, 2, ap->y_axis_y0 - ap->y_axis_y1, cp->cx, ap->y_axis_y1); -#endif - draw_line(ax, cp->cx, ap->y_axis_y0 - 1, cp->cx, ap->y_axis_y1); - } + else draw_line(ax, cp->cx, ap->y_axis_y0 - 1, cp->cx, ap->y_axis_y1); break; case CURSOR_PROC: #if USE_GTK - /* in the cairo case, we need some info about the cursor shape, but I'll assume cursor_size is meaningful */ - save_cursor_pix(cp, ax, csize, csize, cx0, cy0); + FREE_CAIRO(ss->cr); + ss->cr = NULL; #endif XEN_CALL_3((XEN_PROCEDURE_P(cp->cursor_proc)) ? (cp->cursor_proc) : (ss->cursor_proc), C_INT_TO_XEN_SOUND(cp->sound->index), C_TO_XEN_INT(cp->chan), /* this was time-graph, which was useless. It's now #t if we're in tracking-cursor mode */ - /* this will be called only it with_tracking_cursor is #f -> we want to draw it ourselves */ - C_TO_XEN_BOOLEAN(cp->tracking), + C_TO_XEN_BOOLEAN(ss->tracking), S_cursor_style " procedure"); +#if USE_GTK + ss->cr = MAKE_CAIRO(ap->ax->wn); +#endif break; } + /* now draw the play triangle below the x axis */ + fill_polygon(ax, 4, + cp->cx, ap->y_axis_y0, + cp->cx + play_arrow_size(ss), ap->y_axis_y0 + play_arrow_size(ss), + cp->cx, ap->y_axis_y0 + 2 * play_arrow_size(ss), + cp->cx, ap->y_axis_y0); + #if USE_GTK set_foreground_color(ax, old_color); #endif } -void erase_cursor(chan_info *cp) -{ -#if USE_GTK - if (cp->cgx->cursor_pix) - restore_cursor_pix(cp, cp->axis->ax); /* returns true if old cursor was erased */ -#else - draw_cursor(cp); -#endif -} - /* -------------------------------------------------------------------------------- */ #define AXIS_CONTEXT_ID_OK(Id) ((Id >= CHAN_GC) && (Id <= CHAN_TMPGC)) -#define NO_SUCH_WIDGET XEN_ERROR_TYPE("no-such-widget") +#define NO_SUCH_WIDGET XEN_ERROR_TYPE("no-such-widget") -static graphics_context *get_ax(chan_info *cp, int ax_id, const char *caller) +#if USE_MOTIF +static graphics_context *get_ax(chan_info *cp, int ax_id, const char *caller, XEN ignored) { if ((cp) && (AXIS_CONTEXT_ID_OK(ax_id))) return(set_context(cp, (chan_gc_t)ax_id)); + + XEN_ERROR(XEN_ERROR_TYPE("no-such-graphics-context"), + XEN_LIST_6(C_TO_XEN_STRING("~A: no such graphics context: ~A, sound index: ~A (~A), chan: ~A"), + C_TO_XEN_STRING(caller), + C_TO_XEN_INT(ax_id), + C_INT_TO_XEN_SOUND(cp->sound->index), + C_TO_XEN_STRING(cp->sound->short_filename), + C_TO_XEN_INT(cp->chan))); + return(NULL); +} + + +static graphics_context *get_ax_no_cr(chan_info *cp, int ax_id, const char *caller) +{ + return(get_ax(cp,ax_id, caller, XEN_FALSE)); +} +#endif + +#if USE_GTK +static graphics_context *get_ax(chan_info *cp, int ax_id, const char *caller, XEN xcr) +{ + if ((cp) && (AXIS_CONTEXT_ID_OK(ax_id))) + { + graphics_context *ax; + ax = set_context(cp, (chan_gc_t)ax_id); + /* (gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (car (channel-widgets 0 0)))))) -> '(cairo_t_ #<c_pointer 0x12bbca0>) + * (eq? (car hi) 'cairo_t_) -> #t + */ + if ((XEN_LIST_P(xcr)) && + (XEN_LIST_LENGTH(xcr) == 2) && + (XEN_SYMBOL_P(XEN_CAR(xcr))) && + (strcmp("cairo_t_", XEN_SYMBOL_TO_C_STRING(XEN_CAR(xcr))) == 0)) + ss->cr = (cairo_t *)XEN_UNWRAP_C_POINTER(XEN_CADR(xcr)); + else + XEN_ERROR(XEN_ERROR_TYPE("not-a-graphics-context"), + XEN_LIST_2(C_TO_XEN_STRING("~A: cairo_t argument is not a cairo_t pointer"), + C_TO_XEN_STRING(caller))); + return(ax); + } + XEN_ERROR(XEN_ERROR_TYPE("no-such-graphics-context"), + XEN_LIST_6(C_TO_XEN_STRING("~A: no such graphics context: ~A, sound index: ~A (~A), chan: ~A"), + C_TO_XEN_STRING(caller), + C_TO_XEN_INT(ax_id), + C_INT_TO_XEN_SOUND(cp->sound->index), + C_TO_XEN_STRING(cp->sound->short_filename), + C_TO_XEN_INT(cp->chan))); + return(NULL); +} + +static graphics_context *get_ax_no_cr(chan_info *cp, int ax_id, const char *caller) +{ + if ((cp) && (AXIS_CONTEXT_ID_OK(ax_id))) + { + graphics_context *ax; + ax = set_context(cp, (chan_gc_t)ax_id); + return(ax); + } XEN_ERROR(XEN_ERROR_TYPE("no-such-graphics-context"), XEN_LIST_6(C_TO_XEN_STRING("~A: no such graphics context: ~A, sound index: ~A (~A), chan: ~A"), C_TO_XEN_STRING(caller), @@ -255,16 +301,16 @@ static graphics_context *get_ax(chan_info *cp, int ax_id, const char *caller) C_TO_XEN_INT(cp->chan))); return(NULL); } +#endif + +#define TO_C_AXIS_CONTEXT(Snd, Chn, Ax, Caller, Cr) get_ax(get_cp(Snd, Chn, Caller), XEN_TO_C_INT_OR_ELSE(Ax, (int)CHAN_GC), Caller, Cr) +#define TO_C_AXIS_CONTEXT_NO_CR(Snd, Chn, Ax, Caller) get_ax_no_cr(get_cp(Snd, Chn, Caller), XEN_TO_C_INT_OR_ELSE(Ax, (int)CHAN_GC), Caller) -#define TO_C_AXIS_CONTEXT(Snd, Chn, Ax, Caller) \ - get_ax(get_cp(Snd, Chn, Caller), \ - XEN_TO_C_INT_OR_ELSE(Ax, (int)CHAN_GC), \ - Caller) -static XEN g_draw_line(XEN x0, XEN y0, XEN x1, XEN y1, XEN snd, XEN chn, XEN ax) +static XEN g_draw_line(XEN x0, XEN y0, XEN x1, XEN y1, XEN snd, XEN chn, XEN ax, XEN xcr) { - #define H_draw_line "(" S_draw_line " x0 y0 x1 y1 :optional snd chn (ax " S_time_graph ")): draw a line" + #define H_draw_line "(" S_draw_line " x0 y0 x1 y1 :optional snd chn (ax " S_time_graph ") cr): draw a line" ASSERT_CHANNEL(S_draw_line, snd, chn, 5); XEN_ASSERT_TYPE(XEN_NUMBER_P(x0), x0, XEN_ARG_1, S_draw_line, "a number"); @@ -273,24 +319,7 @@ static XEN g_draw_line(XEN x0, XEN y0, XEN x1, XEN y1, XEN snd, XEN chn, XEN ax) XEN_ASSERT_TYPE(XEN_NUMBER_P(y1), y1, XEN_ARG_4, S_draw_line, "a number"); XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax), ax, XEN_ARG_7, S_draw_line, "an integer such as " S_time_graph); -#if USE_GTK - { - graphics_context *axc; - axc = TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_line); - if (!(axc->cr)) - { - if (axc->wn) - axc->cr = gdk_cairo_create(axc->wn); - else - { - fprintf(stderr,"ax->cr is null in (draw-line %s %s %s %s %s %s %s)\n", - XEN_AS_STRING(x0), XEN_AS_STRING(y0), XEN_AS_STRING(x1), XEN_AS_STRING(y1), XEN_AS_STRING(snd), XEN_AS_STRING(chn), XEN_AS_STRING(ax)); - abort(); - } - } - } -#endif - draw_line(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_line), + draw_line(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_line, xcr), XEN_TO_C_INT(x0), XEN_TO_C_INT(y0), XEN_TO_C_INT(x1), @@ -299,9 +328,9 @@ static XEN g_draw_line(XEN x0, XEN y0, XEN x1, XEN y1, XEN snd, XEN chn, XEN ax) } -static XEN g_draw_dot(XEN x0, XEN y0, XEN size, XEN snd, XEN chn, XEN ax) +static XEN g_draw_dot(XEN x0, XEN y0, XEN size, XEN snd, XEN chn, XEN ax, XEN xcr) { - #define H_draw_dot "(" S_draw_dot " x0 y0 size :optional snd chn (ax " S_time_graph ")): draw a dot" + #define H_draw_dot "(" S_draw_dot " x0 y0 size :optional snd chn (ax " S_time_graph ") cr): draw a dot" ASSERT_CHANNEL(S_draw_dot, snd, chn, 4); XEN_ASSERT_TYPE(XEN_NUMBER_P(x0), x0, XEN_ARG_1, S_draw_dot, "a number"); @@ -309,7 +338,7 @@ static XEN g_draw_dot(XEN x0, XEN y0, XEN size, XEN snd, XEN chn, XEN ax) XEN_ASSERT_TYPE(XEN_NUMBER_P(size), size, XEN_ARG_3, S_draw_dot, "a number"); XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax), ax, XEN_ARG_6, S_draw_dot, "an integer such as " S_time_graph); - draw_dot(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_dot), + draw_dot(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_dot, xcr), XEN_TO_C_INT(x0), XEN_TO_C_INT(y0), XEN_TO_C_INT_OR_ELSE(size, 1)); @@ -317,9 +346,9 @@ static XEN g_draw_dot(XEN x0, XEN y0, XEN size, XEN snd, XEN chn, XEN ax) } -static XEN g_fill_rectangle(XEN x0, XEN y0, XEN width, XEN height, XEN snd, XEN chn, XEN ax, XEN erase) +static XEN g_fill_rectangle(XEN x0, XEN y0, XEN width, XEN height, XEN snd, XEN chn, XEN ax, XEN erase, XEN xcr) { - #define H_fill_rectangle "(" S_fill_rectangle " x0 y0 width height :optional snd chn (ax " S_time_graph ") erase): draw a filled rectangle" + #define H_fill_rectangle "(" S_fill_rectangle " x0 y0 width height :optional snd chn (ax " S_time_graph ") erase cr): draw a filled rectangle" ASSERT_CHANNEL(S_fill_rectangle, snd, chn, 5); XEN_ASSERT_TYPE(XEN_NUMBER_P(x0), x0, XEN_ARG_1, S_fill_rectangle, "a number"); @@ -332,12 +361,12 @@ static XEN g_fill_rectangle(XEN x0, XEN y0, XEN width, XEN height, XEN snd, XEN if ((XEN_BOOLEAN_P(erase)) && (XEN_TRUE_P(erase))) erase_rectangle(get_cp(snd, chn, S_fill_rectangle), - TO_C_AXIS_CONTEXT(snd, chn, ax, S_fill_rectangle), + TO_C_AXIS_CONTEXT(snd, chn, ax, S_fill_rectangle, xcr), XEN_TO_C_INT(x0), XEN_TO_C_INT(y0), XEN_TO_C_INT(width), XEN_TO_C_INT(height)); - else fill_rectangle(TO_C_AXIS_CONTEXT(snd, chn, ax, S_fill_rectangle), + else fill_rectangle(TO_C_AXIS_CONTEXT(snd, chn, ax, S_fill_rectangle, xcr), XEN_TO_C_INT(x0), XEN_TO_C_INT(y0), XEN_TO_C_INT(width), @@ -346,9 +375,9 @@ static XEN g_fill_rectangle(XEN x0, XEN y0, XEN width, XEN height, XEN snd, XEN } -static XEN g_draw_string(XEN text, XEN x0, XEN y0, XEN snd, XEN chn, XEN ax) +static XEN g_draw_string(XEN text, XEN x0, XEN y0, XEN snd, XEN chn, XEN ax, XEN xcr) { - #define H_draw_string "(" S_draw_string " text x0 y0 :optional snd chn (ax " S_time_graph ")): draw a string" + #define H_draw_string "(" S_draw_string " text x0 y0 :optional snd chn (ax " S_time_graph ") cr): draw a string" const char *tmp = NULL; ASSERT_CHANNEL(S_draw_string, snd, chn, 4); @@ -361,9 +390,9 @@ static XEN g_draw_string(XEN text, XEN x0, XEN y0, XEN snd, XEN chn, XEN ax) #if USE_MOTIF /* snd-xdraw to make motif draw-string act in the same way (coordinate-wise) as gtk */ /* despite the name, this is not a gtk function */ - gtk_style_draw_string(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_string), + gtk_style_draw_string(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_string, xcr), #else - draw_string(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_string), + draw_string(TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_string, xcr), #endif XEN_TO_C_INT(x0), XEN_TO_C_INT(y0), @@ -402,10 +431,10 @@ static point_t *vector_to_points(XEN pts, const char *caller, int *vector_len) } -static XEN g_draw_lines(XEN pts, XEN snd, XEN chn, XEN ax) + static XEN g_draw_lines(XEN pts, XEN snd, XEN chn, XEN ax, XEN xcr) { /* pts should be a vector of integers as (x y) pairs */ - #define H_draw_lines "(" S_draw_lines " lines :optional snd chn (ax " S_time_graph ")): draw a vector of lines" + #define H_draw_lines "(" S_draw_lines " lines :optional snd chn (ax " S_time_graph ") cr): draw a vector of lines" point_t *pack_pts; graphics_context *ax1; @@ -415,7 +444,8 @@ static XEN g_draw_lines(XEN pts, XEN snd, XEN chn, XEN ax) XEN_ASSERT_TYPE(XEN_VECTOR_P(pts), pts, XEN_ARG_1, S_draw_lines, "a vector"); XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax), ax, XEN_ARG_4, S_draw_lines, "an integer such as " S_time_graph); - ax1 = TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_lines); + ax1 = TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_lines, xcr); + pack_pts = vector_to_points(pts, S_draw_lines, &vlen); draw_lines(ax1, pack_pts, vlen); @@ -424,10 +454,10 @@ static XEN g_draw_lines(XEN pts, XEN snd, XEN chn, XEN ax) } -static XEN g_draw_dots(XEN pts, XEN size, XEN snd, XEN chn, XEN ax) + static XEN g_draw_dots(XEN pts, XEN size, XEN snd, XEN chn, XEN ax, XEN xcr) { /* pts should be a vector of integers as (x y) pairs */ - #define H_draw_dots "(" S_draw_dots " positions :optional dot-size snd chn (ax " S_time_graph ")): draw a vector of dots" + #define H_draw_dots "(" S_draw_dots " positions :optional dot-size snd chn (ax " S_time_graph ") cr): draw a vector of dots" point_t *pack_pts; graphics_context *ax1; @@ -438,7 +468,8 @@ static XEN g_draw_dots(XEN pts, XEN size, XEN snd, XEN chn, XEN ax) XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(size), size, XEN_ARG_2, S_draw_dots, "an integer"); XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax), ax, XEN_ARG_5, S_draw_dots, "an integer such as " S_time_graph); - ax1 = TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_dots); + ax1 = TO_C_AXIS_CONTEXT(snd, chn, ax, S_draw_dots, xcr); + pack_pts = vector_to_points(pts, S_draw_dots, &vlen); draw_points(ax1, pack_pts, @@ -450,9 +481,9 @@ static XEN g_draw_dots(XEN pts, XEN size, XEN snd, XEN chn, XEN ax) } -static XEN g_fill_polygon(XEN pts, XEN snd, XEN chn, XEN ax_id) + static XEN g_fill_polygon(XEN pts, XEN snd, XEN chn, XEN ax_id, XEN xcr) { - #define H_fill_polygon "(" S_fill_polygon " points :optional snd chn (ax " S_time_graph ")): draw a filled polygon" + #define H_fill_polygon "(" S_fill_polygon " points :optional snd chn (ax " S_time_graph ") cr): draw a filled polygon" point_t *pack_pts; graphics_context *ax; @@ -462,7 +493,8 @@ static XEN g_fill_polygon(XEN pts, XEN snd, XEN chn, XEN ax_id) XEN_ASSERT_TYPE(XEN_VECTOR_P(pts), pts, XEN_ARG_1, S_fill_polygon, "a vector"); XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax_id), ax_id, XEN_ARG_4, S_fill_polygon, "an integer such as " S_time_graph); - ax = TO_C_AXIS_CONTEXT(snd, chn, ax_id, S_fill_polygon); + ax = TO_C_AXIS_CONTEXT(snd, chn, ax_id, S_fill_polygon, xcr); + pack_pts = vector_to_points(pts, S_fill_polygon, &vlen); #if USE_MOTIF XFillPolygon(ax->dp, ax->wn, ax->gc, pack_pts, vlen, Complex, CoordModeOrigin); @@ -522,7 +554,7 @@ defined by the 4 controlling points x0..y3; 'n' is how many points to return" } -static XEN g_foreground_color(XEN snd, XEN chn, XEN xax) + static XEN g_foreground_color(XEN snd, XEN chn, XEN xax) { #define H_foreground_color "(" S_foreground_color " :optional snd chn (ax " S_time_graph ")): current drawing color" chan_info *cp; @@ -534,12 +566,12 @@ static XEN g_foreground_color(XEN snd, XEN chn, XEN xax) cp = get_cp(snd, chn, S_foreground_color); if (!cp) return(XEN_FALSE); - ax = get_ax(cp, XEN_TO_C_INT_OR_ELSE(xax, (int)CHAN_GC), S_foreground_color); + ax = get_ax_no_cr(cp, XEN_TO_C_INT_OR_ELSE(xax, (int)CHAN_GC), S_foreground_color); return(XEN_WRAP_PIXEL(get_foreground_color(ax))); } -static XEN g_set_foreground_color(XEN color, XEN snd, XEN chn, XEN ax) + static XEN g_set_foreground_color(XEN color, XEN snd, XEN chn, XEN ax) { chan_info *cp; @@ -550,9 +582,7 @@ static XEN g_set_foreground_color(XEN color, XEN snd, XEN chn, XEN ax) cp = get_cp(snd, chn, S_setB S_foreground_color); if (!cp) return(XEN_FALSE); - set_foreground_color(get_ax(cp, - XEN_TO_C_INT_OR_ELSE(ax, (int)CHAN_GC), - S_setB S_foreground_color), + set_foreground_color(get_ax_no_cr(cp, XEN_TO_C_INT_OR_ELSE(ax, (int)CHAN_GC), S_setB S_foreground_color), XEN_UNWRAP_PIXEL(color)); return(color); } @@ -573,7 +603,7 @@ static XEN g_set_current_font(XEN id, XEN snd, XEN chn, XEN ax_id) (XEN_SYMBOL_P(XEN_CAR(id))) && (strcmp("Font", XEN_SYMBOL_TO_C_STRING(XEN_CAR(id))) == 0), id, XEN_ARG_1, S_setB S_current_font, "a Font"); - ax = TO_C_AXIS_CONTEXT(snd, chn, ax_id, S_current_font); + ax = TO_C_AXIS_CONTEXT_NO_CR(snd, chn, ax_id, S_current_font); ax->current_font = (Font)XEN_TO_C_ULONG(XEN_CADR(id)); XSetFont(ax->dp, ax->gc, ax->current_font); return(id); @@ -591,9 +621,7 @@ static XEN g_current_font(XEN snd, XEN chn, XEN ax_id) cp = get_cp(snd, chn, S_current_font); if (!cp) return(XEN_FALSE); - ax = get_ax(cp, - XEN_TO_C_INT_OR_ELSE(ax_id, (int)CHAN_GC), - S_current_font); + ax = get_ax_no_cr(cp, XEN_TO_C_INT_OR_ELSE(ax_id, (int)CHAN_GC), S_current_font); if (ax->current_font == 0) { if ((cp->axis) && (cp->axis->ax)) @@ -614,7 +642,8 @@ static XEN g_set_current_font(XEN id, XEN snd, XEN chn, XEN ax_id) ASSERT_CHANNEL(S_setB S_current_font, snd, chn, 2); XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax_id), ax_id, XEN_ARG_4, S_setB S_current_font, "an integer such as time-graph"); - ax = TO_C_AXIS_CONTEXT(snd, chn, ax_id, S_setB S_current_font); + + ax = TO_C_AXIS_CONTEXT_NO_CR(snd, chn, ax_id, S_setB S_current_font); XEN_ASSERT_TYPE((XEN_WRAPPED_C_POINTER_P(id)) || (XEN_LIST_P(id) && (XEN_LIST_LENGTH(id) >= 2) && @@ -634,7 +663,7 @@ static XEN g_current_font(XEN snd, XEN chn, XEN ax_id) graphics_context *ax; ASSERT_CHANNEL(S_current_font, snd, chn, 1); XEN_ASSERT_TYPE(XEN_INTEGER_IF_BOUND_P(ax_id), ax_id, XEN_ARG_3, S_current_font, "an integer such as time-graph"); - ax = TO_C_AXIS_CONTEXT(snd, chn, ax_id, S_current_font); + ax = TO_C_AXIS_CONTEXT_NO_CR(snd, chn, ax_id, S_current_font); return(XEN_WRAP_C_POINTER(ax->current_font)); } @@ -651,11 +680,14 @@ return either a vct (if the graph has one trace), or a list of two vcts (the two 'high' defaults to the current rightmost sample. (" S_graph_data " (" S_make_graph_data ")) reimplements the time domain graph." chan_info *cp; + ASSERT_CHANNEL(S_make_graph_data, snd, chn, 1); cp = get_cp(snd, chn, S_make_graph_data); if (!cp) return(XEN_FALSE); + XEN_ASSERT_TYPE(XEN_NUMBER_IF_BOUND_P(lo), lo, XEN_ARG_4, S_make_graph_data, "a number"); XEN_ASSERT_TYPE(XEN_NUMBER_IF_BOUND_P(hi), hi, XEN_ARG_5, S_make_graph_data, "a number"); + return(make_graph_data(cp, to_c_edit_position(cp, edpos, S_make_graph_data, 3), XEN_TO_C_INT64_T_OR_ELSE(lo, -1), @@ -663,17 +695,20 @@ return either a vct (if the graph has one trace), or a list of two vcts (the two } -static XEN g_graph_data(XEN data, XEN snd, XEN chn, XEN ax, XEN lo, XEN hi, XEN style) + static XEN g_graph_data(XEN data, XEN snd, XEN chn, XEN ax, XEN lo, XEN hi, XEN style, XEN xcr) { - #define H_graph_data "(" S_graph_data " data :optional snd chn (context " S_copy_context ") low high graph-style): \ + #define H_graph_data "(" S_graph_data " data :optional snd chn (context " S_copy_context ") low high graph-style cr): \ display 'data' in the time domain graph of snd's channel chn using the graphics context context (normally " S_copy_context "), placing the \ data in the recipient's graph between points low and high in the drawing mode graphic-style." chan_info *cp; vct *v0, *v1 = NULL; + ASSERT_CHANNEL(S_graph_data, snd, chn, 2); + cp = get_cp(snd, chn, S_graph_data); if (!cp) return(XEN_FALSE); + if (XEN_FALSE_P(data)) return(XEN_FALSE); XEN_ASSERT_TYPE((XEN_LIST_P(data) && (XEN_LIST_LENGTH(data) == 2) && @@ -685,19 +720,21 @@ data in the recipient's graph between points low and high in the drawing mode gr XEN_ASSERT_TYPE(XEN_INT64_T_P(lo) || XEN_FALSE_P(lo) || XEN_NOT_BOUND_P(lo), lo, XEN_ARG_5, S_graph_data, "a sample number"); XEN_ASSERT_TYPE(XEN_INT64_T_P(hi) || XEN_FALSE_P(hi) || XEN_NOT_BOUND_P(hi), hi, XEN_ARG_6, S_graph_data, "a sample number"); XEN_ASSERT_TYPE(XEN_INTEGER_OR_BOOLEAN_IF_BOUND_P(style), style, XEN_ARG_7, S_graph_data, "an integer"); + if (XEN_LIST_P(data)) { v0 = xen_to_vct(XEN_CAR(data)); v1 = xen_to_vct(XEN_CADR(data)); } else v0 = xen_to_vct(data); + draw_graph_data(cp, XEN_TO_C_INT64_T_OR_ELSE(lo, -1), XEN_TO_C_INT64_T_OR_ELSE(hi, -1), v0->length, v0->data, (v1) ? (v1->data) : NULL, - get_ax(cp, XEN_TO_C_INT_OR_ELSE(ax, (int)CHAN_GC), S_graph_data), + get_ax(cp, XEN_TO_C_INT_OR_ELSE(ax, (int)CHAN_GC), S_graph_data, xcr), (graph_style_t)XEN_TO_C_INT_OR_ELSE(style, (int)(cp->time_graph_style))); return(data); } @@ -721,7 +758,7 @@ widgets (list (0)main-app (1)main-shell (2)main-pane (3)sound-pane (4)listener-p XEN_CONS(XEN_WRAP_WIDGET(MAIN_SHELL(ss)), XEN_CONS(XEN_WRAP_WIDGET(MAIN_PANE(ss)), XEN_CONS(XEN_WRAP_WIDGET(SOUND_PANE(ss)), - XEN_CONS(XEN_WRAP_WIDGET(ss->sgx->listener_pane), + XEN_CONS(XEN_WRAP_WIDGET(ss->listener_pane), XEN_CONS(XEN_WRAP_WIDGET(SOUND_PANE_BOX(ss)), XEN_EMPTY_LIST)))))); snd_unprotect_at(loc); @@ -767,27 +804,29 @@ static XEN g_dialog_widgets(void) void set_dialog_widget(snd_dialog_t which, widget_t wid) { - state_context *sx; - sx = ss->sgx; - if (sx->dialogs == NULL) + if (ss->dialogs == NULL) { - sx->dialogs_size = 8; - sx->num_dialogs = 0; - sx->dialogs = (widget_t *)calloc(sx->dialogs_size, sizeof(widget_t)); + ss->dialogs_size = 8; + ss->num_dialogs = 0; + ss->dialogs = (widget_t *)calloc(ss->dialogs_size, sizeof(widget_t)); } else { - if (sx->num_dialogs == sx->dialogs_size) + if (ss->num_dialogs == ss->dialogs_size) { int i; - sx->dialogs_size += 8; - sx->dialogs = (widget_t *)realloc(sx->dialogs, sx->dialogs_size * sizeof(widget_t)); - for (i = sx->num_dialogs; i < sx->dialogs_size; i++) sx->dialogs[i] = NULL; + ss->dialogs_size += 8; + ss->dialogs = (widget_t *)realloc(ss->dialogs, ss->dialogs_size * sizeof(widget_t)); + for (i = ss->num_dialogs; i < ss->dialogs_size; i++) ss->dialogs[i] = NULL; } } - sx->dialogs[sx->num_dialogs++] = wid; + ss->dialogs[ss->num_dialogs++] = wid; check_dialog_widget_table(); +#if USE_GTK && HAVE_GTK_3 + gtk_widget_override_background_color(wid, GTK_STATE_NORMAL, (GdkRGBA *)(ss->basic_color)); +#endif + if (XEN_FALSE_P(XEN_VECTOR_REF(dialog_widgets, (int)which))) XEN_VECTOR_SET(dialog_widgets, (int)which, XEN_WRAP_WIDGET(wid)); @@ -1037,25 +1076,25 @@ fltenv_basic) (13 fltenv_data))." #endif #endif - state_context *sx; - sx = ss->sgx; - if (sx) - return(XEN_CONS(XEN_WRAP_SND_GC(sx->basic_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->selected_basic_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->combined_basic_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->cursor_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->selected_cursor_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->selection_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->selected_selection_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->erase_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->selected_erase_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->mark_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->selected_mark_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->mix_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->fltenv_basic_gc), - XEN_CONS(XEN_WRAP_SND_GC(sx->fltenv_data_gc), +#if (!USE_NO_GUI) + return(XEN_CONS(XEN_WRAP_SND_GC(ss->basic_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->selected_basic_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->combined_basic_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->cursor_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->selected_cursor_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->selection_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->selected_selection_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->erase_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->selected_erase_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->mark_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->selected_mark_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->mix_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->fltenv_basic_gc), + XEN_CONS(XEN_WRAP_SND_GC(ss->fltenv_data_gc), XEN_EMPTY_LIST))))))))))))))); +#else return(XEN_EMPTY_LIST); +#endif } @@ -1067,43 +1106,43 @@ static XEN g_snd_color(XEN choice) switch (XEN_TO_C_INT(choice)) { - case 0: col = ss->sgx->white; break; - case 1: col = ss->sgx->black; break; - case 2: col = ss->sgx->red; break; - case 3: col = ss->sgx->yellow; break; - case 4: col = ss->sgx->green; break; - case 5: col = ss->sgx->light_blue; break; - case 6: col = ss->sgx->lighter_blue; break; - - case 7: col = ss->sgx->data_color; break; - case 8: col = ss->sgx->selected_data_color; break; - case 9: col = ss->sgx->mark_color; break; - case 10: col = ss->sgx->graph_color; break; - case 11: col = ss->sgx->selected_graph_color; break; - case 12: col = ss->sgx->listener_color; break; - case 13: col = ss->sgx->listener_text_color; break; - - case 14: col = ss->sgx->basic_color; break; - case 15: col = ss->sgx->selection_color; break; - case 16: col = ss->sgx->zoom_color; break; - case 17: col = ss->sgx->position_color; break; - case 18: col = ss->sgx->highlight_color; break; - case 19: col = ss->sgx->enved_waveform_color; break; - case 20: col = ss->sgx->cursor_color; break; - - case 21: col = ss->sgx->text_focus_color; break; - case 22: col = ss->sgx->filter_control_waveform_color; break; - case 23: col = ss->sgx->mix_color; break; - case 25: col = ss->sgx->sash_color; break; - - case 31: col = ss->sgx->grid_color; break; - case 32: col = ss->sgx->selected_grid_color; break; + case 0: col = ss->white; break; + case 1: col = ss->black; break; + case 2: col = ss->red; break; + case 3: col = ss->yellow; break; + case 4: col = ss->green; break; + case 5: col = ss->light_blue; break; + case 6: col = ss->lighter_blue; break; + + case 7: col = ss->data_color; break; + case 8: col = ss->selected_data_color; break; + case 9: col = ss->mark_color; break; + case 10: col = ss->graph_color; break; + case 11: col = ss->selected_graph_color; break; + case 12: col = ss->listener_color; break; + case 13: col = ss->listener_text_color; break; + + case 14: col = ss->basic_color; break; + case 15: col = ss->selection_color; break; + case 16: col = ss->zoom_color; break; + case 17: col = ss->position_color; break; + case 18: col = ss->highlight_color; break; + case 19: col = ss->enved_waveform_color; break; + case 20: col = ss->cursor_color; break; + + case 21: col = ss->text_focus_color; break; + case 22: col = ss->filter_control_waveform_color; break; + case 23: col = ss->mix_color; break; + case 25: col = ss->sash_color; break; + + case 31: col = ss->grid_color; break; + case 32: col = ss->selected_grid_color; break; case 33: - if (ss->sgx->axis_color_set) - col = ss->sgx->axis_color; - else col = ss->sgx->black; + if (ss->axis_color_set) + col = ss->axis_color; + else col = ss->black; break; - default: col = ss->sgx->black; break; + default: col = ss->black; break; } return(XEN_WRAP_PIXEL(col)); } @@ -1123,20 +1162,20 @@ static XEN g_snd_font(XEN choice) switch (XEN_TO_C_INT(choice)) { #if USE_MOTIF - case 0: return(WRAP_FONT(ss->sgx->peaks_fontstruct->fid)); break; - case 1: return(WRAP_FONT(ss->sgx->bold_peaks_fontstruct->fid)); break; - case 2: return(WRAP_FONT(ss->sgx->tiny_fontstruct->fid)); break; - case 3: return(WRAP_FONT(ss->sgx->axis_label_fontstruct->fid)); break; - case 4: return(WRAP_FONT(ss->sgx->axis_numbers_fontstruct->fid)); break; - case 5: return(WRAP_FONT(ss->sgx->listener_fontstruct->fid)); break; + case 0: return(WRAP_FONT(ss->peaks_fontstruct->fid)); break; + case 1: return(WRAP_FONT(ss->bold_peaks_fontstruct->fid)); break; + case 2: return(WRAP_FONT(ss->tiny_fontstruct->fid)); break; + case 3: return(WRAP_FONT(ss->axis_label_fontstruct->fid)); break; + case 4: return(WRAP_FONT(ss->axis_numbers_fontstruct->fid)); break; + case 5: return(WRAP_FONT(ss->listener_fontstruct->fid)); break; #endif #if USE_GTK - case 0: return(WRAP_FONT(ss->sgx->peaks_fnt)); break; - case 1: return(WRAP_FONT(ss->sgx->bold_peaks_fnt)); break; - case 2: return(WRAP_FONT(ss->sgx->tiny_fnt)); break; - case 3: return(WRAP_FONT(ss->sgx->axis_label_fnt)); break; - case 4: return(WRAP_FONT(ss->sgx->axis_numbers_fnt)); break; - case 5: return(WRAP_FONT(ss->sgx->listener_fnt)); break; + case 0: return(WRAP_FONT(ss->peaks_fnt)); break; + case 1: return(WRAP_FONT(ss->bold_peaks_fnt)); break; + case 2: return(WRAP_FONT(ss->tiny_fnt)); break; + case 3: return(WRAP_FONT(ss->axis_label_fnt)); break; + case 4: return(WRAP_FONT(ss->axis_numbers_fnt)); break; + case 5: return(WRAP_FONT(ss->listener_fnt)); break; #endif default: return(XEN_FALSE); break; } @@ -1144,6 +1183,47 @@ static XEN g_snd_font(XEN choice) } +static XEN g_make_cairo(XEN drawer) +{ + #define H_make_cairo "(" S_make_cairo " widget) in gtk, this returns a new cairo_t to draw on the widget." + +#if USE_GTK + #define C_TO_XEN_cairo_t(Value) XEN_LIST_2(C_STRING_TO_XEN_SYMBOL("cairo_t_"), XEN_WRAP_C_POINTER(Value)) + cairo_t *cr; + + XEN_ASSERT_TYPE(XEN_WIDGET_P(drawer), drawer, XEN_ONLY_ARG, S_make_cairo, "a widget"); + +#if (!HAVE_GTK_3) + cr = MAKE_CAIRO(GDK_DRAWABLE(gtk_widget_get_window(XEN_UNWRAP_WIDGET(drawer)))); +#else + cr = MAKE_CAIRO(GDK_WINDOW(gtk_widget_get_window(XEN_UNWRAP_WIDGET(drawer)))); +#endif + + return(C_TO_XEN_cairo_t(cr)); +#endif + + return(XEN_FALSE); +} + + +static XEN g_free_cairo(XEN xcr) +{ + #define H_free_cairo "(" S_free_cairo " cr) in gtk, this frees (destroys) the cairo_t 'cr'." + +#if USE_GTK + if ((XEN_LIST_P(xcr)) && + (XEN_LIST_LENGTH(xcr) == 2) && + (XEN_SYMBOL_P(XEN_CAR(xcr))) && + (strcmp("cairo_t_", XEN_SYMBOL_TO_C_STRING(XEN_CAR(xcr))) == 0)) + FREE_CAIRO((cairo_t *)XEN_UNWRAP_C_POINTER(XEN_CADR(xcr))); + else + XEN_ERROR(XEN_ERROR_TYPE("not-a-graphics-context"), + XEN_LIST_2(C_TO_XEN_STRING(S_free_cairo ": cairo_t argument is not a cairo_t pointer: ~A"), xcr)); +#endif + return(XEN_FALSE); +} + + #if HAVE_GL static mus_float_t gl_currents[6] = {DEFAULT_SPECTRO_X_ANGLE, DEFAULT_SPECTRO_Y_ANGLE, DEFAULT_SPECTRO_Z_ANGLE, DEFAULT_SPECTRO_X_SCALE, DEFAULT_SPECTRO_Y_SCALE, DEFAULT_SPECTRO_Z_SCALE}; @@ -1215,7 +1295,7 @@ static XEN g_set_cursor_color(XEN color) static XEN g_cursor_color(void) { #define H_cursor_color "(" S_cursor_color "): cursor color" - return(XEN_WRAP_PIXEL(ss->sgx->cursor_color)); + return(XEN_WRAP_PIXEL(ss->cursor_color)); } @@ -1227,7 +1307,7 @@ static void highlight_recolor_everything(widget_t w, color_t color) { XtVaGetValues(w, XmNbackground, &curcol, NULL); if (curcol == color) - XmChangeColor(w, ss->sgx->highlight_color); + XmChangeColor(w, ss->highlight_color); } /* to handle the gtk side correctly here, we'd need a list of widgets to modify -- * currently basic-color hits every background, so the whole thing is messed up. @@ -1239,8 +1319,8 @@ static void highlight_recolor_everything(widget_t w, color_t color) void set_highlight_color(color_t color) { color_t old_color; - old_color = ss->sgx->highlight_color; - ss->sgx->highlight_color = color; + old_color = ss->highlight_color; + ss->highlight_color = color; #if USE_MOTIF map_over_children_with_color(MAIN_SHELL(ss), highlight_recolor_everything, old_color); #endif @@ -1258,7 +1338,7 @@ static XEN g_set_highlight_color(XEN color) static XEN g_highlight_color(void) { #define H_highlight_color "(" S_highlight_color "): color of highlighted text or buttons" - return(XEN_WRAP_PIXEL(ss->sgx->highlight_color)); + return(XEN_WRAP_PIXEL(ss->highlight_color)); } @@ -1274,14 +1354,14 @@ static XEN g_set_mark_color(XEN color) static XEN g_mark_color(void) { #define H_mark_color "(" S_mark_color "): mark color" - return(XEN_WRAP_PIXEL(ss->sgx->mark_color)); + return(XEN_WRAP_PIXEL(ss->mark_color)); } void set_zoom_color(color_t color) { - ss->sgx->zoom_color = color; - color_chan_components(ss->sgx->zoom_color, COLOR_ZOOM); + ss->zoom_color = color; + color_chan_components(ss->zoom_color, COLOR_ZOOM); } @@ -1296,14 +1376,14 @@ static XEN g_set_zoom_color(XEN color) static XEN g_zoom_color(void) { #define H_zoom_color "(" S_zoom_color "): color of zoom sliders" - return(XEN_WRAP_PIXEL(ss->sgx->zoom_color)); + return(XEN_WRAP_PIXEL(ss->zoom_color)); } void set_position_color(color_t color) { - ss->sgx->position_color = color; - color_chan_components(ss->sgx->position_color, COLOR_POSITION); + ss->position_color = color; + color_chan_components(ss->position_color, COLOR_POSITION); } @@ -1318,7 +1398,7 @@ static XEN g_set_position_color(XEN color) static XEN g_position_color(void) { #define H_position_color "(" S_position_color "): color of position sliders" - return(XEN_WRAP_PIXEL(ss->sgx->position_color)); + return(XEN_WRAP_PIXEL(ss->position_color)); } @@ -1333,7 +1413,7 @@ static XEN g_set_listener_color(XEN color) static XEN g_listener_color(void) { #define H_listener_color "(" S_listener_color "): background color of the lisp listener" - return(XEN_WRAP_PIXEL(ss->sgx->listener_color)); + return(XEN_WRAP_PIXEL(ss->listener_color)); } @@ -1348,7 +1428,7 @@ static XEN g_set_listener_text_color(XEN color) static XEN g_listener_text_color(void) { #define H_listener_text_color "(" S_listener_text_color "): text color in the lisp listener" - return(XEN_WRAP_PIXEL(ss->sgx->listener_text_color)); + return(XEN_WRAP_PIXEL(ss->listener_text_color)); } @@ -1363,7 +1443,7 @@ static XEN g_set_enved_waveform_color(XEN color) static XEN g_enved_waveform_color(void) { #define H_enved_waveform_color "(" S_enved_waveform_color "): color of the envelope editor wave display" - return(XEN_WRAP_PIXEL(ss->sgx->enved_waveform_color)); + return(XEN_WRAP_PIXEL(ss->enved_waveform_color)); } @@ -1378,7 +1458,7 @@ static XEN g_set_filter_control_waveform_color(XEN color) static XEN g_filter_control_waveform_color(void) { #define H_filter_control_waveform_color "(" S_filter_control_waveform_color "): color of the filter waveform" - return(XEN_WRAP_PIXEL(ss->sgx->filter_control_waveform_color)); + return(XEN_WRAP_PIXEL(ss->filter_control_waveform_color)); } @@ -1394,14 +1474,14 @@ static XEN g_set_selection_color(XEN color) static XEN g_selection_color(void) { #define H_selection_color "(" S_selection_color "): selection color" - return(XEN_WRAP_PIXEL(ss->sgx->selection_color)); + return(XEN_WRAP_PIXEL(ss->selection_color)); } static XEN g_set_text_focus_color(XEN color) { XEN_ASSERT_TYPE(XEN_PIXEL_P(color), color, XEN_ONLY_ARG, S_setB S_text_focus_color, "a color"); - ss->sgx->text_focus_color = XEN_UNWRAP_PIXEL(color); + ss->text_focus_color = XEN_UNWRAP_PIXEL(color); return(color); } @@ -1409,14 +1489,14 @@ static XEN g_set_text_focus_color(XEN color) static XEN g_text_focus_color(void) { #define H_text_focus_color "(" S_text_focus_color "): color used to show a text field has focus" - return(XEN_WRAP_PIXEL(ss->sgx->text_focus_color)); + return(XEN_WRAP_PIXEL(ss->text_focus_color)); } static XEN g_set_sash_color(XEN color) { XEN_ASSERT_TYPE(XEN_PIXEL_P(color), color, XEN_ONLY_ARG, S_setB S_sash_color, "a color"); - ss->sgx->sash_color = XEN_UNWRAP_PIXEL(color); + ss->sash_color = XEN_UNWRAP_PIXEL(color); return(color); } @@ -1424,21 +1504,21 @@ static XEN g_set_sash_color(XEN color) static XEN g_sash_color(void) { #define H_sash_color "(" S_sash_color "): color used to draw paned window sashes" - return(XEN_WRAP_PIXEL(ss->sgx->sash_color)); + return(XEN_WRAP_PIXEL(ss->sash_color)); } static XEN g_data_color(void) { #define H_data_color "(" S_data_color "): color used to draw unselected data" - return(XEN_WRAP_PIXEL(ss->sgx->data_color)); + return(XEN_WRAP_PIXEL(ss->data_color)); } void set_data_color(color_t color) { color_data(color); - ss->sgx->grid_color = get_in_between_color(ss->sgx->data_color, ss->sgx->graph_color); + ss->grid_color = get_in_between_color(ss->data_color, ss->graph_color); for_each_chan(update_graph); } @@ -1455,7 +1535,7 @@ void set_selected_data_color(color_t color) { chan_info *cp; color_selected_data(color); - ss->sgx->selected_grid_color = get_in_between_color(ss->sgx->selected_data_color, ss->sgx->selected_graph_color); + ss->selected_grid_color = get_in_between_color(ss->selected_data_color, ss->selected_graph_color); cp = selected_channel(); if (cp) update_graph(cp); } @@ -1472,7 +1552,7 @@ static XEN g_set_selected_data_color(XEN color) static XEN g_selected_data_color(void) { #define H_selected_data_color "(" S_selected_data_color "): color used for selected data" - return(XEN_WRAP_PIXEL(ss->sgx->selected_data_color)); + return(XEN_WRAP_PIXEL(ss->selected_data_color)); } @@ -1480,7 +1560,7 @@ void set_graph_color(color_t color) { color_graph(color); color_unselected_graphs(color); - ss->sgx->grid_color = get_in_between_color(ss->sgx->data_color, ss->sgx->graph_color); + ss->grid_color = get_in_between_color(ss->data_color, ss->graph_color); } @@ -1495,7 +1575,7 @@ static XEN g_set_graph_color(XEN color) static XEN g_graph_color(void) { #define H_graph_color "(" S_graph_color "): background color used for unselected data" - return(XEN_WRAP_PIXEL(ss->sgx->graph_color)); + return(XEN_WRAP_PIXEL(ss->graph_color)); } @@ -1503,14 +1583,14 @@ void set_selected_graph_color(color_t color) { chan_info *cp; color_selected_graph(color); - ss->sgx->selected_grid_color = get_in_between_color(ss->sgx->selected_data_color, ss->sgx->selected_graph_color); + ss->selected_grid_color = get_in_between_color(ss->selected_data_color, ss->selected_graph_color); cp = selected_channel(); if (cp) { #if USE_MOTIF - XtVaSetValues(channel_graph(cp), XmNbackground, ss->sgx->selected_graph_color, NULL); + XtVaSetValues(channel_graph(cp), XmNbackground, ss->selected_graph_color, NULL); #else - widget_modify_bg(channel_graph(cp), GTK_STATE_NORMAL, ss->sgx->selected_graph_color); + widget_modify_bg(channel_graph(cp), GTK_STATE_NORMAL, ss->selected_graph_color); #endif } } @@ -1527,15 +1607,15 @@ static XEN g_set_selected_graph_color(XEN color) static XEN g_selected_graph_color(void) { #define H_selected_graph_color "(" S_selected_graph_color "): background color of selected data" - return(XEN_WRAP_PIXEL(ss->sgx->selected_graph_color)); + return(XEN_WRAP_PIXEL(ss->selected_graph_color)); } static XEN g_set_axis_color(XEN color) { XEN_ASSERT_TYPE(XEN_PIXEL_P(color), color, XEN_ONLY_ARG, S_setB S_axis_color, "a color"); - ss->sgx->axis_color = XEN_UNWRAP_PIXEL(color); - ss->sgx->axis_color_set = true; + ss->axis_color = XEN_UNWRAP_PIXEL(color); + ss->axis_color_set = true; for_each_chan(update_graph); return(color); } @@ -1544,33 +1624,60 @@ static XEN g_set_axis_color(XEN color) static XEN g_axis_color(void) { #define H_axis_color "(" S_axis_color "): color of axis (defaults to current data color)" - return(XEN_WRAP_PIXEL(ss->sgx->axis_color)); + return(XEN_WRAP_PIXEL(ss->axis_color)); } static XEN g_basic_color(void) { #define H_basic_color "(" S_basic_color "): Snd's basic color" - return(XEN_WRAP_PIXEL(ss->sgx->basic_color)); + return(XEN_WRAP_PIXEL(ss->basic_color)); } #if USE_GTK + +#if HAVE_GTK_3 +static bool is_dark(color_info *color) +{ + return(color->red + color->green + color->blue < 0.75); +} +#endif + static void recolor_everything_1(widget_t w, gpointer color) { - if (GTK_IS_WIDGET(w)) + if ((GTK_IS_WIDGET(w)) && + (w != ss->listener_pane)) { +#if (!HAVE_GTK_3) gtk_widget_modify_bg(w, GTK_STATE_NORMAL, (GdkColor *)color); if (GTK_IS_CONTAINER(w)) gtk_container_foreach(GTK_CONTAINER(w), recolor_everything_1, color); +#else + gtk_widget_override_background_color(w, GTK_STATE_NORMAL, (GdkRGBA *)color); + if (GTK_IS_LABEL(w)) + { + if (is_dark(color)) + gtk_widget_override_color(w, GTK_STATE_NORMAL, (GdkRGBA *)(ss->white)); + else gtk_widget_override_color(w, GTK_STATE_NORMAL, (GdkRGBA *)(ss->black)); + } + + if (GTK_IS_CONTAINER(w)) + gtk_container_foreach(GTK_CONTAINER(w), recolor_everything_1, color); +#endif } } -static void recolor_everything(widget_t w, gpointer color) +void recolor_everything(widget_t w, gpointer color) { +#if (!HAVE_GTK_3) GdkColor *nc; nc = rgb_to_gdk_color((color_t)color); +#else + GdkRGBA *nc; + nc = (GdkRGBA *)color; +#endif recolor_everything_1(w, (gpointer)nc); } @@ -1581,15 +1688,16 @@ static XEN g_color_to_list(XEN obj) color_info *v; XEN_ASSERT_TYPE(XEN_PIXEL_P(obj), obj, XEN_ONLY_ARG, S_color_to_list, "a color"); v = XEN_UNWRAP_PIXEL(obj); - return(XEN_LIST_3(C_TO_XEN_DOUBLE(RGB_TO_FLOAT(v->red)), + return(XEN_LIST_4(C_TO_XEN_DOUBLE(RGB_TO_FLOAT(v->red)), C_TO_XEN_DOUBLE(RGB_TO_FLOAT(v->green)), - C_TO_XEN_DOUBLE(RGB_TO_FLOAT(v->blue)))); + C_TO_XEN_DOUBLE(RGB_TO_FLOAT(v->blue)), + C_TO_XEN_DOUBLE(v->alpha))); } -static XEN g_make_color(XEN r, XEN g, XEN b) +static XEN g_make_color(XEN r, XEN g, XEN b, XEN alpha) { - #define H_make_color "(" S_make_color " r g b): return a color object with the indicated rgb values" + #define H_make_color "(" S_make_color " r g b alpha): return a color object with the indicated rgb values" color_info *ccolor; mus_float_t rf, gf, bf; @@ -1601,10 +1709,15 @@ static XEN g_make_color(XEN r, XEN g, XEN b) rf = check_color_range(S_make_color, r); gf = check_color_range(S_make_color, g); bf = check_color_range(S_make_color, b); - ccolor = (color_info *)calloc(1, sizeof(color_info)); /* memleak here -- need color smob + free to deal with this */ + ccolor = (color_info *)calloc(1, sizeof(color_info)); /* memleak here */ ccolor->red = rf; ccolor->green = gf; ccolor->blue = bf; + + if (XEN_NUMBER_P(alpha)) + ccolor->alpha = check_color_range(S_make_color, alpha); + else ccolor->alpha = 1.0; + return(XEN_WRAP_PIXEL(ccolor)); } #endif @@ -1619,7 +1732,7 @@ static void recolor_everything(widget_t w, color_t color) { XtVaGetValues(w, XmNbackground, &curcol, NULL); if (curcol == color) - XmChangeColor(w, ss->sgx->basic_color); + XmChangeColor(w, ss->basic_color); } } @@ -1643,8 +1756,9 @@ static XEN g_color_to_list(XEN obj) } -static XEN g_make_color(XEN r, XEN g, XEN b) +static XEN g_make_color(XEN r, XEN g, XEN b, XEN alpha) { + /* alpha is ignored in Motif */ #define H_make_color "(" S_make_color " r g b): return a color object with the indicated rgb values" Colormap cmap; XColor tmp_color; @@ -1679,8 +1793,8 @@ static XEN g_make_color(XEN r, XEN g, XEN b) void set_basic_color(color_t color) { color_t old_color; - old_color = ss->sgx->basic_color; - ss->sgx->basic_color = color; + old_color = ss->basic_color; + ss->basic_color = color; #if USE_MOTIF map_over_children_with_color(MAIN_SHELL(ss), recolor_everything, old_color); #endif @@ -1688,9 +1802,9 @@ void set_basic_color(color_t color) recolor_everything(MAIN_SHELL(ss), color); #endif -#if HAVE_XPM && USE_MOTIF - make_sound_icons_transparent_again(old_color, ss->sgx->basic_color); - make_mixer_icons_transparent_again(old_color, ss->sgx->basic_color); +#if USE_MOTIF + make_sound_icons_transparent_again(old_color, ss->basic_color); + make_mixer_icons_transparent_again(old_color, ss->basic_color); #endif } @@ -1708,7 +1822,7 @@ static XEN g_mix_color(XEN mix_id) #define H_mix_color "(" S_mix_color " :optional mix-id): color of all mix tags (if mix-id is omitted), or of mix-id's tag" if (XEN_MIX_P(mix_id)) return(XEN_WRAP_PIXEL(mix_color_from_id(XEN_MIX_TO_C_INT(mix_id)))); - return(XEN_WRAP_PIXEL(ss->sgx->mix_color)); + return(XEN_WRAP_PIXEL(ss->mix_color)); } @@ -1736,14 +1850,45 @@ bool foreground_color_ok(XEN color, graphics_context *ax) } + +static XEN g_combined_data_color(XEN snd, XEN chn) +{ + #define H_combined_data_color "(" S_combined_data_color " snd chn): color of this channel's data if graphed with channels-combined" + chan_info *cp; + + ASSERT_CHANNEL(S_combined_data_color, snd, chn, 1); + cp = get_cp(snd, chn, S_combined_data_color); + if (!cp) return(XEN_FALSE); + + return(XEN_WRAP_PIXEL(cp->combined_data_color)); +} + + +static XEN g_set_combined_data_color(XEN color, XEN snd, XEN chn) +{ + chan_info *cp; + + XEN_ASSERT_TYPE(XEN_PIXEL_P(color), color, XEN_ARG_1, S_setB S_combined_data_color, "a color"); + ASSERT_CHANNEL(S_combined_data_color, snd, chn, 1); + cp = get_cp(snd, chn, S_combined_data_color); + if (!cp) return(XEN_FALSE); + + cp->combined_data_color = XEN_UNWRAP_PIXEL(color); + return(color); +} + +WITH_THREE_SETTER_ARGS(g_set_combined_data_color_reversed, g_set_combined_data_color) + + + #ifdef XEN_ARGIFY_1 -XEN_ARGIFY_7(g_draw_line_w, g_draw_line) -XEN_ARGIFY_6(g_draw_dot_w, g_draw_dot) -XEN_ARGIFY_4(g_draw_lines_w, g_draw_lines) -XEN_ARGIFY_5(g_draw_dots_w, g_draw_dots) -XEN_ARGIFY_6(g_draw_string_w, g_draw_string) -XEN_ARGIFY_8(g_fill_rectangle_w, g_fill_rectangle) -XEN_ARGIFY_4(g_fill_polygon_w, g_fill_polygon) +XEN_ARGIFY_8(g_draw_line_w, g_draw_line) +XEN_ARGIFY_7(g_draw_dot_w, g_draw_dot) +XEN_ARGIFY_5(g_draw_lines_w, g_draw_lines) +XEN_ARGIFY_6(g_draw_dots_w, g_draw_dots) +XEN_ARGIFY_7(g_draw_string_w, g_draw_string) +XEN_ARGIFY_9(g_fill_rectangle_w, g_fill_rectangle) +XEN_ARGIFY_5(g_fill_polygon_w, g_fill_polygon) XEN_ARGIFY_3(g_foreground_color_w, g_foreground_color) XEN_ARGIFY_4(g_set_foreground_color_w, g_set_foreground_color) XEN_ARGIFY_3(g_current_font_w, g_current_font) @@ -1760,11 +1905,13 @@ XEN_NARGIFY_1(g_hide_widget_w, g_hide_widget) XEN_NARGIFY_1(g_show_widget_w, g_show_widget) XEN_NARGIFY_1(g_focus_widget_w, g_focus_widget) XEN_ARGIFY_5(g_make_graph_data_w, g_make_graph_data) -XEN_ARGIFY_7(g_graph_data_w, g_graph_data) +XEN_ARGIFY_8(g_graph_data_w, g_graph_data) XEN_VARGIFY(g_make_bezier_w, g_make_bezier) XEN_NARGIFY_0(g_snd_gcs_w, g_snd_gcs) XEN_NARGIFY_1(g_snd_color_w, g_snd_color) XEN_NARGIFY_1(g_snd_font_w, g_snd_font) +XEN_NARGIFY_1(g_make_cairo_w, g_make_cairo) +XEN_NARGIFY_1(g_free_cairo_w, g_free_cairo) XEN_NARGIFY_0(g_selection_color_w, g_selection_color) XEN_NARGIFY_1(g_set_selection_color_w, g_set_selection_color) @@ -1803,10 +1950,12 @@ XEN_NARGIFY_1(g_set_axis_color_w, g_set_axis_color) XEN_NARGIFY_0(g_basic_color_w, g_basic_color) XEN_NARGIFY_1(g_set_basic_color_w, g_set_basic_color) XEN_NARGIFY_1(g_color_p_w, g_color_p) -XEN_NARGIFY_3(g_make_color_w, g_make_color) +XEN_ARGIFY_4(g_make_color_w, g_make_color) XEN_NARGIFY_1(g_color_to_list_w, g_color_to_list) XEN_ARGIFY_1(g_mix_color_w, g_mix_color) XEN_ARGIFY_2(g_set_mix_color_w, g_set_mix_color) +XEN_NARGIFY_2(g_combined_data_color_w, g_combined_data_color) +XEN_NARGIFY_3(g_set_combined_data_color_w, g_set_combined_data_color) #else @@ -1838,6 +1987,8 @@ XEN_ARGIFY_2(g_set_mix_color_w, g_set_mix_color) #define g_snd_gcs_w g_snd_gcs #define g_snd_color_w g_snd_color #define g_snd_font_w g_snd_font +#define g_make_cairo_w g_make_cairo +#define g_free_cairo_w g_free_cairo #define g_selection_color_w g_selection_color #define g_set_selection_color_w g_set_selection_color @@ -1880,6 +2031,8 @@ XEN_ARGIFY_2(g_set_mix_color_w, g_set_mix_color) #define g_color_to_list_w g_color_to_list #define g_mix_color_w g_mix_color #define g_set_mix_color_w g_set_mix_color +#define g_combined_data_color_w g_combined_data_color +#define g_set_combined_data_color_w g_set_combined_data_color #endif @@ -1892,13 +2045,13 @@ void g_init_draw(void) XEN_DEFINE_CONSTANT(S_selection_context, CHAN_SELGC, "graphics context to draw in the selection color"); XEN_DEFINE_CONSTANT(S_mark_context, CHAN_MGC, "graphics context for a mark"); - XEN_DEFINE_PROCEDURE(S_draw_line, g_draw_line_w, 4, 3, 0, H_draw_line); - XEN_DEFINE_PROCEDURE(S_draw_dot, g_draw_dot_w, 2, 4, 0, H_draw_dot); - XEN_DEFINE_PROCEDURE(S_draw_lines, g_draw_lines_w, 1, 3, 0, H_draw_lines); - XEN_DEFINE_PROCEDURE(S_draw_dots, g_draw_dots_w, 1, 4, 0, H_draw_dots); - XEN_DEFINE_PROCEDURE(S_draw_string, g_draw_string_w, 3, 3, 0, H_draw_string); - XEN_DEFINE_PROCEDURE(S_fill_rectangle, g_fill_rectangle_w, 4, 4, 0, H_fill_rectangle); - XEN_DEFINE_PROCEDURE(S_fill_polygon, g_fill_polygon_w, 1, 3, 0, H_fill_polygon); + XEN_DEFINE_PROCEDURE(S_draw_line, g_draw_line_w, 4, 4, 0, H_draw_line); + XEN_DEFINE_PROCEDURE(S_draw_dot, g_draw_dot_w, 2, 5, 0, H_draw_dot); + XEN_DEFINE_PROCEDURE(S_draw_lines, g_draw_lines_w, 1, 4, 0, H_draw_lines); + XEN_DEFINE_PROCEDURE(S_draw_dots, g_draw_dots_w, 1, 5, 0, H_draw_dots); + XEN_DEFINE_PROCEDURE(S_draw_string, g_draw_string_w, 3, 4, 0, H_draw_string); + XEN_DEFINE_PROCEDURE(S_fill_rectangle, g_fill_rectangle_w, 4, 5, 0, H_fill_rectangle); + XEN_DEFINE_PROCEDURE(S_fill_polygon, g_fill_polygon_w, 1, 4, 0, H_fill_polygon); XEN_DEFINE_PROCEDURE(S_main_widgets, g_main_widgets_w, 0, 0, 0, H_main_widgets); XEN_DEFINE_PROCEDURE(S_dialog_widgets, g_dialog_widgets_w, 0, 0, 0, H_dialog_widgets); XEN_DEFINE_PROCEDURE(S_hide_widget, g_hide_widget_w, 1, 0, 0, H_hide_widget); @@ -1906,7 +2059,7 @@ void g_init_draw(void) XEN_DEFINE_PROCEDURE(S_focus_widget, g_focus_widget_w, 1, 0, 0, H_focus_widget); XEN_DEFINE_PROCEDURE(S_make_graph_data, g_make_graph_data_w, 0, 5, 0, H_make_graph_data); - XEN_DEFINE_PROCEDURE(S_graph_data, g_graph_data_w, 1, 6, 0, H_graph_data); + XEN_DEFINE_PROCEDURE(S_graph_data, g_graph_data_w, 1, 7, 0, H_graph_data); XEN_DEFINE_PROCEDURE_WITH_REVERSED_SETTER(S_foreground_color, g_foreground_color_w, H_foreground_color, S_setB S_foreground_color, g_set_foreground_color_w, g_set_foreground_color_reversed, 0, 3, 1, 3); @@ -1981,18 +2134,21 @@ void g_init_draw(void) XEN_DEFINE_PROCEDURE_WITH_REVERSED_SETTER(S_mix_color, g_mix_color_w, H_mix_color, S_setB S_mix_color, g_set_mix_color_w, g_set_mix_color_reversed, 0, 1, 1, 1); + XEN_DEFINE_PROCEDURE_WITH_REVERSED_SETTER(S_combined_data_color, g_combined_data_color_w, H_combined_data_color, + S_setB S_combined_data_color, g_set_combined_data_color_w, g_set_combined_data_color_reversed, 2, 0, 3, 0); + XEN_DEFINE_PROCEDURE(S_color_p, g_color_p_w, 1, 0, 0, H_color_p); - XEN_DEFINE_PROCEDURE(S_make_color, g_make_color_w, 3, 0, 0, H_make_color); + XEN_DEFINE_PROCEDURE(S_make_color, g_make_color_w, 3, 1, 0, H_make_color); XEN_DEFINE_PROCEDURE(S_color_to_list, g_color_to_list_w, 1, 0, 0, H_color_to_list); - - /* ---------------- unstable ---------------- */ - XEN_DEFINE_PROCEDURE(S_make_bezier, g_make_bezier_w, 0, 0, 1, H_make_bezier); XEN_DEFINE_PROCEDURE(S_snd_gcs, g_snd_gcs_w, 0, 0, 0, H_snd_gcs); XEN_DEFINE_PROCEDURE(S_snd_color, g_snd_color_w, 1, 0, 0, H_snd_color); XEN_DEFINE_PROCEDURE(S_snd_font, g_snd_font_w, 1, 0, 0, H_snd_font); + XEN_DEFINE_PROCEDURE(S_make_cairo, g_make_cairo_w, 1, 0, 0, H_make_cairo); + XEN_DEFINE_PROCEDURE(S_free_cairo, g_free_cairo_w, 1, 0, 0, H_free_cairo); + #define H_new_widget_hook S_new_widget_hook " (widget): called each time a dialog or \ a new set of channel or sound widgets is created." @@ -2000,15 +2156,13 @@ a new set of channel or sound widgets is created." } #else -/* no gui */ +/* no gui -- extension lang tie-ins are in snd-nogui.c */ void set_grf_points(int xi, int j, int ymin, int ymax) {} void set_grf_point(int xi, int j, int yi) {} void draw_grf_points(int dot_size, graphics_context *ax, int j, axis_info *ap, mus_float_t y0, graph_style_t graph_style) {} void draw_both_grf_points(int dot_size, graphics_context *ax, int j, graph_style_t graph_style) {} void draw_cursor(chan_info *cp) {} -void erase_cursor(chan_info *cp) {} point_t *get_grf_points(void) {return(NULL);} point_t *get_grf_points1(void) {return(NULL);} bool foreground_color_ok(XEN color, graphics_context *ax) {return(true);} #endif - |