// ---------------------------------------------------------------------- // // Copyright (C) 2010 Fons Adriaensen // Modified by falkTX on Jan-Apr 2015 for inclusion in Carla // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // ---------------------------------------------------------------------- #include #include #include #include "styles.h" #include "global.h" #include "mainwin.h" namespace REV1 { Mainwin::Mainwin (X_rootwin *parent, X_resman *xres, int xp, int yp, bool ambisonic, ValueChangedCallback* valuecb) : A_thread ("Main"), X_window (parent, xp, yp, XSIZE, YSIZE, XftColors [C_MAIN_BG]->pixel), _stop (false), _ambis (ambisonic), _xres (xres), _valuecb (valuecb) { X_hints H; int i, x; _atom = XInternAtom (dpy (), "WM_DELETE_WINDOW", True); XSetWMProtocols (dpy (), win (), &_atom, 1); _atom = XInternAtom (dpy (), "WM_PROTOCOLS", True); H.position (xp, yp); H.minsize (XSIZE, YSIZE); H.maxsize (XSIZE, YSIZE); H.rname (xres->rname ()); H.rclas (xres->rclas ()); x_apply (&H); RotaryCtl::init (disp ()); x = 0; _rotary [R_DELAY] = new Rlinctl (this, this, &r_delay_img, x, 0, 160, 5, 0.02, 0.100, 0.04, R_DELAY); _rotary [R_XOVER] = new Rlogctl (this, this, &r_xover_img, x, 0, 200, 5, 50.0, 1000.0, 200.0, R_XOVER); _rotary [R_RTLOW] = new Rlogctl (this, this, &r_rtlow_img, x, 0, 200, 5, 1.0, 8.0, 3.0, R_RTLOW); _rotary [R_RTMID] = new Rlogctl (this, this, &r_rtmid_img, x, 0, 200, 5, 1.0, 8.0, 2.0, R_RTMID); _rotary [R_FDAMP] = new Rlogctl (this, this, &r_fdamp_img, x, 0, 200, 5, 1.5e3, 24.0e3, 6.0e3, R_FDAMP); x += 315; _rotary [R_EQ1FR] = new Rlogctl (this, this, &r_parfr_img, x, 0, 180, 5, 40.0, 2.5e3, 160.0, R_EQ1FR); _rotary [R_EQ1GN] = new Rlinctl (this, this, &r_pargn_img, x, 0, 150, 5, -15.0, 15.0, 0.0, R_EQ1GN); x += 110; _rotary [R_EQ2FR] = new Rlogctl (this, this, &r_parfr_img, x, 0, 180, 5, 160.0, 10e3, 2.5e3, R_EQ2FR); _rotary [R_EQ2GN] = new Rlinctl (this, this, &r_pargn_img, x, 0, 150, 5, -15.0, 15.0, 0.0, R_EQ2GN); x += 110; _rotary [R_OPMIX] = new Rlinctl (this, this, &r_opmix_img, x, 0, 180, 5, 0.0 , 1.0, 0.5, R_OPMIX); _rotary [R_RGXYZ] = new Rlinctl (this, this, &r_rgxyz_img, x, 0, 180, 5, -9.0 , 9.0, 0.0, R_RGXYZ); for (i = 0; i < R_OPMIX; i++) _rotary [i]->x_map (); if (_ambis) _rotary [R_RGXYZ]->x_map (); else _rotary [R_OPMIX]->x_map (); x_add_events (ExposureMask); set_time (0); inc_time (50000); } Mainwin::~Mainwin (void) { RotaryCtl::fini (); } int Mainwin::process (void) { int e; if (_stop) handle_stop (); e = get_event_timed (); switch (e) { case EV_TIME: handle_time (); break; } return e; } void Mainwin::handle_event (XEvent *E) { switch (E->type) { case Expose: expose ((XExposeEvent *) E); break; case ClientMessage: clmesg ((XClientMessageEvent *) E); break; } } void Mainwin::expose (XExposeEvent *E) { if (E->count) return; redraw (); } void Mainwin::clmesg (XClientMessageEvent *E) { if (E->message_type == _atom) _stop = true; } void Mainwin::handle_time (void) { inc_time (5000); XFlush (dpy ()); } void Mainwin::handle_stop (void) { put_event (EV_EXIT, 1); } void Mainwin::handle_callb (int type, X_window *W, XEvent *E) { RotaryCtl *R; int k; double v, v2; switch (type) { case RotaryCtl::PRESS: R = (RotaryCtl *) W; k = R->cbind (); switch (k) { default: ; } break; case RotaryCtl::DELTA: R = (RotaryCtl *) W; k = R->cbind (); switch (k) { case R_DELAY: v = _rotary [R_DELAY]->value (); _valuecb->valueChangedCallback (R_DELAY, v); break; case R_XOVER: v = _rotary [R_XOVER]->value (); _valuecb->valueChangedCallback (R_XOVER, v); break; case R_RTLOW: v = _rotary [R_RTLOW]->value (); _valuecb->valueChangedCallback (R_RTLOW, v); break; case R_RTMID: v = _rotary [R_RTMID]->value (); _valuecb->valueChangedCallback (R_RTMID, v); break; case R_FDAMP: v = _rotary [R_FDAMP]->value (); _valuecb->valueChangedCallback (R_FDAMP, v); break; case R_OPMIX: v = _rotary [R_OPMIX]->value (); _valuecb->valueChangedCallback (R_OPMIX, v); break; case R_RGXYZ: v = _rotary [R_RGXYZ]->value (); _valuecb->valueChangedCallback (R_RGXYZ, v); break; case R_EQ1FR: case R_EQ1GN: v = _rotary [R_EQ1FR]->value (), v2 = _rotary [R_EQ1GN]->value (); _valuecb->valueChangedCallback (R_EQ1FR, v); _valuecb->valueChangedCallback (R_EQ1GN, v2); break; case R_EQ2FR: case R_EQ2GN: v = _rotary [R_EQ2FR]->value (), v2 = _rotary [R_EQ2GN]->value (); _valuecb->valueChangedCallback (R_EQ2FR, v); _valuecb->valueChangedCallback (R_EQ2GN, v2); break; } break; } } void Mainwin::redraw (void) { int x; x = 0; XPutImage (dpy (), win (), dgc (), revsect_img, 0, 0, x, 0, 310, 75); x += 315; XPutImage (dpy (), win (), dgc (), eq1sect_img, 0, 0, x, 0, 110, 75); x += 110; XPutImage (dpy (), win (), dgc (), eq2sect_img, 0, 0, x, 0, 110, 75); x += 110; if (_ambis) XPutImage (dpy (), win (), dgc (), ambsect_img, 0, 0, x, 0, 70, 75); else XPutImage (dpy (), win (), dgc (), mixsect_img, 0, 0, x, 0, 70, 75); x += 70; } }