aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias C. Berner <tcberner@FreeBSD.org>2021-06-30 11:06:17 +0000
committerTobias C. Berner <tcberner@FreeBSD.org>2021-06-30 11:06:17 +0000
commit3bbf0f33c9c313ee2b8579b372b503ecf937f6e9 (patch)
tree657b8e5c665d622e896b17981e957fe02c87ac4b
parentd64eb42e5b50c43cec29f672d32f04ddb7d8dca8 (diff)
downloadports-3bbf0f33c9c313ee2b8579b372b503ecf937f6e9.tar.gz
ports-3bbf0f33c9c313ee2b8579b372b503ecf937f6e9.zip
deskutils/presage: New port
Presage is an intelligent predictive text entry system. Presage (formerly known as Soothsayer) generates predictions by modelling natural language as a combination of redundant information sources. Presage computes probabilities for words which are most likely to be entered next by merging predictions generated by the different predictive algorithms. Presage’s modular and extensible architecture allows its language model to be extended and customized to utilize statistical, syntactic, and semantic predictive algorithms. WWW: https://presage.sourceforge.io/ This port will be required by maliit-keyboard, the defacto standard virtual keyboard for Plasma Wayland Desktop
-rw-r--r--deskutils/Makefile1
-rw-r--r--deskutils/presage/Makefile37
-rw-r--r--deskutils/presage/distinfo3
-rw-r--r--deskutils/presage/files/patch-opensuse_gcc11263
-rw-r--r--deskutils/presage/files/patch-opensuse_gcc6531
-rw-r--r--deskutils/presage/files/patch-opensuse_python31169
-rw-r--r--deskutils/presage/pkg-descr11
-rw-r--r--deskutils/presage/pkg-plist33
8 files changed, 2048 insertions, 0 deletions
diff --git a/deskutils/Makefile b/deskutils/Makefile
index f877e027e807..67d2fb2e23cf 100644
--- a/deskutils/Makefile
+++ b/deskutils/Makefile
@@ -194,6 +194,7 @@
SUBDIR += plasma5-sddm-kcm
SUBDIR += plopfolio
SUBDIR += preferences
+ SUBDIR += presage
SUBDIR += projectlibre
SUBDIR += puush
SUBDIR += py-autokey
diff --git a/deskutils/presage/Makefile b/deskutils/presage/Makefile
new file mode 100644
index 000000000000..506d6eae92ff
--- /dev/null
+++ b/deskutils/presage/Makefile
@@ -0,0 +1,37 @@
+PORTNAME= presage
+DISTVERSION= 0.9.1
+CATEGORIES= deskutils kde
+MASTER_SITES= SF/${PORTNAME}/${PORTNAME}/${DISTVERSION}
+
+MAINTAINER= kde@FreeBSD.org
+COMMENT= An intelligent predictive text entry system
+
+BUILD_DEPENDS= help2man:misc/help2man \
+ ${PYTHON_PKGNAMEPREFIX}dbus>0:devel/py-dbus@${PY_FLAVOR}
+LIB_DEPENDS= libexpat.so:textproc/expat2 \
+ libfontconfig.so:x11-fonts/fontconfig \
+ libfreetype.so:print/freetype2 \
+ libharfbuzz.so:print/harfbuzz \
+ libtinyxml.so:textproc/tinyxml \
+ libuuid.so:misc/e2fsprogs-libuuid
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}dbus>0:devel/py-dbus@${PY_FLAVOR}
+
+USES= gmake gnome libtool:build localbase shebangfix python:3.6+ sqlite
+USE_GNOME= atk cairo gdkpixbuf2 glib20 gtk20 pango
+
+SHEBANG_FILES= apps/dbus/presage_dbus_python_demo \
+ apps/dbus/presage_dbus_python_demo.in \
+ apps/dbus/presage_dbus_service \
+ apps/dbus/presage_dbus_service.py \
+ apps/python/presagemate/presagemate.py \
+ apps/python/pypresagemate.in \
+ apps/python/pyprompter.in \
+ bindings/python/presage_python_demo.in
+
+GNU_CONFIGURE= yes
+CONFIGURE_ARGS= --disable-documentation \
+ --disable-gprompter \
+ --disable-static
+INSTALL_TARGET= install-strip
+
+.include <bsd.port.mk>
diff --git a/deskutils/presage/distinfo b/deskutils/presage/distinfo
new file mode 100644
index 000000000000..7025150d0003
--- /dev/null
+++ b/deskutils/presage/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1624863940
+SHA256 (presage-0.9.1.tar.gz) = 5ed567e350402a1d72c9053c78ecec3be710b7e72153a0223c6d19a7fe58a366
+SIZE (presage-0.9.1.tar.gz) = 2687519
diff --git a/deskutils/presage/files/patch-opensuse_gcc11 b/deskutils/presage/files/patch-opensuse_gcc11
new file mode 100644
index 000000000000..23d03029e7da
--- /dev/null
+++ b/deskutils/presage/files/patch-opensuse_gcc11
@@ -0,0 +1,263 @@
+Index: presage-0.9.1/src/lib/presage.cpp
+===================================================================
+--- src/lib/presage.cpp.orig
++++ src/lib/presage.cpp
+@@ -31,7 +31,7 @@
+ #include "core/predictorActivator.h"
+
+ Presage::Presage (PresageCallback* callback)
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ profileManager = new ProfileManager();
+ configuration = profileManager->get_configuration();
+@@ -42,7 +42,7 @@ Presage::Presage (PresageCallback* callb
+ }
+
+ Presage::Presage (PresageCallback* callback, const std::string config_filename)
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ profileManager = new ProfileManager(config_filename);
+ configuration = profileManager->get_configuration();
+@@ -62,7 +62,7 @@ Presage::~Presage()
+ }
+
+ std::vector<std::string> Presage::predict ()
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ std::vector<std::string> result;
+
+@@ -88,7 +88,7 @@ std::vector<std::string> Presage::predic
+ }
+
+ std::multimap<double, std::string> Presage::predict (std::vector<std::string> filter)
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ std::multimap<double, std::string> result;
+
+@@ -137,20 +137,20 @@ std::multimap<double, std::string> Presa
+ }
+
+ void Presage::learn(const std::string text) const
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ contextTracker->learn(text); // TODO: can pass additional param to
+ // learn to specify offline learning
+ }
+
+ PresageCallback* Presage::callback (PresageCallback* callback)
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ return const_cast<PresageCallback*>(contextTracker->callback(callback));
+ }
+
+ std::string Presage::completion (const std::string str)
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ // There are two types of completions: normal and erasing.
+ // normal_completion = prefix + remainder
+@@ -198,37 +198,37 @@ std::string Presage::completion (const s
+ }
+
+ std::string Presage::context () const
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ return contextTracker->getPastStream();
+ }
+
+ bool Presage::context_change () const
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ return contextTracker->contextChange();
+ }
+
+ std::string Presage::prefix () const
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ return contextTracker->getPrefix();
+ }
+
+ std::string Presage::config (const std::string variable) const
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ return configuration->find (variable)->get_value ();
+ }
+
+ void Presage::config (const std::string variable, const std::string value) const
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ configuration->insert (variable, value);
+ }
+
+ void Presage::save_config () const
+- throw (PresageException)
++ EXCEPT (PresageException)
+ {
+ profileManager->save_profile ();
+ }
+Index: presage-0.9.1/src/lib/presage.h
+===================================================================
+--- src/lib/presage.h.orig
++++ src/lib/presage.h
+@@ -28,6 +28,12 @@
+ #include "presageException.h"
+ #include "presageCallback.h"
+
++#if __cplusplus >= 201103L
++#define EXCEPT(...) noexcept(false)
++#else
++#define EXCEPT(...) throw(__VA_ARGS__)
++#endif
++
+ /** \mainpage
+
+ \section intro_section Introduction
+@@ -112,7 +118,7 @@ public:
+ *
+ * Presage does not take ownership of the callback object.
+ */
+- Presage(PresageCallback* callback) throw (PresageException);
++ Presage(PresageCallback* callback) EXCEPT(PresageException);
+
+
+ /** Creates and initializes presage with supplied configuration.
+@@ -122,7 +128,7 @@ public:
+ *
+ * Presage does not take ownership of the callback object.
+ */
+- Presage(PresageCallback* callback, const std::string config) throw (PresageException);
++ Presage(PresageCallback* callback, const std::string config) EXCEPT(PresageException);
+
+
+ /** Destroys presage.
+@@ -138,7 +144,7 @@ public:
+ * context.
+ *
+ */
+- std::vector<std::string> predict() throw (PresageException);
++ std::vector<std::string> predict() EXCEPT(PresageException);
+
+ /** \brief Obtain a prediction that matches the supplied token
+ * filter.
+@@ -153,7 +159,7 @@ public:
+ * of the filter tokens.
+ *
+ */
+- std::multimap<double, std::string> predict(std::vector<std::string> filter) throw (PresageException);
++ std::multimap<double, std::string> predict(std::vector<std::string> filter) EXCEPT(PresageException);
+
+ /** \brief Learn from text offline.
+ *
+@@ -167,7 +173,7 @@ public:
+ * \param text a text string to learn from.
+ *
+ */
+- void learn(const std::string text) const throw (PresageException);
++ void learn(const std::string text) const EXCEPT(PresageException);
+
+ /** \brief Callback getter/setter.
+ *
+@@ -176,7 +182,7 @@ public:
+ *
+ * \return pointer to previously used callback
+ */
+- PresageCallback* callback(PresageCallback* callback) throw (PresageException);
++ PresageCallback* callback(PresageCallback* callback) EXCEPT(PresageException);
+
+ /** \brief Request presage to return the completion string for the given predicted token.
+ *
+@@ -190,26 +196,26 @@ public:
+ *
+ * \return completion string
+ */
+- std::string completion(std::string str) throw (PresageException);
++ std::string completion(std::string str) EXCEPT(PresageException);
+
+ /** \brief Returns the text entered so far.
+ *
+ * \return context, text entered so far.
+ */
+- std::string context() const throw (PresageException);
++ std::string context() const EXCEPT(PresageException);
+
+ /** \brief Returns true if a context change occured.
+ *
+ * \return true if a context change occured after the last update
+ * or predict calls, or false otherwise.
+ */
+- bool context_change() const throw (PresageException);
++ bool context_change() const EXCEPT(PresageException);
+
+ /** \brief Returns the current prefix.
+ *
+ * \return prefix
+ */
+- std::string prefix() const throw (PresageException);
++ std::string prefix() const EXCEPT(PresageException);
+
+ /** \brief Gets the value of specified configuration variable.
+ *
+@@ -218,7 +224,7 @@ public:
+ *
+ * \return value assigned to configuration variable.
+ */
+- std::string config(const std::string variable) const throw (PresageException);
++ std::string config(const std::string variable) const EXCEPT(PresageException);
+
+ /** \brief Sets the value of specified configuration variable.
+ *
+@@ -227,7 +233,7 @@ public:
+ * from the configuration file in use.
+ *
+ */
+- void config(const std::string variable, const std::string value) const throw (PresageException);
++ void config(const std::string variable, const std::string value) const EXCEPT(PresageException);
+
+ /** \brief Save current configuration to file.
+ *
+@@ -236,7 +242,7 @@ public:
+ * active XML profile.
+ *
+ */
+- void save_config() const throw (PresageException);
++ void save_config() const EXCEPT(PresageException);
+
+ /*
+ * Presage public API ends here
+From e9faf7fa918e75bdf26f3068794c97b34d14b406 Mon Sep 17 00:00:00 2001
+From: Martin Liska <mliska@suse.cz>
+Date: Wed, 12 May 2021 14:13:23 +0200
+Subject: [PATCH] Fix GCC 11 warning.
+
+---
+ apps/gtk/gprompter/scintilla/gtk/ScintillaGTK.cxx | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/apps/gtk/gprompter/scintilla/gtk/ScintillaGTK.cxx b/apps/gtk/gprompter/scintilla/gtk/ScintillaGTK.cxx
+index 926457b..8f4816d 100644
+--- apps/gtk/gprompter/scintilla/gtk/ScintillaGTK.cxx.orig
++++ apps/gtk/gprompter/scintilla/gtk/ScintillaGTK.cxx
+@@ -1626,7 +1626,7 @@ void ScintillaGTK::ReceivedDrop(GtkSelectionData *selection_data) {
+ drop.push_back('\0');
+ NotifyURIDropped(&drop[0]);
+ } else if ((TypeOfGSD(selection_data) == GDK_TARGET_STRING) || (TypeOfGSD(selection_data) == atomUTF8)) {
+- if (TypeOfGSD(selection_data) > 0) {
++ if (TypeOfGSD(selection_data) != NULL) {
+ SelectionText selText;
+ GetGtkSelectionText(selection_data, selText);
+ DropAt(posDrop, selText.Data(), selText.Length(), false, selText.rectangular);
+--
+2.31.1
+
+
diff --git a/deskutils/presage/files/patch-opensuse_gcc6 b/deskutils/presage/files/patch-opensuse_gcc6
new file mode 100644
index 000000000000..d8b4cd8e2360
--- /dev/null
+++ b/deskutils/presage/files/patch-opensuse_gcc6
@@ -0,0 +1,531 @@
+Obtained from:
+ https://build.opensuse.org/package/view_file/openSUSE:Factory/presage/presage-0.9.1-gcc6.patch
+
+Index: presage-0.9.1/src/lib/core/iso8859_1.h
+===================================================================
+--- src/lib/core/iso8859_1.h.orig
++++ src/lib/core/iso8859_1.h
+@@ -27,266 +27,266 @@
+
+ // ISO 8859-1 standard ///////////////////////
+
+-const int NUL = 0; // NUL
+-const int SOH = 1; // SOH
+-const int STX = 2; // STX
+-const int ETX = 3; // ETX
+-const int EOT = 4; // EOT
+-const int ENQ = 5; // ENQ
+-const int ACK = 6; // ACK
+-const int BEL = 7; // BEL
+-const int BS = 8; // BS
+-const int HT = 9; // HT
+-const int NL = 10; // NL
+-const int VT = 11; // VT
+-const int NP = 12; // NP
+-const int CR = 13; // CR
+-const int SO = 14; // SO
+-const int SI = 15; // SI
+-const int DLE = 16; // DLE
+-const int DC1 = 17; // DC1
+-const int DC2 = 18; // DC2
+-const int DC3 = 19; // DC3
+-const int DC4 = 20; // DC4
+-const int NAK = 21; // NAK
+-const int SYN = 22; // SYN
+-const int ETB = 23; // ETB
+-const int CAN = 24; // CAN
+-const int EM = 25; // EM
+-const int SUB = 26; // SUB
+-const int ESC = 27; // ESC
+-const int FS = 28; // FS
+-const int GS = 29; // GS
+-const int RS = 30; // RS
+-const int US = 31; // US
+-const int space = 32; // normal space
+-const int exclamation = 33; // !
+-const int quote = 34; // "
+-const int hashsign = 35; // #
+-const int dollar = 36; // $
+-const int percent = 37; // %
+-const int ampersand = 38; // &
+-const int apostrophe = 39; // '
+-const int openbracket = 40; // (
+-const int closebracket= 41; // )
+-const int asterisk = 42; // *
+-const int plus = 43; // +
+-const int comma = 44; // ,
+-const int minus = 45; // -
+-const int period = 46; // .
+-const int slash = 47; // /
+-const int digit0 = 48; // 0
+-const int digit1 = 49; // 1
+-const int digit2 = 50; // 2
+-const int digit3 = 51; // 3
+-const int digit4 = 52; // 4
+-const int digit5 = 53; // 5
+-const int digit6 = 54; // 6
+-const int digit7 = 55; // 7
+-const int digit8 = 56; // 8
+-const int digit9 = 57; // 9
+-const int colon = 58; // :
+-const int semicolon = 59; // ;
+-const int lessthan = 60; // <
+-const int equals = 61; // =
+-const int greaterthan = 62; // >
+-const int question = 63; // ?
+-const int at = 64; // @
+-const int Aletter = 65; // A
+-const int Bletter = 66; // B
+-const int Cletter = 67; // C
+-const int Dletter = 68; // D
+-const int Eletter = 69; // E
+-const int Fletter = 70; // F
+-const int Gletter = 71; // G
+-const int Hletter = 72; // H
+-const int Iletter = 73; // I
+-const int Jletter = 74; // J
+-const int Kletter = 75; // K
+-const int Lletter = 76; // L
+-const int Mletter = 77; // M
+-const int Nletter = 78; // N
+-const int Oletter = 79; // O
+-const int Pletter = 80; // P
+-const int Qletter = 81; // Q
+-const int Rletter = 82; // R
+-const int Sletter = 83; // S
+-const int Tletter = 84; // T
+-const int Uletter = 85; // U
+-const int Vletter = 86; // V
+-const int Wletter = 87; // W
+-const int Xletter = 88; // X
+-const int Yletter = 89; // Y
+-const int Zletter = 90; // Z
+-const int opensquare = 91; // [
+-const int backslash = 92; //
+-const int closesquare = 93; // ]
+-const int pointer = 94; // ^
+-const int underscore = 95; // _
+-const int grave = 96; // `
+-const int aletter = 97; // a
+-const int bletter = 98; // b
+-const int cletter = 99; // c
+-const int dletter = 100; // d
+-const int eletter = 101; // e
+-const int fletter = 102; // f
+-const int gletter = 103; // g
+-const int hletter = 104; // h
+-const int iletter = 105; // i
+-const int jletter = 106; // j
+-const int kletter = 107; // k
+-const int lletter = 108; // l
+-const int mletter = 109; // m
+-const int nletter = 110; // n
+-const int oletter = 111; // o
+-const int pletter = 112; // p
+-const int qletter = 113; // q
+-const int rletter = 114; // r
+-const int sletter = 115; // s
+-const int tletter = 116; // t
+-const int uletter = 117; // u
+-const int vletter = 118; // v
+-const int wletter = 119; // w
+-const int xletter = 120; // x
+-const int yletter = 121; // y
+-const int zletter = 122; // z
+-const int leftbrace = 123; // {
+-const int verticalbar = 124; // |
+-const int rightbrace = 125; // }
+-const int tilde = 126; // ~
++const char NUL = 0; // NUL
++const char SOH = 1; // SOH
++const char STX = 2; // STX
++const char ETX = 3; // ETX
++const char EOT = 4; // EOT
++const char ENQ = 5; // ENQ
++const char ACK = 6; // ACK
++const char BEL = 7; // BEL
++const char BS = 8; // BS
++const char HT = 9; // HT
++const char NL = 10; // NL
++const char VT = 11; // VT
++const char NP = 12; // NP
++const char CR = 13; // CR
++const char SO = 14; // SO
++const char SI = 15; // SI
++const char DLE = 16; // DLE
++const char DC1 = 17; // DC1
++const char DC2 = 18; // DC2
++const char DC3 = 19; // DC3
++const char DC4 = 20; // DC4
++const char NAK = 21; // NAK
++const char SYN = 22; // SYN
++const char ETB = 23; // ETB
++const char CAN = 24; // CAN
++const char EM = 25; // EM
++const char SUB = 26; // SUB
++const char ESC = 27; // ESC
++const char FS = 28; // FS
++const char GS = 29; // GS
++const char RS = 30; // RS
++const char US = 31; // US
++const char space = 32; // normal space
++const char exclamation = 33; // !
++const char quote = 34; // "
++const char hashsign = 35; // #
++const char dollar = 36; // $
++const char percent = 37; // %
++const char ampersand = 38; // &
++const char apostrophe = 39; // '
++const char openbracket = 40; // (
++const char closebracket= 41; // )
++const char asterisk = 42; // *
++const char plus = 43; // +
++const char comma = 44; // ,
++const char minus = 45; // -
++const char period = 46; // .
++const char slash = 47; // /
++const char digit0 = 48; // 0
++const char digit1 = 49; // 1
++const char digit2 = 50; // 2
++const char digit3 = 51; // 3
++const char digit4 = 52; // 4
++const char digit5 = 53; // 5
++const char digit6 = 54; // 6
++const char digit7 = 55; // 7
++const char digit8 = 56; // 8
++const char digit9 = 57; // 9
++const char colon = 58; // :
++const char semicolon = 59; // ;
++const char lessthan = 60; // <
++const char equals = 61; // =
++const char greaterthan = 62; // >
++const char question = 63; // ?
++const char at = 64; // @
++const char Aletter = 65; // A
++const char Bletter = 66; // B
++const char Cletter = 67; // C
++const char Dletter = 68; // D
++const char Eletter = 69; // E
++const char Fletter = 70; // F
++const char Gletter = 71; // G
++const char Hletter = 72; // H
++const char Iletter = 73; // I
++const char Jletter = 74; // J
++const char Kletter = 75; // K
++const char Lletter = 76; // L
++const char Mletter = 77; // M
++const char Nletter = 78; // N
++const char Oletter = 79; // O
++const char Pletter = 80; // P
++const char Qletter = 81; // Q
++const char Rletter = 82; // R
++const char Sletter = 83; // S
++const char Tletter = 84; // T
++const char Uletter = 85; // U
++const char Vletter = 86; // V
++const char Wletter = 87; // W
++const char Xletter = 88; // X
++const char Yletter = 89; // Y
++const char Zletter = 90; // Z
++const char opensquare = 91; // [
++const char backslash = 92; //
++const char closesquare = 93; // ]
++const char pointer = 94; // ^
++const char underscore = 95; // _
++const char grave = 96; // `
++const char aletter = 97; // a
++const char bletter = 98; // b
++const char cletter = 99; // c
++const char dletter = 100; // d
++const char eletter = 101; // e
++const char fletter = 102; // f
++const char gletter = 103; // g
++const char hletter = 104; // h
++const char iletter = 105; // i
++const char jletter = 106; // j
++const char kletter = 107; // k
++const char lletter = 108; // l
++const char mletter = 109; // m
++const char nletter = 110; // n
++const char oletter = 111; // o
++const char pletter = 112; // p
++const char qletter = 113; // q
++const char rletter = 114; // r
++const char sletter = 115; // s
++const char tletter = 116; // t
++const char uletter = 117; // u
++const char vletter = 118; // v
++const char wletter = 119; // w
++const char xletter = 120; // x
++const char yletter = 121; // y
++const char zletter = 122; // z
++const char leftbrace = 123; // {
++const char verticalbar = 124; // |
++const char rightbrace = 125; // }
++const char tilde = 126; // ~
+
+
+-const int DEL = 127; // DEL
+-const int PAD = 128; // --
+-const int HOP = 129; // --
+-const int BPH = 130; // --
+-const int NBH = 131; // --
+-const int IND = 132; // --
+-const int NEL = 133; // --
+-const int SSA = 134; // --
+-const int ESA = 135; // --
+-const int HTS = 136; // --
+-const int HTJ = 137; // --
+-const int VTS = 138; // --
+-const int PLD = 139; // --
+-const int PLU = 140; // --
+-const int RI = 141; // --
+-const int SS2 = 142; // --
+-const int SS3 = 143; // --
+-const int DCS = 144; // --
+-const int PU1 = 145; // --
+-const int PU2 = 146; // --
+-const int STS = 147; // --
+-const int CCH = 148; // --
+-const int MW = 149; // --
+-const int SPA = 150; // --
+-const int EPA = 151; // --
+-const int SOS = 152; // --
+-const int SGCI= 153; // --
+-const int SCI = 154; // --
+-const int CSI = 155; // --
+-const int ST = 156; // --
+-const int OSC = 157; // --
+-const int PM = 158; // --
+-const int APC = 159; // --
++const char DEL = 127; // DEL
++const char PAD = 128; // --
++const char HOP = 129; // --
++const char BPH = 130; // --
++const char NBH = 131; // --
++const char IND = 132; // --
++const char NEL = 133; // --
++const char SSA = 134; // --
++const char ESA = 135; // --
++const char HTS = 136; // --
++const char HTJ = 137; // --
++const char VTS = 138; // --
++const char PLD = 139; // --
++const char PLU = 140; // --
++const char RI = 141; // --
++const char SS2 = 142; // --
++const char SS3 = 143; // --
++const char DCS = 144; // --
++const char PU1 = 145; // --
++const char PU2 = 146; // --
++const char STS = 147; // --
++const char CCH = 148; // --
++const char MW = 149; // --
++const char SPA = 150; // --
++const char EPA = 151; // --
++const char SOS = 152; // --
++const char SGCI= 153; // --
++const char SCI = 154; // --
++const char CSI = 155; // --
++const char ST = 156; // --
++const char OSC = 157; // --
++const char PM = 158; // --
++const char APC = 159; // --
+
+
+-const int nbsp = 160; // non-breaking space
+-const int iexcl = 161; // ¡
+-const int cent = 162; // ¢
+-const int pound = 163; // £
+-const int curren = 164; // ¤
+-const int yen = 165; // ¥
+-const int brvbar = 166; // ¦
+-const int sect = 167; // §
+-const int uml = 168; // ¨
+-const int copyr = 169; // ©
+-const int ordf = 170; // ª
+-const int laquo = 171; // «
+-const int notsign= 172; // ¬
+-const int shy = 173; // ­
+-const int reg = 174; // ®
+-const int macr = 175; // ¯
+-const int deg = 176; // °
+-const int plusmn = 177; // ±
+-const int sup2 = 178; // ²
+-const int sup3 = 179; // ³
+-const int acute = 180; // ´
+-const int micro = 181; // µ
+-const int para = 182; // ¶
+-const int middot = 183; // ·
+-const int cedil = 184; // ¸
+-const int sup1 = 185; // ¹
+-const int ordm = 186; // º
+-const int raquo = 187; // »
+-const int frac14 = 188; // ¼
+-const int frac12 = 189; // ½
+-const int frac34 = 190; // ¾
+-const int iquest = 191; // ¿
+-const int Agrave = 192; // À
+-const int Aacute = 193; // Á
+-const int Acirc = 194; // Â
+-const int Atilde = 195; // Ã
+-const int Auml = 196; // Ä
+-const int Aring = 197; // Å
+-const int AElig = 198; // Æ
+-const int Ccedil = 199; // Ç
+-const int Egrave = 200; // È
+-const int Eacute = 201; // É
+-const int Ecirc = 202; // Ê
+-const int Euml = 203; // Ë
+-const int Igrave = 204; // Ì
+-const int Iacute = 205; // Í
+-const int Icirc = 206; // Î
+-const int Iuml = 207; // Ï
+-const int ETH = 208; // Ð
+-const int Ntilde = 209; // Ñ
+-const int Ograve = 210; // Ò
+-const int Oacute = 211; // Ó
+-const int Ocirc = 212; // Ô
+-const int Otilde = 213; // Õ
+-const int Ouml = 214; // Ö
+-const int times = 215; // ×
+-const int Oslash = 216; // Ø
+-const int Ugrave = 217; // Ù
+-const int Uacute = 218; // Ú
+-const int Ucirc = 219; // Û
+-const int Uuml = 220; // Ü
+-const int Yacute = 221; // Ý
+-const int THORN = 222; // Þ
+-const int szlig = 223; // ß
+-const int agrave = 224; // à
+-const int aacute = 225; // á
+-const int acirc = 226; // â
+-const int atilde = 227; // ã
+-const int auml = 228; // ä
+-const int aring = 229; // å
+-const int aelig = 230; // æ
+-const int ccedil = 231; // ç
+-const int egrave = 232; // è
+-const int eacute = 233; // é
+-const int ecirc = 234; // ê
+-const int euml = 235; // ë
+-const int igrave = 236; // ì
+-const int iacute = 237; // í
+-const int icirc = 238; // î
+-const int iuml = 239; // ï
+-const int eth = 240; // ð
+-const int ntilde = 241; // ñ
+-const int ograve = 242; // ò
+-const int oacute = 243; // ó
+-const int ocirc = 244; // ô
+-const int otilde = 245; // õ
+-const int ouml = 246; // ö
+-const int divide = 247; // ÷
+-const int oslash = 248; // ø
+-const int ugrave = 249; // ù
+-const int uacute = 250; // ú
+-const int ucirc = 251; // û
+-const int uuml = 252; // ü
+-const int yacute = 253; // ý
+-const int thorn = 254; // þ
+-const int yuml = 255; // ÿ
++const char nbsp = 160; // non-breaking space
++const char iexcl = 161; // ¡
++const char cent = 162; // ¢
++const char pound = 163; // £
++const char curren = 164; // ¤
++const char yen = 165; // ¥
++const char brvbar = 166; // ¦
++const char sect = 167; // §
++const char uml = 168; // ¨
++const char copyr = 169; // ©
++const char ordf = 170; // ª
++const char laquo = 171; // «
++const char notsign= 172; // ¬
++const char shy = 173; // ­
++const char reg = 174; // ®
++const char macr = 175; // ¯
++const char deg = 176; // °
++const char plusmn = 177; // ±
++const char sup2 = 178; // ²
++const char sup3 = 179; // ³
++const char acute = 180; // ´
++const char micro = 181; // µ
++const char para = 182; // ¶
++const char middot = 183; // ·
++const char cedil = 184; // ¸
++const char sup1 = 185; // ¹
++const char ordm = 186; // º
++const char raquo = 187; // »
++const char frac14 = 188; // ¼
++const char frac12 = 189; // ½
++const char frac34 = 190; // ¾
++const char iquest = 191; // ¿
++const char Agrave = 192; // À
++const char Aacute = 193; // Á
++const char Acirc = 194; // Â
++const char Atilde = 195; // Ã
++const char Auml = 196; // Ä
++const char Aring = 197; // Å
++const char AElig = 198; // Æ
++const char Ccedil = 199; // Ç
++const char Egrave = 200; // È
++const char Eacute = 201; // É
++const char Ecirc = 202; // Ê
++const char Euml = 203; // Ë
++const char Igrave = 204; // Ì
++const char Iacute = 205; // Í
++const char Icirc = 206; // Î
++const char Iuml = 207; // Ï
++const char ETH = 208; // Ð
++const char Ntilde = 209; // Ñ
++const char Ograve = 210; // Ò
++const char Oacute = 211; // Ó
++const char Ocirc = 212; // Ô
++const char Otilde = 213; // Õ
++const char Ouml = 214; // Ö
++const char times = 215; // ×
++const char Oslash = 216; // Ø
++const char Ugrave = 217; // Ù
++const char Uacute = 218; // Ú
++const char Ucirc = 219; // Û
++const char Uuml = 220; // Ü
++const char Yacute = 221; // Ý
++const char THORN = 222; // Þ
++const char szlig = 223; // ß
++const char agrave = 224; // à
++const char aacute = 225; // á
++const char acirc = 226; // â
++const char atilde = 227; // ã
++const char auml = 228; // ä
++const char aring = 229; // å
++const char aelig = 230; // æ
++const char ccedil = 231; // ç
++const char egrave = 232; // è
++const char eacute = 233; // é
++const char ecirc = 234; // ê
++const char euml = 235; // ë
++const char igrave = 236; // ì
++const char iacute = 237; // í
++const char icirc = 238; // î
++const char iuml = 239; // ï
++const char eth = 240; // ð
++const char ntilde = 241; // ñ
++const char ograve = 242; // ò
++const char oacute = 243; // ó
++const char ocirc = 244; // ô
++const char otilde = 245; // õ
++const char ouml = 246; // ö
++const char divide = 247; // ÷
++const char oslash = 248; // ø
++const char ugrave = 249; // ù
++const char uacute = 250; // ú
++const char ucirc = 251; // û
++const char uuml = 252; // ü
++const char yacute = 253; // ý
++const char thorn = 254; // þ
++const char yuml = 255; // ÿ
+
+
+ #endif // ISO8859_1
+
diff --git a/deskutils/presage/files/patch-opensuse_python3 b/deskutils/presage/files/patch-opensuse_python3
new file mode 100644
index 000000000000..76c5d9b67e0b
--- /dev/null
+++ b/deskutils/presage/files/patch-opensuse_python3
@@ -0,0 +1,1169 @@
+Index: presage-0.9.1/bindings/python/Makefile.am
+===================================================================
+--- bindings/python/Makefile.am.orig
++++ bindings/python/Makefile.am
+@@ -81,7 +81,7 @@ clean-local:
+ rm -rf build
+
+ presage_wrap.cpp presage_wrap.h presage.py: $(SWIG_INTERFACE) $(PRESAGE_INTERFACE)
+- $(SWIG) -c++ -python -I$(top_srcdir)/src/lib -o presage_wrap.cpp -outdir . $(srcdir)/$(SWIG_INTERFACE)
++ $(SWIG) -c++ -python -py3 -I$(top_srcdir)/src/lib -o presage_wrap.cpp -outdir . $(srcdir)/$(SWIG_INTERFACE)
+
+ if HAVE_HELP2MAN
+ presage_python_demo.1: presage_python_demo.in $(top_srcdir)/configure.ac
+Index: presage-0.9.1/bindings/python/presage_python_demo.in
+===================================================================
+--- bindings/python/presage_python_demo.in.orig
++++ bindings/python/presage_python_demo.in
+@@ -25,11 +25,12 @@ import getopt
+
+ PROGRAM_NAME = 'presage_python_demo'
+
+-config = None
+-suggestions = None
++CONFIG = None
++SUGGESTIONS = None
++
+
+ def disclaimer():
+- print """
++ print("""
+ Presage python demo
+ -----------------------
+
+@@ -42,19 +43,21 @@ Its intent is NOT to provide a predictiv
+
+ Think of Presage as the predictive backend that sits behind a shiny
+ user interface and does all the predictive heavy lifting.
+-"""
++""")
++
+
+ def print_version():
+- print """
++ print("""
+ %s (%s) version %s
+ Copyright (C) 2004 Matteo Vescovi.
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
+ to the extent permitted by law.
+-""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@')
++""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@'))
++
+
+ def print_usage():
+- print """
++ print("""
+ Usage: %s [OPTION]...
+
+ At the prompt, type in some text. Hit enter to generate a prediction.
+@@ -66,40 +69,41 @@ Any text input is valid, including no te
+ -v, --version output version information and exit
+
+ Direct your bug reports to: %s
+-""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@')
++""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@'))
++
+
+ def parse_cmd_line_args():
+- global config
+- global suggestions
++ global CONFIG
++ global SUGGESTIONS
++
++ short_options = "c:s:hv"
++ long_options = ["config=", "suggestions=", "help", "version"]
+
+- short_options = "c:s:hv"
+- long_options = ["config=", "suggestions=", "help", "version"]
+-
+- try:
+- opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
+- except getopt.GetoptError, err:
+- print str(err)
+- sys.exit(1)
+-
+- for opt, arg in opts:
+- if opt in ('-v', '--version'):
+- print_version()
+- sys.exit()
+- elif opt in ('-h', '--help'):
+- print_usage()
+- sys.exit()
+- elif opt in ('-c', '--config'):
+- config = arg
+- elif opt in ('-s', '--suggestions'):
+- suggestions = arg
++ try:
++ opts, _ = getopt.getopt(sys.argv[1:], short_options, long_options)
++ except getopt.GetoptError as err:
++ print(str(err))
++ sys.exit(1)
++
++ for opt, arg in opts:
++ if opt in ('-v', '--version'):
++ print_version()
++ sys.exit()
++ elif opt in ('-h', '--help'):
++ print_usage()
++ sys.exit()
++ elif opt in ('-c', '--config'):
++ CONFIG = arg
++ elif opt in ('-s', '--suggestions'):
++ SUGGESTIONS = arg
+
+
+ def main():
+- try:
+- import presage
++ try:
++ import presage
+
+- except ImportError, e:
+- print '''
++ except ImportError as err:
++ print('''
+ Error: failed to import module presage.
+
+ Check that presage python binding is properly installed (if
+@@ -109,53 +113,53 @@ accordingly).
+ Check that presage library is properly installed (if installed in a
+ non-standard location, please set LD_LIBRARY_PATH (PATH, LIBPATH)
+ accordingly).
+-'''
+- print e
+- sys.exit(1)
+-
+- try:
+- # Define and create PresageCallback object
+- class DemoCallback(presage.PresageCallback):
+- def __init__(self):
+- presage.PresageCallback.__init__(self)
+- self.buffer = ''
+-
+- def get_past_stream(self):
+- return self.buffer
+-
+- def get_future_stream(self):
+- return ''
+-
+- # Presage owns callback, so we create it and disown it
+- callback = DemoCallback().__disown__()
+-
+- # Create Presage object
+- if config:
+- prsg = presage.Presage(callback, config)
+- else:
+- prsg = presage.Presage(callback)
+-
+- if suggestions:
+- prsg.config('Presage.Selector.SUGGESTIONS', suggestions)
+-
+- print "Enter text at the prompt (press enter on empty line to exit):"
+- str = None
+- while str != "":
+- str = raw_input("> ")
+- callback.buffer += str
+- print prsg.predict()
+-
+- # Destroy Presage object
+- del prsg
+-
+- except presage.PresageException,ex:
+- print ex.what()
+- sys.exit(1)
++''')
++ print(err)
++ sys.exit(1)
++
++ try:
++ # Define and create PresageCallback object
++ class DemoCallback(presage.PresageCallback):
++ def __init__(self):
++ presage.PresageCallback.__init__(self)
++ self.buffer = ''
++
++ def get_past_stream(self):
++ return self.buffer
++
++ def get_future_stream(self):
++ return ''
++
++ # Presage owns callback, so we create it and disown it
++ callback = DemoCallback().__disown__()
++
++ # Create Presage object
++ if CONFIG:
++ prsg = presage.Presage(callback, CONFIG)
++ else:
++ prsg = presage.Presage(callback)
++
++ if SUGGESTIONS:
++ prsg.config('Presage.Selector.SUGGESTIONS', SUGGESTIONS)
++
++ print("Enter text at the prompt (press enter on empty line to exit):")
++ strs = None
++ while strs != "":
++ strs = input("> ")
++ callback.buffer += strs
++ print(prsg.predict())
++
++ # Destroy Presage object
++ del prsg
++
++ except presage.PresageException as ex:
++ print(ex.what())
++ sys.exit(1)
+
+- print "Goodbye"
++ print("Goodbye")
+
+
+ if __name__ == '__main__':
+- parse_cmd_line_args()
+- disclaimer()
+- main()
++ parse_cmd_line_args()
++ disclaimer()
++ main()
+Index: presage-0.9.1/configure.ac
+===================================================================
+--- configure.ac.orig
++++ configure.ac
+@@ -233,7 +233,7 @@ AM_PATH_PYTHON([2.0],
+ [AC_MSG_WARN([Python not found. Python is required to build presage python binding. Python can be obtained from http://www.python.org])])
+ if test "$PYTHON" != :
+ then
+- python_include_path=`$PYTHON -c "import distutils.sysconfig; print distutils.sysconfig.get_python_inc();"`
++ python_include_path=`$PYTHON -c "import sysconfig; print(sysconfig.get_path('include'));"`
+ AC_CHECK_HEADERS([${python_include_path}/Python.h],
+ [have_python_header=true],
+ [AC_MSG_WARN([Python.h header file not found. Python development files are required to build presage python binding. Python can be obtained from http://www.python.org])],
+@@ -295,7 +295,7 @@ then
+ AC_MSG_RESULT($have_pyatspi)
+
+ AC_MSG_CHECKING(for python gtk module)
+- $PYTHON -c "import gtk" 2&>/dev/null
++ $PYTHON -c "import gi; gi.require_version('Gtk', '3.0'); from gi.repository import Gtk" 2&>/dev/null
+ if test $? -eq 0;
+ then
+ have_python_gtk=yes
+@@ -305,7 +305,7 @@ then
+ AC_MSG_RESULT($have_python_gtk)
+
+ AC_MSG_CHECKING(for python pango module)
+- $PYTHON -c "import pango" 2&>/dev/null
++ $PYTHON -c "import gi; from gi.repository import Pango" 2&>/dev/null
+ if test $? -eq 0;
+ then
+ have_python_pango=yes
+Index: presage-0.9.1/apps/python/pyprompter.in
+===================================================================
+--- apps/python/pyprompter.in.orig
++++ apps/python/pyprompter.in
+@@ -25,20 +25,22 @@ import getopt
+ import os
+
+ PROGRAM_NAME = 'pyprompter'
+-config = None
+-suggestions = None
++CONFIG = None
++SUGGESTIONS = None
++
+
+ def print_version():
+- print """
++ print("""
+ %s (%s) version %s
+ Copyright (C) 2004 Matteo Vescovi.
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
+ to the extent permitted by law.
+-""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@')
++""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@'))
++
+
+ def print_usage():
+- print """
++ print("""
+ Usage: %s [options]
+
+ Options:
+@@ -55,60 +57,62 @@ clicking on it or by highlighting it wit
+ pressing ENTER; the desired text will be automatically entered.
+
+ Direct your bug reports to: %s
+-""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@')
++""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@'))
++
+
+ def parse_cmd_line_args():
+- short_options = "c:s:hv"
+- long_options = ["config=", "suggestions=", "help", "version"]
+-
+- try:
+- opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
+- except getopt.GetoptError, err:
+- print str(err)
+- sys.exit(1)
+-
+- for opt, arg in opts:
+- if opt in ('-v', '--version'):
+- print_version()
+- sys.exit()
+- elif opt in ('-h', '--help'):
+- print_usage()
+- sys.exit()
+- elif opt in ('-c', '--config'):
+- global config
+- config = arg
+- elif opt in ('-s', '--suggestions'):
+- global suggestions
+- suggestions = arg
++ short_options = "c:s:hv"
++ long_options = ["config=", "suggestions=", "help", "version"]
++
++ try:
++ opts, _ = getopt.getopt(sys.argv[1:], short_options, long_options)
++ except getopt.GetoptError as err:
++ print(str(err))
++ sys.exit(1)
++
++ for opt, arg in opts:
++ if opt in ('-v', '--version'):
++ print_version()
++ sys.exit()
++ elif opt in ('-h', '--help'):
++ print_usage()
++ sys.exit()
++ elif opt in ('-c', '--config'):
++ global CONFIG
++ CONFIG = arg
++ elif opt in ('-s', '--suggestions'):
++ global SUGGESTIONS
++ SUGGESTIONS = arg
+
+
+ if __name__ == "__main__":
+- parse_cmd_line_args()
++ parse_cmd_line_args()
+
+- try:
+- import prompter.prompter
+- except ImportError, e:
+- print '''
++ try:
++ import prompter.prompter
++ except ImportError as err:
++ print('''
+ Error: failed to import module prompter.
+
+ Check that prompter is properly installed (if installed in a
+ non-standard location, please set PYTHONPATH accordingly).
+-'''
+- print e
+- else:
+- if not config:
+- # try to locate presage.xml config file
+- scriptdir = os.path.dirname(sys.argv[0])
+- # in scriptdir/etc
+- conffile = os.path.join(scriptdir, 'etc', 'presage.xml')
+- if os.path.isfile(conffile):
+- config = conffile
+- else:
+- # in scriptdir/../etc
+- conffile = os.path.join(scriptdir, '..', 'etc', 'presage.xml')
+- if os.path.isfile(conffile):
+- config = conffile
+- print 'Configuration file: ' + str(config)
+-
+- app = prompter.prompter.Prompter("@PACKAGE_VERSION@", config, suggestions)
+- app.MainLoop()
++''')
++ print(err)
++ else:
++ if not CONFIG:
++ # try to locate presage.xml config file
++ SCRIPTDIR = os.path.dirname(sys.argv[0])
++ # in scriptdir/etc
++ CONFFILE = os.path.join(SCRIPTDIR, 'etc', 'presage.xml')
++ if os.path.isfile(CONFFILE):
++ CONFIG = CONFFILE
++ else:
++ # in scriptdir/../etc
++ CONFFILE = os.path.join(SCRIPTDIR, '..', 'etc', 'presage.xml')
++ if os.path.isfile(CONFFILE):
++ CONFIG = CONFFILE
++ print('Configuration file: ' + str(CONFIG))
++
++ APP = prompter.prompter.Prompter(
++ "@PACKAGE_VERSION@", CONFIG, SUGGESTIONS)
++ APP.MainLoop()
+Index: presage-0.9.1/apps/python/prompter/prompter.py
+===================================================================
+--- apps/python/prompter/prompter.py.orig
++++ apps/python/prompter/prompter.py
+@@ -23,21 +23,22 @@ import sys
+ try:
+ import wx
+ import wx.stc
+-except ImportError, ex:
+- print '''
++ import wx.adv
++except ImportError as ex:
++ print('''
+ Error: failed to import module wxPython.
+
+ wxPython is a Python binding for the wxWidgets toolkit.
+
+ Check that wxPython is properly installed.
+-'''
+- print ex
++''')
++ print(ex)
+ sys.exit(1)
+
+ try:
+ import presage
+-except ImportError, ex:
+- print '''
++except ImportError as ex:
++ print('''
+ Error: failed to import module presage.
+
+ Check that presage python binding is properly installed (if
+@@ -47,8 +48,8 @@ accordingly).
+ Check that presage library is properly installed (if installed in a
+ non-standard location, please set LD_LIBRARY_PATH (PATH, LIBPATH)
+ accordingly).
+-'''
+- print ex
++''')
++ print(ex)
+ sys.exit(1)
+
+ ##########
+@@ -238,7 +239,7 @@ class PrompterFrame(wx.Frame):
+ self.fileMenu.Enable(wx.ID_SAVEAS, False)
+
+ def OnFileMenuOpen(self, event):
+- print "Opening a file.."
++ print("Opening a file..")
+
+ # Create the dialog. In this case the current directory is forced as the starting
+ # directory for the dialog, and no default file name is forced. This can easilly
+@@ -249,7 +250,7 @@ class PrompterFrame(wx.Frame):
+ # dialog is set up to change the current working directory to the path chosen.
+ dlg = wx.FileDialog(
+ self, message="Choose a file", defaultDir="",
+- defaultFile="", wildcard=self.wildcard, style=wx.OPEN | wx.CHANGE_DIR
++ defaultFile="", wildcard=self.wildcard, style=wx.FD_OPEN | wx.FD_CHANGE_DIR
+ )
+
+ # Show the dialog and retrieve the user response. If it is the OK response,
+@@ -279,7 +280,7 @@ class PrompterFrame(wx.Frame):
+ dlg.Destroy()
+
+ def OnFileMenuSave(self, event):
+- print "Save file"
++ print("Save file")
+ if self.editor.file == None:
+ self.OnFileMenuSaveAs(event)
+ else:
+@@ -287,7 +288,7 @@ class PrompterFrame(wx.Frame):
+ self.fileMenu.Enable(wx.ID_SAVE, False)
+
+ def OnFileMenuSaveAs(self, event):
+- print "Save file as"
++ print("Save file as")
+
+ # Create the dialog. In this case the current directory is forced as the starting
+ # directory for the dialog, and no default file name is forced. This can easilly
+@@ -298,12 +299,12 @@ class PrompterFrame(wx.Frame):
+ # directory than the one initially set.
+ dlg = wx.FileDialog(
+ self, message="Save file as ...", defaultDir="",
+- defaultFile="", wildcard=self.wildcard, style=wx.SAVE
++ defaultFile="", wildcard=self.wildcard, style=wx.FD_SAVE
+ )
+
+ # This sets the default filter that the user will initially see. Otherwise,
+ # the first filter in the list will be used by default.
+- dlg.SetFilterIndex(2)
++ dlg.SetFilterIndex(1)
+
+ # Show the dialog and retrieve the user response. If it is the OK response,
+ # process the data.
+@@ -321,31 +322,31 @@ class PrompterFrame(wx.Frame):
+ self.OnFileMenuNew(event) # this will do for now
+
+ def OnFileMenuQuit(self, event):
+- print "This should first check that changes have been saved..."
++ print("This should first check that changes have been saved...")
+ self.Close(True)
+
+ def OnEditMenuUndo(self, event):
+ if self.editor.CanUndo():
+ self.editor.Undo()
+- print "Undo last action"
++ print("Undo last action")
+
+ def OnEditMenuRedo(self, event):
+ if self.editor.CanRedo():
+ self.editor.Redo()
+- print "Redo last action"
++ print("Redo last action")
+
+ def OnEditMenuCut(self, event):
+ self.clip = self.editor.GetSelectedText()
+ self.editor.ReplaceSelection('')
+- print "Cut selected text: " + self.clip
++ print("Cut selected text: " + self.clip)
+
+ def OnEditMenuCopy(self, event):
+ self.clip = self.editor.GetSelectedText()
+- print "Stored selected text into clip: " + self.clip
++ print("Stored selected text into clip: " + self.clip)
+
+ def OnEditMenuPaste(self, event):
+ self.editor.ReplaceSelection(self.clip)
+- print "Replace selection with: " + self.clip
++ print("Replace selection with: " + self.clip)
+
+ def OnEditMenuSelectAll(self, event):
+ self.editor.SelectAll()
+@@ -360,7 +361,7 @@ class PrompterFrame(wx.Frame):
+ self.editor.DecreaseTextSize()
+
+ def OnViewMenuShowToolbar(self, event):
+- if event.Checked():
++ if event.IsChecked():
+ self.toolbar.Show()
+ else:
+ self.toolbar.Hide()
+@@ -370,10 +371,10 @@ class PrompterFrame(wx.Frame):
+ self.editor.ShowPrediction()
+
+ def OnPresageMenuToggleFunctionMode(self, event):
+- self.editor.function_keys_enabled = event.Checked()
++ self.editor.function_keys_enabled = event.IsChecked()
+
+ def OnPresageMenuToggleAutopunctuationMode(self, event):
+- self.editor.autopunctuation = event.Checked()
++ self.editor.autopunctuation = event.IsChecked()
+
+ def OnHelpMenuContents(self, event):
+ message = "Sorry, help not written yet."
+@@ -412,7 +413,7 @@ with this program; if not, write to the
+ # AboutBox and AboutDialogInfo were introduced in wxPython 2.7.1.1
+ if wx.VERSION > (2, 7, 1, 1):
+ # build about dialog information
+- info = wx.AboutDialogInfo()
++ info = wx.adv.AboutDialogInfo()
+ info.SetName(name)
+ info.SetVersion(version)
+ info.SetCopyright(copyright)
+@@ -426,7 +427,7 @@ with this program; if not, write to the
+ #info.SetIcon()
+
+ # show about dialog box
+- wx.AboutBox(info)
++ wx.adv.AboutBox(info)
+
+ else:
+ message = name + ' ' + version + '\n' \
+@@ -517,7 +518,7 @@ class PrompterEditor(wx.stc.StyledTextCt
+ wx.CallAfter(self.SetSTCFocus, 1)
+
+ def OnChar(self, event):
+- print "------------ OnChar() handler"
++ print("------------ OnChar() handler")
+
+ if event.HasModifiers():
+ if self.AutoCompActive():
+@@ -535,7 +536,7 @@ class PrompterEditor(wx.stc.StyledTextCt
+ self.__HandleFunctionKey(keycode)
+
+ else:
+- key = unichr(key)
++ key = chr(key)
+
+ self.parent.fileMenu.Enable(wx.ID_SAVE, True)
+ self.parent.fileMenu.Enable(wx.ID_SAVEAS, True)
+@@ -553,7 +554,7 @@ class PrompterEditor(wx.stc.StyledTextCt
+ self.__ShowPrediction(string)
+
+ def __ShowPrediction(self, string = ''):
+- print "------------ __ShowPrediction()"
++ print("------------ __ShowPrediction()")
+ try:
+ prefix = self.prsg.prefix()
+ context = self.prsg.context()
+@@ -565,18 +566,18 @@ class PrompterEditor(wx.stc.StyledTextCt
+ self.prediction = self.__PrependFunctionLabel(self.prediction)
+ self.suggestions = self.separator.join(self.prediction);
+
+- except presage.PresageException, ex:
+- print 'Caught exception %s' % (ex)
+- print ' code: %d' % (ex.code())
+- print ' what: %s' % (ex.what())
++ except presage.PresageException as ex:
++ print('Caught exception %s' % (ex))
++ print(' code: %d' % (ex.code()))
++ print(' what: %s' % (ex.what()))
+
+
+- print "String: " + string
+- print "Prefix: " + prefix
+- print "Prefix len: " + str(len(prefix))
+- print "Context: " + context
+- print "Context change: " + str(context_change)
+- print "Prediction: " + self.suggestions
++ print("String: " + string)
++ print("Prefix: " + prefix)
++ print("Prefix len: " + str(len(prefix)))
++ print("Context: " + context)
++ print("Context change: " + str(context_change))
++ print("Prediction: " + self.suggestions)
+
+ if self.AutoCompActive():
+ self.AutoCompCancel()
+@@ -622,11 +623,11 @@ class PrompterEditor(wx.stc.StyledTextCt
+ return result
+
+ def __HandleFunctionKey(self, key):
+- print "Got function key " + str(key)
++ print("Got function key " + str(key))
+
+ try:
+ idx = self.function_keys.index(key)
+- print self.prediction[idx]
++ print(self.prediction[idx])
+ if self.AutoCompActive():
+ self.AutoCompCancel()
+
+@@ -634,7 +635,7 @@ class PrompterEditor(wx.stc.StyledTextCt
+ self.AutoCompSelect(self.prediction[idx])
+ self.AutoCompComplete()
+ except IndexError:
+- print 'Key not in prediction completion list'
++ print('Key not in prediction completion list')
+
+ def __PrependFunctionLabel(self, prediction):
+ return ['F' + str(i + 1) + ' ' + prediction[i] for i in range(len(prediction))]
+@@ -646,15 +647,15 @@ class PrompterEditor(wx.stc.StyledTextCt
+ return completion
+
+ def OnUserListSelection(self, event):
+- completion = unicode(event.GetText())
++ completion = str(event.GetText())
+ if self.function_keys_enabled:
+ completion = self.__RemoveFunctionLabel(completion)
+- prefix_length = len(unicode(self.prsg.prefix()))
++ prefix_length = len(str(self.prsg.prefix()))
+
+- print "----------- OnUserListSelection() handler"
+- print "Completion: " + completion
+- print "Prefix length: " + str(prefix_length)
+- print "To be added: " + completion[prefix_length:]
++ print("----------- OnUserListSelection() handler")
++ print("Completion: " + completion)
++ print("Prefix length: " + str(prefix_length))
++ print("To be added: " + completion[prefix_length:])
+
+ # no need to call complete, using callbacks
+ #self.prsg.complete(completion.encode('utf-8'))
+Index: presage-0.9.1/apps/dbus/presage_dbus_python_demo.in
+===================================================================
+--- apps/dbus/presage_dbus_python_demo.in.orig
++++ apps/dbus/presage_dbus_python_demo.in
+@@ -32,13 +32,13 @@ PROGRAM_NAME = 'presage_dbus_python_demo
+
+ config = None
+
+-presage_service_name = 'org.gnome.presage.beta'
+-presage_service_path = '/org/gnome/presage/beta'
++presage_service_name = 'org.gnome.presage.beta'
++presage_service_path = '/org/gnome/presage/beta'
+ presage_service_interface = 'org.gnome.presage.beta'
+
+
+ def disclaimer():
+- print """
++ print("""
+ Presage dbus python demo
+ ------------------------
+
+@@ -51,19 +51,21 @@ Its intent is NOT to provide a predictiv
+
+ Think of Presage as the predictive backend that sits behind a shiny
+ user interface and does all the predictive heavy lifting.
+-"""
++""")
++
+
+ def print_version():
+- print """
++ print("""
+ %s (%s) version %s
+ Copyright (C) 2010 Matteo Vescovi.
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
+ to the extent permitted by law.
+-""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@')
++""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@'))
++
+
+ def print_usage():
+- print """
++ print("""
+ Usage: %s [OPTION]...
+
+ At the prompt, type in some text. Hit enter to generate a prediction.
+@@ -74,29 +76,30 @@ Any text input is valid, including no te
+ -v, --version output version information and exit
+
+ Direct your bug reports to: %s
+-""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@')
++""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@'))
++
+
+ def parse_cmd_line_args():
+- global config
++ global config
++
++ short_options = "c:s:hv"
++ long_options = ["config=", "suggestions=", "help", "version"]
++
++ try:
++ opts, _ = getopt.getopt(sys.argv[1:], short_options, long_options)
++ except getopt.GetoptError as err:
++ print(str(err))
++ sys.exit(1)
+
+- short_options = "c:s:hv"
+- long_options = ["config=", "suggestions=", "help", "version"]
+-
+- try:
+- opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
+- except getopt.GetoptError, err:
+- print str(err)
+- sys.exit(1)
+-
+- for opt, arg in opts:
+- if opt in ('-v', '--version'):
+- print_version()
+- sys.exit()
+- elif opt in ('-h', '--help'):
+- print_usage()
+- sys.exit()
+- elif opt in ('-c', '--config'):
+- config = arg
++ for opt, arg in opts:
++ if opt in ('-v', '--version'):
++ print_version()
++ sys.exit()
++ elif opt in ('-h', '--help'):
++ print_usage()
++ sys.exit()
++ elif opt in ('-c', '--config'):
++ config = arg
+
+
+ def main():
+@@ -107,32 +110,38 @@ def main():
+ try:
+ bus = dbus.SessionBus(gloop)
+ if config:
+- presage_object_path = bus.get_object(presage_service_name, presage_service_path).get_presage_object_path(config)
++ presage_object_path = bus.get_object(
++ presage_service_name,
++ presage_service_path).get_presage_object_path(config)
+ else:
+- presage_object_path = bus.get_object(presage_service_name, presage_service_path).get_presage_object_path()
++ presage_object_path = bus.get_object(
++ presage_service_name, presage_service_path).get_presage_object_path()
+ # Get the Presage object
+- presage_object = bus.get_object(presage_service_name, presage_object_path)
++ presage_object = bus.get_object(
++ presage_service_name, presage_object_path)
+
+- print 'D-BUS connection to presage object %s created' % presage_object_path
++ print(
++ 'D-BUS connection to presage object %s created' %
++ presage_object_path)
+
+- except Exception, e:
+- print e
++ except Exception as err:
++ print(err)
+ sys.exit(1)
+
+- print "Enter text at the prompt (press enter on empty line to exit):"
++ print("Enter text at the prompt (press enter on empty line to exit):")
+ string = None
+ buffer = ""
+ while string != "":
+- string = raw_input("> ")
++ string = input("> ")
+ buffer += string
+ results = presage_object.get_prediction(buffer, '')
+ for result in results:
+- print str(result)
++ print(str(result))
+ presage_object.destroy()
+- print "Goodbye"
++ print("Goodbye")
+
+
+ if __name__ == '__main__':
+- parse_cmd_line_args()
+- disclaimer()
+- main()
++ parse_cmd_line_args()
++ disclaimer()
++ main()
+Index: presage-0.9.1/apps/dbus/presage_dbus_service.py
+===================================================================
+--- apps/dbus/presage_dbus_service.py.orig
++++ apps/dbus/presage_dbus_service.py
+@@ -72,7 +72,7 @@ class PresageObject(dbus.service.Object)
+ self.callback = DbusPresageCallback().__disown__()
+ self.prsg = presage.Presage(self.callback, config)
+ dbus.service.Object.__init__(self, name, self.path)
+- print 'Created presage object %s' % self.path
++ print('Created presage object %s' % self.path)
+
+ # def __del__( self ):
+ # print 'PresageObject destroyed: ', self
+@@ -88,7 +88,7 @@ class PresageObject(dbus.service.Object)
+ @dbus.service.method(dbus_interface = presage_service_interface)
+ def destroy(self):
+ self.remove_from_connection()
+- print 'Removed presage object ' + self.path
++ print('Removed presage object ' + self.path)
+
+
+ class PresageService(dbus.service.Object):
+@@ -98,7 +98,7 @@ class PresageService(dbus.service.Object
+ self.path = presage_service_path
+ self.loop = loop
+ dbus.service.Object.__init__(self, self.name, self.path)
+- print 'Service %s created, pid %d' % (presage_service_name, os.getpid())
++ print('Service %s created, pid %d' % (presage_service_name, os.getpid()))
+
+ @dbus.service.method(dbus_interface = presage_service_interface,
+ in_signature = 's',
+@@ -112,11 +112,11 @@ class PresageService(dbus.service.Object
+ out_signature = '')
+ def shutdown(self):
+ self.loop.quit()
+- print 'Service %s shutdown' % presage_service_name
++ print('Service %s shutdown' % presage_service_name)
+
+
+ def start():
+- print 'Starting ' + presage_service_name + '...'
++ print('Starting ' + presage_service_name + '...')
+
+ dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+ loop = gobject.MainLoop()
+@@ -124,16 +124,16 @@ def start():
+ loop.run()
+
+ def stop():
+- print 'Stopping ' + presage_service_name + '...'
++ print('Stopping ' + presage_service_name + '...')
+ try:
+ dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+ bus = dbus.SessionBus()
+ presage_service_object = bus.get_object(presage_service_name, presage_service_path)
+ presage_service_object.shutdown()
+
+- except Exception, e:
+- print 'Caught exception while attempting to stop ' + presage_service_name
+- print e
++ except Exception as err:
++ print('Caught exception while attempting to stop ' + presage_service_name)
++ print(err)
+
+ if __name__ == '__main__':
+ start()
+Index: presage-0.9.1/apps/python/presagemate/presagemate.py
+===================================================================
+--- apps/python/presagemate/presagemate.py.orig
++++ apps/python/presagemate/presagemate.py
+@@ -24,8 +24,8 @@ import string
+
+ try:
+ import presage
+-except ImportError, ex:
+- print '''
++except ImportError as ex:
++ print('''
+ Error: failed to import module presage.
+
+ Check that presage python binding is properly installed (if
+@@ -35,11 +35,11 @@ accordingly).
+ Check that presage library is properly installed (if installed in a
+ non-standard location, please set LD_LIBRARY_PATH (PATH, LIBPATH)
+ accordingly).
+-'''
++''')
+ try:
+ import pyatspi
+-except ImportError, ex:
+- print '''
++except ImportError as ex:
++ print('''
+ Error: failed to import module pyatspi.
+
+ Check that pyatspi python binding is properly installed (if
+@@ -49,12 +49,14 @@ accordingly).
+ Check that pyatspi library is properly installed (if installed in a
+ non-standard location, please set LD_LIBRARY_PATH (PATH, LIBPATH)
+ accordingly).
+-'''
++''')
+
+ try:
+- import gtk
+-except ImportError, ex:
+- print '''
++ import gi
++ gi.require_version('Gtk', '3.0')
++ from gi.repository import Gtk as gtk, Gdk as gdk
++except ImportError as ex:
++ print('''
+ Error: failed to import module gtk.
+
+ Check that gtk python binding is properly installed (if
+@@ -64,12 +66,12 @@ accordingly).
+ Check that gtk library is properly installed (if installed in a
+ non-standard location, please set LD_LIBRARY_PATH (PATH, LIBPATH)
+ accordingly).
+-'''
++''')
+
+
+-import ConfigParser
++import configparser
+ import os
+-import pango
++from gi.repository import Pango as pango
+ import atexit
+ import Xlib
+ import Xlib.display
+@@ -129,11 +131,11 @@ def process_event(event):
+
+ completion = prsg.completion(predicted_word)
+
+- print 'Prediction: ' + predicted_word
+- print 'Completion: ' + completion
++ print('Prediction: ' + predicted_word)
++ print('Completion: ' + completion)
+
+ for ch in completion:
+- keyval = gtk.gdk.unicode_to_keyval(ord(ch))
++ keyval = gdk.unicode_to_keyval(ord(ch))
+ reg.generateKeyboardEvent(keyval, None, pyatspi.KEY_SYM)
+
+ callback.buffer += completion
+@@ -173,7 +175,7 @@ def delete_event(widget, event, data=Non
+
+ def frame_event(window, event, data=None):
+ state = event.new_window_state
+- if state & gtk.gdk.WINDOW_STATE_ICONIFIED:
++ if state & gdk.WindowState.ICONIFIED:
+ # re-map F1-10 to F1-10 when the window is iconified
+ remap_keys(False)
+ else:
+@@ -182,7 +184,7 @@ def frame_event(window, event, data=None
+
+ def get_config():
+ writeconfig_flag = False
+- config = ConfigParser.SafeConfigParser()
++ config = configparser.ConfigParser()
+ config.read(os.path.expanduser('~/.pypresagematerc'))
+
+ if config.has_section('Config') == False:
+@@ -207,7 +209,7 @@ def get_config():
+ writeconfig_flag = True
+
+ if writeconfig_flag == True:
+- configfile = open(os.path.expanduser('~/.pypresagematerc'), 'wb')
++ configfile = open(os.path.expanduser('~/.pypresagematerc'), 'w')
+ try:
+ config.write(configfile)
+ finally:
+@@ -216,11 +218,11 @@ def get_config():
+ return config
+
+ def set_position_config(x, y):
+- config = ConfigParser.SafeConfigParser()
++ config = configparser.ConfigParser()
+ config.read(os.path.expanduser('~/.pypresagematerc'))
+ config.set('Config', 'window_position_x', str(x))
+ config.set('Config', 'window_position_y', str(y))
+- configfile = open(os.path.expanduser('~/.pypresagematerc'), 'wb')
++ configfile = open(os.path.expanduser('~/.pypresagematerc'), 'w')
+ try:
+ config.write(configfile)
+ finally:
+@@ -279,15 +281,15 @@ def remap_keys(remap):
+
+ def popup_menu(widget, event):
+ if event.button == 3:
+- menu.popup(None, None, None, event.button, event.time)
++ menu.popup(None, None, None, None, event.button, event.time)
+ return True
+ return False
+
+ def apply_preferences(widget):
+- print "apply"
++ print("apply")
+
+ def close_preferences(widget):
+- print "close"
++ print("close")
+
+ def update_no_selections(widget):
+ global number_of_suggestions
+@@ -297,14 +299,14 @@ def update_no_selections(widget):
+ remap_keys(True)
+
+ def preferences(widget):
+- preferences = gtk.Window(gtk.WINDOW_TOPLEVEL)
++ preferences = gtk.Window(gtk.WindowType.TOPLEVEL)
+ preferences.set_title("pypresagemate preferences")
+- preferences.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
++ preferences.set_type_hint(gdk.WindowTypeHint.DIALOG)
+
+ preferences_box = gtk.VBox()
+
+ notebook = gtk.Notebook()
+- notebook.set_tab_pos(gtk.POS_TOP)
++ notebook.set_tab_pos(gtk.PositionType.TOP)
+
+ appearance_frame = gtk.Frame()
+ appearance_tab = gtk.Label("Appearance")
+@@ -319,7 +321,8 @@ def preferences(widget):
+
+ presage_placeholder = gtk.Label("\n\nPresage library configuration\n\n")
+ adj = gtk.Adjustment(float(number_of_suggestions), 3, 10, 1, 0, 0)
+- no_of_selections = gtk.SpinButton(adj, 0, 0)
++ no_of_selections = gtk.SpinButton()
++ no_of_selections.configure(adj, 0, 0)
+ no_of_selections.connect("output", update_no_selections)
+ presage_frame.add(no_of_selections)
+
+@@ -366,7 +369,7 @@ with this program; if not, write to the
+ about.set_website("http://presage.sourceforge.net/")
+ about.set_comments(comments)
+ if os.path.isfile("/usr/local/share/presage/presage.png"):
+- about.set_logo(gtk.gdk.pixbuf_new_from_file("/usr/local/share/presage/presage.png"))
++ about.set_logo(gdk.pixbuf_new_from_file("/usr/local/share/presage/presage.png"))
+ about.run()
+ about.destroy()
+
+@@ -410,7 +413,7 @@ prediction = prsg.predict()
+
+ reg.registerKeystrokeListener(process_event, mask=pyatspi.allModifiers())
+
+-window = gtk.Window(gtk.WINDOW_TOPLEVEL)
++window = gtk.Window(gtk.WindowType.TOPLEVEL)
+ window.connect("delete-event", delete_event)
+ window.connect("window-state-event", frame_event)
+
+@@ -419,17 +422,17 @@ window.set_keep_above(True)
+
+ window.move(window_position_x, window_position_y)
+
+-window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#c0c0ff"))
++window.modify_bg(gtk.StateType.NORMAL, gdk.color_parse("#c0c0ff"))
+
+ label = gtk.Label("pypresagemate")
+-label.set_justify(gtk.JUSTIFY_LEFT)
++label.set_justify(gtk.Justification.LEFT)
+ label.set_width_chars(20)
+
+ font_desc = pango.FontDescription(pangofont)
+ label.modify_font(font_desc)
+
+ window.connect("button-press-event", popup_menu)
+-window.add_events(gtk.gdk.BUTTON_PRESS_MASK)
++window.add_events(gdk.EventMask.BUTTON_PRESS_MASK)
+
+ menu = gtk.Menu()
+ menu_item1 = gtk.MenuItem('About')
+Index: presage-0.9.1/apps/python/pypresagemate.in
+===================================================================
+--- apps/python/pypresagemate.in.orig
++++ apps/python/pypresagemate.in
+@@ -27,17 +27,17 @@ import os
+ PROGRAM_NAME = 'pypresagemate'
+
+ def print_version():
+- print """
++ print("""
+ %s (%s) version %s
+ Copyright (C) 2010 Matteo Vescovi.
+ Copyright (C) 2010 John Hills.
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
+ to the extent permitted by law.
+-""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@')
++""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@'))
+
+ def print_usage():
+- print """
++ print("""
+ Usage: %s [options]
+
+ Options:
+@@ -54,16 +54,16 @@ keystrokes are typed and displaying pred
+ prediction is selected, text is sent to the active application.
+
+ Direct your bug reports to: %s
+-""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@')
++""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@'))
+
+ def parse_cmd_line_args():
+ short_options = "hv"
+ long_options = ["help", "version"]
+
+ try:
+- opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
+- except getopt.GetoptError, err:
+- print str(err)
++ opts, _ = getopt.getopt(sys.argv[1:], short_options, long_options)
++ except getopt.GetoptError as err:
++ print(str(err))
+ sys.exit(1)
+
+ for opt, arg in opts:
+@@ -80,14 +80,14 @@ if __name__ == "__main__":
+
+ try:
+ import presagemate.presagemate
+- except ImportError, e:
+- print '''
++ except ImportError as err:
++ print('''
+ Error: failed to import module presagemate.
+
+ Check that prompter is properly installed (if installed in a
+ non-standard location, please set PYTHONPATH accordingly).
+-'''
+- print e
++''')
++ print(err)
+ else:
+ if not config:
+ # try to locate presage.xml config file
+@@ -101,4 +101,4 @@ non-standard location, please set PYTHON
+ conffile = os.path.join(scriptdir, '..', 'etc', 'presage.xml')
+ if os.path.isfile(conffile):
+ config = conffile
+- print 'Configuration file: ' + str(config)
++ print('Configuration file: ' + str(config))
diff --git a/deskutils/presage/pkg-descr b/deskutils/presage/pkg-descr
new file mode 100644
index 000000000000..cfa77743ca1e
--- /dev/null
+++ b/deskutils/presage/pkg-descr
@@ -0,0 +1,11 @@
+Presage is an intelligent predictive text entry system.
+
+Presage (formerly known as Soothsayer) generates predictions by modelling
+natural language as a combination of redundant information sources. Presage
+computes probabilities for words which are most likely to be entered next by
+merging predictions generated by the different predictive algorithms. Presage’s
+modular and extensible architecture allows its language model to be extended
+and customized to utilize statistical, syntactic, and semantic predictive
+algorithms.
+
+WWW: https://presage.sourceforge.io/
diff --git a/deskutils/presage/pkg-plist b/deskutils/presage/pkg-plist
new file mode 100644
index 000000000000..8747866534f4
--- /dev/null
+++ b/deskutils/presage/pkg-plist
@@ -0,0 +1,33 @@
+bin/presage_dbus_python_demo
+bin/presage_dbus_service
+bin/presage_demo
+bin/presage_demo_text
+bin/presage_simulator
+bin/text2ngram
+etc/presage.xml
+include/presage.h
+include/presageCallback.h
+include/presageException.h
+lib/libpresage.so
+lib/libpresage.so.1
+lib/libpresage.so.1.1.1
+%%PYTHON_SITELIBDIR%%/presage_dbus_service.py
+%%PYTHON_SITELIBDIR%%/presage_dbus_service.pyc
+%%PYTHON_SITELIBDIR%%/presage_dbus_service.pyo
+man/man1/presage_dbus_python_demo.1.gz
+man/man1/presage_dbus_service.1.gz
+man/man1/presage_demo.1.gz
+man/man1/presage_demo_text.1.gz
+man/man1/presage_simulator.1.gz
+man/man1/text2ngram.1.gz
+share/dbus-1/services/org.gnome.presage.service
+%%DATADIR%%/abbreviations_en.txt
+%%DATADIR%%/abbreviations_it.txt
+%%DATADIR%%/database_en.db
+%%DATADIR%%/database_es.db
+%%DATADIR%%/database_it.db
+%%DATADIR%%/getting_started.txt
+%%DATADIR%%/presage.png
+%%DATADIR%%/presage.svg
+%%DATADIR%%/presage.xpm
+%%DATADIR%%/python_binding.txt