int Canvas::keypress_event(BC_WindowBase *caller)
{
- int caller_is_canvas = (caller == get_canvas());
int key = caller->get_keypress();
switch( key ) {
case 'f':
stop_fullscreen();
else
start_fullscreen();
- if(!caller_is_canvas) caller->lock_window("Canvas::keypress_event 1");
+ caller->lock_window("Canvas::keypress_event 1");
break;
case ESC:
caller->unlock_window();
if(get_fullscreen())
stop_fullscreen();
- if(!caller_is_canvas) caller->lock_window("Canvas::keypress_event 2");
+ caller->lock_window("Canvas::keypress_event 2");
break;
default:
return 0;
int CanvasOutput::cursor_leave_event()
{
- return canvas->cursor_leave_event_base(this);
+ return canvas->cursor_leave_event_base(canvas->get_canvas());
}
int CanvasOutput::cursor_enter_event()
{
- return canvas->cursor_enter_event_base(this);
+ return canvas->cursor_enter_event_base(canvas->get_canvas());
}
int CanvasOutput::button_press_event()
{
- return canvas->button_press_event_base(this);
+ return canvas->button_press_event_base(canvas->get_canvas());
}
int CanvasOutput::button_release_event()
int CanvasOutput::keypress_event()
{
- return canvas->keypress_event(this);
+ return canvas->keypress_event(canvas->get_canvas());
}
private:
void get_scrollbars(EDL *edl,
- int &canvas_x,
- int &canvas_y,
- int &canvas_w,
- int &canvas_h);
+ int &canvas_x, int &canvas_y, int &canvas_w, int &canvas_h);
Mutex *canvas_lock;
};
{
public:
CanvasOutput(Canvas *canvas,
- int x,
- int y,
- int w,
- int h);
+ int x, int y, int w, int h);
~CanvasOutput();
int cursor_leave_event();
class CanvasFullScreen : public BC_FullScreen
{
public:
- CanvasFullScreen(Canvas *canvas,
- int w,
- int h);
+ CanvasFullScreen(Canvas *canvas, int w, int h);
~CanvasFullScreen();
Canvas *canvas;
float in_x1, in_y1, in_x2, in_y2;
float out_x1, out_y1, out_x2, out_y2;
get_transfers(edl,
- in_x1,
- in_y1,
- in_x2,
- in_y2,
- out_x1,
- out_y1,
- out_x2,
- out_y2);
+ in_x1, in_y1, in_x2, in_y2,
+ out_x1, out_y1, out_x2, out_y2);
+// input scaled from session to refresh frame coordinates
+ int ow = get_output_w(edl);
+ int oh = get_output_h(edl);
+ int rw = refresh_frame->get_w();
+ int rh = refresh_frame->get_h();
+ float xs = (float)rw / ow;
+ float ys = (float)rh / oh;
+ in_x1 *= xs; in_x2 *= xs;
+ in_y1 *= ys; in_y2 *= ys;
get_canvas()->draw_vframe(refresh_frame,
(int)out_x1,
(int)out_y1,
case LeaveNotify:
if( event->xcrossing.mode != NotifyNormal ) break;
- if( cursor_entered && event->xcrossing.window == win ) {
- cursor_entered = 0;
- }
+ cursor_entered = 0;
event_win = event->xany.window;
dispatch_cursor_leave();
break;
case EnterNotify:
if( event->xcrossing.mode != NotifyNormal ) break;
- if( !cursor_entered && event->xcrossing.window == win ) {
- if( !event->xcrossing.focus && get_resources()->grab_input_focus ) {
- XSetInputFocus(display, win, RevertToParent, CurrentTime);
+
+ if( !cursor_entered ) {
+ for( int i=0; i<popups.size(); ++i ) { // popups always take focus
+ if( popups[i]->win == event->xcrossing.window )
+ cursor_entered = 1;
}
- cursor_entered = 1;
+ if( !cursor_entered && get_resources()->grab_input_focus &&
+ !event->xcrossing.focus && event->xcrossing.window == win ) {
+ cursor_entered = 1;
+ }
+ if( cursor_entered )
+ XSetInputFocus(display, win, RevertToParent, CurrentTime);
}
event_win = event->xany.window;
cursor_x = event->xcrossing.x;