Commit 5efdbb4f authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

window: add events for fullscreen and window state

parent a92d3126
......@@ -70,7 +70,7 @@ enum vout_window_control {
/**
* Window management state.
*/
enum {
enum vout_window_state {
VOUT_WINDOW_STATE_NORMAL,
VOUT_WINDOW_STATE_ABOVE,
VOUT_WINDOW_STATE_BELOW,
......@@ -117,6 +117,9 @@ typedef struct vout_window_cfg_t {
struct vout_window_callbacks {
void (*resized)(vout_window_t *, unsigned width, unsigned height);
void (*closed)(vout_window_t *);
void (*state_changed)(vout_window_t *, unsigned state);
void (*windowed)(vout_window_t *);
void (*fullscreened)(vout_window_t *, const char *id);
void (*mouse_event)(vout_window_t *,
const vout_window_mouse_event_t *mouse);
void (*keyboard_event)(vout_window_t *, unsigned key);
......@@ -318,6 +321,43 @@ static inline void vout_window_ReportClose(vout_window_t *window)
window->owner.cbs->closed(window);
}
/**
* Reports the current window state.
*
* This notifies the owner of the window that the state of the window changed.
* \param state \see vout_window_state
*/
static inline void vout_window_ReportState(vout_window_t *window,
unsigned state)
{
if (window->owner.cbs->state_changed != NULL)
window->owner.cbs->state_changed(window, state);
}
/**
* Reports that the window is not in full screen.
*
* This notifies the owner of the window that the window is windowed, i.e. not
* in full screen mode.
*/
static inline void vout_window_ReportWindowed(vout_window_t *window)
{
if (window->owner.cbs->windowed != NULL)
window->owner.cbs->windowed(window);
}
/**
* Reports that the window is in full screen.
*
* \param id fullscreen output nul-terminated identifier, NULL for default
*/
static inline void vout_window_ReportFullscreen(vout_window_t *window,
const char *id)
{
if (window->owner.cbs->fullscreened != NULL)
window->owner.cbs->fullscreened(window, id);
}
static inline void vout_window_SendMouseEvent(vout_window_t *window,
const vout_window_mouse_event_t *mouse)
{
......
......@@ -150,6 +150,36 @@ static void vout_display_window_CloseNotify(vout_window_t *window)
msg_Err(window, "window closed");
}
static void vout_display_window_StateNotify(vout_window_t *window,
unsigned state)
{
static const char states[][8] = {
[VOUT_WINDOW_STATE_NORMAL] = "normal",
[VOUT_WINDOW_STATE_ABOVE] = "above",
[VOUT_WINDOW_STATE_BELOW] = "below",
};
assert(state < ARRAY_SIZE(states));
msg_Dbg(window, "window state changed: %s", states[state]);
var_SetInteger(window->obj.parent, "window-state", state);
}
static void vout_display_window_FullscreenNotify(vout_window_t *window,
const char *id)
{
msg_Dbg(window, (id != NULL) ? "window set to fullscreen on %s"
: "window set to fullscreen", id);
var_SetString(window->obj.parent, "window-fullscreen-output",
(id != NULL) ? id : "");
var_SetBool(window->obj.parent, "window-fullscreen", true);
}
static void vout_display_window_WindowingNotify(vout_window_t *window)
{
msg_Dbg(window, "window set windowed");
var_SetBool(window->obj.parent, "window-fullscreen", false);
}
static void vout_display_window_MouseEvent(vout_window_t *window,
const vout_window_mouse_event_t *ev)
{
......@@ -213,6 +243,9 @@ static void vout_display_window_KeyboardEvent(vout_window_t *window,
static const struct vout_window_callbacks vout_display_window_cbs = {
.resized = vout_display_window_ResizeNotify,
.closed = vout_display_window_CloseNotify,
.state_changed = vout_display_window_StateNotify,
.fullscreened = vout_display_window_FullscreenNotify,
.windowed = vout_display_window_WindowingNotify,
.mouse_event = vout_display_window_MouseEvent,
.keyboard_event = vout_display_window_KeyboardEvent,
};
......@@ -237,6 +270,10 @@ vout_window_t *vout_display_window_New(vout_thread_t *vout,
};
vout_window_t *window;
var_Create(vout, "window-state", VLC_VAR_INTEGER);
var_Create(vout, "window-fullscreen", VLC_VAR_BOOL);
var_Create(vout, "window-fullscreen-output", VLC_VAR_STRING);
window = vout_window_New((vlc_object_t *)vout, modlist, cfg, &owner);
free(modlist);
if (window == NULL)
......@@ -250,8 +287,12 @@ vout_window_t *vout_display_window_New(vout_thread_t *vout,
*/
void vout_display_window_Delete(vout_window_t *window)
{
vout_thread_t *vout = (vout_thread_t *)(window->obj.parent);
vout_display_window_t *state = window->owner.sys;
vout_window_Delete(window);
var_Destroy(vout, "window-fullscreen-output");
var_Destroy(vout, "window-fullscreen");
var_Destroy(vout, "window-state");
free(state);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment