Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit 2afab31

Browse files
committed
Merge branch 'bugfix-14846-byte' into bugfix-14846
2 parents 6c98156 + 110c240 commit 2afab31

25 files changed

Lines changed: 1107 additions & 199 deletions

docs/notes/bugfix-14851.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Popup won't stop displaying when displayed in mouseDown of button widget

engine/src/canvas.mlc

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2351,6 +2351,13 @@ public foreign handler MCCanvasPathMakeWithCircle(in pCenter as Point, in pRadiu
23512351
public foreign handler MCCanvasPathMakeWithEllipseWithRadiiAsList(in pCenter as Point, in pRadii as List, out rPath as Path) as undefined binds to "<builtin>"
23522352
public foreign handler MCCanvasPathMakeWithLine(in pStart as Point, in pEnd as Point, out rPath as Path) as undefined binds to "<builtin>"
23532353
public foreign handler MCCanvasPathMakeWithPoints(in pClose as CBool, in pPoints as List, out rPath as Path) as undefined binds to "<builtin>"
2354+
public foreign handler MCCanvasPathMakeWithArcWithRadius(in pCenter as Point, in pRadius as CanvasFloat, in pStartAngle as CanvasFloat, in pEndAngle as CanvasFloat, out rPath as Path) as undefined binds to "<builtin>"
2355+
public foreign handler MCCanvasPathMakeWithArcWithRadiiAsList(in pCenter as Point, in pRadii as List, in pStartAngle as CanvasFloat, in pEndAngle as CanvasFloat, out rPath as Path) as undefined binds to "<builtin>"
2356+
public foreign handler MCCanvasPathMakeWithSectorWithRadius(in pCenter as Point, in pRadius as CanvasFloat, in pStartAngle as CanvasFloat, in pEndAngle as CanvasFloat, out rPath as Path) as undefined binds to "<builtin>"
2357+
public foreign handler MCCanvasPathMakeWithSectorWithRadiiAsList(in pCenter as Point, in pRadii as List, in pStartAngle as CanvasFloat, in pEndAngle as CanvasFloat, out rPath as Path) as undefined binds to "<builtin>"
2358+
public foreign handler MCCanvasPathMakeWithSegmentWithRadius(in pCenter as Point, in pRadius as CanvasFloat, in pStartAngle as CanvasFloat, in pEndAngle as CanvasFloat, out rPath as Path) as undefined binds to "<builtin>"
2359+
public foreign handler MCCanvasPathMakeWithSegmentWithRadiiAsList(in pCenter as Point, in pRadii as List, in pStartAngle as CanvasFloat, in pEndAngle as CanvasFloat, out rPath as Path) as undefined binds to "<builtin>"
2360+
23542361

23552362
/*
23562363
Summary: Creates a new path.
@@ -2486,6 +2493,96 @@ begin
24862493
MCCanvasPathMakeWithPoints(mClosed, mPoints, output)
24872494
end syntax
24882495

2496+
2497+
/*
2498+
Summary: Creates a new path.
2499+
2500+
mCenter: An expression which evaluates to a point.
2501+
mRadius: An expression which evaluates to a number.
2502+
mRadii: An expression which evaluates to a list of numbers.
2503+
mStartAngle: An expression which evaluates to a number.
2504+
mEndAngle: An expression which evaluates to a number.
2505+
Returns: A new arc path.
2506+
2507+
Example:
2508+
// Create an elliptical arc path
2509+
variable tPath
2510+
put arc path centered at point [100,100] with radii [100,75] from 0 to 270 into tPath
2511+
2512+
Example:
2513+
// Create a circular arc path
2514+
variable tPath
2515+
put arc path centered at point [100,100] with radius 100 from 0 to 270 into tPath
2516+
2517+
Tags: Canvas
2518+
*/
2519+
syntax PathMakeWithArc is prefix operator with precedence 4
2520+
"arc" "path" "centered" "at" <mCenter: Expression> "with" [ "radius" <mRadius: Expression> | "radii" <mRadii: Expression> ] "from" <mStartAngle: Expression> "to" <mEndAngle: Expression>
2521+
begin
2522+
MCCanvasPathMakeWithArcWithRadius(mCenter, mRadius, mStartAngle, mEndAngle, output)
2523+
MCCanvasPathMakeWithArcWithRadiiAsList(mCenter, mRadii, mStartAngle, mEndAngle, output)
2524+
end syntax
2525+
2526+
2527+
/*
2528+
Summary: Creates a new path.
2529+
2530+
mCenter: An expression which evaluates to a point.
2531+
mRadius: An expression which evaluates to a number.
2532+
mRadii: An expression which evaluates to a list of numbers.
2533+
mStartAngle: An expression which evaluates to a number.
2534+
mEndAngle: An expression which evaluates to a number.
2535+
Returns: A new sector path.
2536+
2537+
Example:
2538+
// Create an elliptical sector path
2539+
variable tPath
2540+
put sector path centered at point [100,100] with radii [100,75] from 0 to 270 into tPath
2541+
2542+
Example:
2543+
// Create a circular sector path
2544+
variable tPath
2545+
put sector path centered at point [100,100] with radius 100 from 0 to 270 into tPath
2546+
2547+
Tags: Canvas
2548+
*/
2549+
syntax PathMakeWithSector is prefix operator with precedence 4
2550+
"sector" "path" "centered" "at" <mCenter: Expression> "with" [ "radius" <mRadius: Expression> | "radii" <mRadii: Expression> ] "from" <mStartAngle: Expression> "to" <mEndAngle: Expression>
2551+
begin
2552+
MCCanvasPathMakeWithSectorWithRadius(mCenter, mRadius, mStartAngle, mEndAngle, output)
2553+
MCCanvasPathMakeWithSectorWithRadiiAsList(mCenter, mRadii, mStartAngle, mEndAngle, output)
2554+
end syntax
2555+
2556+
2557+
/*
2558+
Summary: Creates a new path.
2559+
2560+
mCenter: An expression which evaluates to a point.
2561+
mRadius: An expression which evaluates to a number.
2562+
mRadii: An expression which evaluates to a list of numbers.
2563+
mStartAngle: An expression which evaluates to a number.
2564+
mEndAngle: An expression which evaluates to a number.
2565+
Returns: A new segment path.
2566+
2567+
Example:
2568+
// Create an elliptical segment path
2569+
variable tPath
2570+
put segment path centered at point [100,100] with radii [100,75] from 0 to 270 into tPath
2571+
2572+
Example:
2573+
// Create a circular segment path
2574+
variable tPath
2575+
put segment path centered at point [100,100] with radius 100 from 0 to 270 into tPath
2576+
2577+
Tags: Canvas
2578+
*/
2579+
syntax PathMakeWithSegment is prefix operator with precedence 4
2580+
"segment" "path" "centered" "at" <mCenter: Expression> "with" [ "radius" <mRadius: Expression> | "radii" <mRadii: Expression> ] "from" <mStartAngle: Expression> "to" <mEndAngle: Expression>
2581+
begin
2582+
MCCanvasPathMakeWithSegmentWithRadius(mCenter, mRadius, mStartAngle, mEndAngle, output)
2583+
MCCanvasPathMakeWithSegmentWithRadiiAsList(mCenter, mRadii, mStartAngle, mEndAngle, output)
2584+
end syntax
2585+
24892586
//////////
24902587

24912588
// Properties

engine/src/engine.mlc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public foreign handler MCEngineExecPostToScriptObjectWithArguments(in pMessage a
5353
public foreign handler MCEngineEvalMessageWasHandled(out pHandled as CBool) as undefined binds to "<builtin>"
5454
public foreign handler MCEngineEvalMessageWasNotHandled(out pHandled as CBool) as undefined binds to "<builtin>"
5555
public foreign handler MCEngineExecExecuteScript(in pScript as String) as any binds to "<builtin>"
56-
public foreign handler MCEngineExecLog(in pFormat as String) as undefined binds to "<builtin>"
56+
public foreign handler MCEngineExecLog(in pMessage as any) as undefined binds to "<builtin>"
5757
public foreign handler MCEngineExecLogWithValues(in pFormat as String, in pValues as List) as undefined binds to "<builtin>"
5858

5959
/*

engine/src/exec-extension.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,11 @@ bool MCEngineLookupResourcePathForModule(MCScriptModuleRef p_module, MCStringRef
160160

161161
void MCEngineExecLoadExtension(MCExecContext& ctxt, MCStringRef p_filename, MCStringRef p_resource_path)
162162
{
163+
ctxt . SetTheResultToEmpty();
164+
163165
MCAutoStringRef t_resolved_filename;
164-
/* UNCHECKED */ MCS_resolvepath(p_filename, &t_resolved_filename);
166+
if (!MCS_resolvepath(p_filename, &t_resolved_filename))
167+
return;
165168

166169
MCAutoDataRef t_data;
167170
if (!MCS_loadbinaryfile(*t_resolved_filename, &t_data))
@@ -177,7 +180,11 @@ void MCEngineExecLoadExtension(MCExecContext& ctxt, MCStringRef p_filename, MCSt
177180
MCScriptModuleRef t_module;
178181
if (!MCScriptCreateModuleFromStream(t_stream, t_module))
179182
{
180-
ctxt . SetTheResultToStaticCString("failed to load module");
183+
MCAutoErrorRef t_error;
184+
if (MCErrorCatch(Out(t_error)))
185+
ctxt . SetTheResultToValue(MCErrorGetMessage(In(t_error)));
186+
else
187+
ctxt . SetTheResultToStaticCString("failed to load module");
181188
MCValueRelease(t_stream);
182189
return;
183190
}
@@ -190,6 +197,7 @@ void MCEngineExecLoadExtension(MCExecContext& ctxt, MCStringRef p_filename, MCSt
190197

191198
MCScriptReleaseModule(t_module);
192199

200+
193201
return;
194202
}
195203

engine/src/exec-interface.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2757,8 +2757,21 @@ void MCInterfaceExecPopupButton(MCExecContext& ctxt, MCButton *p_target, MCPoint
27572757
p_target->setmenumode(WM_POPUP);
27582758
if (p_target->findmenu())
27592759
{
2760-
if (MCbuttonstate)
2761-
MCtargetptr -> mup(0, false);
2760+
// IM-2015-03-10: [[ Bug 14851 ]] Send mouseup release for each depressed button.
2761+
uint16_t t_state;
2762+
t_state = MCbuttonstate;
2763+
2764+
uint16_t t_which;
2765+
t_which = 1;
2766+
2767+
while (t_state)
2768+
{
2769+
if (t_state & 0x1)
2770+
MCtargetptr -> mup(t_which, true);
2771+
t_state >>= 1;
2772+
t_which += 1;
2773+
}
2774+
27622775
p_target->openmenu(True);
27632776
}
27642777
}

engine/src/image_rep_mutable.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1465,7 +1465,7 @@ MCRectangle MCMutableImageRep::drawoval()
14651465
if (MCarcangle != 0 && MCarcangle % 360 == 0)
14661466
MCGPathAddArc(t_path, t_center, t_radii, 0.0, 360 - (MCstartangle + MCarcangle), 360 - MCstartangle);
14671467
else
1468-
MCGPathAddSegment(t_path, t_center, t_radii, 0.0, 360 - (MCstartangle + MCarcangle), 360 - MCstartangle);
1468+
MCGPathAddSector(t_path, t_center, t_radii, 0.0, 360 - (MCstartangle + MCarcangle), 360 - MCstartangle);
14691469

14701470
draw_path(t_path);
14711471

engine/src/module-canvas.cpp

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3343,6 +3343,96 @@ void MCCanvasPathMakeWithPoints(bool p_close, MCProperListRef p_points, MCCanvas
33433343
MCMemoryDeleteArray(t_points);
33443344
}
33453345

3346+
static void MCCanvasPathMakeWithArcWithRadii(const MCGPoint &p_center, MCGFloat p_radius_x, MCGFloat p_radius_y, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path)
3347+
{
3348+
MCGPathRef t_path;
3349+
t_path = nil;
3350+
3351+
if (!MCGPathCreateMutable(t_path))
3352+
return;
3353+
3354+
MCGPathAddArc(t_path, p_center, MCGSizeMake(p_radius_x, p_radius_y), 0, p_start_angle, p_end_angle);
3355+
if (MCGPathIsValid(t_path))
3356+
MCCanvasPathMakeWithMCGPath(t_path, r_path);
3357+
3358+
MCGPathRelease(t_path);
3359+
}
3360+
3361+
void MCCanvasPathMakeWithArcWithRadius(MCCanvasPointRef p_center, MCCanvasFloat p_radius, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path)
3362+
{
3363+
MCCanvasPathMakeWithArcWithRadii(*MCCanvasPointGet(p_center), p_radius, p_radius, p_start_angle, p_end_angle, r_path);
3364+
}
3365+
3366+
void MCCanvasPathMakeWithArcWithRadiiAsList(MCCanvasPointRef p_center, MCProperListRef p_radii, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path)
3367+
{
3368+
MCGPoint t_radii;
3369+
if (!MCProperListToRadii(p_radii, t_radii))
3370+
return;
3371+
3372+
MCCanvasPathMakeWithArcWithRadii(*MCCanvasPointGet(p_center), t_radii.x, t_radii.y, p_start_angle, p_end_angle, r_path);
3373+
}
3374+
3375+
static void MCCanvasPathMakeWithSectorWithRadii(const MCGPoint &p_center, MCGFloat p_radius_x, MCGFloat p_radius_y, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path)
3376+
{
3377+
MCGPathRef t_path;
3378+
t_path = nil;
3379+
3380+
if (!MCGPathCreateMutable(t_path))
3381+
return;
3382+
3383+
MCGPathAddArc(t_path, p_center, MCGSizeMake(p_radius_x, p_radius_y), 0, p_start_angle, p_end_angle);
3384+
MCGPathLineTo(t_path, p_center);
3385+
MCGPathCloseSubpath(t_path);
3386+
if (MCGPathIsValid(t_path))
3387+
MCCanvasPathMakeWithMCGPath(t_path, r_path);
3388+
3389+
MCGPathRelease(t_path);
3390+
}
3391+
3392+
void MCCanvasPathMakeWithSectorWithRadius(MCCanvasPointRef p_center, MCCanvasFloat p_radius, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path)
3393+
{
3394+
MCCanvasPathMakeWithSectorWithRadii(*MCCanvasPointGet(p_center), p_radius, p_radius, p_start_angle, p_end_angle, r_path);
3395+
}
3396+
3397+
void MCCanvasPathMakeWithSectorWithRadiiAsList(MCCanvasPointRef p_center, MCProperListRef p_radii, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path)
3398+
{
3399+
MCGPoint t_radii;
3400+
if (!MCProperListToRadii(p_radii, t_radii))
3401+
return;
3402+
3403+
MCCanvasPathMakeWithSectorWithRadii(*MCCanvasPointGet(p_center), t_radii.x, t_radii.y, p_start_angle, p_end_angle, r_path);
3404+
}
3405+
3406+
static void MCCanvasPathMakeWithSegmentWithRadii(const MCGPoint &p_center, MCGFloat p_radius_x, MCGFloat p_radius_y, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path)
3407+
{
3408+
MCGPathRef t_path;
3409+
t_path = nil;
3410+
3411+
if (!MCGPathCreateMutable(t_path))
3412+
return;
3413+
3414+
MCGPathAddArc(t_path, p_center, MCGSizeMake(p_radius_x, p_radius_y), 0, p_start_angle, p_end_angle);
3415+
MCGPathCloseSubpath(t_path);
3416+
if (MCGPathIsValid(t_path))
3417+
MCCanvasPathMakeWithMCGPath(t_path, r_path);
3418+
3419+
MCGPathRelease(t_path);
3420+
}
3421+
3422+
void MCCanvasPathMakeWithSegmentWithRadius(MCCanvasPointRef p_center, MCCanvasFloat p_radius, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path)
3423+
{
3424+
MCCanvasPathMakeWithSegmentWithRadii(*MCCanvasPointGet(p_center), p_radius, p_radius, p_start_angle, p_end_angle, r_path);
3425+
}
3426+
3427+
void MCCanvasPathMakeWithSegmentWithRadiiAsList(MCCanvasPointRef p_center, MCProperListRef p_radii, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path)
3428+
{
3429+
MCGPoint t_radii;
3430+
if (!MCProperListToRadii(p_radii, t_radii))
3431+
return;
3432+
3433+
MCCanvasPathMakeWithSegmentWithRadii(*MCCanvasPointGet(p_center), t_radii.x, t_radii.y, p_start_angle, p_end_angle, r_path);
3434+
}
3435+
33463436
// Properties
33473437

33483438
void MCCanvasPathSetMCGPath(MCGPathRef p_path, MCCanvasPathRef &x_path)

engine/src/module-canvas.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,12 @@ extern "C" MC_DLLEXPORT void MCCanvasPathMakeWithEllipseWithRadiiAsList(MCCanvas
414414
extern "C" MC_DLLEXPORT void MCCanvasPathMakeWithCircle(MCCanvasPointRef p_center, MCCanvasFloat p_radius, MCCanvasPathRef &r_path);
415415
extern "C" MC_DLLEXPORT void MCCanvasPathMakeWithLine(MCCanvasPointRef p_start, MCCanvasPointRef p_end, MCCanvasPathRef &r_path);
416416
extern "C" MC_DLLEXPORT void MCCanvasPathMakeWithPoints(bool p_close, MCProperListRef p_points, MCCanvasPathRef &r_path);
417+
extern "C" MC_DLLEXPORT void MCCanvasPathMakeWithArcWithRadius(MCCanvasPointRef p_center, MCCanvasFloat p_radius, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path);
418+
extern "C" MC_DLLEXPORT void MCCanvasPathMakeWithArcWithRadiiAsList(MCCanvasPointRef p_center, MCProperListRef p_radii, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path);
419+
extern "C" MC_DLLEXPORT void MCCanvasPathMakeWithSectorWithRadius(MCCanvasPointRef p_center, MCCanvasFloat p_radius, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path);
420+
extern "C" MC_DLLEXPORT void MCCanvasPathMakeWithSectorWithRadiiAsList(MCCanvasPointRef p_center, MCProperListRef p_radii, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path);
421+
extern "C" MC_DLLEXPORT void MCCanvasPathMakeWithSegmentWithRadius(MCCanvasPointRef p_center, MCCanvasFloat p_radius, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path);
422+
extern "C" MC_DLLEXPORT void MCCanvasPathMakeWithSegmentWithRadiiAsList(MCCanvasPointRef p_center, MCProperListRef p_radii, MCCanvasFloat p_start_angle, MCCanvasFloat p_end_angle, MCCanvasPathRef &r_path);
417423

418424
// Properties
419425
extern "C" MC_DLLEXPORT void MCCanvasPathGetSubpaths(integer_t p_start, integer_t p_end, MCCanvasPathRef p_path, MCCanvasPathRef &r_subpaths);

engine/src/module-engine.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -630,8 +630,12 @@ extern "C" MC_DLLEXPORT void MCEngineExecLog(MCStringRef p_message)
630630
if (!MCStringAppendChar(s_log_buffer, '\n'))
631631
return;
632632
}
633-
634-
if (!MCStringAppend(s_log_buffer, p_message))
633+
634+
MCAutoStringRef t_message_desc;
635+
if (!MCValueCopyDescription(p_message, &t_message_desc))
636+
return;
637+
638+
if (!MCStringAppend(s_log_buffer, *t_message_desc))
635639
return;
636640

637641
if (s_log_update_pending)

libfoundation/include/foundation.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -707,8 +707,9 @@ inline double MCAbs(double a) { return fabs(a); }
707707
// SIGN FUNCTIONS
708708
//
709709

710-
inline compare_t MCSgn(int32_t a) { return a < 0 ? -1 : (a > 0 ? 1 : 0); }
711-
inline compare_t MCSgn(int64_t a) { return a < 0 ? -1 : (a > 0 ? 1 : 0); }
710+
//inline compare_t MCSgn(int32_t a) { return a < 0 ? -1 : (a > 0 ? 1 : 0); }
711+
//inline compare_t MCSgn(int64_t a) { return a < 0 ? -1 : (a > 0 ? 1 : 0); }
712+
template <class T> inline compare_t MCSgn(T a) { return a < 0 ? -1 : (a > 0 ? 1 : 0); }
712713

713714
////////////////////////////////////////////////////////////////////////////////
714715
//

0 commit comments

Comments
 (0)