| 3227 | } |
| 3228 | |
| 3229 | bool ObjectInstance::signal_find_impl(JSContext* cx, const JS::CallArgs& args) { |
| 3230 | gjs_debug_gsignal("[Gi.signal_find_symbol]() obj %p priv %p argc %d", |
| 3231 | m_wrapper.get(), this, args.length()); |
| 3232 | |
| 3233 | if (!check_gobject_finalized("find any signal on")) { |
| 3234 | args.rval().setInt32(0); |
| 3235 | return true; |
| 3236 | } |
| 3237 | |
| 3238 | JS::RootedObject match(cx); |
| 3239 | if (!gjs_parse_call_args(cx, "[Gi.signal_find_symbol]", args, "o", "match", |
| 3240 | &match)) |
| 3241 | return false; |
| 3242 | |
| 3243 | GSignalMatchType mask; |
| 3244 | unsigned signal_id; |
| 3245 | GQuark detail; |
| 3246 | JS::RootedObject callable(cx); |
| 3247 | if (!signal_match_arguments_from_object(cx, match, &mask, &signal_id, |
| 3248 | &detail, &callable)) |
| 3249 | return false; |
| 3250 | |
| 3251 | uint64_t handler = 0; |
| 3252 | if (!callable) { |
| 3253 | handler = g_signal_handler_find(m_ptr, mask, signal_id, detail, nullptr, |
| 3254 | nullptr, nullptr); |
| 3255 | } else { |
| 3256 | for (GClosure* candidate : m_closures) { |
| 3257 | if (Gjs::Closure::for_gclosure(candidate)->callable() == callable) { |
| 3258 | handler = g_signal_handler_find(m_ptr, mask, signal_id, detail, |
| 3259 | candidate, nullptr, nullptr); |
| 3260 | if (handler != 0) |
| 3261 | break; |
| 3262 | } |
| 3263 | } |
| 3264 | } |
| 3265 | |
| 3266 | args.rval().setNumber(static_cast<double>(handler)); |
| 3267 | return true; |
| 3268 | } |
| 3269 | |
| 3270 | template <ObjectBase::SignalMatchFunc(*MatchFunc)> |
| 3271 | static inline const char* signal_match_to_action_name(); |
no test coverage detected