diff options
| author | jixiufeng <jixiufeng@luojilab.com> | 2018-11-16 00:10:48 +0800 |
|---|---|---|
| committer | jixiufeng <jixiufeng@luojilab.com> | 2018-11-16 00:15:58 +0800 |
| commit | c59eb64dc45c0f69f52142f9c9b974511ea77aa6 (patch) | |
| tree | bf1631638645eb97273c6b2908e1656175943a5e | |
| parent | 141935df5fbd2e4c1dbeaf2bca0d69ab55af5b74 (diff) | |
support set terminal title .
| -rw-r--r-- | elisp.c | 3 | ||||
| -rw-r--r-- | elisp.h | 2 | ||||
| -rw-r--r-- | vterm-module.c | 28 | ||||
| -rw-r--r-- | vterm-module.h | 2 | ||||
| -rw-r--r-- | vterm.el | 22 |
5 files changed, 57 insertions, 0 deletions
@@ -143,3 +143,6 @@ emacs_value get_hex_color_bg(emacs_env *env, emacs_value face) { return env->funcall(env, Fvterm_face_color_hex, 2, (emacs_value[]){face, Qbackground}); } +void set_title(emacs_env *env, emacs_value string) { + env->funcall(env, Fvterm_set_title, 1, (emacs_value[]){string}); +} @@ -39,6 +39,7 @@ emacs_value Fvterm_flush_output; emacs_value Fblink_cursor_mode; emacs_value Fget_buffer_window; emacs_value Fselected_window; +emacs_value Fvterm_set_title; // Utils void bind_function(emacs_env *env, const char *name, emacs_value Sfun); @@ -67,5 +68,6 @@ void recenter(emacs_env *env, emacs_value pos); void forward_char(emacs_env *env, emacs_value n); emacs_value get_buffer_window(emacs_env *env); emacs_value selected_window(emacs_env *env); +void set_title(emacs_env *env, emacs_value string) ; #endif /* ELISP_H */ diff --git a/vterm-module.c b/vterm-module.c index 24ac1e6..17cb14f 100644 --- a/vterm-module.c +++ b/vterm-module.c @@ -320,6 +320,10 @@ static void term_redraw(Term *term, emacs_env *env) { env->extract_integer(env, buffer_line_number(env)) - bufline_before; adjust_topline(term, env, line_added); } + if(term->is_title_changed){ + set_title(env,env->make_string(env, term->title,strlen(term->title))); + term->is_title_changed=false; + } term->is_invalidated = false; } @@ -353,6 +357,17 @@ static bool is_key(unsigned char *key, size_t len, char *key_description) { return (len == strlen(key_description) && memcmp(key, key_description, len) == 0); } +static void term_set_title(Term *term ,char* title) { + size_t len=strlen(title); + if (term->title){ + free(term->title); + } + term->title=malloc(sizeof(char) * (len+1)); + strncpy(term->title ,title,len); + term->title[len]=0; + term->is_title_changed=true; + return ; +} static int term_settermprop(VTermProp prop, VTermValue *val, void *user_data) { Term *term = (Term *)user_data; @@ -362,8 +377,12 @@ static int term_settermprop(VTermProp prop, VTermValue *val, void *user_data) { term->cursor.visible = val->boolean; break; + case VTERM_PROP_TITLE: + term_set_title(term,val->string); + break; case VTERM_PROP_CURSORBLINK: term->cursor.blinking = val->boolean; + break; default: return 0; } @@ -541,6 +560,11 @@ static void term_finalize(void *object) { for (int i = 0; i < term->sb_current; i++) { free(term->sb_buffer[i]); } + if (term->title){ + free(term->title); + term->title=NULL; + } + free(term->sb_buffer); vterm_free(term->vt); free(term); @@ -571,6 +595,8 @@ static emacs_value Fvterm_new(emacs_env *env, ptrdiff_t nargs, term->invalid_end = rows; term->cursor.visible = true; term->cursor.blinking = false; + term->title = NULL; + term->is_title_changed=false; return env->make_user_ptr(env, term_finalize, term); } @@ -683,6 +709,8 @@ int emacs_module_init(struct emacs_runtime *ert) { Fselected_window = env->make_global_ref(env, env->intern(env, "selected-window")); + Fvterm_set_title = + env->make_global_ref(env, env->intern(env, "vterm--set-title")); // Faces Qterm = env->make_global_ref(env, env->intern(env, "vterm")); Qterm_color_black = diff --git a/vterm-module.h b/vterm-module.h index 0934087..9f809b3 100644 --- a/vterm-module.h +++ b/vterm-module.h @@ -48,6 +48,8 @@ typedef struct Term { bool is_invalidated; Cursor cursor; + char *title; + bool is_title_changed; } Term; // Faces @@ -61,6 +61,22 @@ value with `add-hook'." :type 'hook :group 'vterm) +(defcustom vterm-set-title-hook nil + "Shell set title hook. + +those functions are called one by one, with 1 arguments. +`vterm-set-title-hook' should be a symbol, a hook variable. +The value of HOOK may be nil, a function, or a list of functions. +for example +(defun vterm--rename-buffer-as-title (title) + (rename-buffer (format \"vterm %s\" title))) +(add-hook 'vterm-set-title-hook 'vterm--rename-buffer-as-title) + +see http://tldp.org/HOWTO/Xterm-Title-4.html about how to set terminal title +for different shell. " + :type 'hook + :group 'vterm) + (defface vterm '((t :inherit default)) "Default face to use in Term mode." @@ -267,5 +283,11 @@ Feeds the size change to the virtual terminal." "Return the maximum line number." (line-number-at-pos (point-max))) +(defun vterm--set-title (title) + (run-hook-with-args 'vterm-set-title-hook title)) + + + + (provide 'vterm) ;;; vterm.el ends here |
