[FarGroup/FarManager] master: 1. Menu.GetItemExtendedData now has 1st optional parameter: dialog handle. (521a287e1)

0 views
Skip to first unread message

farg...@farmanager.com

unread,
Sep 28, 2025, 4:15:56 PM (3 days ago) Sep 28
to farco...@googlegroups.com
Repository : https://github.com/FarGroup/FarManager
On branch : master
Link : https://github.com/FarGroup/FarManager/commit/521a287e13d80849693c1108ea84046ba89b3b15

>---------------------------------------------------------------

commit 521a287e13d80849693c1108ea84046ba89b3b15
Author: Vadim Yegorov <z...@bmg.lv>
Date: Sun Sep 28 23:03:23 2025 +0300

1. Menu.GetItemExtendedData now has 1st optional parameter: dialog handle.


>---------------------------------------------------------------

521a287e13d80849693c1108ea84046ba89b3b15
far/changelog | 5 +++++
far/macroapi.cpp | 31 +++++++++++++++++++++++++++----
far/plugin.hpp | 1 +
far/tvar.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
far/tvar.hpp | 12 ++++++++++++
far/vbuild.m4 | 2 +-
6 files changed, 95 insertions(+), 5 deletions(-)

diff --git a/far/changelog b/far/changelog
index 6502d92e8..31eaff37b 100644
--- a/far/changelog
+++ b/far/changelog
@@ -1,3 +1,8 @@
+--------------------------------------------------------------------------------
+zg 2025-09-28 23:02:00+03:00 - build 6564
+
+1. Menu.GetItemExtendedData now has 1st optional parameter: dialog handle.
+
--------------------------------------------------------------------------------
drkns 2025-09-21 18:06:25+01:00 - build 6563

diff --git a/far/macroapi.cpp b/far/macroapi.cpp
index 359e24643..4eedb066f 100644
--- a/far/macroapi.cpp
+++ b/far/macroapi.cpp
@@ -252,6 +252,8 @@ std::vector<TVar> FarMacroApi::parseParams(size_t Count) const
case FMVT_BOOLEAN: return TVar(i.Boolean);
case FMVT_DOUBLE: return TVar(i.Double);
case FMVT_STRING: return TVar(i.String);
+ case FMVT_POINTER: return TVar(i.Pointer);
+ case FMVT_DIALOG: return TVar(static_cast<Dialog*>(i.Pointer));
default: return TVar();
}
});
@@ -1168,12 +1170,23 @@ void KeyMacro::CallFar(intptr_t CheckCode, FarMacroCall* Data)

case MCODE_F_MENU_GETEXTENDEDDATA: // T=Menu.GetItemExtendedData([N])
{
- if (IsMenuOrDialogArea(GetArea()) && CurrentWindow)
+ const auto Params{ api.parseParams(2) };
+ auto Nidx = 0;
+ Dialog* Dlg{};
+ if(Params[0].isDialog())
+ {
+ Nidx = 1;
+ Dlg = Params[0].asDialog();
+ }
+ else if(IsMenuOrDialogArea(GetArea()) && CurrentWindow)
+ {
+ Dlg = dynamic_cast<Dialog*>(CurrentWindow.get());
+ }
+ if (Dlg)
{
- const auto Params{ api.parseParams(1) };
- const auto N{ Params[0].isUnknown() ? -1 : Params[0].asInteger() - 1 };
+ const auto N{ Params[Nidx].isUnknown() ? -1 : Params[Nidx].asInteger() - 1 };

- if (VMenu::extended_item_data ExtendedData; CurrentWindow->VMProcess(CheckCode, &ExtendedData, N) == 1)
+ if (VMenu::extended_item_data ExtendedData; Dlg->VMProcess(CheckCode, &ExtendedData, N) == 1)
{
api.PushTable();
for (const auto& [Key, Value] : ExtendedData)
@@ -2494,6 +2507,16 @@ void FarMacroApi::dlggetvalueFunc() const
fgv.Value.Type = FMVT_DOUBLE;
fgv.Value.Double=Ret.asDouble();
break;
+
+ case TVar::Type::Pointer:
+ fgv.Value.Type = FMVT_POINTER;
+ fgv.Value.Pointer = Ret.asPointer();
+ break;
+
+ case TVar::Type::Dialog:
+ fgv.Value.Type = FMVT_DIALOG;
+ fgv.Value.Pointer = Ret.asDialog();
+ break;
}

if (Dlg->SendMessage(DN_GETVALUE,Index,&fgv))
diff --git a/far/plugin.hpp b/far/plugin.hpp
index ab71093bc..71ce09b88 100644
--- a/far/plugin.hpp
+++ b/far/plugin.hpp
@@ -1483,6 +1483,7 @@ enum FARMACROVARTYPE
FMVT_MBSTRING = 11,
FMVT_NEWTABLE = 12,
FMVT_SETTABLE = 13,
+ FMVT_DIALOG = 14,
};

struct FarMacroValue
diff --git a/far/tvar.cpp b/far/tvar.cpp
index 04d0f1bf0..c90251f48 100644
--- a/far/tvar.cpp
+++ b/far/tvar.cpp
@@ -281,6 +281,18 @@ TVar::TVar(const wchar_t* v):
{
}

+TVar::TVar(void* v):
+ ptr(v),
+ vType(Type::Pointer)
+{
+}
+
+TVar::TVar(Dialog* v):
+ ptr(v),
+ vType(Type::Dialog)
+{
+}
+
const string& TVar::toString()
{
// this already writes to str
@@ -360,6 +372,30 @@ double TVar::asDouble() const
}
}

+void* TVar::asPointer() const
+{
+ switch (vType)
+ {
+ case Type::Pointer:
+ return ptr;
+
+ default:
+ return nullptr;
+ }
+}
+
+Dialog* TVar::asDialog() const
+{
+ switch (vType)
+ {
+ case Type::Dialog:
+ return static_cast<Dialog*>(ptr);
+
+ default:
+ return nullptr;
+ }
+}
+
bool TVar::isNumber() const
{
switch (type())
@@ -378,6 +414,9 @@ bool TVar::isNumber() const
default:
return false;
}
+ case Type::Pointer:
+ case Type::Dialog:
+ return false;
}

return false;
@@ -429,6 +468,9 @@ bool TVar::operator<(const TVar& rhs) const
return asDouble() < rhs.asDouble();
}
break;
+ case Type::Pointer:
+ case Type::Dialog:
+ break;
}
break;

@@ -451,11 +493,18 @@ bool TVar::operator<(const TVar& rhs) const
return asDouble() < rhs.asDouble();
}
break;
+ case Type::Pointer:
+ case Type::Dialog:
+ break;
}
break;

case Type::String:
return string_sort::less(asString(), rhs.asString());
+
+ case Type::Pointer:
+ case Type::Dialog:
+ break;
}

return false;
diff --git a/far/tvar.hpp b/far/tvar.hpp
index 14bce8a50..d39aa0a3d 100644
--- a/far/tvar.hpp
+++ b/far/tvar.hpp
@@ -53,6 +53,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// If not, I don't know who wrote it.
//---------------------------------------------------------------

+class Dialog;
class TVar
{
public:
@@ -62,6 +63,8 @@ public:
Integer = 1,
String = 2,
Double = 3,
+ Pointer = 4,
+ Dialog = 5,
};

COPYABLE(TVar);
@@ -73,12 +76,16 @@ public:
explicit TVar(string_view);
explicit TVar(const wchar_t*);
explicit TVar(double);
+ explicit TVar(void*);
+ explicit TVar(Dialog*);

COPY_AND_MOVE(TVar, long long)
COPY_AND_MOVE(TVar, string_view)
COPY_AND_MOVE(TVar, const wchar_t*)
COPY_AND_MOVE(TVar, int)
COPY_AND_MOVE(TVar, double)
+ COPY_AND_MOVE(TVar, void*)
+ COPY_AND_MOVE(TVar, Dialog*)

bool operator<(const TVar&) const;

@@ -89,6 +96,8 @@ public:
bool isString() const { return vType == Type::String; }
bool isInteger() const { return vType == Type::Integer || vType == Type::Unknown; }
bool isDouble() const { return vType == Type::Double; }
+ bool isPointer() const { return vType == Type::Pointer; }
+ bool isDialog() const { return vType == Type::Dialog; }
bool isUnknown() const { return vType == Type::Unknown; }

bool isNumber() const;
@@ -100,12 +109,15 @@ public:
const string& asString() const;
double asDouble() const;
long long asInteger() const;
+ void* asPointer() const;
+ Dialog* asDialog() const;

private:
union
{
long long inum{};
double dnum;
+ void* ptr;
};
mutable string str;
Type vType;
diff --git a/far/vbuild.m4 b/far/vbuild.m4
index 251c00a92..d2cac275d 100644
--- a/far/vbuild.m4
+++ b/far/vbuild.m4
@@ -1 +1 @@
-6563
+6564


Reply all
Reply to author
Forward
0 new messages