WM: Remove Screen Cast

This feature is better handled by specialized tools.
This commit is contained in:
Campbell Barton 2018-06-28 23:39:20 +02:00
parent aa6247a385
commit 46dceefc35
Notes: blender-bot 2023-02-14 09:33:11 +01:00
Referenced by issue #55772, Crashes opening a file
18 changed files with 5 additions and 312 deletions

View File

@ -163,7 +163,7 @@ class SpellChecker:
"rolloff",
"runtime",
"scanline",
"screencast", "screenshot", "screenshots",
"screenshot", "screenshots",
"seekability",
"selfcollision",
"shadowbuffer", "shadowbuffers",

View File

@ -91,7 +91,6 @@ kmi = km.keymap_items.new('screen.screen_full_area', 'UP_ARROW', 'PRESS', ctrl=T
kmi = km.keymap_items.new('screen.screen_full_area', 'DOWN_ARROW', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('screen.screen_full_area', 'SPACE', 'PRESS', shift=True)
kmi = km.keymap_items.new('screen.screenshot', 'F3', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('screen.screencast', 'F3', 'PRESS', alt=True)
kmi = km.keymap_items.new('screen.region_quadview', 'W', 'PRESS', alt=True)
kmi = km.keymap_items.new('screen.repeat_history', 'F3', 'PRESS', shift=True)
kmi = km.keymap_items.new('screen.repeat_last', 'R', 'PRESS', shift=True)
@ -2449,4 +2448,3 @@ kmi = km.keymap_items.new_modal('SELECT', 'LEFTMOUSE', 'RELEASE', any=True)
kmi = km.keymap_items.new_modal('SELECT', 'RIGHTMOUSE', 'RELEASE', any=True)
kmi = km.keymap_items.new_modal('BEGIN', 'MIDDLEMOUSE', 'PRESS')
kmi = km.keymap_items.new_modal('DESELECT', 'MIDDLEMOUSE', 'RELEASE')

View File

@ -89,7 +89,6 @@ kmi = km.keymap_items.new('screen.screen_set', 'LEFT_ARROW', 'PRESS', ctrl=True)
kmi.properties.delta = -1
kmi = km.keymap_items.new('screen.screen_full_area', 'SPACE', 'PRESS', shift=True)
kmi = km.keymap_items.new('screen.screenshot', 'F3', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('screen.screencast', 'F3', 'PRESS', alt=True)
kmi = km.keymap_items.new('screen.region_quadview', 'SPACE', 'PRESS')
kmi = km.keymap_items.new('screen.repeat_history', 'F3', 'PRESS')
kmi = km.keymap_items.new('screen.repeat_last', 'G', 'PRESS')
@ -1931,4 +1930,3 @@ kmi.properties.action = 'TOGGLE'
kmi = km.keymap_items.new('transform.translate', 'W', 'PRESS')
kmi = km.keymap_items.new('transform.translate', 'EVT_TWEAK_S', 'ANY')
kmi = km.keymap_items.new('transform.resize', 'R', 'PRESS')

View File

@ -300,7 +300,6 @@ class INFO_MT_window(Menu):
layout.separator()
layout.operator("screen.screenshot")
layout.operator("screen.screencast")
if sys.platform[:3] == "win":
layout.separator()

View File

@ -494,12 +494,6 @@ class USERPREF_PT_system(Panel):
col.separator()
col.label(text="Screencast:")
col.prop(system, "screencast_fps")
col.prop(system, "screencast_wait_time")
col.separator()
if bpy.app.build_options.cycles:
addon = userpref.addons.get("cycles")
if addon is not None:

View File

@ -3800,9 +3800,6 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
NULL, 0.0f, 0.0f, 0, 0, TIP_("Stop this job"));
}
if (WM_jobs_test(wm, screen, WM_JOB_TYPE_SCREENCAST))
uiDefIconTextBut(block, UI_BTYPE_BUT, B_STOPCAST, ICON_CANCEL, IFACE_("Capture"), 0, 0, UI_UNIT_X * 4.25f, UI_UNIT_Y,
NULL, 0.0f, 0.0f, 0, 0, TIP_("Stop screencast"));
if (screen->animtimer)
uiDefIconTextBut(block, UI_BTYPE_BUT, B_STOPANIM, ICON_CANCEL, IFACE_("Anim Player"), 0, 0, UI_UNIT_X * 5.0f, UI_UNIT_Y,
NULL, 0.0f, 0.0f, 0, 0, TIP_("Stop animation playback"));

View File

@ -2325,10 +2325,6 @@ void init_userdef_do_versions(Main *bmain)
if (U.dbl_click_time == 0) {
U.dbl_click_time = 350;
}
if (U.scrcastfps == 0) {
U.scrcastfps = 10;
U.scrcastwait = 50;
}
if (U.v2d_min_gridsize == 0) {
U.v2d_min_gridsize = 35;
}

View File

@ -72,7 +72,6 @@ extern const char *screen_context_dir[]; /* doc access */
/* screendump.c */
void SCREEN_OT_screenshot(struct wmOperatorType *ot);
void SCREEN_OT_screencast(struct wmOperatorType *ot);
/* screen_ops.c */
void region_blend_start(struct bContext *C, struct ScrArea *sa, struct ARegion *ar);

View File

@ -4493,7 +4493,6 @@ void ED_operatortypes_screen(void)
WM_operatortype_append(SCREEN_OT_back_to_previous);
WM_operatortype_append(SCREEN_OT_spacedata_cleanup);
WM_operatortype_append(SCREEN_OT_screenshot);
WM_operatortype_append(SCREEN_OT_screencast);
WM_operatortype_append(SCREEN_OT_userpref_show);
WM_operatortype_append(SCREEN_OT_region_blend);
WM_operatortype_append(SCREEN_OT_space_context_cycle);
@ -4625,7 +4624,6 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
RNA_boolean_set(kmi->ptr, "use_hide_panels", true);
WM_keymap_add_item(keymap, "SCREEN_OT_screenshot", F3KEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "SCREEN_OT_screencast", F3KEY, KM_PRESS, KM_ALT, 0);
kmi = WM_keymap_add_item(keymap, "SCREEN_OT_space_context_cycle", TABKEY, KM_PRESS, KM_CTRL, 0);
RNA_enum_set(kmi->ptr, "direction", SPACE_CONTEXT_CYCLE_NEXT);

View File

@ -36,7 +36,6 @@
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
#include "BLI_math.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@ -44,17 +43,14 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_image.h"
#include "BKE_report.h"
#include "BKE_writeavi.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "RNA_access.h"
#include "RNA_define.h"
@ -64,9 +60,6 @@
#include "WM_types.h"
#include "WM_api.h"
#include "PIL_time.h"
#include "screen_intern.h"
typedef struct ScreenshotData {
@ -305,259 +298,3 @@ void SCREEN_OT_screenshot(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "full", 1, "Full Screen",
"Capture the whole window (otherwise only capture the active area)");
}
/* *************** screenshot movie job ************************* */
typedef struct ScreenshotJob {
Main *bmain;
Scene *scene;
wmWindowManager *wm;
unsigned int *dumprect;
int x, y, dumpsx, dumpsy;
const short *stop;
const short *do_update;
ReportList reports;
bMovieHandle *movie_handle;
void *movie_ctx;
} ScreenshotJob;
static void screenshot_freejob(void *sjv)
{
ScreenshotJob *sj = sjv;
if (sj->dumprect)
MEM_freeN(sj->dumprect);
if (sj->movie_handle) {
bMovieHandle *mh = sj->movie_handle;
mh->end_movie(sj->movie_ctx);
mh->context_free(sj->movie_ctx);
}
MEM_freeN(sj);
}
/* called before redraw notifiers, copies a new dumprect */
static void screenshot_updatejob(void *sjv)
{
ScreenshotJob *sj = sjv;
unsigned int *dumprect;
if (sj->dumprect == NULL) {
dumprect = MEM_mallocN(sizeof(int) * sj->dumpsx * sj->dumpsy, "dumprect");
screenshot_read_pixels(sj->x, sj->y, sj->dumpsx, sj->dumpsy, (unsigned char *)dumprect);
sj->dumprect = dumprect;
}
}
/* only this runs inside thread */
static void screenshot_startjob(void *sjv, short *stop, short *do_update, float *UNUSED(progress))
{
ScreenshotJob *sj = sjv;
RenderData rd = sj->scene->r;
bMovieHandle *mh = NULL;
/* we need this as local variables for renderdata */
rd.frs_sec = U.scrcastfps;
rd.frs_sec_base = 1.0f;
if (BKE_imtype_is_movie(rd.im_format.imtype)) {
mh = BKE_movie_handle_get(sj->scene->r.im_format.imtype);
if (mh == NULL) {
printf("Movie format unsupported\n");
return;
}
sj->movie_ctx = mh->context_create();
sj->movie_handle = mh;
if (!mh->start_movie(sj->movie_ctx, sj->scene, &rd, sj->dumpsx, sj->dumpsy, &sj->reports, false, "")) {
printf("screencast job stopped\n");
return;
}
}
sj->stop = stop;
sj->do_update = do_update;
*do_update = true; /* wait for opengl rect */
while (*stop == 0) {
if (sj->dumprect) {
if (mh) {
if (mh->append_movie(sj->movie_ctx, &rd, rd.sfra, rd.cfra, (int *)sj->dumprect,
sj->dumpsx, sj->dumpsy, "", &sj->reports))
{
BKE_reportf(&sj->reports, RPT_INFO, "Appended frame: %d", rd.cfra);
printf("Appended frame %d\n", rd.cfra);
}
else {
break;
}
}
else {
ImBuf *ibuf = IMB_allocImBuf(sj->dumpsx, sj->dumpsy, rd.im_format.planes, 0);
char name[FILE_MAX];
int ok;
BKE_image_path_from_imformat(
name, rd.pic, BKE_main_blendfile_path(sj->bmain), rd.cfra,
&rd.im_format, (rd.scemode & R_EXTENSION) != 0, true, NULL);
ibuf->rect = sj->dumprect;
ok = BKE_imbuf_write(ibuf, name, &rd.im_format);
if (ok == 0) {
printf("Write error: cannot save %s\n", name);
BKE_reportf(&sj->reports, RPT_INFO, "Write error: cannot save %s", name);
break;
}
else {
printf("Saved file: %s\n", name);
BKE_reportf(&sj->reports, RPT_INFO, "Saved file: %s", name);
}
/* imbuf knows which rects are not part of ibuf */
IMB_freeImBuf(ibuf);
}
MEM_freeN(sj->dumprect);
sj->dumprect = NULL;
*do_update = true;
rd.cfra++;
}
else
PIL_sleep_ms(U.scrcastwait);
}
if (mh) {
mh->end_movie(sj->movie_ctx);
mh->context_free(sj->movie_ctx);
sj->movie_handle = NULL;
}
BKE_report(&sj->reports, RPT_INFO, "Screencast job stopped");
}
/* Helper callback for drawing the cursor itself */
static void screencast_draw_cursor(bContext *UNUSED(C), int x, int y, void *UNUSED(p_ptr))
{
glPushMatrix();
glTranslatef((float)x, (float)y, 0.0f);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
glColor4ub(0, 0, 0, 32);
glutil_draw_filled_arc(0.0, M_PI * 2.0, 20, 40);
glColor4ub(255, 255, 255, 128);
glutil_draw_lined_arc(0.0, M_PI * 2.0, 20, 40);
glDisable(GL_BLEND);
glDisable(GL_LINE_SMOOTH);
glPopMatrix();
}
/* Turn brush cursor in 3D view on/off */
static void screencast_cursor_toggle(wmWindowManager *wm, short enable)
{
static void *cursor = NULL;
if (cursor && !enable) {
/* clear cursor */
WM_paint_cursor_end(wm, cursor);
cursor = NULL;
}
else if (enable) {
/* enable cursor */
cursor = WM_paint_cursor_activate(wm, NULL, screencast_draw_cursor, NULL);
}
}
static void screenshot_endjob(void *sjv)
{
ScreenshotJob *sj = sjv;
screencast_cursor_toggle(sj->wm, 0);
}
static int screencast_exec(bContext *C, wmOperator *op)
{
wmWindowManager *wm = CTX_wm_manager(C);
wmWindow *win = CTX_wm_window(C);
bScreen *screen = CTX_wm_screen(C);
wmJob *wm_job;
ScreenshotJob *sj;
/* if called again, stop the running job */
if (WM_jobs_test(wm, screen, WM_JOB_TYPE_SCREENCAST))
WM_jobs_stop(wm, screen, screenshot_startjob);
wm_job = WM_jobs_get(wm, win, screen, "Screencast", 0, WM_JOB_TYPE_SCREENCAST);
sj = MEM_callocN(sizeof(ScreenshotJob), "screenshot job");
/* setup sj */
if (RNA_boolean_get(op->ptr, "full")) {
sj->x = 0;
sj->y = 0;
sj->dumpsx = WM_window_pixels_x(win);
sj->dumpsy = WM_window_pixels_y(win);
}
else {
ScrArea *curarea = CTX_wm_area(C);
sj->x = curarea->totrct.xmin;
sj->y = curarea->totrct.ymin;
sj->dumpsx = curarea->totrct.xmax - sj->x;
sj->dumpsy = curarea->totrct.ymax - sj->y;
}
sj->bmain = CTX_data_main(C);
sj->scene = CTX_data_scene(C);
sj->wm = wm;
BKE_reports_init(&sj->reports, RPT_PRINT);
/* setup job */
WM_jobs_customdata_set(wm_job, sj, screenshot_freejob);
WM_jobs_timer(wm_job, 0.1, 0, NC_SCREEN | ND_SCREENCAST);
WM_jobs_callbacks(wm_job, screenshot_startjob, NULL, screenshot_updatejob, screenshot_endjob);
WM_jobs_start(sj->wm, wm_job);
screencast_cursor_toggle(sj->wm, 1);
WM_event_add_notifier(C, NC_SCREEN | ND_SCREENCAST, screen);
return OPERATOR_FINISHED;
}
void SCREEN_OT_screencast(wmOperatorType *ot)
{
ot->name = "Make Screencast";
ot->idname = "SCREEN_OT_screencast";
ot->description = "Capture a video of the active area or whole Blender window";
ot->invoke = WM_operator_confirm;
ot->exec = screencast_exec;
ot->poll = screenshot_poll; /* shared poll */
ot->flag = 0;
RNA_def_property(ot->srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_boolean(ot->srna, "full", 1, "Full Screen",
"Capture the whole window (otherwise only capture the active area)");
}

View File

@ -256,7 +256,7 @@ static void info_header_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegi
/* context changes */
switch (wmn->category) {
case NC_SCREEN:
if (ELEM(wmn->data, ND_SCREENCAST, ND_ANIMPLAY))
if (ELEM(wmn->data, ND_ANIMPLAY))
ED_region_tag_redraw(ar);
break;
case NC_WM:

View File

@ -747,7 +747,6 @@ static void node_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegi
break;
case NC_SCREEN:
switch (wmn->data) {
case ND_SCREENCAST:
case ND_ANIMPLAY:
ED_region_tag_redraw(ar);
break;
@ -968,4 +967,3 @@ void ED_spacetype_node(void)
BKE_spacetype_register(st);
}

View File

@ -530,7 +530,7 @@ static void sequencer_main_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(
ED_region_tag_redraw(ar);
break;
case NC_SCREEN:
if (ELEM(wmn->data, ND_SCREENCAST, ND_ANIMPLAY))
if (ELEM(wmn->data, ND_ANIMPLAY))
ED_region_tag_redraw(ar);
break;
}

View File

@ -527,8 +527,7 @@ typedef struct UserDef {
int view_frame_keyframes; /* number of keyframes to zoom around current frame */
float view_frame_seconds; /* seconds to zoom around current frame */
short scrcastfps; /* frame rate for screencast to be played back */
short scrcastwait; /* milliseconds between screencast snapshots */
char _pad0[4];
short widget_unit; /* private, defaults to 20 for 72 DPI setting */
short anisotropic_filter;

View File

@ -4207,17 +4207,6 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Audio Channels", "Audio channel count");
RNA_def_property_update(prop, 0, "rna_UserDef_audio_update");
prop = RNA_def_property(srna, "screencast_fps", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "scrcastfps");
RNA_def_property_range(prop, 10, 100);
RNA_def_property_ui_text(prop, "FPS", "Frame rate for the screencast to be played back");
prop = RNA_def_property(srna, "screencast_wait_time", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "scrcastwait");
RNA_def_property_range(prop, 10, 1000);
RNA_def_property_ui_text(prop, "Wait Timer (ms)",
"Time in milliseconds between each frame recorded for screencast");
prop = RNA_def_property(srna, "use_text_antialiasing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "text_render", USER_TEXT_DISABLE_AA);
RNA_def_property_ui_text(prop, "Text Anti-aliasing", "Draw user interface text anti-aliased");

View File

@ -447,7 +447,6 @@ enum {
WM_JOB_TYPE_COMPOSITE,
WM_JOB_TYPE_RENDER,
WM_JOB_TYPE_RENDER_PREVIEW, /* UI preview */
WM_JOB_TYPE_SCREENCAST,
WM_JOB_TYPE_OBJECT_SIM_OCEAN,
WM_JOB_TYPE_OBJECT_SIM_FLUID,
WM_JOB_TYPE_OBJECT_BAKE_TEXTURE,
@ -462,7 +461,7 @@ enum {
WM_JOB_TYPE_POINTCACHE,
WM_JOB_TYPE_DPAINT_BAKE,
WM_JOB_TYPE_ALEMBIC,
/* add as needed, screencast, seq proxy build
/* add as needed, seq proxy build
* if having hard coded values is a problem */
};
@ -554,4 +553,3 @@ void WM_tooltip_refresh(struct bContext *C, struct wmWindow *win);
#endif
#endif /* __WM_API_H__ */

View File

@ -261,7 +261,6 @@ typedef struct wmNotifier {
/* NC_SCREEN screen */
#define ND_SCREENBROWSE (1<<16)
#define ND_SCREENDELETE (2<<16)
#define ND_SCREENCAST (3<<16)
#define ND_ANIMPLAY (4<<16)
#define ND_GPENCIL (5<<16)
#define ND_EDITOR_CHANGED (6<<16) /*sent to new editors after switching to them*/
@ -715,4 +714,3 @@ extern struct CLG_LogRef *WM_LOG_KEYMAPS;
#endif
#endif /* __WM_TYPES_H__ */

View File

@ -1216,11 +1216,6 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
state = GHOST_GetWindowState(win->ghostwin);
win->windowstate = state;
/* stop screencast if resize */
if (type == GHOST_kEventWindowSize) {
WM_jobs_stop(wm, win->screen, NULL);
}
WM_window_set_dpi(win);
/* win32: gives undefined window size when minimized */