Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
3c34f3b4
Commit
3c34f3b4
authored
Feb 14, 2011
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
XCB/X11: cosmetic changes
parent
eed1ae9d
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
110 additions
and
115 deletions
+110
-115
modules/video_output/xcb/x11.c
modules/video_output/xcb/x11.c
+110
-115
No files found.
modules/video_output/xcb/x11.c
View file @
3c34f3b4
...
...
@@ -55,16 +55,15 @@ vlc_module_begin ()
add_obsolete_bool
(
"x11-shm"
)
/* obsoleted since 1.2.0 */
vlc_module_end
()
/* It must be large enough to absorb the server display jitter but it is
* useless to used a too large value, direct rendering cannot be used with
* xcb x11
*/
/* This must be large enough to absorb the server display jitter.
* But excessively large value is useless as direct rendering cannot be used
* with XCB X11. */
#define MAX_PICTURES (3)
struct
vout_display_sys_t
{
xcb_connection_t
*
conn
;
vout_window_t
*
embed
;
/* VLC window
(when windowed)
*/
vout_window_t
*
embed
;
/* VLC window */
xcb_cursor_t
cursor
;
/* blank cursor */
xcb_window_t
window
;
/* drawable X window */
...
...
@@ -106,34 +105,36 @@ static const xcb_depth_t *FindDepth (const xcb_screen_t *scr,
static
int
Open
(
vlc_object_t
*
obj
)
{
vout_display_t
*
vd
=
(
vout_display_t
*
)
obj
;
vout_display_sys_t
*
p_sys
=
malloc
(
sizeof
(
*
p_
sys
));
if
(
p_sys
==
NULL
)
vout_display_sys_t
*
sys
=
malloc
(
sizeof
(
*
sys
));
if
(
unlikely
(
sys
==
NULL
)
)
return
VLC_ENOMEM
;
vd
->
sys
=
p_
sys
;
p_
sys
->
pool
=
NULL
;
vd
->
sys
=
sys
;
sys
->
pool
=
NULL
;
/* Get window, connect to X server */
xcb_connection_t
*
conn
;
const
xcb_screen_t
*
scr
;
p_sys
->
embed
=
GetWindow
(
vd
,
&
p_sys
->
conn
,
&
scr
,
&
(
uint8_t
){
0
});
if
(
p_
sys
->
embed
==
NULL
)
sys
->
embed
=
GetWindow
(
vd
,
&
conn
,
&
scr
,
&
(
uint8_t
){
0
});
if
(
sys
->
embed
==
NULL
)
{
free
(
p_
sys
);
free
(
sys
);
return
VLC_EGENERIC
;
}
sys
->
conn
=
conn
;
const
xcb_setup_t
*
setup
=
xcb_get_setup
(
p_sys
->
conn
);
const
xcb_setup_t
*
setup
=
xcb_get_setup
(
conn
);
/* Determine our pixel format */
xcb_visualid_t
vid
=
0
;
p_
sys
->
depth
=
0
;
xcb_visualid_t
vid
;
sys
->
depth
=
0
;
for
(
const
xcb_format_t
*
fmt
=
xcb_setup_pixmap_formats
(
setup
),
*
end
=
fmt
+
xcb_setup_pixmap_formats_length
(
setup
);
fmt
<
end
;
fmt
++
)
{
if
(
fmt
->
depth
<=
p_
sys
->
depth
)
if
(
fmt
->
depth
<=
sys
->
depth
)
continue
;
/* no better than earlier format */
video_format_t
fmt_pic
=
vd
->
fmt
;
...
...
@@ -207,8 +208,8 @@ static int Open (vlc_object_t *obj)
vd
->
fmt
=
fmt_pic
;
vid
=
vt
->
visual_id
;
msg_Dbg
(
vd
,
"using X11 visual ID 0x%"
PRIx32
,
vid
);
p_
sys
->
depth
=
fmt
->
depth
;
msg_Dbg
(
vd
,
" %"
PRIu8
" bits depth"
,
p_
sys
->
depth
);
sys
->
depth
=
fmt
->
depth
;
msg_Dbg
(
vd
,
" %"
PRIu8
" bits depth"
,
sys
->
depth
);
msg_Dbg
(
vd
,
" %"
PRIu8
" bits per pixel"
,
fmt
->
bits_per_pixel
);
msg_Dbg
(
vd
,
" %"
PRIu8
" bits line pad"
,
fmt
->
scanline_pad
);
goto
found_format
;
...
...
@@ -239,8 +240,8 @@ found_format:;
xcb_colormap_t
cmap
;
if
(
vid
!=
scr
->
root_visual
)
{
cmap
=
xcb_generate_id
(
p_sys
->
conn
);
xcb_create_colormap
(
p_sys
->
conn
,
XCB_COLORMAP_ALLOC_NONE
,
cmap
=
xcb_generate_id
(
conn
);
xcb_create_colormap
(
conn
,
XCB_COLORMAP_ALLOC_NONE
,
cmap
,
scr
->
root
,
vid
);
}
else
...
...
@@ -248,12 +249,12 @@ found_format:;
/* Create window */
unsigned
width
,
height
;
if
(
GetWindowSize
(
p_sys
->
embed
,
p_sys
->
conn
,
&
width
,
&
height
))
if
(
GetWindowSize
(
sys
->
embed
,
conn
,
&
width
,
&
height
))
goto
error
;
p_sys
->
window
=
xcb_generate_id
(
p_sys
->
conn
);
p_sys
->
gc
=
xcb_generate_id
(
p_sys
->
conn
);
xcb_pixmap_t
pixmap
=
xcb_generate_id
(
p_sys
->
conn
);
sys
->
window
=
xcb_generate_id
(
conn
);
sys
->
gc
=
xcb_generate_id
(
conn
);
xcb_pixmap_t
pixmap
=
xcb_generate_id
(
conn
);
{
const
uint32_t
mask
=
XCB_CW_BACK_PIXMAP
|
...
...
@@ -278,35 +279,30 @@ found_format:;
};
xcb_void_cookie_t
c
;
xcb_create_pixmap
(
p_sys
->
conn
,
p_sys
->
depth
,
pixmap
,
scr
->
root
,
1
,
1
);
c
=
xcb_create_window_checked
(
p_sys
->
conn
,
p_sys
->
depth
,
p_sys
->
window
,
p_sys
->
embed
->
handle
.
xid
,
0
,
0
,
xcb_create_pixmap
(
conn
,
sys
->
depth
,
pixmap
,
scr
->
root
,
1
,
1
);
c
=
xcb_create_window_checked
(
conn
,
sys
->
depth
,
sys
->
window
,
sys
->
embed
->
handle
.
xid
,
0
,
0
,
width
,
height
,
0
,
XCB_WINDOW_CLASS_INPUT_OUTPUT
,
vid
,
mask
,
values
);
xcb_map_window
(
p_sys
->
conn
,
p_
sys
->
window
);
xcb_map_window
(
conn
,
sys
->
window
);
/* Create graphic context (I wonder why the heck do we need this) */
xcb_create_gc
(
p_sys
->
conn
,
p_sys
->
gc
,
p_
sys
->
window
,
0
,
NULL
);
xcb_create_gc
(
conn
,
sys
->
gc
,
sys
->
window
,
0
,
NULL
);
if
(
CheckError
(
vd
,
p_sys
->
conn
,
"cannot create X11 window"
,
c
))
if
(
CheckError
(
vd
,
conn
,
"cannot create X11 window"
,
c
))
goto
error
;
}
msg_Dbg
(
vd
,
"using X11 window %08"
PRIx32
,
p_sys
->
window
);
msg_Dbg
(
vd
,
"using X11 graphic context %08"
PRIx32
,
p_sys
->
gc
);
p_sys
->
cursor
=
CreateBlankCursor
(
p_sys
->
conn
,
scr
);
msg_Dbg
(
vd
,
"using X11 window %08"
PRIx32
,
sys
->
window
);
msg_Dbg
(
vd
,
"using X11 graphic context %08"
PRIx32
,
sys
->
gc
);
p_sys
->
visible
=
false
;
sys
->
cursor
=
CreateBlankCursor
(
conn
,
scr
);
sys
->
visible
=
false
;
sys
->
shm
=
CheckSHM
(
obj
,
conn
);
p_sys
->
shm
=
CheckSHM
(
obj
,
p_sys
->
conn
);
/* */
vout_display_info_t
info
=
vd
->
info
;
info
.
has_pictures_invalid
=
true
;
info
.
has_event_thread
=
true
;
/* Setup vout_display_t once everything is fine */
vd
->
info
=
info
;
vd
->
info
.
has_pictures_invalid
=
true
;
vd
->
info
.
has_event_thread
=
true
;
vd
->
pool
=
Pool
;
vd
->
prepare
=
NULL
;
...
...
@@ -316,7 +312,7 @@ found_format:;
/* */
bool
is_fullscreen
=
vd
->
cfg
->
is_fullscreen
;
if
(
is_fullscreen
&&
vout_window_SetFullScreen
(
p_
sys
->
embed
,
true
))
if
(
is_fullscreen
&&
vout_window_SetFullScreen
(
sys
->
embed
,
true
))
is_fullscreen
=
false
;
vout_display_SendEventFullscreen
(
vd
,
is_fullscreen
);
vout_display_SendEventDisplaySize
(
vd
,
width
,
height
,
is_fullscreen
);
...
...
@@ -335,19 +331,19 @@ error:
static
void
Close
(
vlc_object_t
*
obj
)
{
vout_display_t
*
vd
=
(
vout_display_t
*
)
obj
;
vout_display_sys_t
*
p_
sys
=
vd
->
sys
;
vout_display_sys_t
*
sys
=
vd
->
sys
;
ResetPictures
(
vd
);
/* show the default cursor */
xcb_change_window_attributes
(
p_sys
->
conn
,
p_
sys
->
embed
->
handle
.
xid
,
XCB_CW_CURSOR
,
xcb_change_window_attributes
(
sys
->
conn
,
sys
->
embed
->
handle
.
xid
,
XCB_CW_CURSOR
,
&
(
uint32_t
)
{
XCB_CURSOR_NONE
});
xcb_flush
(
p_
sys
->
conn
);
xcb_flush
(
sys
->
conn
);
/* colormap, window and context are garbage-collected by X */
xcb_disconnect
(
p_
sys
->
conn
);
vout_display_DeleteWindow
(
vd
,
p_
sys
->
embed
);
free
(
p_
sys
);
xcb_disconnect
(
sys
->
conn
);
vout_display_DeleteWindow
(
vd
,
sys
->
embed
);
free
(
sys
);
}
/**
...
...
@@ -355,59 +351,58 @@ static void Close (vlc_object_t *obj)
*/
static
picture_pool_t
*
Pool
(
vout_display_t
*
vd
,
unsigned
requested_count
)
{
vout_display_sys_t
*
p_
sys
=
vd
->
sys
;
vout_display_sys_t
*
sys
=
vd
->
sys
;
(
void
)
requested_count
;
if
(
!
p_sys
->
pool
)
{
vout_display_place_t
place
;
vout_display_PlacePicture
(
&
place
,
&
vd
->
source
,
vd
->
cfg
,
false
);
if
(
sys
->
pool
)
return
sys
->
pool
;
/* */
const
uint32_t
values
[]
=
{
place
.
x
,
place
.
y
,
place
.
width
,
place
.
height
};
xcb_configure_window
(
p_sys
->
conn
,
p_sys
->
window
,
XCB_CONFIG_WINDOW_X
|
XCB_CONFIG_WINDOW_Y
|
XCB_CONFIG_WINDOW_WIDTH
|
XCB_CONFIG_WINDOW_HEIGHT
,
values
);
vout_display_place_t
place
;
picture_t
*
pic
=
picture_NewFromFormat
(
&
vd
->
fmt
);
if
(
!
pic
)
return
NULL
;
vout_display_PlacePicture
(
&
place
,
&
vd
->
source
,
vd
->
cfg
,
false
);
assert
(
pic
->
i_planes
==
1
);
memset
(
p_sys
->
resource
,
0
,
sizeof
(
p_sys
->
resource
));
/* */
const
uint32_t
values
[]
=
{
place
.
x
,
place
.
y
,
place
.
width
,
place
.
height
};
xcb_configure_window
(
sys
->
conn
,
sys
->
window
,
XCB_CONFIG_WINDOW_X
|
XCB_CONFIG_WINDOW_Y
|
XCB_CONFIG_WINDOW_WIDTH
|
XCB_CONFIG_WINDOW_HEIGHT
,
values
);
picture_t
*
pic
=
picture_NewFromFormat
(
&
vd
->
fmt
);
if
(
!
pic
)
return
NULL
;
assert
(
pic
->
i_planes
==
1
);
memset
(
sys
->
resource
,
0
,
sizeof
(
sys
->
resource
));
unsigned
count
;
picture_t
*
pic_array
[
MAX_PICTURES
];
for
(
count
=
0
;
count
<
MAX_PICTURES
;
count
++
)
{
picture_resource_t
*
res
=
&
sys
->
resource
[
count
];
unsigned
count
;
picture_t
*
pic_array
[
MAX_PICTURES
];
for
(
count
=
0
;
count
<
MAX_PICTURES
;
count
++
)
res
->
p
->
i_lines
=
pic
->
p
->
i_lines
;
res
->
p
->
i_pitch
=
pic
->
p
->
i_pitch
;
if
(
PictureResourceAlloc
(
vd
,
res
,
res
->
p
->
i_pitch
*
res
->
p
->
i_lines
,
sys
->
conn
,
sys
->
shm
))
break
;
pic_array
[
count
]
=
picture_NewFromResource
(
&
vd
->
fmt
,
res
);
if
(
!
pic_array
[
count
])
{
picture_resource_t
*
res
=
&
p_sys
->
resource
[
count
];
res
->
p
->
i_lines
=
pic
->
p
->
i_lines
;
res
->
p
->
i_pitch
=
pic
->
p
->
i_pitch
;
if
(
PictureResourceAlloc
(
vd
,
res
,
res
->
p
->
i_pitch
*
res
->
p
->
i_lines
,
p_sys
->
conn
,
p_sys
->
shm
))
break
;
pic_array
[
count
]
=
picture_NewFromResource
(
&
vd
->
fmt
,
res
);
if
(
!
pic_array
[
count
])
{
PictureResourceFree
(
res
,
p_sys
->
conn
);
memset
(
res
,
0
,
sizeof
(
*
res
));
break
;
}
PictureResourceFree
(
res
,
sys
->
conn
);
memset
(
res
,
0
,
sizeof
(
*
res
));
break
;
}
picture_Release
(
pic
);
if
(
count
==
0
)
return
NULL
;
p_sys
->
pool
=
picture_pool_New
(
count
,
pic_array
);
/* TODO release picture resources if NULL */
xcb_flush
(
p_sys
->
conn
);
}
picture_Release
(
pic
);
if
(
count
==
0
)
return
NULL
;
return
p_sys
->
pool
;
sys
->
pool
=
picture_pool_New
(
count
,
pic_array
);
/* TODO release picture resources if NULL */
xcb_flush
(
sys
->
conn
);
return
sys
->
pool
;
}
/**
...
...
@@ -415,31 +410,31 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count)
*/
static
void
Display
(
vout_display_t
*
vd
,
picture_t
*
pic
,
subpicture_t
*
subpicture
)
{
vout_display_sys_t
*
p_
sys
=
vd
->
sys
;
vout_display_sys_t
*
sys
=
vd
->
sys
;
xcb_shm_seg_t
segment
=
pic
->
p_sys
->
segment
;
xcb_void_cookie_t
ck
;
if
(
!
p_
sys
->
visible
)
if
(
!
sys
->
visible
)
goto
out
;
if
(
segment
!=
0
)
ck
=
xcb_shm_put_image_checked
(
p_sys
->
conn
,
p_sys
->
window
,
p_
sys
->
gc
,
ck
=
xcb_shm_put_image_checked
(
sys
->
conn
,
sys
->
window
,
sys
->
gc
,
/* real width */
pic
->
p
->
i_pitch
/
pic
->
p
->
i_pixel_pitch
,
/* real height */
pic
->
p
->
i_lines
,
/* x */
vd
->
fmt
.
i_x_offset
,
/* y */
vd
->
fmt
.
i_y_offset
,
/* width */
vd
->
fmt
.
i_visible_width
,
/* height */
vd
->
fmt
.
i_visible_height
,
0
,
0
,
p_
sys
->
depth
,
XCB_IMAGE_FORMAT_Z_PIXMAP
,
0
,
0
,
sys
->
depth
,
XCB_IMAGE_FORMAT_Z_PIXMAP
,
0
,
segment
,
0
);
else
{
const
size_t
offset
=
vd
->
fmt
.
i_y_offset
*
pic
->
p
->
i_pitch
;
const
unsigned
lines
=
pic
->
p
->
i_lines
-
vd
->
fmt
.
i_y_offset
;
ck
=
xcb_put_image_checked
(
p_
sys
->
conn
,
XCB_IMAGE_FORMAT_Z_PIXMAP
,
p_sys
->
window
,
p_
sys
->
gc
,
ck
=
xcb_put_image_checked
(
sys
->
conn
,
XCB_IMAGE_FORMAT_Z_PIXMAP
,
sys
->
window
,
sys
->
gc
,
pic
->
p
->
i_pitch
/
pic
->
p
->
i_pixel_pitch
,
lines
,
-
vd
->
fmt
.
i_x_offset
,
0
,
0
,
p_
sys
->
depth
,
lines
,
-
vd
->
fmt
.
i_x_offset
,
0
,
0
,
sys
->
depth
,
pic
->
p
->
i_pitch
*
lines
,
pic
->
p
->
p_pixels
+
offset
);
}
...
...
@@ -447,7 +442,7 @@ static void Display (vout_display_t *vd, picture_t *pic, subpicture_t *subpictur
* display the picture. xcb_flush() is *not* sufficient: especially with
* shared memory the PUT requests are so short that many of them can fit in
* X11 socket output buffer before the kernel preempts VLC. */
xcb_generic_error_t
*
e
=
xcb_request_check
(
p_
sys
->
conn
,
ck
);
xcb_generic_error_t
*
e
=
xcb_request_check
(
sys
->
conn
,
ck
);
if
(
e
!=
NULL
)
{
msg_Dbg
(
vd
,
"%s: X11 error %d"
,
"cannot put image"
,
e
->
error_code
);
...
...
@@ -464,14 +459,14 @@ out:
static
int
Control
(
vout_display_t
*
vd
,
int
query
,
va_list
ap
)
{
vout_display_sys_t
*
p_
sys
=
vd
->
sys
;
vout_display_sys_t
*
sys
=
vd
->
sys
;
switch
(
query
)
{
case
VOUT_DISPLAY_CHANGE_FULLSCREEN
:
{
const
vout_display_cfg_t
*
c
=
va_arg
(
ap
,
const
vout_display_cfg_t
*
);
return
vout_window_SetFullScreen
(
p_
sys
->
embed
,
c
->
is_fullscreen
);
return
vout_window_SetFullScreen
(
sys
->
embed
,
c
->
is_fullscreen
);
}
case
VOUT_DISPLAY_CHANGE_DISPLAY_SIZE
:
...
...
@@ -481,7 +476,7 @@ static int Control (vout_display_t *vd, int query, va_list ap)
const
bool
is_forced
=
(
bool
)
va_arg
(
ap
,
int
);
if
(
is_forced
&&
vout_window_SetSize
(
p_
sys
->
embed
,
&&
vout_window_SetSize
(
sys
->
embed
,
p_cfg
->
display
.
width
,
p_cfg
->
display
.
height
))
return
VLC_EGENERIC
;
...
...
@@ -498,7 +493,7 @@ static int Control (vout_display_t *vd, int query, va_list ap)
/* Move the picture within the window */
const
uint32_t
values
[]
=
{
place
.
x
,
place
.
y
};
xcb_configure_window
(
p_sys
->
conn
,
p_
sys
->
window
,
xcb_configure_window
(
sys
->
conn
,
sys
->
window
,
XCB_CONFIG_WINDOW_X
|
XCB_CONFIG_WINDOW_Y
,
values
);
return
VLC_SUCCESS
;
...
...
@@ -506,7 +501,7 @@ static int Control (vout_display_t *vd, int query, va_list ap)
case
VOUT_DISPLAY_CHANGE_WINDOW_STATE
:
{
unsigned
state
=
va_arg
(
ap
,
unsigned
);
return
vout_window_SetState
(
p_
sys
->
embed
,
state
);
return
vout_window_SetState
(
sys
->
embed
,
state
);
}
case
VOUT_DISPLAY_CHANGE_ZOOM
:
...
...
@@ -537,8 +532,8 @@ static int Control (vout_display_t *vd, int query, va_list ap)
/* Hide the mouse. It will be send when
* vout_display_t::info.b_hide_mouse is false */
case
VOUT_DISPLAY_HIDE_MOUSE
:
xcb_change_window_attributes
(
p_sys
->
conn
,
p_
sys
->
embed
->
handle
.
xid
,
XCB_CW_CURSOR
,
&
(
uint32_t
){
p_
sys
->
cursor
});
xcb_change_window_attributes
(
sys
->
conn
,
sys
->
embed
->
handle
.
xid
,
XCB_CW_CURSOR
,
&
(
uint32_t
){
sys
->
cursor
});
return
VLC_SUCCESS
;
default:
...
...
@@ -549,26 +544,26 @@ static int Control (vout_display_t *vd, int query, va_list ap)
static
void
Manage
(
vout_display_t
*
vd
)
{
vout_display_sys_t
*
p_
sys
=
vd
->
sys
;
vout_display_sys_t
*
sys
=
vd
->
sys
;
ManageEvent
(
vd
,
p_sys
->
conn
,
&
p_
sys
->
visible
);
ManageEvent
(
vd
,
sys
->
conn
,
&
sys
->
visible
);
}
static
void
ResetPictures
(
vout_display_t
*
vd
)
{
vout_display_sys_t
*
p_
sys
=
vd
->
sys
;
vout_display_sys_t
*
sys
=
vd
->
sys
;
if
(
!
p_
sys
->
pool
)
if
(
!
sys
->
pool
)
return
;
for
(
unsigned
i
=
0
;
i
<
MAX_PICTURES
;
i
++
)
{
picture_resource_t
*
res
=
&
p_
sys
->
resource
[
i
];
picture_resource_t
*
res
=
&
sys
->
resource
[
i
];
if
(
!
res
->
p
->
p_pixels
)
break
;
PictureResourceFree
(
res
,
p_
sys
->
conn
);
PictureResourceFree
(
res
,
sys
->
conn
);
}
picture_pool_Delete
(
p_
sys
->
pool
);
p_
sys
->
pool
=
NULL
;
picture_pool_Delete
(
sys
->
pool
);
sys
->
pool
=
NULL
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment