New upstream version 24.0.1+dfsg1
This commit is contained in:
parent
b14f9eae6d
commit
5a730d6ec3
842 changed files with 42245 additions and 33385 deletions
|
|
@ -33,26 +33,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#define blog(level, msg, ...) blog(level, "xshm-input: " msg, ##__VA_ARGS__)
|
||||
|
||||
struct xshm_data {
|
||||
obs_source_t *source;
|
||||
obs_source_t *source;
|
||||
|
||||
xcb_connection_t *xcb;
|
||||
xcb_screen_t *xcb_screen;
|
||||
xcb_shm_t *xshm;
|
||||
xcb_xcursor_t *cursor;
|
||||
xcb_screen_t *xcb_screen;
|
||||
xcb_shm_t *xshm;
|
||||
xcb_xcursor_t *cursor;
|
||||
|
||||
char *server;
|
||||
uint_fast32_t screen_id;
|
||||
int_fast32_t x_org;
|
||||
int_fast32_t y_org;
|
||||
int_fast32_t width;
|
||||
int_fast32_t height;
|
||||
char *server;
|
||||
uint_fast32_t screen_id;
|
||||
int_fast32_t x_org;
|
||||
int_fast32_t y_org;
|
||||
int_fast32_t width;
|
||||
int_fast32_t height;
|
||||
|
||||
gs_texture_t *texture;
|
||||
gs_texture_t *texture;
|
||||
|
||||
bool show_cursor;
|
||||
bool use_xinerama;
|
||||
bool use_randr;
|
||||
bool advanced;
|
||||
bool show_cursor;
|
||||
bool use_xinerama;
|
||||
bool use_randr;
|
||||
bool advanced;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -66,8 +66,8 @@ static inline void xshm_resize_texture(struct xshm_data *data)
|
|||
{
|
||||
if (data->texture)
|
||||
gs_texture_destroy(data->texture);
|
||||
data->texture = gs_texture_create(data->width, data->height,
|
||||
GS_BGRA, 1, NULL, GS_DYNAMIC);
|
||||
data->texture = gs_texture_create(data->width, data->height, GS_BGRA, 1,
|
||||
NULL, GS_DYNAMIC);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -102,26 +102,23 @@ static int_fast32_t xshm_update_geometry(struct xshm_data *data)
|
|||
int_fast32_t old_height = data->height;
|
||||
|
||||
if (data->use_randr) {
|
||||
if (randr_screen_geo(data->xcb, data->screen_id,
|
||||
&data->x_org, &data->y_org,
|
||||
&data->width, &data->height,
|
||||
&data->xcb_screen) < 0) {
|
||||
if (randr_screen_geo(data->xcb, data->screen_id, &data->x_org,
|
||||
&data->y_org, &data->width, &data->height,
|
||||
&data->xcb_screen) < 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else if (data->use_xinerama) {
|
||||
} else if (data->use_xinerama) {
|
||||
if (xinerama_screen_geo(data->xcb, data->screen_id,
|
||||
&data->x_org, &data->y_org,
|
||||
&data->width, &data->height) < 0) {
|
||||
&data->x_org, &data->y_org,
|
||||
&data->width, &data->height) < 0) {
|
||||
return -1;
|
||||
}
|
||||
data->xcb_screen = xcb_get_screen(data->xcb, 0);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
data->x_org = 0;
|
||||
data->y_org = 0;
|
||||
if (x11_screen_geo(data->xcb, data->screen_id,
|
||||
&data->width, &data->height) < 0) {
|
||||
if (x11_screen_geo(data->xcb, data->screen_id, &data->width,
|
||||
&data->height) < 0) {
|
||||
return -1;
|
||||
}
|
||||
data->xcb_screen = xcb_get_screen(data->xcb, data->screen_id);
|
||||
|
|
@ -132,9 +129,10 @@ static int_fast32_t xshm_update_geometry(struct xshm_data *data)
|
|||
return -1;
|
||||
}
|
||||
|
||||
blog(LOG_INFO, "Geometry %"PRIdFAST32"x%"PRIdFAST32
|
||||
" @ %"PRIdFAST32",%"PRIdFAST32,
|
||||
data->width, data->height, data->x_org, data->y_org);
|
||||
blog(LOG_INFO,
|
||||
"Geometry %" PRIdFAST32 "x%" PRIdFAST32 " @ %" PRIdFAST32
|
||||
",%" PRIdFAST32,
|
||||
data->width, data->height, data->x_org, data->y_org);
|
||||
|
||||
if (old_width == data->width && old_height == data->height)
|
||||
return 0;
|
||||
|
|
@ -145,7 +143,7 @@ static int_fast32_t xshm_update_geometry(struct xshm_data *data)
|
|||
/**
|
||||
* Returns the name of the plugin
|
||||
*/
|
||||
static const char* xshm_getname(void *unused)
|
||||
static const char *xshm_getname(void *unused)
|
||||
{
|
||||
UNUSED_PARAMETER(unused);
|
||||
return obs_module_text("X11SharedMemoryScreenInput");
|
||||
|
|
@ -190,8 +188,8 @@ static void xshm_capture_stop(struct xshm_data *data)
|
|||
*/
|
||||
static void xshm_capture_start(struct xshm_data *data)
|
||||
{
|
||||
const char *server = (data->advanced && *data->server)
|
||||
? data->server : NULL;
|
||||
const char *server = (data->advanced && *data->server) ? data->server
|
||||
: NULL;
|
||||
|
||||
data->xcb = xcb_connect(server, NULL);
|
||||
if (!data->xcb || xcb_connection_has_error(data->xcb)) {
|
||||
|
|
@ -239,10 +237,10 @@ static void xshm_update(void *vptr, obs_data_t *settings)
|
|||
|
||||
xshm_capture_stop(data);
|
||||
|
||||
data->screen_id = obs_data_get_int(settings, "screen");
|
||||
data->screen_id = obs_data_get_int(settings, "screen");
|
||||
data->show_cursor = obs_data_get_bool(settings, "show_cursor");
|
||||
data->advanced = obs_data_get_bool(settings, "advanced");
|
||||
data->server = bstrdup(obs_data_get_string(settings, "server"));
|
||||
data->advanced = obs_data_get_bool(settings, "advanced");
|
||||
data->server = bstrdup(obs_data_get_string(settings, "server"));
|
||||
|
||||
xshm_capture_start(data);
|
||||
}
|
||||
|
|
@ -260,11 +258,11 @@ static void xshm_defaults(obs_data_t *defaults)
|
|||
/**
|
||||
* Toggle visibility of advanced settings
|
||||
*/
|
||||
static bool xshm_toggle_advanced(obs_properties_t *props,
|
||||
obs_property_t *p, obs_data_t *settings)
|
||||
static bool xshm_toggle_advanced(obs_properties_t *props, obs_property_t *p,
|
||||
obs_data_t *settings)
|
||||
{
|
||||
UNUSED_PARAMETER(p);
|
||||
const bool visible = obs_data_get_bool(settings, "advanced");
|
||||
const bool visible = obs_data_get_bool(settings, "advanced");
|
||||
obs_property_t *server = obs_properties_get(props, "server");
|
||||
|
||||
obs_property_set_visible(server, visible);
|
||||
|
|
@ -278,14 +276,14 @@ static bool xshm_toggle_advanced(obs_properties_t *props,
|
|||
/**
|
||||
* The x server was changed
|
||||
*/
|
||||
static bool xshm_server_changed(obs_properties_t *props,
|
||||
obs_property_t *p, obs_data_t *settings)
|
||||
static bool xshm_server_changed(obs_properties_t *props, obs_property_t *p,
|
||||
obs_data_t *settings)
|
||||
{
|
||||
UNUSED_PARAMETER(p);
|
||||
|
||||
bool advanced = obs_data_get_bool(settings, "advanced");
|
||||
bool advanced = obs_data_get_bool(settings, "advanced");
|
||||
int_fast32_t old_screen = obs_data_get_int(settings, "screen");
|
||||
const char *server = obs_data_get_string(settings, "server");
|
||||
const char *server = obs_data_get_string(settings, "server");
|
||||
obs_property_t *screens = obs_properties_get(props, "screen");
|
||||
|
||||
/* we want a real NULL here in case there is no string here */
|
||||
|
|
@ -303,11 +301,11 @@ static bool xshm_server_changed(obs_properties_t *props,
|
|||
dstr_init(&screen_info);
|
||||
bool randr = randr_is_active(xcb);
|
||||
bool xinerama = xinerama_is_active(xcb);
|
||||
int_fast32_t count = (randr) ?
|
||||
randr_screen_count(xcb) :
|
||||
(xinerama) ?
|
||||
xinerama_screen_count(xcb) :
|
||||
xcb_setup_roots_length(xcb_get_setup(xcb));
|
||||
int_fast32_t count =
|
||||
(randr) ? randr_screen_count(xcb)
|
||||
: (xinerama)
|
||||
? xinerama_screen_count(xcb)
|
||||
: xcb_setup_roots_length(xcb_get_setup(xcb));
|
||||
|
||||
for (int_fast32_t i = 0; i < count; ++i) {
|
||||
int_fast32_t x, y, w, h;
|
||||
|
|
@ -320,21 +318,22 @@ static bool xshm_server_changed(obs_properties_t *props,
|
|||
else
|
||||
x11_screen_geo(xcb, i, &w, &h);
|
||||
|
||||
dstr_printf(&screen_info, "Screen %"PRIuFAST32" (%"PRIuFAST32
|
||||
"x%"PRIuFAST32" @ %"PRIuFAST32
|
||||
",%"PRIuFAST32")", i, w, h, x, y);
|
||||
dstr_printf(&screen_info,
|
||||
"Screen %" PRIuFAST32 " (%" PRIuFAST32
|
||||
"x%" PRIuFAST32 " @ %" PRIuFAST32 ",%" PRIuFAST32
|
||||
")",
|
||||
i, w, h, x, y);
|
||||
|
||||
obs_property_list_add_int(screens, screen_info.array, i);
|
||||
}
|
||||
|
||||
/* handle missing screen */
|
||||
if (old_screen + 1 > count) {
|
||||
dstr_printf(&screen_info, "Screen %"PRIuFAST32" (not found)",
|
||||
old_screen);
|
||||
size_t index = obs_property_list_add_int(screens,
|
||||
screen_info.array, old_screen);
|
||||
dstr_printf(&screen_info, "Screen %" PRIuFAST32 " (not found)",
|
||||
old_screen);
|
||||
size_t index = obs_property_list_add_int(
|
||||
screens, screen_info.array, old_screen);
|
||||
obs_property_list_item_disable(screens, index, true);
|
||||
|
||||
}
|
||||
|
||||
dstr_free(&screen_info);
|
||||
|
|
@ -355,13 +354,13 @@ static obs_properties_t *xshm_properties(void *vptr)
|
|||
obs_properties_t *props = obs_properties_create();
|
||||
|
||||
obs_properties_add_list(props, "screen", obs_module_text("Screen"),
|
||||
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
|
||||
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
|
||||
obs_properties_add_bool(props, "show_cursor",
|
||||
obs_module_text("CaptureCursor"));
|
||||
obs_property_t *advanced = obs_properties_add_bool(props, "advanced",
|
||||
obs_module_text("AdvancedSettings"));
|
||||
obs_property_t *server = obs_properties_add_text(props, "server",
|
||||
obs_module_text("XServer"), OBS_TEXT_DEFAULT);
|
||||
obs_module_text("CaptureCursor"));
|
||||
obs_property_t *advanced = obs_properties_add_bool(
|
||||
props, "advanced", obs_module_text("AdvancedSettings"));
|
||||
obs_property_t *server = obs_properties_add_text(
|
||||
props, "server", obs_module_text("XServer"), OBS_TEXT_DEFAULT);
|
||||
|
||||
obs_property_set_modified_callback(advanced, xshm_toggle_advanced);
|
||||
obs_property_set_modified_callback(server, xshm_server_changed);
|
||||
|
|
@ -415,14 +414,16 @@ static void xshm_video_tick(void *vptr, float seconds)
|
|||
if (!obs_source_showing(data->source))
|
||||
return;
|
||||
|
||||
xcb_shm_get_image_cookie_t img_c;
|
||||
xcb_shm_get_image_reply_t *img_r;
|
||||
xcb_shm_get_image_cookie_t img_c;
|
||||
xcb_shm_get_image_reply_t *img_r;
|
||||
xcb_xfixes_get_cursor_image_cookie_t cur_c;
|
||||
xcb_xfixes_get_cursor_image_reply_t *cur_r;
|
||||
xcb_xfixes_get_cursor_image_reply_t *cur_r;
|
||||
|
||||
img_c = xcb_shm_get_image_unchecked(data->xcb, data->xcb_screen->root,
|
||||
data->x_org, data->y_org, data->width, data->height,
|
||||
~0, XCB_IMAGE_FORMAT_Z_PIXMAP, data->xshm->seg, 0);
|
||||
data->x_org, data->y_org,
|
||||
data->width, data->height, ~0,
|
||||
XCB_IMAGE_FORMAT_Z_PIXMAP,
|
||||
data->xshm->seg, 0);
|
||||
cur_c = xcb_xfixes_get_cursor_image_unchecked(data->xcb);
|
||||
|
||||
img_r = xcb_shm_get_image_reply(data->xcb, img_c, NULL);
|
||||
|
|
@ -433,8 +434,8 @@ static void xshm_video_tick(void *vptr, float seconds)
|
|||
|
||||
obs_enter_graphics();
|
||||
|
||||
gs_texture_set_image(data->texture, (void *) data->xshm->data,
|
||||
data->width * 4, false);
|
||||
gs_texture_set_image(data->texture, (void *)data->xshm->data,
|
||||
data->width * 4, false);
|
||||
xcb_xcursor_update(data->cursor, cur_r);
|
||||
|
||||
obs_leave_graphics();
|
||||
|
|
@ -491,19 +492,18 @@ static uint32_t xshm_getheight(void *vptr)
|
|||
}
|
||||
|
||||
struct obs_source_info xshm_input = {
|
||||
.id = "xshm_input",
|
||||
.type = OBS_SOURCE_TYPE_INPUT,
|
||||
.output_flags = OBS_SOURCE_VIDEO |
|
||||
OBS_SOURCE_CUSTOM_DRAW |
|
||||
OBS_SOURCE_DO_NOT_DUPLICATE,
|
||||
.get_name = xshm_getname,
|
||||
.create = xshm_create,
|
||||
.destroy = xshm_destroy,
|
||||
.update = xshm_update,
|
||||
.get_defaults = xshm_defaults,
|
||||
.id = "xshm_input",
|
||||
.type = OBS_SOURCE_TYPE_INPUT,
|
||||
.output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW |
|
||||
OBS_SOURCE_DO_NOT_DUPLICATE,
|
||||
.get_name = xshm_getname,
|
||||
.create = xshm_create,
|
||||
.destroy = xshm_destroy,
|
||||
.update = xshm_update,
|
||||
.get_defaults = xshm_defaults,
|
||||
.get_properties = xshm_properties,
|
||||
.video_tick = xshm_video_tick,
|
||||
.video_render = xshm_video_render,
|
||||
.get_width = xshm_getwidth,
|
||||
.get_height = xshm_getheight
|
||||
.video_tick = xshm_video_tick,
|
||||
.video_render = xshm_video_render,
|
||||
.get_width = xshm_getwidth,
|
||||
.get_height = xshm_getheight,
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue