X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fdisplay.c;h=be379dc58fb4732c0067e843b0b0b689c527db6d;hb=9d34c9bb90611066ed48f7e2631a5bf427fbddfd;hp=b1672e6df66f1b5fba5ae10fad304dafa76ab781;hpb=c75fafe4ec348154a6e07c324dbe62c1c23a7149;p=vlc diff --git a/src/video_output/display.c b/src/video_output/display.c index b1672e6df6..be379dc58f 100644 --- a/src/video_output/display.c +++ b/src/video_output/display.c @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include @@ -112,6 +114,7 @@ static vout_display_t *vout_display_New(vlc_object_t *obj, vd->info.has_double_click = false; vd->info.has_hide_mouse = false; vd->info.has_pictures_invalid = false; + vd->info.has_event_thread = false; vd->cfg = cfg; vd->pool = NULL; @@ -253,7 +256,7 @@ void vout_display_PlacePicture(vout_display_place_t *place, place->x = cfg->display.width - place->width; break; default: - place->x = (cfg->display.width - place->width) / 2; + place->x = ((int)cfg->display.width - (int)place->width) / 2; break; } @@ -265,7 +268,7 @@ void vout_display_PlacePicture(vout_display_place_t *place, place->y = cfg->display.height - place->height; break; default: - place->y = (cfg->display.height - place->height) / 2; + place->y = ((int)cfg->display.height - (int)place->height) / 2; break; } } @@ -284,8 +287,8 @@ struct vout_display_owner_sys_t { } sar_initial; /* */ - int width_saved; - int height_saved; + unsigned width_saved; + unsigned height_saved; struct { unsigned num; @@ -356,6 +359,11 @@ struct vout_display_owner_sys_t { int fit_window; + struct { + vlc_thread_t thread; + block_fifo_t *fifo; + } event; + #ifdef ALLOW_DUMMY_VOUT vlc_mouse_t vout_mouse; #endif @@ -459,15 +467,12 @@ static void VoutDisplayEventMouse(vout_display_t *vd, int event, va_list args) case VOUT_DISPLAY_EVENT_MOUSE_MOVED: { const int x = (int)va_arg(args, int); const int y = (int)va_arg(args, int); - if (x != osys->mouse.state.i_x || y != osys->mouse.state.i_y) { - //msg_Dbg(vd, "VoutDisplayEvent 'mouse' @%d,%d", x, y); - m.i_x = x; - m.i_y = y; - m.b_double_click = false; - } else { - is_ignored = true; - } + //msg_Dbg(vd, "VoutDisplayEvent 'mouse' @%d,%d", x, y); + + m.i_x = x; + m.i_y = y; + m.b_double_click = false; break; } case VOUT_DISPLAY_EVENT_MOUSE_PRESSED: @@ -537,6 +542,46 @@ static void VoutDisplayEventMouse(vout_display_t *vd, int event, va_list args) vlc_mutex_unlock(&osys->lock); } +static void *VoutDisplayEventKeyDispatch(void *data) +{ + vout_display_owner_sys_t *osys = data; + + for (;;) { + block_t *event = block_FifoGet(osys->event.fifo); + + int cancel = vlc_savecancel(); + + int key; + memcpy(&key, event->p_buffer, sizeof(key)); + vout_SendEventKey(osys->vout, key); + block_Release(event); + + vlc_restorecancel(cancel); + } +} + +static void VoutDisplayEventKey(vout_display_t *vd, int key) +{ + vout_display_owner_sys_t *osys = vd->owner.sys; + + if (!osys->event.fifo) { + osys->event.fifo = block_FifoNew(); + if (!osys->event.fifo) + return; + if (vlc_clone(&osys->event.thread, VoutDisplayEventKeyDispatch, + osys, VLC_THREAD_PRIORITY_LOW)) { + block_FifoRelease(osys->event.fifo); + osys->event.fifo = NULL; + return; + } + } + block_t *event = block_Alloc(sizeof(key)); + if (event) { + memcpy(event->p_buffer, &key, sizeof(key)); + block_FifoPut(osys->event.fifo, event); + } +} + static void VoutDisplayEvent(vout_display_t *vd, int event, va_list args) { vout_display_owner_sys_t *osys = vd->owner.sys; @@ -550,7 +595,10 @@ static void VoutDisplayEvent(vout_display_t *vd, int event, va_list args) case VOUT_DISPLAY_EVENT_KEY: { const int key = (int)va_arg(args, int); msg_Dbg(vd, "VoutDisplayEvent 'key' 0x%2.2x", key); - vout_SendEventKey(osys->vout, key); + if (vd->info.has_event_thread) + vout_SendEventKey(osys->vout, key); + else + VoutDisplayEventKey(vd, key); break; } case VOUT_DISPLAY_EVENT_MOUSE_STATE: @@ -631,12 +679,29 @@ static vout_window_t *VoutDisplayNewWindow(vout_display_t *vd, const vout_window { vout_display_owner_sys_t *osys = vd->owner.sys; +#ifdef ALLOW_DUMMY_VOUT + if (!osys->vout->p) { + vout_window_cfg_t cfg_override = *cfg; + + if (!var_InheritBool(osys->vout, "embedded-video")) + cfg_override.is_standalone = true; + + return vout_window_New(VLC_OBJECT(osys->vout), NULL, &cfg_override); + } +#endif return vout_NewDisplayWindow(osys->vout, vd, cfg); } static void VoutDisplayDelWindow(vout_display_t *vd, vout_window_t *window) { vout_display_owner_sys_t *osys = vd->owner.sys; +#ifdef ALLOW_DUMMY_VOUT + if (!osys->vout->p) { + if( window) + vout_window_Delete(window); + return; + } +#endif vout_DeleteDisplayWindow(osys->vout, vd, window); } @@ -1151,6 +1216,7 @@ static vout_display_t *DisplayNew(vout_thread_t *vout, osys->zoom.den = cfg->zoom.den; osys->wm_state = state->wm_state; osys->fit_window = 0; + osys->event.fifo = NULL; osys->source = *source_org; @@ -1227,6 +1293,11 @@ void vout_DeleteDisplay(vout_display_t *vd, vout_display_state_t *state) if (osys->is_wrapper) SplitterClose(vd); vout_display_Delete(vd); + if (osys->event.fifo) { + vlc_cancel(osys->event.thread); + vlc_join(osys->event.thread, NULL); + block_FifoRelease(osys->event.fifo); + } vlc_mutex_destroy(&osys->lock); free(osys); }