summaryrefslogtreecommitdiffstats
path: root/src/ex_cmds2.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-09-05 22:33:28 +0200
committerBram Moolenaar <Bram@vim.org>2019-09-05 22:33:28 +0200
commitaf7645d3733fdd3cd2df03ec7b653601d26969ef (patch)
tree1b3c3d1d0d6428c33026693a5086910cca8b3078 /src/ex_cmds2.c
parent8d3b51084a5bdcd2ee9e31bc03cba0d16c43d428 (diff)
patch 8.1.1989: the evalfunc.c file is still too bigv8.1.1989
Problem: The evalfunc.c file is still too big. Solution: Move f_pathshorten() to filepath.c. Move f_cscope_connection() to if_cscope.c. Move diff_ functions to diff.c. Move timer_ functions to ex_cmds2.c. move callback functions to evalvars.c.
Diffstat (limited to 'src/ex_cmds2.c')
-rw-r--r--src/ex_cmds2.c119
1 files changed, 116 insertions, 3 deletions
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index e2c87bd6f6..6eafd47e29 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -375,7 +375,7 @@ set_ref_in_timer(int copyID)
return abort;
}
-# if defined(EXITFREE) || defined(PROTO)
+# if defined(EXITFREE) || defined(PROTO)
void
timer_free_all()
{
@@ -388,10 +388,123 @@ timer_free_all()
free_timer(timer);
}
}
-# endif
# endif
-#endif
+/*
+ * "timer_info([timer])" function
+ */
+ void
+f_timer_info(typval_T *argvars, typval_T *rettv)
+{
+ timer_T *timer = NULL;
+
+ if (rettv_list_alloc(rettv) != OK)
+ return;
+ if (argvars[0].v_type != VAR_UNKNOWN)
+ {
+ if (argvars[0].v_type != VAR_NUMBER)
+ emsg(_(e_number_exp));
+ else
+ {
+ timer = find_timer((int)tv_get_number(&argvars[0]));
+ if (timer != NULL)
+ add_timer_info(rettv, timer);
+ }
+ }
+ else
+ add_timer_info_all(rettv);
+}
+
+/*
+ * "timer_pause(timer, paused)" function
+ */
+ void
+f_timer_pause(typval_T *argvars, typval_T *rettv UNUSED)
+{
+ timer_T *timer = NULL;
+ int paused = (int)tv_get_number(&argvars[1]);
+
+ if (argvars[0].v_type != VAR_NUMBER)
+ emsg(_(e_number_exp));
+ else
+ {
+ timer = find_timer((int)tv_get_number(&argvars[0]));
+ if (timer != NULL)
+ timer->tr_paused = paused;
+ }
+}
+
+/*
+ * "timer_start(time, callback [, options])" function
+ */
+ void
+f_timer_start(typval_T *argvars, typval_T *rettv)
+{
+ long msec = (long)tv_get_number(&argvars[0]);
+ timer_T *timer;
+ int repeat = 0;
+ callback_T callback;
+ dict_T *dict;
+
+ rettv->vval.v_number = -1;
+ if (check_secure())
+ return;
+ if (argvars[2].v_type != VAR_UNKNOWN)
+ {
+ if (argvars[2].v_type != VAR_DICT
+ || (dict = argvars[2].vval.v_dict) == NULL)
+ {
+ semsg(_(e_invarg2), tv_get_string(&argvars[2]));
+ return;
+ }
+ if (dict_find(dict, (char_u *)"repeat", -1) != NULL)
+ repeat = dict_get_number(dict, (char_u *)"repeat");
+ }
+
+ callback = get_callback(&argvars[1]);
+ if (callback.cb_name == NULL)
+ return;
+
+ timer = create_timer(msec, repeat);
+ if (timer == NULL)
+ free_callback(&callback);
+ else
+ {
+ set_callback(&timer->tr_callback, &callback);
+ rettv->vval.v_number = (varnumber_T)timer->tr_id;
+ }
+}
+
+/*
+ * "timer_stop(timer)" function
+ */
+ void
+f_timer_stop(typval_T *argvars, typval_T *rettv UNUSED)
+{
+ timer_T *timer;
+
+ if (argvars[0].v_type != VAR_NUMBER)
+ {
+ emsg(_(e_number_exp));
+ return;
+ }
+ timer = find_timer((int)tv_get_number(&argvars[0]));
+ if (timer != NULL)
+ stop_timer(timer);
+}
+
+/*
+ * "timer_stopall()" function
+ */
+ void
+f_timer_stopall(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
+{
+ stop_all_timers();
+}
+
+# endif // FEAT_TIMERS
+
+#endif // FEAT_EVAL
/*
* If 'autowrite' option set, try to write the file.