Commit: 583f6948266ba1195c40549d2c8c90f1a1c02e66 Author: Germano Cavalcante Date: Thu Aug 26 14:13:19 2021 -0300 Branches: master https://developer.blender.org/rB583f6948266ba1195c40549d2c8c90f1a1c02e66
Fix T90817: Object Picker Doesn't Work on Second window Solution similar to the one seen in {rBb94ab93dfb82}. The idea is to find the window and region under the cursor to use in the operator. Reviewed By: brecht Maniphest Tasks: T90817 Differential Revision: https://developer.blender.org/D12310 =================================================================== M source/blender/editors/interface/interface_eyedropper.c M source/blender/editors/interface/interface_eyedropper_datablock.c M source/blender/editors/interface/interface_eyedropper_depth.c M source/blender/editors/interface/interface_eyedropper_intern.h =================================================================== diff --git a/source/blender/editors/interface/interface_eyedropper.c b/source/blender/editors/interface/interface_eyedropper.c index 59629e9f1e6..13566a59910 100644 --- a/source/blender/editors/interface/interface_eyedropper.c +++ b/source/blender/editors/interface/interface_eyedropper.c @@ -126,23 +126,15 @@ void eyedropper_draw_cursor_text_window(const struct wmWindow *window, const cha } void eyedropper_draw_cursor_text_region(const struct bContext *C, - const ARegion *region, + const int x, + const int y, const char *name) { - wmWindow *win = CTX_wm_window(C); - const int x = win->eventstate->x; - const int y = win->eventstate->y; - - if ((name[0] == '\0') || (BLI_rcti_isect_pt(®ion->winrct, x, y) == false)) { + if (name[0] == '\0') { return; } - const int mval[2] = { - x - region->winrct.xmin, - y - region->winrct.ymin, - }; - - eyedropper_draw_cursor_text_ex(mval[0], mval[1], name); + eyedropper_draw_cursor_text_ex(x, y, name); } /** diff --git a/source/blender/editors/interface/interface_eyedropper_datablock.c b/source/blender/editors/interface/interface_eyedropper_datablock.c index 8c605598cbc..0eeeb0a39e4 100644 --- a/source/blender/editors/interface/interface_eyedropper_datablock.c +++ b/source/blender/editors/interface/interface_eyedropper_datablock.c @@ -71,13 +71,14 @@ typedef struct DataDropper { ScrArea *cursor_area; /* Area under the cursor */ ARegionType *art; void *draw_handle_pixel; + int name_pos[2]; char name[200]; } DataDropper; static void datadropper_draw_cb(const struct bContext *C, ARegion *region, void *arg) { DataDropper *ddr = arg; - eyedropper_draw_cursor_text_region(C, region, ddr->name); + eyedropper_draw_cursor_text_region(C, UNPACK2(ddr->name_pos), ddr->name); } static int datadropper_init(bContext *C, wmOperator *op) @@ -148,12 +149,10 @@ static void datadropper_exit(bContext *C, wmOperator *op) /** * \brief get the ID from the 3D view or outliner. */ -static void datadropper_id_sample_pt(bContext *C, DataDropper *ddr, int mx, int my, ID **r_id) +static void datadropper_id_sample_pt( + bContext *C, wmWindow *win, ScrArea *area, DataDropper *ddr, int mx, int my, ID **r_id) { - /* we could use some clever */ - bScreen *screen = CTX_wm_screen(C); - ScrArea *area = BKE_screen_find_area_xy(screen, -1, mx, my); - + wmWindow *win_prev = CTX_wm_window(C); ScrArea *area_prev = CTX_wm_area(C); ARegion *region_prev = CTX_wm_region(C); @@ -166,6 +165,7 @@ static void datadropper_id_sample_pt(bContext *C, DataDropper *ddr, int mx, int const int mval[2] = {mx - region->winrct.xmin, my - region->winrct.ymin}; Base *base; + CTX_wm_window_set(C, win); CTX_wm_area_set(C, area); CTX_wm_region_set(C, region); @@ -202,11 +202,15 @@ static void datadropper_id_sample_pt(bContext *C, DataDropper *ddr, int mx, int BLI_snprintf(ddr->name, sizeof(ddr->name), "%s: %s", ddr->idcode_name, id->name + 2); *r_id = id; } + + ddr->name_pos[0] = mval[0]; + ddr->name_pos[1] = mval[1]; } } } } + CTX_wm_window_set(C, win_prev); CTX_wm_area_set(C, area_prev); CTX_wm_region_set(C, region_prev); } @@ -232,7 +236,13 @@ static bool datadropper_id_sample(bContext *C, DataDropper *ddr, int mx, int my) { ID *id = NULL; - datadropper_id_sample_pt(C, ddr, mx, my, &id); + wmWindow *win; + ScrArea *area; + + int mval[] = {mx, my}; + datadropper_win_area_find(C, mval, mval, &win, &area); + + datadropper_id_sample_pt(C, win, area, ddr, mval[0], mval[1], &id); return datadropper_id_set(C, ddr, id); } @@ -244,14 +254,8 @@ static void datadropper_cancel(bContext *C, wmOperator *op) } /* To switch the draw callback when region under mouse event changes */ -static void datadropper_set_draw_callback_region(bContext *C, - DataDropper *ddr, - const int mx, - const int my) +static void datadropper_set_draw_callback_region(bContext *C, ScrArea *area, DataDropper *ddr) { - bScreen *screen = CTX_wm_screen(C); - ScrArea *area = BKE_screen_find_area_xy(screen, -1, mx, my); - if (area) { /* If spacetype changed */ if (area->spacetype != ddr->cursor_area->spacetype) { @@ -300,10 +304,16 @@ static int datadropper_modal(bContext *C, wmOperator *op, const wmEvent *event) else if (event->type == MOUSEMOVE) { ID *id = NULL; + wmWindow *win; + ScrArea *area; + + int mval[] = {event->x, event->y}; + datadropper_win_area_find(C, mval, mval, &win, &area); + /* Set the region for eyedropper cursor text drawing */ - datadropper_set_draw_callback_region(C, ddr, event->x, event->y); + datadropper_set_draw_callback_region(C, area, ddr); - datadropper_id_sample_pt(C, ddr, event->x, event->y, &id); + datadropper_id_sample_pt(C, win, area, ddr, mval[0], mval[1], &id); } return OPERATOR_RUNNING_MODAL; diff --git a/source/blender/editors/interface/interface_eyedropper_depth.c b/source/blender/editors/interface/interface_eyedropper_depth.c index a64fad8c333..6f272201085 100644 --- a/source/blender/editors/interface/interface_eyedropper_depth.c +++ b/source/blender/editors/interface/interface_eyedropper_depth.c @@ -72,13 +72,14 @@ typedef struct DepthDropper { ARegionType *art; void *draw_handle_pixel; + int name_pos[2]; char name[200]; } DepthDropper; static void depthdropper_draw_cb(const struct bContext *C, ARegion *region, void *arg) { DepthDropper *ddr = arg; - eyedropper_draw_cursor_text_region(C, region, ddr->name); + eyedropper_draw_cursor_text_region(C, UNPACK2(ddr->name_pos), ddr->name); } static int depthdropper_init(bContext *C, wmOperator *op) @@ -172,6 +173,8 @@ static void depthdropper_depth_sample_pt( /* weak, we could pass in some reference point */ const float *view_co = v3d->camera ? v3d->camera->obmat[3] : rv3d->viewinv[3]; const int mval[2] = {mx - region->winrct.xmin, my - region->winrct.ymin}; + copy_v2_v2_int(ddr->name_pos, mval); + float co[3]; CTX_wm_area_set(C, area); diff --git a/source/blender/editors/interface/interface_eyedropper_intern.h b/source/blender/editors/interface/interface_eyedropper_intern.h index 2957ea337e0..4295a781af8 100644 --- a/source/blender/editors/interface/interface_eyedropper_intern.h +++ b/source/blender/editors/interface/interface_eyedropper_intern.h @@ -25,7 +25,8 @@ /* interface_eyedropper.c */ void eyedropper_draw_cursor_text_window(const struct wmWindow *window, const char *name); void eyedropper_draw_cursor_text_region(const struct bContext *C, - const struct ARegion *region, + const int x, + const int y, const char *name); uiBut *eyedropper_get_property_button_under_mouse(bContext *C, const wmEvent *event); void datadropper_win_area_find(const struct bContext *C, _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs