Showing the changes to player/javascript.c (1 of 1 file). Show all
Unified · Split
| @@ -1086,107 +1086,13 @@ static void makenode(void *ta_ctx, mpv_node *dst, js_State *J, int idx) · 1085 unmodified lines | |||
| 1086 | // args: wait in secs (infinite if negative) if mpv doesn't send events earlier. | 1086 | // args: wait in secs (infinite if negative) if mpv doesn't send events earlier. |
| 1087 | static void script_wait_event(js_State *J) | 1087 | static void script_wait_event(js_State *J) |
| 1088 | { | 1088 | { |
| 1089 | int top = js_gettop(J); | ||
| 1090 | double timeout = js_isnumber(J, 1) ? js_tonumber(J, 1) : -1; | 1089 | double timeout = js_isnumber(J, 1) ? js_tonumber(J, 1) : -1; |
| 1091 | mpv_event *event = mpv_wait_event(jclient(J), timeout); | 1090 | mpv_event *event = mpv_wait_event(jclient(J), timeout); |
| 1092 | 1091 | ||
| 1093 | js_newobject(J); // the reply | 1092 | struct mpv_node rn; |
| 1094 | js_pushstring(J, mpv_event_name(event->event_id)); | 1093 | mpv_event_to_node(&rn, event); |
| 1095 | js_setproperty(J, -2, "event"); // reply.event (is an event name) | 1094 | pushnode(J, &rn); |
| 1096 | 1095 | mpv_free_node_contents(&rn); | |
| 1097 | if (event->reply_userdata) { | ||
| 1098 | js_pushnumber(J, event->reply_userdata); | ||
| 1099 | js_setproperty(J, -2, "id"); // reply.id | ||
| 1100 | } | ||
| 1101 | |||
| 1102 | if (event->error < 0) { | ||
| 1103 | // TODO: untested | ||
| 1104 | js_pushstring(J, mpv_error_string(event->error)); | ||
| 1105 | js_setproperty(J, -2, "error"); // reply.error | ||
| 1106 | } | ||
| 1107 | |||
| 1108 | switch (event->event_id) { | ||
| 1109 | case MPV_EVENT_LOG_MESSAGE: { | ||
| 1110 | mpv_event_log_message *msg = event->data; | ||
| 1111 | |||
| 1112 | js_pushstring(J, msg->prefix); | ||
| 1113 | js_setproperty(J, -2, "prefix"); // reply.prefix (e.g. "cplayer") | ||
| 1114 | js_pushstring(J, msg->level); | ||
| 1115 | js_setproperty(J, -2, "level"); // reply.level (e.g. "v" or "info") | ||
| 1116 | js_pushstring(J, msg->text); | ||
| 1117 | js_setproperty(J, -2, "text"); // reply.text | ||
| 1118 | break; | ||
| 1119 | } | ||
| 1120 | |||
| 1121 | case MPV_EVENT_CLIENT_MESSAGE: { | ||
| 1122 | mpv_event_client_message *msg = event->data; | ||
| 1123 | |||
| 1124 | js_newarray(J); // reply.args | ||
| 1125 | for (int n = 0; n < msg->num_args; n++) { | ||
| 1126 | js_pushstring(J, msg->args[n]); | ||
| 1127 | js_setindex(J, -2, n); | ||
| 1128 | } | ||
| 1129 | js_setproperty(J, -2, "args"); // reply.args (is a strings array) | ||
| 1130 | break; | ||
| 1131 | } | ||
| 1132 | |||
| 1133 | case MPV_EVENT_END_FILE: { | ||
| 1134 | mpv_event_end_file *eef = event->data; | ||
| 1135 | const char *reason; | ||
| 1136 | |||
| 1137 | switch (eef->reason) { | ||
| 1138 | case MPV_END_FILE_REASON_EOF: reason = "eof"; break; | ||
| 1139 | case MPV_END_FILE_REASON_STOP: reason = "stop"; break; | ||
| 1140 | case MPV_END_FILE_REASON_QUIT: reason = "quit"; break; | ||
| 1141 | case MPV_END_FILE_REASON_ERROR: reason = "error"; break; | ||
| 1142 | case MPV_END_FILE_REASON_REDIRECT: reason = "redirect"; break; | ||
| 1143 | default: | ||
| 1144 | reason = "unknown"; | ||
| 1145 | } | ||
| 1146 | js_pushstring(J, reason); | ||
| 1147 | js_setproperty(J, -2, "reason"); // reply.reason | ||
| 1148 | |||
| 1149 | if (eef->reason == MPV_END_FILE_REASON_ERROR) { | ||
| 1150 | js_pushstring(J, mpv_error_string(eef->error)); | ||
| 1151 | js_setproperty(J, -2, "error"); // reply.error | ||
| 1152 | } | ||
| 1153 | break; | ||
| 1154 | } | ||
| 1155 | |||
| 1156 | case MPV_EVENT_PROPERTY_CHANGE: { | ||
| 1157 | mpv_event_property *prop = event->data; | ||
| 1158 | js_pushstring(J, prop->name); | ||
| 1159 | js_setproperty(J, -2, "name"); // reply.name (is a property name) | ||
| 1160 | |||
| 1161 | switch (prop->format) { | ||
| 1162 | case MPV_FORMAT_NODE: pushnode(J, prop->data); break; | ||
| 1163 | case MPV_FORMAT_DOUBLE: js_pushnumber(J, *(double *)prop->data); break; | ||
| 1164 | case MPV_FORMAT_INT64: js_pushnumber(J, *(int64_t *)prop->data); break; | ||
| 1165 | case MPV_FORMAT_FLAG: js_pushboolean(J, *(int *)prop->data); break; | ||
| 1166 | case MPV_FORMAT_STRING: js_pushstring(J, *(char **)prop->data); break; | ||
| 1167 | default: | ||
| 1168 | js_pushnull(J); // also for FORMAT_NONE, e.g. observe type "none" | ||
| 1169 | } | ||
| 1170 | js_setproperty(J, -2, "data"); // reply.data (value as observed type) | ||
| 1171 | break; | ||
| 1172 | } | ||
| 1173 | |||
| 1174 | case MPV_EVENT_HOOK: { | ||
| 1175 | mpv_event_hook *hook = event->data; | ||
| 1176 | js_pushnumber(J, hook->id); | ||
| 1177 | js_setproperty(J, -2, "hook_id"); // reply.hook_id (is a number) | ||
| 1178 | break; | ||
| 1179 | } | ||
| 1180 | |||
| 1181 | case MPV_EVENT_COMMAND_REPLY: { | ||
| 1182 | mpv_event_command *cmd = event->data; | ||
| 1183 | pushnode(J, &cmd->result); | ||
| 1184 | js_setproperty(J, -2, "result"); // reply.result (mpv node) | ||
| 1185 | break; | ||
| 1186 | } | ||
| 1187 | } // switch (event->event_id) | ||
| 1188 | |||
| 1189 | assert(top == js_gettop(J) - 1); | ||
| 1190 | } | 1096 | } |
| 1191 | 1097 | ||
| 1192 | /********************************************************************** | 1098 | /********************************************************************** |