- switch( event->type ) {
- case ButtonPress: break;
- case ButtonRelease: break;
- case MotionNotify: break;
- default:
- return check_configure_change(0);
- }
-
- MWindow *mwindow = client->server->mwindow;
- CWindowGUI *cwindow_gui = mwindow->cwindow->gui;
- CWindowCanvas *canvas = cwindow_gui->canvas;
- int cx, cy; cwindow_gui->get_relative_cursor(cx, cy);
- cx -= mwindow->theme->ccanvas_x;
- cy -= mwindow->theme->ccanvas_y;
-
- if( !dragging ) {
- if( cx < 0 || cx >= mwindow->theme->ccanvas_w ||
- cy < 0 || cy >= mwindow->theme->ccanvas_h )
- return check_configure_change(0);
- }
-
- switch( event->type ) {
- case ButtonPress:
- if( !dragging ) break;
- return 1;
- case ButtonRelease:
- if( !dragging ) return check_configure_change(0);
- dragging = 0;
- return 1;
- case MotionNotify:
- if( !dragging ) return check_configure_change(0);
- break;
- default:
- return check_configure_change(0);
- }
-
- float cursor_x = cx, cursor_y = cy;
- canvas->canvas_to_output(mwindow->edl, 0, cursor_x, cursor_y);
- int64_t position = client->get_source_position();
- float projector_x, projector_y, projector_z;
- Track *track = client->server->plugin->track;
- int track_w = track->track_w, track_h = track->track_h;
- track->automation->get_projector(
- &projector_x, &projector_y, &projector_z,
- position, PLAY_FORWARD);
- projector_x += mwindow->edl->session->output_w / 2;
- projector_y += mwindow->edl->session->output_h / 2;
- cursor_x = (cursor_x - projector_x) / projector_z + track_w / 2;
- cursor_y = (cursor_y - projector_y) / projector_z + track_h / 2;
- int title_x = client->config.title_x, title_y = client->config.title_y;
- int title_w = client->config.title_w, title_h = client->config.title_h;
- if( !title_w ) title_w = track_w;
- if( !title_h ) title_h = track_h;
- int r = MIN(track_w, track_h)/100 + 2;
- int x0 = title_x, x1 = title_x+(title_w+1)/2, x2 = title_x+title_w;
- int y0 = title_y, y1 = title_y+(title_h+1)/2, y2 = title_y+title_h;
- int drag_dx = 0, drag_dy = 0;
- if( !dragging ) { // clockwise
- if( abs(drag_dx = cursor_x-x0) < r && // x0,y0
- abs(drag_dy = cursor_y-y0) < r ) dragging = 1;
- else if( abs(drag_dx = cursor_x-x1) < r && // x1,y0
- abs(drag_dy = cursor_y-y0) < r ) dragging = 2;
- else if( abs(drag_dx = cursor_x-x2) < r && // x2,y0
- abs(drag_dy = cursor_y-y0) < r ) dragging = 3;
- else if( abs(drag_dx = cursor_x-x2) < r && // x2,y1
- abs(drag_dy = cursor_y-y1) < r ) dragging = 4;
- else if( abs(drag_dx = cursor_x-x2) < r && // x2,y2
- abs(drag_dy = cursor_y-y2) < r ) dragging = 5;
- else if( abs(drag_dx = cursor_x-x1) < r && // x1,y2
- abs(drag_dy = cursor_y-y2) < r ) dragging = 6;
- else if( abs(drag_dx = cursor_x-x0) < r && // x0,y2
- abs(drag_dy = cursor_y-y2) < r ) dragging = 7;
- else if( abs(drag_dx = cursor_x-x0) < r && // x0,y1
- abs(drag_dy = cursor_y-y1) < r ) dragging = 8;
- else if( abs(drag_dx = cursor_x-x1) < r && // x1,y1
- abs(drag_dy = cursor_y-y1) < r ) dragging = 9;
- return 0;
- }
- switch( dragging ) {
- case 1: { // x0,y0
- int cur_x = cursor_x - drag_dx, dx = cur_x - x0;
- int cur_y = cursor_y - drag_dy, dy = cur_y - y0;
- if( !dx && !dy ) return 1;
- int cur_w = title_w - dx; if( cur_w < 1 ) cur_w = 1;
- int cur_h = title_h - dy; if( cur_h < 1 ) cur_h = 1;
- this->title_x->update((int64_t)(client->config.title_x = cur_x));
- this->title_y->update((int64_t)(client->config.title_y = cur_y));
- this->title_w->update((int64_t)(client->config.title_w = cur_w));
- this->title_h->update((int64_t)(client->config.title_h = cur_h));
- break; }
- case 2: { // x1,y0
- int cur_y = cursor_y - drag_dy, dy = cur_y - y0;
- if( !dy ) return 1;
- int cur_h = title_h - dy; if( cur_h < 1 ) cur_h = 1;
- this->title_y->update((int64_t)(client->config.title_y = cur_y));
- this->title_h->update((int64_t)(client->config.title_h = cur_h));
- break; }
- case 3: { // x2,y0
- int cur_x = cursor_x - drag_dx, dx = cur_x - x2;
- int cur_y = cursor_y - drag_dy, dy = cur_y - y0;
- int cur_w = title_w + dx; if( cur_w < 1 ) cur_w = 1;
- int cur_h = title_h - dy; if( cur_h < 1 ) cur_h = 1;
- this->title_w->update((int64_t)(client->config.title_w = cur_w));
- this->title_y->update((int64_t)(client->config.title_y = cur_y));
- this->title_h->update((int64_t)(client->config.title_h = cur_h));
- break; }
- case 4: { // x2,y1
- int cur_x = cursor_x - drag_dx, dx = cur_x - x2;
- if( !dx ) return 1;
- int cur_w = title_w + dx; if( cur_w < 1 ) cur_w = 1;
- this->title_w->update((int64_t)(client->config.title_w = cur_w));
- break; }
- case 5: { // x2,y2
- int cur_x = cursor_x - drag_dx, dx = cur_x - x2;
- int cur_y = cursor_y - drag_dy, dy = cur_y - y2;
- int cur_w = title_w + dx; if( cur_w < 1 ) cur_w = 1;
- int cur_h = title_h + dy; if( cur_h < 1 ) cur_h = 1;
- this->title_w->update((int64_t)(client->config.title_w = cur_w));
- this->title_h->update((int64_t)(client->config.title_h = cur_h));
- break; }
- case 6: { // x1,y2
- int cur_y = cursor_y - drag_dy, dy = cur_y - y2;
- if( client->config.title_h == cur_y ) return 1;
- int cur_h = title_h + dy; if( cur_h < 1 ) cur_h = 1;
- this->title_h->update((int64_t)(client->config.title_h = cur_h));
- break; }
- case 7: { // x0,y2
- int cur_x = cursor_x - drag_dx, dx = cur_x - x0;
- int cur_y = cursor_y - drag_dy, dy = cur_y - y2;
- int cur_w = title_w - dx; if( cur_w < 1 ) cur_w = 1;
- int cur_h = title_h + dy; if( cur_h < 1 ) cur_h = 1;
- this->title_x->update((int64_t)(client->config.title_x = cur_x));
- this->title_w->update((int64_t)(client->config.title_w = cur_w));
- this->title_h->update((int64_t)(client->config.title_h = cur_h));
- break; }
- case 8: { // x0,y1
- int cur_x = cursor_x - drag_dx, dx = cur_x - x0;
- if( !dx ) return 1;
- int cur_w = title_w - dx; if( cur_w < 1 ) cur_w = 1;
- this->title_x->update((int64_t)(client->config.title_x = cur_x));
- this->title_w->update((int64_t)(client->config.title_w = cur_w));
- break; }
- case 9: { // x1,y1
- int cur_x = cursor_x - drag_dx, dx = cur_x - x1;
- int cur_y = cursor_y - drag_dy, dy = cur_y - y1;
- if( title_x == cur_x && title_y == cur_y ) return 1;
- this->title_x->update((int64_t)(client->config.title_x += dx));
- this->title_y->update((int64_t)(client->config.title_y += dy));
- }
- }
- if( !grab_event_count() )
- send_configure_change();
- else
- pending_config = 1;
- return 1;