diff --git a/src/ibustypes.h b/src/ibustypes.h
index 06370a277..798ad04d9 100644
--- a/src/ibustypes.h
+++ b/src/ibustypes.h
@@ -2,7 +2,7 @@
 /* vim:set et sts=4: */
 /* ibus - The Input Bus
  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2008-2015 Red Hat, Inc.
+ * Copyright (C) 2008-2020 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -241,29 +241,46 @@ typedef void (* IBusFreeFunc) (gpointer object);
  * @IBUS_INPUT_PURPOSE_EMAIL: Edited field expects email address
  * @IBUS_INPUT_PURPOSE_NAME: Edited field expects the name of a person
  * @IBUS_INPUT_PURPOSE_PASSWORD: Like @IBUS_INPUT_PURPOSE_FREE_FORM,
- * but characters are hidden
+ *     but characters are hidden
  * @IBUS_INPUT_PURPOSE_PIN: Like @IBUS_INPUT_PURPOSE_DIGITS, but
- * characters are hidden
+ *     characters are hidden
+ * @IBUS_INPUT_PURPOSE_TERMINAL: Allow any character, in addition to control
+ *     codes. Since 1.5.24
  *
  * Describes primary purpose of the input context.  This information
  * is particularly useful to implement intelligent behavior in
  * engines, such as automatic input-mode switch and text prediction.
  *
+ * Note that the purpose is not meant to impose a totally strict rule
+ * about allowed characters, and does not replace input validation.
+ * It is fine for an on-screen keyboard to let the user override the
+ * character set restriction that is expressed by the purpose. The
+ * application is expected to validate the entry contents, even if
+ * it specified a purpose.
+ *
+ * The difference between @IBUS_INPUT_PURPOSE_DIGITS and
+ * @IBUS_INPUT_PURPOSE_NUMBER is that the former accepts only digits
+ * while the latter also some punctuation (like commas or points, plus,
+ * minus) and “e” or “E” as in 3.14E+000.
+ *
  * This enumeration may be extended in the future; engines should
  * interpret unknown values as 'free form'.
+ *
+ * Since: 1.5.4
  */
 typedef enum
 {
-  IBUS_INPUT_PURPOSE_FREE_FORM,
-  IBUS_INPUT_PURPOSE_ALPHA,
-  IBUS_INPUT_PURPOSE_DIGITS,
-  IBUS_INPUT_PURPOSE_NUMBER,
-  IBUS_INPUT_PURPOSE_PHONE,
-  IBUS_INPUT_PURPOSE_URL,
-  IBUS_INPUT_PURPOSE_EMAIL,
-  IBUS_INPUT_PURPOSE_NAME,
-  IBUS_INPUT_PURPOSE_PASSWORD,
-  IBUS_INPUT_PURPOSE_PIN
+    IBUS_INPUT_PURPOSE_FREE_FORM,
+    IBUS_INPUT_PURPOSE_ALPHA,
+    IBUS_INPUT_PURPOSE_DIGITS,
+    IBUS_INPUT_PURPOSE_NUMBER,
+    IBUS_INPUT_PURPOSE_PHONE,
+    IBUS_INPUT_PURPOSE_URL,
+    IBUS_INPUT_PURPOSE_EMAIL,
+    IBUS_INPUT_PURPOSE_NAME,
+    IBUS_INPUT_PURPOSE_PASSWORD,
+    IBUS_INPUT_PURPOSE_PIN,
+    IBUS_INPUT_PURPOSE_TERMINAL
 } IBusInputPurpose;
 
 /**
@@ -280,24 +297,36 @@ typedef enum
  *     first word of each sentence
  * @IBUS_INPUT_HINT_INHIBIT_OSK: Suggest to not show an onscreen keyboard
  *     (e.g for a calculator that already has all the keys).
- * @IBUS_INPUT_HINT_VERTICAL_WRITING: The text is vertical.
+ * @IBUS_INPUT_HINT_VERTICAL_WRITING: The text is vertical. Since 1.5.11
+ * @IBUS_INPUT_HINT_EMOJI: Suggest offering Emoji support. Since 1.5.24
+ * @IBUS_INPUT_HINT_NO_EMOJI: Suggest not offering Emoji support. Since 1.5.24
  *
  * Describes hints that might be taken into account by engines.  Note
  * that engines may already tailor their behaviour according to the
  * #IBusInputPurpose of the entry.
+ *
+ * Some common sense is expected when using these flags - mixing
+ * @IBUS_INPUT_HINT_LOWERCASE with any of the uppercase hints makes no sense.
+ *
+ * This enumeration may be extended in the future; engines should
+ * ignore unknown values.
+ *
+ * Since: 1.5.4
  */
 typedef enum
 {
-  IBUS_INPUT_HINT_NONE                = 0,
-  IBUS_INPUT_HINT_SPELLCHECK          = 1 << 0,
-  IBUS_INPUT_HINT_NO_SPELLCHECK       = 1 << 1,
-  IBUS_INPUT_HINT_WORD_COMPLETION     = 1 << 2,
-  IBUS_INPUT_HINT_LOWERCASE           = 1 << 3,
-  IBUS_INPUT_HINT_UPPERCASE_CHARS     = 1 << 4,
-  IBUS_INPUT_HINT_UPPERCASE_WORDS     = 1 << 5,
-  IBUS_INPUT_HINT_UPPERCASE_SENTENCES = 1 << 6,
-  IBUS_INPUT_HINT_INHIBIT_OSK         = 1 << 7,
-  IBUS_INPUT_HINT_VERTICAL_WRITING    = 1 << 8
+    IBUS_INPUT_HINT_NONE                = 0,
+    IBUS_INPUT_HINT_SPELLCHECK          = 1 << 0,
+    IBUS_INPUT_HINT_NO_SPELLCHECK       = 1 << 1,
+    IBUS_INPUT_HINT_WORD_COMPLETION     = 1 << 2,
+    IBUS_INPUT_HINT_LOWERCASE           = 1 << 3,
+    IBUS_INPUT_HINT_UPPERCASE_CHARS     = 1 << 4,
+    IBUS_INPUT_HINT_UPPERCASE_WORDS     = 1 << 5,
+    IBUS_INPUT_HINT_UPPERCASE_SENTENCES = 1 << 6,
+    IBUS_INPUT_HINT_INHIBIT_OSK         = 1 << 7,
+    IBUS_INPUT_HINT_VERTICAL_WRITING    = 1 << 8,
+    IBUS_INPUT_HINT_EMOJI               = 1 << 9,
+    IBUS_INPUT_HINT_NO_EMOJI            = 1 << 10
 } IBusInputHints;
 
 #endif
