Ejemplo n.º 1
0
void wm_draw_update(bContext *C)
{
	wmWindowManager *wm = CTX_wm_manager(C);
	wmWindow *win;
	int drawmethod;

	GPU_free_unused_buffers();
	
	for (win = wm->windows.first; win; win = win->next) {
#ifdef WIN32
		if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_ANY, GPU_DRIVER_ANY)) {
			GHOST_TWindowState state = GHOST_GetWindowState(win->ghostwin);

			if (state == GHOST_kWindowStateMinimized) {
				/* do not update minimized windows, it gives issues on intel drivers (see [#33223])
				 * anyway, it seems logical to skip update for invisible windows
				 */
				continue;
			}
		}
#endif
		if (win->drawmethod != U.wmdrawmethod) {
			wm_draw_window_clear(win);
			win->drawmethod = U.wmdrawmethod;
		}

		if (wm_draw_update_test_window(win)) {
			CTX_wm_window_set(C, win);
			
			/* sets context window+screen */
			wm_window_make_drawable(wm, win);

			/* notifiers for screen redraw */
			if (win->screen->do_refresh)
				ED_screen_refresh(wm, win);

			drawmethod = wm_automatic_draw_method(win);

			if (win->drawfail)
				wm_method_draw_overlap_all(C, win, 0);
			else if (drawmethod == USER_DRAW_FULL)
				wm_method_draw_full(C, win);
			else if (drawmethod == USER_DRAW_OVERLAP)
				wm_method_draw_overlap_all(C, win, 0);
			else if (drawmethod == USER_DRAW_OVERLAP_FLIP)
				wm_method_draw_overlap_all(C, win, 1);
			else // if (drawmethod == USER_DRAW_TRIPLE)
				wm_method_draw_triple(C, win);

			win->screen->do_draw_gesture = false;
			win->screen->do_draw_paintcursor = false;
			win->screen->do_draw_drag = false;
		
			wm_window_swap_buffers(win);

			CTX_wm_window_set(C, NULL);
		}
	}
}
Ejemplo n.º 2
0
void wm_draw_update(bContext *C)
{
	wmWindowManager *wm= CTX_wm_manager(C);
	wmWindow *win;
	int drawmethod;

	GPU_free_unused_buffers();
	
	for(win= wm->windows.first; win; win= win->next) {
		if(win->drawmethod != U.wmdrawmethod) {
			wm_draw_window_clear(win);
			win->drawmethod= U.wmdrawmethod;
		}

		if(wm_draw_update_test_window(win)) {
			CTX_wm_window_set(C, win);
			
			/* sets context window+screen */
			wm_window_make_drawable(C, win);

			/* notifiers for screen redraw */
			if(win->screen->do_refresh)
				ED_screen_refresh(wm, win);

			drawmethod= wm_automatic_draw_method(win);

			if(win->drawfail)
				wm_method_draw_overlap_all(C, win, 0);
			else if(drawmethod == USER_DRAW_FULL)
				wm_method_draw_full(C, win);
			else if(drawmethod == USER_DRAW_OVERLAP)
				wm_method_draw_overlap_all(C, win, 0);
			else if(drawmethod == USER_DRAW_OVERLAP_FLIP)
				wm_method_draw_overlap_all(C, win, 1);
			else // if(drawmethod == USER_DRAW_TRIPLE)
				wm_method_draw_triple(C, win);

			win->screen->do_draw_gesture= 0;
			win->screen->do_draw_paintcursor= 0;
			win->screen->do_draw_drag= 0;
		
			wm_window_swap_buffers(win);

			CTX_wm_window_set(C, NULL);
		}
	}
}
Ejemplo n.º 3
0
void WM_window_open_temp(bContext *C, rcti *position, int type)
{
    wmWindow *win;
    ScrArea *sa;
    Scene *scene = CTX_data_scene(C);

    /* 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 = BLI_rcti_size_x(position);
    win->sizey = BLI_rcti_size_y(position);

    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);

    /* 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)
        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");
}
Ejemplo n.º 4
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;
    }
}