| @@ -208,6 +208,11 @@ class CarlaApplication(object): | |||
| self.fApp.setPalette(self.fPalBlue) | |||
| def createApp(self, appName): | |||
| QApplication.setAttribute(Qt.AA_X11InitThreads) | |||
| if MACOS: | |||
| QApplication.setAttribute(Qt.AA_DontShowIconsInMenus) | |||
| self.fApp = QApplication(sys.argv) | |||
| self.fApp.setApplicationName(appName) | |||
| self.fApp.setApplicationVersion(VERSION) | |||
| @@ -218,9 +223,6 @@ class CarlaApplication(object): | |||
| else: | |||
| self.fApp.setWindowIcon(QIcon(":/scalable/carla.svg")) | |||
| if MACOS: | |||
| self.fApp.setAttribute(Qt.AA_DontShowIconsInMenus) | |||
| print("Using \"%s\" theme" % self.fApp.style().objectName()) | |||
| def arguments(self): | |||
| @@ -298,14 +298,15 @@ public: | |||
| rootwin = new X_rootwin(display); | |||
| mainwin = new Mainwin(rootwin, &xresman, 0, 0, jclient, this); | |||
| rootwin->handle_event(); | |||
| mainwin->x_set_title(getUiName()); | |||
| handler = new X_handler(display, mainwin, EV_X11); | |||
| mainwin->x_set_title(getUiName()); | |||
| if (const uintptr_t winId = getUiParentId()) | |||
| XSetTransientForHint(display->dpy(), mainwin->win(), static_cast<Window>(winId)); | |||
| rootwin->handle_event(); | |||
| handler = new X_handler(display, mainwin, EV_X11); | |||
| handler->next_event(); | |||
| XFlush(display->dpy()); | |||
| @@ -88,7 +88,6 @@ Mainwin::Mainwin (X_rootwin *parent, X_resman *xres, int xp, int yp, Jclient *jc | |||
| } | |||
| RotaryCtl::init (disp ()); | |||
| x = 270; | |||
| _rotary [R_TUNE] = new Rlinctl (this, this, R_TUNE, &r_tune_geom, x, 0, 400, 5, 400.0, 480.0, 440.0); | |||
| _rotary [R_BIAS] = new Rlinctl (this, this, R_BIAS, &r_bias_geom, x, 0, 270, 5, 0.0, 1.0, 0.5); | |||
| @@ -111,7 +110,6 @@ Mainwin::Mainwin (X_rootwin *parent, X_resman *xres, int xp, int yp, Jclient *jc | |||
| Mainwin::~Mainwin (void) | |||
| { | |||
| RotaryCtl::fini (); | |||
| } | |||
| @@ -28,9 +28,6 @@ | |||
| namespace AT1 { | |||
| cairo_t *RotaryCtl::_cairotype = 0; | |||
| cairo_surface_t *RotaryCtl::_cairosurf = 0; | |||
| int RotaryCtl::_wb_up = 4; | |||
| int RotaryCtl::_wb_dn = 5; | |||
| @@ -62,6 +59,10 @@ RotaryCtl::RotaryCtl (X_window *parent, | |||
| { | |||
| x_add_events ( ExposureMask | |||
| | Button1MotionMask | ButtonPressMask | ButtonReleaseMask); | |||
| _cairo->initIfNeeded(parent->disp()); | |||
| _cairotype = _cairo->type; | |||
| _cairosurf = _cairo->surf; | |||
| } | |||
| @@ -70,19 +71,6 @@ RotaryCtl::~RotaryCtl (void) | |||
| } | |||
| void RotaryCtl::init (X_display *disp) | |||
| { | |||
| _cairosurf = cairo_xlib_surface_create (disp->dpy (), 0, disp->dvi (), 50, 50); | |||
| _cairotype = cairo_create (_cairosurf); | |||
| } | |||
| void RotaryCtl::fini (void) | |||
| { | |||
| cairo_destroy (_cairotype); | |||
| cairo_surface_destroy (_cairosurf); | |||
| } | |||
| void RotaryCtl::handle_event (XEvent *E) | |||
| { | |||
| @@ -72,9 +72,6 @@ public: | |||
| virtual void set_value (double v) = 0; | |||
| virtual void get_string (char *p, int n) {} | |||
| static void init (X_display *disp); | |||
| static void fini (void); | |||
| static int _wb_up; | |||
| static int _wb_dn; | |||
| @@ -109,8 +106,9 @@ private: | |||
| virtual int handle_motion (int dx, int dy) = 0; | |||
| virtual int handle_mwheel (int dw) = 0; | |||
| static cairo_t *_cairotype; | |||
| static cairo_surface_t *_cairosurf; | |||
| juce::SharedResourcePointer<x_cairo_t> _cairo; | |||
| cairo_t *_cairotype; | |||
| cairo_surface_t *_cairosurf; | |||
| }; | |||
| @@ -56,7 +56,6 @@ Mainwin::Mainwin (X_rootwin *parent, X_resman *xres, int xp, int yp, Jclient *jc | |||
| H.rclas (xres->rclas ()); | |||
| x_apply (&H); | |||
| RotaryCtl::init (disp ()); | |||
| _rotary [INPBAL] = new Rlinctl (this, this, &inpbal_img, 20, 0, 120, 4, -3.0f, 3.0f, 0.0f, INPBAL); | |||
| _rotary [HPFILT] = new Rlogctl (this, this, &hpfilt_img, 20, 0, 120, 4, 10.0f, 320.0f, 40.0f, HPFILT); | |||
| _rotary [SHGAIN] = new Rlinctl (this, this, &shgain_img, 190, 0, 120, 5, 0.0f, 24.0f, 15.0f, SHGAIN); | |||
| @@ -79,7 +78,6 @@ Mainwin::Mainwin (X_rootwin *parent, X_resman *xres, int xp, int yp, Jclient *jc | |||
| Mainwin::~Mainwin (void) | |||
| { | |||
| RotaryCtl::fini (); | |||
| } | |||
| @@ -134,8 +132,6 @@ void Mainwin::handle_time (void) | |||
| { | |||
| if (--_timeout == 0) numdisp (-1); | |||
| } | |||
| inc_time (100000); | |||
| XFlush (dpy ()); | |||
| if (_touch && _jclient->shuffler ()->ready ()) | |||
| { | |||
| @@ -145,6 +141,9 @@ void Mainwin::handle_time (void) | |||
| _valuecb->valueChangedCallback (SHFREQ, v2); | |||
| _touch = 0; | |||
| } | |||
| inc_time (50000); | |||
| XFlush (dpy ()); | |||
| } | |||
| @@ -28,8 +28,6 @@ | |||
| namespace BLS1 { | |||
| cairo_t *RotaryCtl::_cairotype = 0; | |||
| cairo_surface_t *RotaryCtl::_cairosurf = 0; | |||
| int RotaryCtl::_wb_up = 4; | |||
| int RotaryCtl::_wb_dn = 5; | |||
| @@ -61,6 +59,10 @@ RotaryCtl::RotaryCtl (X_window *parent, | |||
| { | |||
| x_add_events ( ExposureMask | |||
| | Button1MotionMask | ButtonPressMask | ButtonReleaseMask); | |||
| _cairo->initIfNeeded(parent->disp()); | |||
| _cairotype = _cairo->type; | |||
| _cairosurf = _cairo->surf; | |||
| } | |||
| @@ -69,20 +71,6 @@ RotaryCtl::~RotaryCtl (void) | |||
| } | |||
| void RotaryCtl::init (X_display *disp) | |||
| { | |||
| _cairosurf = cairo_xlib_surface_create (disp->dpy (), 0, disp->dvi (), 50, 50); | |||
| _cairotype = cairo_create (_cairosurf); | |||
| } | |||
| void RotaryCtl::fini (void) | |||
| { | |||
| cairo_destroy (_cairotype); | |||
| cairo_surface_destroy (_cairosurf); | |||
| } | |||
| void RotaryCtl::handle_event (XEvent *E) | |||
| { | |||
| switch (E->type) | |||
| @@ -73,9 +73,6 @@ public: | |||
| virtual void set_value (double v) = 0; | |||
| virtual void get_string (char *p, int n) {} | |||
| static void init (X_display *disp); | |||
| static void fini (void); | |||
| static int _wb_up; | |||
| static int _wb_dn; | |||
| @@ -110,8 +107,9 @@ private: | |||
| virtual int handle_motion (int dx, int dy) = 0; | |||
| virtual int handle_mwheel (int dw) = 0; | |||
| static cairo_t *_cairotype; | |||
| static cairo_surface_t *_cairosurf; | |||
| juce::SharedResourcePointer<x_cairo_t> _cairo; | |||
| cairo_t *_cairotype; | |||
| cairo_surface_t *_cairosurf; | |||
| }; | |||
| @@ -25,11 +25,40 @@ | |||
| #include <png.h> | |||
| #include <clxclient.h> | |||
| #include <cairo/cairo.h> | |||
| #include <cairo/cairo-xlib.h> | |||
| #define EV_X11 16 | |||
| #define EV_EXIT 31 | |||
| // ----------------------------------------------------------------------- | |||
| struct x_cairo_t { | |||
| cairo_t * type; | |||
| cairo_surface_t* surf; | |||
| x_cairo_t() noexcept | |||
| : type(nullptr), | |||
| surf(nullptr) {} | |||
| ~x_cairo_t() | |||
| { | |||
| cairo_destroy(type); | |||
| cairo_surface_destroy(surf); | |||
| } | |||
| void initIfNeeded(X_display* const disp) | |||
| { | |||
| if (surf != nullptr) | |||
| return; | |||
| surf = cairo_xlib_surface_create(disp->dpy(), 0, disp->dvi(), 50, 50); | |||
| type = cairo_create(surf); | |||
| } | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| struct X_handler_Param { | |||
| uint32_t index; | |||
| float value; | |||
| @@ -132,46 +161,41 @@ private: | |||
| { | |||
| for (; ! shouldThreadExit();) | |||
| { | |||
| int ev; | |||
| { | |||
| const CarlaMutexLocker cml(fMutex); | |||
| CARLA_SAFE_ASSERT_RETURN(fMainwin != nullptr,); | |||
| { | |||
| const CarlaMutexLocker cml(fParamMutex); | |||
| const CarlaMutexLocker cml(fMutex); | |||
| for (ParamList::Itenerator it = fParamChanges.begin(); it.valid(); it.next()) | |||
| { | |||
| const X_handler_Param& param(it.getValue()); | |||
| fCallback->setParameterValueFromHandlerThread(param.index, param.value); | |||
| } | |||
| CARLA_SAFE_ASSERT_RETURN(fMainwin != nullptr,); | |||
| fParamChanges.clear(); | |||
| } | |||
| { | |||
| const CarlaMutexLocker cml(fParamMutex); | |||
| for (; (ev = fMainwin->process()) == EV_X11;) | |||
| for (ParamList::Itenerator it = fParamChanges.begin(); it.valid(); it.next()) | |||
| { | |||
| fRootwin->handle_event(); | |||
| fHandler->next_event(); | |||
| const X_handler_Param& param(it.getValue()); | |||
| fCallback->setParameterValueFromHandlerThread(param.index, param.value); | |||
| } | |||
| if (ev == Esync::EV_TIME) | |||
| { | |||
| fRootwin->handle_event(); | |||
| } | |||
| else if (ev == EV_EXIT) | |||
| { | |||
| fClosed = true; | |||
| fHandler = nullptr; | |||
| fMainwin = nullptr; | |||
| fRootwin = nullptr; | |||
| return; | |||
| } | |||
| fParamChanges.clear(); | |||
| } | |||
| carla_msleep(10); | |||
| switch (fMainwin->process()) | |||
| { | |||
| case EV_X11: | |||
| fRootwin->handle_event(); | |||
| fHandler->next_event(); | |||
| break; | |||
| case EV_EXIT: | |||
| fClosed = true; | |||
| fHandler = nullptr; | |||
| fMainwin = nullptr; | |||
| fRootwin = nullptr; | |||
| return; | |||
| case Esync::EV_TIME: | |||
| fRootwin->handle_event(); | |||
| break; | |||
| default: | |||
| carla_stdout("custom X11 event for zita plugs"); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| }; | |||
| @@ -56,7 +56,6 @@ Mainwin::Mainwin (X_rootwin *parent, X_resman *xres, int xp, int yp, Jclient *jc | |||
| x_apply (&H); | |||
| _ambis = xres->getb (".ambisonic", false); | |||
| 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); | |||
| @@ -79,13 +78,12 @@ Mainwin::Mainwin (X_rootwin *parent, X_resman *xres, int xp, int yp, Jclient *jc | |||
| x_add_events (ExposureMask); | |||
| x_map (); | |||
| set_time (0); | |||
| inc_time (500000); | |||
| inc_time (250000); | |||
| } | |||
| Mainwin::~Mainwin (void) | |||
| { | |||
| RotaryCtl::fini (); | |||
| } | |||
| @@ -137,7 +135,7 @@ void Mainwin::clmesg (XClientMessageEvent *E) | |||
| void Mainwin::handle_time (void) | |||
| { | |||
| inc_time (500000); | |||
| // XFlush (dpy ()); | |||
| XFlush (dpy ()); | |||
| } | |||
| @@ -28,9 +28,6 @@ | |||
| namespace REV1 { | |||
| cairo_t *RotaryCtl::_cairotype = 0; | |||
| cairo_surface_t *RotaryCtl::_cairosurf = 0; | |||
| int RotaryCtl::_wb_up = 4; | |||
| int RotaryCtl::_wb_dn = 5; | |||
| int RotaryCtl::_keymod = 0; | |||
| @@ -61,6 +58,10 @@ RotaryCtl::RotaryCtl (X_window *parent, | |||
| { | |||
| x_add_events ( ExposureMask | |||
| | Button1MotionMask | ButtonPressMask | ButtonReleaseMask); | |||
| _cairo->initIfNeeded(parent->disp()); | |||
| _cairotype = _cairo->type; | |||
| _cairosurf = _cairo->surf; | |||
| } | |||
| @@ -69,20 +70,6 @@ RotaryCtl::~RotaryCtl (void) | |||
| } | |||
| void RotaryCtl::init (X_display *disp) | |||
| { | |||
| _cairosurf = cairo_xlib_surface_create (disp->dpy (), 0, disp->dvi (), 50, 50); | |||
| _cairotype = cairo_create (_cairosurf); | |||
| } | |||
| void RotaryCtl::fini (void) | |||
| { | |||
| cairo_destroy (_cairotype); | |||
| cairo_surface_destroy (_cairosurf); | |||
| } | |||
| void RotaryCtl::handle_event (XEvent *E) | |||
| { | |||
| switch (E->type) | |||
| @@ -72,9 +72,6 @@ public: | |||
| virtual void set_value (double v) = 0; | |||
| virtual void get_string (char *p, int n) {} | |||
| static void init (X_display *disp); | |||
| static void fini (void); | |||
| static int _wb_up; | |||
| static int _wb_dn; | |||
| @@ -109,8 +106,9 @@ private: | |||
| virtual int handle_motion (int dx, int dy) = 0; | |||
| virtual int handle_mwheel (int dw) = 0; | |||
| static cairo_t *_cairotype; | |||
| static cairo_surface_t *_cairosurf; | |||
| juce::SharedResourcePointer<x_cairo_t> _cairo; | |||
| cairo_t *_cairotype; | |||
| cairo_surface_t *_cairosurf; | |||
| }; | |||