]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/MathSupport.cpp
Fix external middle-mouse pasting with Qt5/X11.
[lyx.git] / src / mathed / MathSupport.cpp
index 309d28ed9f38e63b425166615200af68f1f2da86..1f90873fec10dae82647e76511081f2d3ce9951a 100644 (file)
@@ -13,7 +13,8 @@
 
 #include "MathSupport.h"
 
-#include "InsetMath.h"
+#include "InsetMathFont.h"
+#include "InsetMathSymbol.h"
 #include "MathData.h"
 #include "MathParser.h"
 #include "MathStream.h"
@@ -26,6 +27,7 @@
 #include "support/docstream.h"
 
 #include <map>
+#include <algorithm>
 
 using namespace std;
 
@@ -111,6 +113,95 @@ double const brace[] = {
 };
 
 
+double const mapsto[] = {
+       2, 3,
+       0.75, 0.015, 0.95, 0.5, 0.75, 0.985,
+       1, 0.015, 0.475, 0.945, 0.475,
+       1, 0.015, 0.015, 0.015, 0.985,
+       0
+};
+
+
+double const lhook[] = {
+       2, 3,
+       0.25, 0.015, 0.05, 0.5, 0.25, 0.985,
+       1, 0.015, 0.475, 0.7, 0.475,
+       2, 5,
+       0.7, 0.015, 0.825, 0.15, 0.985, 0.25,
+       0.825, 0.35, 0.7, 0.475,
+       0
+};
+
+
+double const rhook[] = {
+       2, 3,
+       0.75, 0.015, 0.95, 0.5, 0.75, 0.985,
+       1, 0.3, 0.475, 0.985, 0.475,
+       2, 5,
+       0.3, 0.015, 0.175, 0.15, 0.05, 0.25,
+       0.175, 0.35, 0.3, 0.475,
+       0
+};
+
+
+double const LRArrow[] = {
+       2, 3,
+       0.25, 0.015, 0.05, 0.5, 0.25, 0.985,
+       2, 3,
+       0.75, 0.015, 0.95, 0.5, 0.75, 0.985,
+       1, 0.2, 0.8, 0.8, 0.8,
+       1, 0.2, 0.2, 0.8, 0.2,
+       0
+};
+
+
+double const LArrow[] = {
+       2, 3,
+       0.25, 0.015, 0.05, 0.5, 0.25, 0.985,
+       1, 0.2, 0.8, 0.985, 0.8,
+       1, 0.2, 0.2, 0.985, 0.2,
+       0
+};
+
+
+double const lharpoondown[] = {
+       2, 2,
+       0.015, 0.5, 0.25, 0.985,
+       1, 0.02, 0.475, 0.985, 0.475,
+       0
+};
+
+
+double const lharpoonup[] = {
+       2, 2,
+       0.25, 0.015, 0.015, 0.5,
+       1, 0.02, 0.525, 0.985, 0.525,
+       0
+};
+
+
+double const lrharpoons[] = {
+       2, 2,
+       0.25, 0.015, 0.015, 0.225,
+       1, 0.02, 0.23, 0.985, 0.23,
+       2, 2,
+       0.75, 0.985, 0.985, 0.775,
+       1, 0.02, 0.7, 0.980, 0.7,
+       0
+};
+
+
+double const rlharpoons[] = {
+       2, 2,
+       0.75, 0.015, 0.985, 0.225,
+       1, 0.02, 0.23, 0.985, 0.23,
+       2, 2,
+       0.25, 0.985, 0.015, 0.775,
+       1, 0.02, 0.7, 0.980, 0.7,
+       0
+};
+
+
 double const arrow[] = {
        4, 7,
        0.0150, 0.7500, 0.2000, 0.6000, 0.3500, 0.3500,
@@ -137,7 +228,7 @@ double const udarrow[] = {
        0.015, 0.25,  0.5, 0.05, 0.95, 0.25,
        2, 3,
        0.015, 0.75,  0.5, 0.95, 0.95, 0.75,
-       1, 0.5, 0.2,  0.5, 0.8,
+       1, 0.5, 0.1,  0.5, 0.9,
        0
 };
 
@@ -160,6 +251,15 @@ double const brack[] = {
 };
 
 
+double const dbrack[] = {
+       2, 4,
+       0.95, 0.05,  0.05, 0.05,  0.05, 0.95,  0.95, 0.95,
+       2, 2,
+       0.50, 0.05,  0.50, 0.95,
+       0
+};
+
+
 double const corner[] = {
        2, 3,
        0.95, 0.05,  0.05, 0.05,  0.05, 0.95,
@@ -187,25 +287,25 @@ double const hline[] = {
 
 
 double const ddot[] = {
-       1, 0.2, 0.5,  0.3, 0.5,
-       1, 0.7, 0.5,  0.8, 0.5,
+       1, 0.2, 0.5, 0.3, 0.5,
+       1, 0.7, 0.5, 0.8, 0.5,
        0
 };
 
 
 double const dddot[] = {
-       1, 0.1, 0.5,  0.2, 0.5,
+       1, 0.1,  0.5, 0.2,  0.5,
        1, 0.45, 0.5, 0.55, 0.5,
-       1, 0.8, 0.5,  0.9, 0.5,
+       1, 0.8,  0.5, 0.9,  0.5,
        0
 };
 
 
 double const ddddot[] = {
-       1, 0.0, 0.5,  0.1, 0.5,
-       1, 0.3, 0.5,  0.4, 0.5,
-       1, 0.6, 0.5,  0.7, 0.5,
-       1, 0.9, 0.5,  1.0, 0.5,
+       1, 0.1,  0.5, 0.2,  0.5,
+       1, 0.45, 0.5, 0.55, 0.5,
+       1, 0.8,  0.5, 0.9,  0.5,
+       1, 1.15, 0.5, 1.25, 0.5,
        0
 };
 
@@ -272,21 +372,36 @@ struct named_deco_struct {
 
 named_deco_struct deco_table[] = {
        // Decorations
-       {"widehat",             angle,    3 },
-       {"widetilde",           tilde,    0 },
-       {"underbar",            hline,    0 },
-       {"underline",           hline,    0 },
-       {"overline",            hline,    0 },
-       {"underbrace",          brace,    1 },
-       {"overbrace",           brace,    3 },
-       {"overleftarrow",       arrow,    1 },
-       {"overrightarrow",      arrow,    3 },
-       {"overleftrightarrow",  udarrow,  1 },
-       {"xleftarrow",          arrow,    1 },
-       {"xrightarrow",         arrow,    3 },
-       {"underleftarrow",      arrow,    1 },
-       {"underrightarrow",     arrow,    3 },
-       {"underleftrightarrow", udarrow,  1 },
+       {"widehat",             angle,        3 },
+       {"widetilde",           tilde,        0 },
+       {"underbar",            hline,        0 },
+       {"underline",           hline,        0 },
+       {"overline",            hline,        0 },
+       {"underbrace",          brace,        1 },
+       {"overbrace",           brace,        3 },
+       {"overleftarrow",       arrow,        1 },
+       {"overrightarrow",      arrow,        3 },
+       {"overleftrightarrow",  udarrow,      1 },
+       {"xhookleftarrow",      lhook,        0 },
+       {"xhookrightarrow",     rhook,        0 },
+       {"xleftarrow",          arrow,        1 },
+       {"xLeftarrow",          LArrow,       0 },
+       {"xleftharpoondown",    lharpoondown, 0 },
+       {"xleftharpoonup",      lharpoonup,   0 },
+       {"xleftrightharpoons",  lrharpoons,   0 },
+       {"xleftrightarrow",     udarrow,      1 },
+       {"xLeftrightarrow",     LRArrow,      0 },
+       {"xmapsto",             mapsto,       0 },
+       {"xrightarrow",         arrow,        3 },
+       {"xRightarrow",         LArrow,       2 },
+       {"xrightharpoondown",   lharpoonup,   2 },
+       {"xrightharpoonup",     lharpoondown, 2 },
+       {"xrightleftharpoons",  rlharpoons,   0 },
+       {"underleftarrow",      arrow,        1 },
+       {"underrightarrow",     arrow,        3 },
+       {"underleftrightarrow", udarrow,      1 },
+       {"undertilde",          tilde,        0 },
+       {"utilde",              tilde,        0 },
 
        // Delimiters
        {"(",              parenth,    0 },
@@ -297,12 +412,20 @@ named_deco_struct deco_table[] = {
        {"rbrace",         brace,      2 },
        {"[",              brack,      0 },
        {"]",              brack,      2 },
+       {"llbracket",      dbrack,     0 },
+       {"rrbracket",      dbrack,     2 },
        {"|",              vert,       0 },
        {"/",              slash,      0 },
        {"slash",          slash,      0 },
        {"vert",           vert,       0 },
+       {"lvert",          vert,       0 },
+       {"rvert",          vert,       0 },
        {"Vert",           Vert,       0 },
+       {"lVert",          Vert,       0 },
+       {"rVert",          Vert,       0 },
        {"'",              slash,      1 },
+       {"<",              angle,      0 },
+       {">",              angle,      2 },
        {"\\",             slash,      1 },
        {"backslash",      slash,      1 },
        {"langle",         angle,      0 },
@@ -378,6 +501,12 @@ deco_struct const * search_deco(docstring const & name)
 } // namespace anon
 
 
+int mathed_font_em(FontInfo const & font)
+{
+       return theFontMetrics(font).em();
+}
+
+
 int mathed_char_width(FontInfo const & font, char_type c)
 {
        return theFontMetrics(font).width(c);
@@ -461,7 +590,7 @@ void mathed_draw_deco(PainterInfo & pi, int x, int y, int w, int h,
                        pi.pain.line(
                                int(x + xx + 0.5), int(y + yy + 0.5),
                                int(x + x2 + 0.5), int(y + y2 + 0.5),
-                               Color_math);
+                               pi.base.font.color());
                } else {
                        int xp[32];
                        int yp[32];
@@ -478,15 +607,24 @@ void mathed_draw_deco(PainterInfo & pi, int x, int y, int w, int h,
                                yp[j] = int(y + yy + 0.5);
                                //  lyxerr << "P[" << j ' ' << xx << ' ' << yy << ' ' << x << ' ' << y << ']';
                        }
-                       pi.pain.lines(xp, yp, n, Color_math);
+                       pi.pain.lines(xp, yp, n, pi.base.font.color());
                }
        }
 }
 
 
+void metricsStrRedBlack(MetricsInfo & mi, Dimension & dim, docstring const & str)
+{
+       FontInfo font = mi.base.font;
+       augmentFont(font, from_ascii("mathnormal"));
+       mathed_string_dim(font, str, dim);
+}
+
+
 void drawStrRed(PainterInfo & pi, int x, int y, docstring const & str)
 {
        FontInfo f = pi.base.font;
+       augmentFont(f, from_ascii("mathnormal"));
        f.setColor(Color_latex);
        pi.pain.text(x, y, str, f);
 }
@@ -495,6 +633,7 @@ void drawStrRed(PainterInfo & pi, int x, int y, docstring const & str)
 void drawStrBlack(PainterInfo & pi, int x, int y, docstring const & str)
 {
        FontInfo f = pi.base.font;
+       augmentFont(f, from_ascii("mathnormal"));
        f.setColor(Color_foreground);
        pi.pain.text(x, y, str, f);
 }
@@ -544,6 +683,8 @@ fontinfo fontinfos[] = {
                          inh_shape, Color_math},
        {"mathit",        inh_family, inh_series,
                          ITALIC_SHAPE, Color_math},
+       {"mathscr",       RSFS_FAMILY, inh_series,
+                         inh_shape, Color_math},
        {"cmex",          CMEX_FAMILY, inh_series,
                          inh_shape, Color_math},
        {"cmm",           CMM_FAMILY, inh_series,
@@ -558,6 +699,8 @@ fontinfo fontinfos[] = {
                          inh_shape, Color_math},
        {"msb",           MSB_FAMILY, inh_series,
                          inh_shape, Color_math},
+       {"stmry",         STMARY_FAMILY, inh_series,
+                         inh_shape, Color_math},
        {"wasy",          WASY_FAMILY, inh_series,
                          inh_shape, Color_math},
        {"esint",         ESINT_FAMILY, inh_series,
@@ -600,6 +743,9 @@ fontinfo fontinfos[] = {
        // LyX internal usage
        {"lyxtex",        inh_family, inh_series,
                          UP_SHAPE, Color_latex},
+       // FIXME: The following two don't work on OS X, since the Symbol font
+       //        uses a different encoding, and is therefore disabled in
+       //        FontLoader::available().
        {"lyxsymbol",     SYMBOL_FAMILY, inh_series,
                          inh_shape, Color_math},
        {"lyxboldsymbol", SYMBOL_FAMILY, BOLD_SERIES,
@@ -707,6 +853,27 @@ void augmentFont(FontInfo & font, docstring const & name)
 }
 
 
+bool isAlphaSymbol(MathAtom const & at)
+{
+       if (at->asCharInset() ||
+           (at->asSymbolInset() &&
+            at->asSymbolInset()->isOrdAlpha()))
+               return true;
+
+       if (at->asFontInset()) {
+               MathData const & ar = at->asFontInset()->cell(0);
+               for (size_t i = 0; i < ar.size(); ++i) {
+                       if (!(ar[i]->asCharInset() ||
+                             (ar[i]->asSymbolInset() &&
+                              ar[i]->asSymbolInset()->isOrdAlpha())))
+                               return false;
+               }
+               return true;
+       }
+       return false;
+}
+
+
 docstring asString(MathData const & ar)
 {
        odocstringstream os;