예제 #1
0
void WM_window_open_temp(bContext *C, rcti *position, int type)
{
	wmWindow *win;
	ScrArea *sa;
	
	/* changes rect to fit within desktop */
	wm_window_check_position(position);
	
	/* test if we have a temp screen already */
	for (win = CTX_wm_manager(C)->windows.first; win; win = win->next)
		if (win->screen->temp)
			break;
	
	/* add new window? */
	if (win == NULL) {
		win = wm_window_new(C);
		
		win->posx = position->xmin;
		win->posy = position->ymin;
	}
	
	win->sizex = position->xmax - position->xmin;
	win->sizey = position->ymax - position->ymin;
	
	if (win->ghostwin) {
		wm_window_set_size(win, win->sizex, win->sizey);
		wm_window_raise(win);
	}
	
	/* add new screen? */
	if (win->screen == NULL)
		win->screen = ED_screen_add(win, CTX_data_scene(C), "temp");
	win->screen->temp = 1; 
	
	/* make window active, and validate/resize */
	CTX_wm_window_set(C, win);
	WM_check(C);
	
	/* ensure it shows the right spacetype editor */
	sa = win->screen->areabase.first;
	CTX_wm_area_set(C, sa);
	
	if (type == WM_WINDOW_RENDER) {
		ED_area_newspace(C, sa, SPACE_IMAGE);
	}
	else {
		ED_area_newspace(C, sa, SPACE_USERPREF);
	}
	
	ED_screen_set(C, win->screen);
	
	if (sa->spacetype == SPACE_IMAGE)
		GHOST_SetTitle(win->ghostwin, IFACE_("Blender Render"));
	else if (ELEM(sa->spacetype, SPACE_OUTLINER, SPACE_USERPREF))
		GHOST_SetTitle(win->ghostwin, IFACE_("Blender User Preferences"));
	else if (sa->spacetype == SPACE_FILE)
		GHOST_SetTitle(win->ghostwin, IFACE_("Blender File View"));
	else
		GHOST_SetTitle(win->ghostwin, "Blender");
}
예제 #2
0
/**
 * Uses `screen->temp` tag to define what to do, currently it limits
 * to only one "temp" window for render out, preferences, filewindow, etc...
 *
 * \param type: WM_WINDOW_RENDER, WM_WINDOW_USERPREFS...
 * \return the window or NULL.
 */
wmWindow *WM_window_open_temp(bContext *C, const rcti *rect_init, int type)
{
    wmWindow *win_prev = CTX_wm_window(C);
    wmWindow *win;
    ScrArea *sa;
    Scene *scene = CTX_data_scene(C);
    const char *title;
    rcti rect = *rect_init;
    const short px_virtual = (short)wm_window_get_virtual_pixelsize();

    /* changes rect to fit within desktop */
    wm_window_check_position(&rect);

    /* test if we have a temp screen already */
    for (win = CTX_wm_manager(C)->windows.first; win; win = win->next)
        if (win->screen->temp)
            break;

    /* add new window? */
    if (win == NULL) {
        win = wm_window_new(C);

        win->posx = rect.xmin;
        win->posy = rect.ymin;
    }

    /* multiply with virtual pixelsize, ghost handles native one (e.g. for retina) */
    win->sizex = BLI_rcti_size_x(&rect) * px_virtual;
    win->sizey = BLI_rcti_size_y(&rect) * px_virtual;

    if (win->ghostwin) {
        wm_window_set_size(win, win->sizex, win->sizey);
        wm_window_raise(win);
    }

    if (win->screen == NULL) {
        /* add new screen */
        win->screen = ED_screen_add(win, scene, "temp");
    }
    else {
        /* switch scene for rendering */
        if (win->screen->scene != scene)
            ED_screen_set_scene(C, win->screen, scene);
    }

    win->screen->temp = 1;

    /* make window active, and validate/resize */
    CTX_wm_window_set(C, win);
    WM_check(C);

    /* It's possible `win->ghostwin == NULL`.
     * instead of attempting to cleanup here (in a half finished state),
     * finish setting up the screen, then free it at the end of the function,
     * to avoid having to take into account a partially-created window.
     */

    /* ensure it shows the right spacetype editor */
    sa = win->screen->areabase.first;
    CTX_wm_area_set(C, sa);

    if (type == WM_WINDOW_RENDER) {
        ED_area_newspace(C, sa, SPACE_IMAGE);
    }
    else {
        ED_area_newspace(C, sa, SPACE_USERPREF);
    }

    ED_screen_set(C, win->screen);
    ED_screen_refresh(CTX_wm_manager(C), win); /* test scale */

    if (sa->spacetype == SPACE_IMAGE)
        title = IFACE_("Blender Render");
    else if (ELEM(sa->spacetype, SPACE_OUTLINER, SPACE_USERPREF))
        title = IFACE_("Blender User Preferences");
    else if (sa->spacetype == SPACE_FILE)
        title = IFACE_("Blender File View");
    else
        title = "Blender";

    if (win->ghostwin) {
        GHOST_SetTitle(win->ghostwin, title);
        return win;
    }
    else {
        /* very unlikely! but opening a new window can fail */
        wm_window_close(C, CTX_wm_manager(C), win);
        CTX_wm_window_set(C, win_prev);

        return NULL;
    }
}