[Bf-blender-cvs] [a99dbb9] master: Fix T48885: Wheel in image space changes wrong window

Campbell Barton noreply at git.blender.org
Mon Jul 18 18:41:56 CEST 2016


Commit: a99dbb9aa027c3b8ef60bd4e15fcc6104e2fed70
Author: Campbell Barton
Date:   Tue Jul 19 02:44:14 2016 +1000
Branches: master
https://developer.blender.org/rBa99dbb9aa027c3b8ef60bd4e15fcc6104e2fed70

Fix T48885: Wheel in image space changes wrong window

===================================================================

M	source/blender/editors/space_image/image_buttons.c

===================================================================

diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index 8347bd6..38a54ad 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -345,6 +345,13 @@ struct ImageUI_Data {
 	int rpass_index;
 };
 
+static struct ImageUI_Data *ui_imageuser_data_copy(const struct ImageUI_Data *rnd_pt_src)
+{
+	struct ImageUI_Data *rnd_pt_dst = MEM_mallocN(sizeof(*rnd_pt_src), __func__);
+	memcpy(rnd_pt_dst, rnd_pt_src, sizeof(*rnd_pt_src));
+	return rnd_pt_dst;
+}
+
 static void ui_imageuser_layer_menu(bContext *UNUSED(C), uiLayout *layout, void *rnd_pt)
 {
 	struct ImageUI_Data *rnd_data = rnd_pt;
@@ -532,9 +539,10 @@ static void ui_imageuser_view_menu_multiview(bContext *UNUSED(C), uiLayout *layo
 }
 
 /* 5 layer button callbacks... */
-static void image_multi_cb(bContext *C, void *rr_v, void *iuser_v) 
+static void image_multi_cb(bContext *C, void *rnd_pt, void *rr_v)
 {
-	ImageUser *iuser = iuser_v;
+	struct ImageUI_Data *rnd_data = rnd_pt;
+	ImageUser *iuser = rnd_data->iuser;
 
 	BKE_image_multilayer_index(rr_v, iuser);
 	WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
@@ -664,10 +672,11 @@ static bool ui_imageuser_pass_menu_step(bContext *C, int direction, void *rnd_pt
 }
 
 /* 5 view button callbacks... */
-static void image_multiview_cb(bContext *C, void *ima_v, void *iuser_v)
+static void image_multiview_cb(bContext *C, void *rnd_pt, void *UNUSED(arg_v))
 {
-	Image *ima = ima_v;
-	ImageUser *iuser = iuser_v;
+	struct ImageUI_Data *rnd_data = rnd_pt;
+	Image *ima = rnd_data->image;
+	ImageUser *iuser = rnd_data->iuser;
 
 	BKE_image_multiview_index(ima, iuser);
 	WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
@@ -694,7 +703,7 @@ static void uiblock_layer_pass_buttons(
         uiLayout *layout, Image *image, RenderResult *rr, ImageUser *iuser, int w,
         short *render_slot)
 {
-	static struct ImageUI_Data rnd_pt;  /* XXX, workaround */
+	struct ImageUI_Data rnd_pt_local, *rnd_pt = NULL;
 	uiBlock *block = uiLayoutGetBlock(layout);
 	uiBut *but;
 	RenderLayer *rl = NULL;
@@ -710,10 +719,10 @@ static void uiblock_layer_pass_buttons(
 	wmenu2 = (3 * w) / 5;
 	wmenu3 = (3 * w) / 6;
 	wmenu4 = (3 * w) / 6;
-	
-	rnd_pt.image = image;
-	rnd_pt.iuser = iuser;
-	rnd_pt.rpass_index = 0;
+
+	rnd_pt_local.image = image;
+	rnd_pt_local.iuser = iuser;
+	rnd_pt_local.rpass_index = 0;
 
 	/* menu buts */
 	if (render_slot) {
@@ -725,10 +734,12 @@ static void uiblock_layer_pass_buttons(
 			BLI_snprintf(str, sizeof(str), IFACE_("Slot %d"), *render_slot + 1);
 		}
 
+		rnd_pt = ui_imageuser_data_copy(&rnd_pt_local);
 		but = uiDefMenuBut(block, ui_imageuser_slot_menu, image, str, 0, 0, wmenu1, UI_UNIT_Y, TIP_("Select Slot"));
 		UI_but_func_menu_step_set(but, ui_imageuser_slot_menu_step);
-		UI_but_func_set(but, image_multi_cb, rr, iuser);
+		UI_but_funcN_set(but, image_multi_cb, rnd_pt, rr);
 		UI_but_type_set_menu_from_pulldown(but);
+		rnd_pt = NULL;
 	}
 
 	if (rr) {
@@ -740,15 +751,18 @@ static void uiblock_layer_pass_buttons(
 		fake_name = ui_imageuser_layer_fake_name(rr);
 		rpass_index = iuser->layer  - (fake_name ? 1 : 0);
 		rl = BLI_findlink(&rr->layers, rpass_index);
-		rnd_pt.rpass_index = rpass_index;
+		rnd_pt_local.rpass_index = rpass_index;
 
 		if (RE_layers_have_name(rr)) {
 			display_name = rl ? rl->name : (fake_name ? fake_name : "");
-			but = uiDefMenuBut(block, ui_imageuser_layer_menu, &rnd_pt, display_name,
-			                   0, 0, wmenu2, UI_UNIT_Y, TIP_("Select Layer"));
+			rnd_pt = ui_imageuser_data_copy(&rnd_pt_local);
+			but = uiDefMenuBut(
+			        block, ui_imageuser_layer_menu, rnd_pt, display_name,
+			        0, 0, wmenu2, UI_UNIT_Y, TIP_("Select Layer"));
 			UI_but_func_menu_step_set(but, ui_imageuser_layer_menu_step);
-			UI_but_func_set(but, image_multi_cb, rr, iuser);
+			UI_but_funcN_set(but, image_multi_cb, rnd_pt, rr);
 			UI_but_type_set_menu_from_pulldown(but);
+			rnd_pt = NULL;
 		}
 
 		/* pass */
@@ -756,11 +770,14 @@ static void uiblock_layer_pass_buttons(
 		rpass = (rl ? BLI_findlink(&rl->passes, iuser->pass  - (fake_name ? 1 : 0)) : NULL);
 
 		display_name = rpass ? rpass->internal_name : (fake_name ? fake_name : "");
-		but = uiDefMenuBut(block, ui_imageuser_pass_menu, &rnd_pt, IFACE_(display_name),
-		                   0, 0, wmenu3, UI_UNIT_Y, TIP_("Select Pass"));
+		rnd_pt = ui_imageuser_data_copy(&rnd_pt_local);
+		but = uiDefMenuBut(
+		        block, ui_imageuser_pass_menu, rnd_pt, IFACE_(display_name),
+		        0, 0, wmenu3, UI_UNIT_Y, TIP_("Select Pass"));
 		UI_but_func_menu_step_set(but, ui_imageuser_pass_menu_step);
-		UI_but_func_set(but, image_multi_cb, rr, iuser);
+		UI_but_funcN_set(but, image_multi_cb, rnd_pt, rr);
 		UI_but_type_set_menu_from_pulldown(but);
+		rnd_pt = NULL;
 
 		/* view */
 		if (BLI_listbase_count_ex(&rr->views, 2) > 1 &&
@@ -769,9 +786,13 @@ static void uiblock_layer_pass_buttons(
 			rview = BLI_findlink(&rr->views, iuser->view);
 			display_name = rview ? rview->name : "";
 
-			but = uiDefMenuBut(block, ui_imageuser_view_menu_rr, &rnd_pt, display_name, 0, 0, wmenu4, UI_UNIT_Y, TIP_("Select View"));
-			UI_but_func_set(but, image_multi_cb, rr, iuser);
+			rnd_pt = ui_imageuser_data_copy(&rnd_pt_local);
+			but = uiDefMenuBut(
+			        block, ui_imageuser_view_menu_rr, rnd_pt, display_name,
+			        0, 0, wmenu4, UI_UNIT_Y, TIP_("Select View"));
+			UI_but_funcN_set(but, image_multi_cb, rnd_pt, rr);
 			UI_but_type_set_menu_from_pulldown(but);
+			rnd_pt = NULL;
 		}
 	}
 
@@ -789,9 +810,13 @@ static void uiblock_layer_pass_buttons(
 			}
 		}
 
-		but = uiDefMenuBut(block, ui_imageuser_view_menu_multiview, &rnd_pt, display_name, 0, 0, wmenu1, UI_UNIT_Y, TIP_("Select View"));
-		UI_but_func_set(but, image_multiview_cb, image, iuser);
+		rnd_pt = ui_imageuser_data_copy(&rnd_pt_local);
+		but = uiDefMenuBut(
+		        block, ui_imageuser_view_menu_multiview, rnd_pt, display_name,
+		        0, 0, wmenu1, UI_UNIT_Y, TIP_("Select View"));
+		UI_but_funcN_set(but, image_multiview_cb, rnd_pt, NULL);
 		UI_but_type_set_menu_from_pulldown(but);
+		rnd_pt = NULL;
 	}
 }




More information about the Bf-blender-cvs mailing list