dragcheckbox rework, boxblur create can grab
authorGood Guy <good1.2guy@gmail.com>
Thu, 9 Apr 2020 01:17:36 +0000 (19:17 -0600)
committerGood Guy <good1.2guy@gmail.com>
Thu, 9 Apr 2020 01:17:36 +0000 (19:17 -0600)
19 files changed:
cinelerra-5.1/cinelerra/dragcheckbox.C
cinelerra-5.1/cinelerra/dragcheckbox.h
cinelerra-5.1/cinelerra/trackcanvas.C
cinelerra-5.1/cinelerra/trackcanvas.h
cinelerra-5.1/guicast/bcwindowbase.C
cinelerra-5.1/guicast/bcwindowbase.h
cinelerra-5.1/guicast/bcwindowdraw.C
cinelerra-5.1/plugins/boxblur/boxblur.C
cinelerra-5.1/plugins/crikey/crikeywindow.C
cinelerra-5.1/plugins/crikey/crikeywindow.h
cinelerra-5.1/plugins/mandelcuda/mandelbrotwindow.C
cinelerra-5.1/plugins/mandelcuda/mandelbrotwindow.h
cinelerra-5.1/plugins/nbodycuda/nbodywindow.C
cinelerra-5.1/plugins/nbodycuda/nbodywindow.h
cinelerra-5.1/plugins/sketcher/sketcherwindow.C
cinelerra-5.1/plugins/sketcher/sketcherwindow.h
cinelerra-5.1/plugins/titler/titlerwindow.C
cinelerra-5.1/plugins/tracer/tracerwindow.C
cinelerra-5.1/plugins/tracer/tracerwindow.h

index c2e1f5d4829c4a0b1cf2be49bb1b87633041a201..8f699bdb7e9710ef27a93f98cf2d842cef7aa044 100644 (file)
@@ -84,6 +84,14 @@ void DragCheckBox::drag_deactivate()
        dragging = 0;
 }
 
+int DragCheckBox::handle_ungrab()
+{
+       drag_deactivate();
+       update(*value = 0);
+       update_gui();
+       return 1;
+}
+
 int DragCheckBox::check_pending()
 {
        if( pending && !grab_event_count() ) {
index f11fca5d3133cedace177b1d684d2506701864f4..d14da97ccc50123f94228a28e6aad6fef61ff4dd 100644 (file)
@@ -26,6 +26,7 @@ public:
 
        int handle_event();
        int grab_event(XEvent *event);
+       int handle_ungrab();
        
        MWindow *mwindow;
        int grabbed, dragging, pending;
index 96726f68222334a5a9af0f6766b404a1469ffdc3..fc31969dc170aea124aa9b12af82211a1d0bbd66 100644 (file)
@@ -2785,9 +2785,9 @@ static int is_linear(FloatAuto *prev, FloatAuto *next)
 {
        if( !prev || !next ) return 1;
        if( prev->curve_mode == FloatAuto::LINEAR ) return 1;
-       int64_t ipos, opos;
-       if( !(ipos = prev->get_control_in_position()) &&
-           !(opos = prev->get_control_out_position()) ) return 1;
+       int64_t ipos = prev->get_control_in_position();
+       int64_t opos = prev->get_control_out_position();
+       if( !ipos && !opos ) return 1;
        if( !ipos || !opos ) return 0;
        float ival = prev->get_control_in_value();
        float oval = prev->get_control_out_value();
@@ -3716,43 +3716,6 @@ int TrackCanvas::draw_hairline(Auto *auto_keyframe, int color, int show)
        return 0;
 }
 
-void TrackCanvas::draw_bline(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap)
-{
-// Short lines are all overhead to hw or sw setup, use bresenhams
-       if( y1 > y2 ) {
-               int tx = x1;  x1 = x2;  x2 = tx;
-               int ty = y1;  y1 = y2;  y2 = ty;
-       }
-
-       int x = x1, y = y1;
-       int dx = x2-x1, dy = y2-y1;
-       int dx2 = 2*dx, dy2 = 2*dy;
-       if( dx < 0 ) dx = -dx;
-       int r = dx > dy ? dx : dy, n = r;
-       int dir = 0;
-       if( dx2 < 0 ) dir += 1;
-       if( dy >= dx ) {
-               if( dx2 >= 0 ) do {     /* +Y, +X */
-                       draw_pixel(x, y++, pixmap);
-                       if( (r -= dx2) < 0 ) { r += dy2;  ++x; }
-               } while( --n >= 0 );
-               else do {               /* +Y, -X */
-                       draw_pixel(x, y++, pixmap);
-                       if( (r += dx2) < 0 ) { r += dy2;  --x; }
-               } while( --n >= 0 );
-       }
-       else {
-               if( dx2 >= 0 ) do {     /* +X, +Y */
-                       draw_pixel(x++, y, pixmap);
-                       if( (r -= dy2) < 0 ) { r += dx2;  ++y; }
-               } while( --n >= 0 );
-               else do {               /* -X, +Y */
-                       draw_pixel(x--, y, pixmap);
-                       if( (r -= dy2) < 0 ) { r -= dx2;  ++y; }
-               } while( --n >= 0 );
-       }
-}
-
 void TrackCanvas::draw_overlays()
 {
        int new_cursor, update_cursor, rerender;
index 490b67b151419ecca3607097cf103c4bd29d6928..4b9c4eba22736a68f8c5be3f8fd9013260ea6f44 100644 (file)
@@ -71,7 +71,6 @@ public:
        void draw_highlighting();
        void draw_keyframe_reticle();
        int draw_hairline(Auto *auto_keyframe, int color, int show);
-       void draw_bline(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap=0);
 
 // User can either call draw or draw_overlays to copy a fresh
 // canvas and just draw the overlays over it
index a2cccd2cf4da8abac6f37276c0af1ce4516aeabf..137b6790b5b8b68c2bb4120eb265054563b1f945 100644 (file)
@@ -3415,14 +3415,25 @@ void BC_WindowBase::close(int return_value)
 
 int BC_WindowBase::grab(BC_WindowBase *window)
 {
-       if( window->active_grab && this != window->active_grab ) return 0;
-       window->active_grab = this;
-       this->grab_active = window;
-       return 1;
+       int ret = 1;
+       if( window->active_grab ) {
+               int locked = get_window_lock();
+               if( locked ) unlock_window();
+               BC_WindowBase *active_grab = window->active_grab;
+               active_grab->lock_window("BC_WindowBase::grab(BC_WindowBase");
+               ret = active_grab->handle_ungrab();
+               active_grab->unlock_window();
+               if( locked ) lock_window("BC_WindowBase::grab(BC_WindowBase");
+       }
+       if( ret ) {
+               window->active_grab = this;
+               this->grab_active = window;
+       }
+       return ret;
 }
 int BC_WindowBase::ungrab(BC_WindowBase *window)
 {
-       if( window->active_grab && this != window->active_grab ) return 0;
+       if( this != window->active_grab ) return 0;
        window->active_grab = 0;
        this->grab_active = 0;
        return 1;
index 6ce2128d9c372c134b8a6ec701a7b6bd6871d1a0..d02a357ed3fe84e0af975e260a5a0c6b59fb0490 100644 (file)
@@ -216,7 +216,9 @@ public:
        virtual int selection_clear_event() { return 0; }
 // Only if opengl is enabled
        virtual int expose_event() { return 0; };
+       virtual int handle_ungrab() { return 0; };
        virtual int grab_event(XEvent *event) { return 0; };
+
        virtual void create_objects() { return; };
 
        static void init_resources(float scale);
@@ -426,7 +428,9 @@ public:
        int draw_single_text(int draw, int font,
                int x, int y, const wchr_t *text, int length = -1, BC_Pixmap *pixmap = 0);
        void draw_center_text(int x, int y, const char *text, int length = -1);
+       void draw_pix(int x, int y, BC_Pixmap *pixmap = 0);
        void draw_line(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap = 0);
+       void draw_bline(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap = 0);
        void draw_polygon(ArrayList<int> *x, ArrayList<int> *y, BC_Pixmap *pixmap = 0);
        void fill_polygon(ArrayList<int> *x, ArrayList<int> *y, BC_Pixmap *pixmap = 0);
        void draw_rectangle(int x, int y, int w, int h);
index eb35b63e7ca34e2cf0fed664a641e2926d24b187..73b3d03437a04e03a2a9737d139901b5451d7ec7 100644 (file)
@@ -388,11 +388,18 @@ void BC_WindowBase::draw_center_text(int x, int y, const char *text, int length)
        draw_text(x, y, text, length);
 }
 
+void BC_WindowBase::draw_pix(int x, int y, BC_Pixmap *pixmap)
+{ // draw_pixel, no BT test
+       XDrawPoint(top_level->display,
+               pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap,
+               top_level->gc, x, y);
+}
+
 void BC_WindowBase::draw_line(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap)
 { BT
 // Some X drivers can't draw 0 length lines
        if( x1 == x2 && y1 == y2 ) {
-               draw_pixel(x1, y1, pixmap);
+               draw_pix(x1, y1, pixmap);
        }
        else {
                XDrawLine(top_level->display,
@@ -401,6 +408,43 @@ void BC_WindowBase::draw_line(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap)
        }
 }
 
+void BC_WindowBase::draw_bline(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap)
+{ BT
+// Short lines are all overhead to hw or sw setup, use bresenhams
+       if( y1 > y2 ) {
+               int tx = x1;  x1 = x2;  x2 = tx;
+               int ty = y1;  y1 = y2;  y2 = ty;
+       }
+
+       int x = x1, y = y1;
+       int dx = x2-x1, dy = y2-y1;
+       int dx2 = 2*dx, dy2 = 2*dy;
+       if( dx < 0 ) dx = -dx;
+       int r = dx > dy ? dx : dy, n = r;
+       int dir = 0;
+       if( dx2 < 0 ) dir += 1;
+       if( dy >= dx ) {
+               if( dx2 >= 0 ) do {     /* +Y, +X */
+                       draw_pix(x, y++, pixmap);
+                       if( (r -= dx2) < 0 ) { r += dy2;  ++x; }
+               } while( --n >= 0 );
+               else do {               /* +Y, -X */
+                       draw_pix(x, y++, pixmap);
+                       if( (r += dx2) < 0 ) { r += dy2;  --x; }
+               } while( --n >= 0 );
+       }
+       else {
+               if( dx2 >= 0 ) do {     /* +X, +Y */
+                       draw_pix(x++, y, pixmap);
+                       if( (r -= dy2) < 0 ) { r += dx2;  ++y; }
+               } while( --n >= 0 );
+               else do {               /* -X, +Y */
+                       draw_pix(x--, y, pixmap);
+                       if( (r -= dy2) < 0 ) { r -= dx2;  ++y; }
+               } while( --n >= 0 );
+       }
+}
+
 void BC_WindowBase::draw_polygon(ArrayList<int> *x, ArrayList<int> *y, BC_Pixmap *pixmap)
 { BT
        int npoints = MIN(x->total, y->total);
index 6848798b3ce1a91b183b7d2c9eab1e85647850a4..50da059921f1038cf1ea35aafba5a11c0e18fcae 100644 (file)
@@ -279,6 +279,8 @@ void BoxBlurWindow::create_objects()
        add_subwindow(title = new BC_Title(x, y, _("Box Blur"), MEDIUMFONT_3D));
        add_subwindow(drag = new BoxBlurDrag(this, plugin, t3, y));
        drag->create_objects();
+       if( plugin->config.drag && drag->drag_activate() )
+               eprintf("drag enabled, but compositor already grabbed\n");
        int x1 = get_w() - BoxBlurReset::calculate_w(this) - 2*margin;
        add_subwindow(reset = new BoxBlurReset(this, x1, y));
        y += bmax(title->get_h(), drag->get_h()) + 2*margin;
index 4295d6d3b7e829c625e9a3e95562c3576536db18..d2d6c6ce1f3ed5322ee3a633a3c9fdf5b75be099 100644 (file)
@@ -588,6 +588,17 @@ int CriKeyDrag::handle_event()
        gui->send_configure_change();
        return 1;
 }
+int CriKeyWindow::handle_ungrab()
+{
+       CWindowGUI *cwindow_gui = plugin->server->mwindow->cwindow->gui;
+       int ret = ungrab(cwindow_gui);
+       if( ret ) {
+               drag->update(0);
+               plugin->config.drag = 0;
+               send_configure_change();
+       }
+       return ret;
+}
 
 CriKeyNewPoint::CriKeyNewPoint(CriKeyWindow *gui, CriKey *plugin, int x, int y)
  : BC_GenericButton(x, y, xS(80), _("New"))
index 3e897f80e0b22fd71ac23d6fe582773ecd0baff8..644cdd24dad994394e1ded478deca253cc388a73 100644 (file)
@@ -204,6 +204,7 @@ public:
        void start_color_thread();
        int grab_event(XEvent *event);
        int do_grab_event(XEvent *event);
+       int handle_ungrab();;
        void done_event(int result);
        void send_configure_change();
 
index 1808bc43849117ff215f3fa51fc08b1dc67f271b..a2b12db995ac657c0587b99ff3babdfe935d154b 100644 (file)
@@ -173,6 +173,13 @@ int MandelbrotDrag::handle_event()
                gui->ungrab(cwindow_gui);
        return 1;
 }
+int MandelbrotDrag::handle_ungrab()
+{
+       CWindowGUI *cwindow_gui = gui->plugin->server->mwindow->cwindow->gui;
+       int ret = gui->ungrab(cwindow_gui);
+       if( ret ) update(value = 0);
+       return ret;
+}
 
 MandelbrotIsJulia::MandelbrotIsJulia(MandelbrotWindow *gui, int x, int y)
  : BC_CheckBox(x, y, gui->plugin->config.is_julia, _("Julia"))
index 98208fcec59277b4051bde077b10412a28d823dc..be93a15bc9bd2befc2b4045339cb1158b139d48c 100644 (file)
@@ -56,6 +56,7 @@ public:
        MandelbrotDrag(MandelbrotWindow *gui, int x, int y);
 
        int handle_event();
+       int handle_ungrab();
        MandelbrotWindow *gui;
 };
 
index d5c2e9f9526ee93132d3e6b5bd84d55eab8245d9..546f9cbbd9c84476b5351294e748c46465bc0232 100644 (file)
@@ -190,6 +190,13 @@ int N_BodyDrag::handle_event()
                gui->ungrab(cwindow_gui);
        return 1;
 }
+int N_BodyDrag::handle_ungrab()
+{
+       CWindowGUI *cwindow_gui = gui->plugin->server->mwindow->cwindow->gui;
+       int ret = gui->ungrab(cwindow_gui);
+       if( ret ) update(value = 0);
+       return ret;
+}
 
 N_BodySetMode::N_BodySetMode(N_BodyWindow *gui, int x, int y, const char *text)
  : BC_PopupTextBox(gui, 0, text, x, y, xS(100), yS(160))
index b4b04c0b1036f52330b49c5338e531ae5120abf7..dd8a093f2bc4f1b51d0864bb37165a5eca734fef 100644 (file)
@@ -41,6 +41,7 @@ public:
        N_BodyDrag(N_BodyWindow *gui, int x, int y);
 
        int handle_event();
+       int handle_ungrab();
        N_BodyWindow *gui;
 };
 
index d0c8ca248a2af78346a2d9af5fa3b47d696322be..22abb7345aa8913f493d54e945ae4765d3aba793 100644 (file)
@@ -1299,6 +1299,17 @@ int SketcherDrag::handle_event()
        gui->send_configure_change();
        return 1;
 }
+int SketcherWindow::handle_ungrab()
+{
+       CWindowGUI *cwindow_gui = plugin->server->mwindow->cwindow->gui;
+       int ret = ungrab(cwindow_gui);
+       if( ret ) {
+               drag->update(0);
+               plugin->config.drag = 0;
+               send_configure_change();
+       }
+       return ret;
+}
 
 SketcherNewPoint::SketcherNewPoint(SketcherWindow *gui, Sketcher *plugin, int x, int y)
  : BC_GenericButton(x, y, xS(96), _("New"))
index 3353ffac845e1dfa1d3d734019931547f242e701..a0a5e3ce374353327c041423ce0ae78128ba9387 100644 (file)
@@ -396,6 +396,7 @@ public:
        void update_gui();
        int grab_event(XEvent *event);
        int do_grab_event(XEvent *event);
+       int handle_ungrab();
        int grab_button_press(XEvent *event);
        int grab_cursor_motion();
        void send_configure_change();
index c6db737b2a029ec88b9416f90371143db868bbff..de6d10cbda4d64c5e6e558ec3c5f99e9d7bc95b6 100644 (file)
@@ -264,10 +264,8 @@ void TitleWindow::create_objects()
        add_tool(drag = new TitleDrag(client, this, x, y + yS(80)));
        drag->create_objects();
        if( drag->get_w() > w1 ) w1 = drag->get_w();
-       if( client->config.drag ) {
-               if( drag->drag_activate() )
-                       eprintf("drag enabled, but compositor already grabbed\n");
-       }
+       if( client->config.drag && drag->drag_activate() )
+               eprintf("drag enabled, but compositor already grabbed\n");
 
        add_tool(alias = new TitleAlias(client, this, x, y+yS(110)));
        if( alias->get_w() > w1 ) w1 = drag->get_w();
index ccc04709814e9d08eb7a93e791f41ffe714ee13f..980da954fcf3b13685905489c07527844dc73084 100644 (file)
@@ -545,6 +545,18 @@ int TracerDrag::handle_event()
        gui->send_configure_change();
        return 1;
 }
+int TracerWindow::handle_ungrab()
+{
+       CWindowGUI *cwindow_gui = plugin->server->mwindow->cwindow->gui;
+       int ret = ungrab(cwindow_gui);
+       if( ret ) {
+               drag->update(0);
+               plugin->config.drag = 0;
+               send_configure_change();
+       }
+       return ret;
+}
+
 
 TracerDraw::TracerDraw(TracerWindow *gui, int x, int y)
  : BC_CheckBox(x, y, gui->plugin->config.draw, _("Draw"))
index 7553282297fa08b961e861c39ff456d3a3eade80..425885d4a0e8b25bdb20459c044e8232081c4edc 100644 (file)
@@ -231,6 +231,7 @@ public:
        void start_color_thread();
        int grab_event(XEvent *event);
        int do_grab_event(XEvent *event);
+       int handle_ungrab();
        void done_event(int result);
        void send_configure_change();