Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGermano Cavalcante <germano.costa@ig.com.br>2021-08-26 20:13:19 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2021-08-26 20:13:19 +0300
commit583f6948266ba1195c40549d2c8c90f1a1c02e66 (patch)
tree20f4341c3bbd3d5fe06a7a0c41574b2092a0a773
parentaadbdb80484c374f054c23502c76511be588fd77 (diff)
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
-rw-r--r--source/blender/editors/interface/interface_eyedropper.c16
-rw-r--r--source/blender/editors/interface/interface_eyedropper_datablock.c42
-rw-r--r--source/blender/editors/interface/interface_eyedropper_depth.c5
-rw-r--r--source/blender/editors/interface/interface_eyedropper_intern.h3
4 files changed, 36 insertions, 30 deletions
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(&region->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,