]> git.sesse.net Git - vlc/blobdiff - src/video_output/display.c
Use var_Inherit* instead of var_CreateGet*.
[vlc] / src / video_output / display.c
index 4fd32f23df0169e1c85f3915e5ffb84b8d5f0435..600fedf846fdfd95e45144944ce378ce44956ad7 100644 (file)
@@ -33,6 +33,8 @@
 #include <vlc_video_splitter.h>
 #include <vlc_vout_display.h>
 #include <vlc_vout.h>
+#include <vlc_block.h>
+#include <vlc_modules.h>
 
 #include <libvlc.h>
 
@@ -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);
 }
 
@@ -719,7 +784,7 @@ void vout_ManageDisplay(vout_display_t *vd, bool allow_reset_pictures)
 
     if (hide_mouse) {
         if (!vd->info.has_hide_mouse) {
-            msg_Dbg(vd, "auto hidding mouse");
+            msg_Dbg(vd, "auto hiding mouse");
             vout_display_Control(vd, VOUT_DISPLAY_HIDE_MOUSE);
         }
         vout_SendEventMouseHidden(osys->vout);
@@ -783,6 +848,8 @@ void vout_ManageDisplay(vout_display_t *vd, bool allow_reset_pictures)
             if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_FULLSCREEN, &cfg)) {
                 msg_Err(vd, "Failed to set fullscreen");
                 is_fullscreen = osys->cfg.is_fullscreen;
+            } else if (!is_fullscreen) {
+                vout_display_Control(vd, VOUT_DISPLAY_CHANGE_DISPLAY_SIZE, &cfg, true);
             }
             osys->cfg.is_fullscreen = is_fullscreen;
 
@@ -1114,7 +1181,7 @@ static vout_display_t *DisplayNew(vout_thread_t *vout,
     vout_display_cfg_t *cfg = &osys->cfg;
 
     *cfg = state->cfg;
-    osys->wm_state_initial = VOUT_WINDOW_STATE_NORMAL;
+    osys->wm_state_initial = -1;
     osys->sar_initial.num = state->sar.num;
     osys->sar_initial.den = state->sar.den;
     vout_display_GetDefaultDisplaySize(&cfg->display.width, &cfg->display.height,
@@ -1131,16 +1198,25 @@ static vout_display_t *DisplayNew(vout_thread_t *vout,
     osys->mouse.double_click_timeout = double_click_timeout;
     osys->mouse.hide_timeout = hide_timeout;
     osys->is_fullscreen  = cfg->is_fullscreen;
-    osys->width_saved    =
     osys->display_width  = cfg->display.width;
-    osys->height_saved   =
     osys->display_height = cfg->display.height;
     osys->is_display_filled = cfg->is_display_filled;
+    osys->width_saved    = cfg->display.width;
+    osys->height_saved   = cfg->display.height;
+    if (osys->is_fullscreen) {
+        vout_display_cfg_t cfg_windowed = *cfg;
+        cfg_windowed.is_fullscreen  = false;
+        cfg_windowed.display.width  = 0;
+        cfg_windowed.display.height = 0;
+        vout_display_GetDefaultDisplaySize(&osys->width_saved,
+                                           &osys->height_saved,
+                                           source_org, &cfg_windowed);
+    }
     osys->zoom.num = cfg->zoom.num;
     osys->zoom.den = cfg->zoom.den;
-    osys->wm_state = state->is_on_top ? VOUT_WINDOW_STATE_ABOVE
-                                      : VOUT_WINDOW_STATE_NORMAL;
+    osys->wm_state = state->wm_state;
     osys->fit_window = 0;
+    osys->event.fifo = NULL;
 
     osys->source = *source_org;
 
@@ -1208,15 +1284,20 @@ void vout_DeleteDisplay(vout_display_t *vd, vout_display_state_t *state)
     if (state) {
         if (!osys->is_wrapper )
             state->cfg = osys->cfg;
-        state->is_on_top = (osys->wm_state & VOUT_WINDOW_STATE_ABOVE) != 0;
-        state->sar.num   = osys->sar_initial.num;
-        state->sar.den   = osys->sar_initial.den;
+        state->wm_state = osys->wm_state;
+        state->sar.num  = osys->sar_initial.num;
+        state->sar.den  = osys->sar_initial.den;
     }
 
     VoutDisplayDestroyRender(vd);
     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);
 }
@@ -1480,18 +1561,20 @@ vout_display_t *vout_NewSplitter(vout_thread_t *vout,
 #include "vout_internal.h"
 void vout_SendDisplayEventMouse(vout_thread_t *vout, const vlc_mouse_t *m)
 {
-    vlc_mouse_t tmp;
+    vlc_mouse_t tmp1, tmp2;
 
     /* The check on p_spu is needed as long as ALLOW_DUMMY_VOUT is defined */
     if (vout->p->p_spu && spu_ProcessMouse( vout->p->p_spu, m, &vout->p->display.vd->source))
         return;
 
-    vlc_mutex_lock( &vout->p->vfilter_lock );
-    if (vout->p->vfilter_chain) {
-        if (!filter_chain_MouseFilter(vout->p->vfilter_chain, &tmp, m))
-            m = &tmp;
+    vlc_mutex_lock( &vout->p->filter.lock );
+    if (vout->p->filter.chain_static && vout->p->filter.chain_interactive) {
+        if (!filter_chain_MouseFilter(vout->p->filter.chain_interactive, &tmp1, m))
+            m = &tmp1;
+        if (!filter_chain_MouseFilter(vout->p->filter.chain_static,      &tmp2, m))
+            m = &tmp2;
     }
-    vlc_mutex_unlock( &vout->p->vfilter_lock );
+    vlc_mutex_unlock( &vout->p->filter.lock );
 
     if (vlc_mouse_HasMoved(&vout->p->mouse, m)) {
         vout_SendEventMouseMoved(vout, m->i_x, m->i_y);
@@ -1524,33 +1607,18 @@ static void DummyVoutSendDisplayEventMouse(vout_thread_t *vout, vlc_mouse_t *fal
 
     if (!vout->p) {
         p.mouse = *fallback;
-        vlc_mutex_init(&p.vfilter_lock);
-        p.vfilter_chain = NULL;
+        vlc_mutex_init(&p.filter.lock);
+        p.filter.chain_static = NULL;
+        p.filter.chain_interactive = NULL;
         p.p_spu = NULL;
         vout->p = &p;
     }
     vout_SendDisplayEventMouse(vout, m);
     if (vout->p == &p) {
-        vlc_mutex_destroy(&p.vfilter_lock);
+        vlc_mutex_destroy(&p.filter.lock);
         *fallback = p.mouse;
         vout->p = NULL;
     }
 }
 #endif
-vout_window_t * vout_NewDisplayWindow(vout_thread_t *vout, vout_display_t *vd, const vout_window_cfg_t *cfg)
-{
-    VLC_UNUSED(vd);
-    vout_window_cfg_t cfg_override = *cfg;
-
-    if( !var_InheritBool( vout, "embedded-video" ) )
-        cfg_override.is_standalone = true;
-
-    return vout_window_New(VLC_OBJECT(vout), NULL, &cfg_override);
-}
-void vout_DeleteDisplayWindow(vout_thread_t *vout, vout_display_t *vd, vout_window_t *window)
-{
-    VLC_UNUSED(vout);
-    VLC_UNUSED(vd);
-    vout_window_Delete(window);
-}