When unbinding a shortcut, it may happen that the exact definition of
the request is not known. A typical example it Tab, which is bound to
a complex command sequence.
In this case it is convenient to use the syntax
\unbind "Tab" "*"
To make this word, the special "*" value is translated to the
FuncRequest::unknown lfun and this value is considered specially in
several places.
This code was triggering the following warnings:
src/mathed/InsetMathHull.cpp:234:15: error: variable 'counters_to_save' is not needed and will not be emitted [-Werror,-Wunneeded-internal-declaration]
const char * counters_to_save[] = {"section", "chapter"};
^
src/mathed/InsetMathHull.cpp:235:21: error: unused variable 'numcnts' [-Werror,-Wunused-const-variable]
unsigned int const numcnts = sizeof(counters_to_save)/sizeof(char *);
The original code was put in at 645f9fdf (and the comment at 8a226ec4).
This commit amends a65e12d6.
Time will tell whether this is too expensive (because most equations
after this on will change too, unless equations are numbered by
section).
Related to bug #11535.
This patch simplifies and fixes the generation of previews with
numbering. Instead of saving the counter values (which is complicated
and error prone), the \thequation macro is set to the numbers_ string
which has been computed by updateBuffer for screen display.
Harcoding the number in the formula means that two equations with
different numbers have different previews, which is the subject of the
bug.
The special code for saving counters in updateBuffer and outputing
them in preparePreview from 645f9fdf (ticket #6894) is removed and
replaced by this simpler approach.
This fixes ticket #11535.
The module subequation allows to number equations in the "Subfigure"
inset to be numbered (1a), (1b), (1c), etc.
To implement this on screen, we need to redefine temporarily the
"equation" counter to use this different numbering.
To this end, implement Counters::copy method that can be used to
backup full counter definitions.
Fixes bug #12567.
This patch simplifies and fixes the generation of previews with
numbering. Instead of saving the counter values (which is complicated
and error prone), the \thequation macro is set to the numbers_ string
which has been computed by updateBuffer for screen display.
Harcoding the number in the formula means that two equations with
different numbers have different previews, which is the subject of the
bug.
The special code for saving counters in updateBuffer and putputing
them in preparePreview from 645f9fdf (ticket #6894) is removed and
replaced by this simpler approach.
This fixes ticket #11535.
The module subequation allows to number equations in the "Subfigure"
inset to be numbered (1a), (1b), (1c), etc.
To implement this on screen, we need to redefine temporarily the
"equation" counter to use this different numbering.
To this end, implement Counters::copy method that can be used to
backup full counter definitions.
Fixes bug #12567.
The layout from the paste content is adopted only if
- the paragraph is empty (ie. empty after the selection has been
erased) and Standard or Plain Layout, or
- empty and multiple lines are pasted, or
- multiple lines are pasted at the beginning of a paragraph
As for what other applications do:
- MS Word decides the adoption of a layout depending on whether the end of line
character is copied
- Libre Writer adopts the paste content layout only if the paragraph is empty
(otherwise it makes *all* pasted paragraph the target layout)
In LyX, as in Libre Writer, one cannot copy the end of line character by
selecting a single line. However, the Libre Writer solution is problematic
because one always has to make sure that a paragraph is in Standard layout if
one wants to paste several lines with their source layout. The implemented
behaviour differs from Libre Writer in that the source format is kept when end
of line characters are pasted, i.e. several lines are pasted, and hence does
what MS Word does in that situation.
Fix for bug #11023: Copy and paste from one list into another often leads to
undesired result.
Introduce the new FileName method ensureExtension, which does the following:
* if the extension is already correct (in a case-insensitive way), do nothing.
* if it is not correct, add the extension to the file name.
This is different from changeExtension that will fail in a case where
the file contains dots, but not a real extension, like newfile2.1.
Use this new method in renameBuffer() and exportBufferAs().
Fixes bug #11008.
This requires to add a parameter to GuiToolbar::addItem so that it is
possble to make a difference between toolbar buttons and menu items.
The long-term solution is to rely on the menu backend for such things.
Fixes bug #12004.
There are several small parts that are needed here:
* Implement LayoutModuleList::asString() that returns a comma-separated
list of modules.
* in Converter::convert(), handle the new tokens $$c for the current
textclass and $$m for the list of modules.
* in Buffer::importFile(), pass the current buffer as parameter instead
of nullptr.
* in pasteClipboardText(), copy the parameters of the current buffer to
the internal one used for importation, so that the textclass and
modules information is available to convert().
* finally, modify configure.py to pass "-c $$c -m $$m" to tex2lyx for
the latexclipoard->lyx converter.
Fixes bug #11312.
In Advanced Find and Replace, Tab can be used to move the focus from
Search field to the replace field. This is inconvenient when Tab has
another use, like completion.
To fix this, check that the function bound to Tab is disabled before switching focus.
The same is done for BackTab.
Fixes bug #11114.
The removal of duplicates is done in LastCommandsSection::add and uses
the erase-remove idiom for performance.
Most of the patch is a cleanup of GuiCommandBuffer:
* remove history_ member, that was a copy of the session lastcommands
vector. Use instead a wrapper history() around it and a addHistory
wrapper for adding new entries.
* Make sure that there is only one place where commands are added to
history. The code used to maintain a list for interactive editing,
and a list for saving the session. They could be different in terms
of leading/trailing spaces.
* [unrelated] remove command_ member, which is just a copy of
LyXAction list of commmands. Use directly lyxaction instead.
In mathed it is assumed that a labeled line is also implicitly numbered.
However, latex allows to label an equation without numbering it.
The label is then assigned the value of a nearby numbered one.
This commit drops the above mathed assumption in order to allow to import
valid latex code with a labeled but not numbered equation line.
The screen representation omits the line number and encloses the label
in square brackets for further differentiation. However, it is still not
possible to label an equation without numbering it using the GUI.
The aliases are defined by a file in the (system or user) image
directory. The format is pretty simple: each line is like
<str1> <str2>
Where every instance of <str1> will be replaced with <str2>.
Fixes bug #12509.
Adding this particular line created bad redraw interactions. See
thread on lyx-devel here:
https://marc.info/?l=lyx-devel&m=165648365808777&w=2
The code is reorganized a bit:
- the part of updateGUI() that (en|dis)abled elements is not moved to
updateBottons ; the rest is renamed updateWorkAreas()
- only updateButtons is called now in eventFilter
- finally the recursion curse is fixed now in updateWorkAreas() by
setting the old_buffer value _before_ calling copy_params. This
avoid recursion if some bad update were to happen again.
When changing the document class, the message "Converting document to
new document class..." is shown in minibuffer. This message leads to
weird GUI update interactions with the FindAndReplace panel, and
ultimately infinite loops. It would only be useful if the conversion
took a long time.
See this thread for rreference:
https://marc.info/?l=lyx-devel&m=165648365808777&w=2
Therefore, just remove it.
This important part is the last point, the rest is what is needed to
make it happen.
* implement (FindAndReplace|FindAndReplaceWidget)::hasWorkArea, that
tell whether a work area is own by the advanced find & replace
widget.
* factor out method find() from GuiView::findOrBuild.
* implement GuiView::hasVisibleWorkArea, that tells whether a workarea
is visible in the view (current tab in a split or adv. f&r
workarea).
* Finally, in TocWidget::sendDispatch, change the current workarea
temporarily to the document workarea before dispatching the
function. The code tries to be as careful as possible to handle all
cases. The future will tell whether it is good enough.
When the commit string from the inputMethodEvent can be interpreted as
characters bound to some action, dispatch this action instead of
inserting the string.
This is useful on an international keyboard, when diaresis+space gives
a plain double quote. It is better in this case to enter a smart
quote.
Adapted from a patch from Daniel Ramoeller <d.lyx@web.de>.
Fixes bug #10377.
Fix for bug #12547.
- "Interword" becomes "Normal"
- "Protected" becomes "Non-Breaking"
Plus a minor fixes to the "Horizontal Space Settings" dialog:
- Indicate that when "Non-Breaking" is disabled, the space will be non-breaking
In FindAdv we use Qt to interpret regular expressions.
Regex uses for instance '\w', '\d' etc.
'\d' finds not just '0-9' but also e.g. '߂' (Nko Digit Two: U+07c2)
'\w' includes also such numbers.
ATM, only FindAdv uses this function.
In this case we skip the undesired word-characters before starting the search.
There are still some inconsistencies between LyX and Qt of 'what counts as a word-character',
but too hard to resolve.
Since the element 'match_len' in class MatchResult is an integer,
the check 'if (!match(...).match_len))' is changed to
'if (match(...).match_len) <= 0)'
1.) The type of variable at_begin changes from bool to enum matchType
true -> MatchStringAdv::MatchFromStart,
false -> MatchStringAdv::MatchAnyPlace
2.) discard default parameter-values of
MatchStringAdv::operator()
MatchStringAdv::findAux()
1.) Changed arrays dept and closes to vector-type because of runtime error in UserGuide.lyx
with a big paragraph (size > 8900 chars) contained too many opening parentheses
2.) Removed one creation 'textcyrillic'-key because it is later anyway created
3.) Most important (thanks to Scott who found the failure)
Move the check if the found string really is part of MATH to
the relevant place.
Without this change the search using 'Search only in maths' will fail miserably.
When implementing multi-row string breaking, an extra createLine()
statement, which made sense in the original code, was kept by mistake.
This basically made the mechanism ineffective, because it created one
row with the correct length, plus a second one with all the remaining
text, which would have to be itself broken. This went undetected
because the display is still correct.
Additionally, this issue polluted the break cache to the extent that
the hit rate could be 0%.
Together, these two effects created a major slowdown with a document
containing a single ~30000 characters paragraph.
Fixes bug #12534.
When toggleFree is called without a selection, the only result is to
change the cursor currentfont.
In the other cases (selection or implicit selection), we want to reset
the cursor font from the text font.
Fixes bug #12518.
To handle this case, we use '\lyxdollar' string instead.
Also try to handle '\n' in the docstring directly instead in the
string already converted to utf8.
(The utf8-version is still there, but commented out)
If the searched area contains deleted parts, there may be more closing
as opening parentheses in latex output. We have to remove them before
further processing.
Using the new inline statements
find_effective(), find_with_non_output(), find_with_deleted(),
find_set_feature(), find_add_feature() and find_clean_features()
makes the code a slightly better readable.
This lfun (like several others) does not work with multicell
selection. Disable the lfun in this this case for now, until a nice
solution is found.
Fixes bug #12530.
Also fix a thinko in interpreting the found values.
The match_len describes the length of the second regex field,
while matchend is the length of the search field 0.
This happens when the cursor goes into a deeper inset, since
selectWord() was called on the wrong Text object.
Additionally, fix the new word selection when cursor goes before
existing selection.
Fixes bug #12529.
DocBook comes in another commit, as the modifications are not required to keep the code compilable.
A semicolon is no more used between an index term and the places it appears, because some languages need a space before it and others not: this wasn't handled at all. With a dash, this problem disappears.
We are removing leading values from the start of string, so
the size of removed data was wrong because s.find() could find
a position inside the leading part.
Problem occured if
1.) not using regex and
2.) search without format and
3.) the search pattern ended with '}'.
then this last char '}' in the search pattern was discarded.
With the debug-level 'find' there are now less output.
The original output can be received now with debig-level 'findverbose'
Also constructions like
LYXERR(Debug::FIND|Debug::FINDVERBOSE, "...");
are now possible.
This adds native macros for subindexes (!level), |see and |seealso
as well as native support for ranges |( |) and pagination format
-- e.g., |textbf -- via the index dialog
Resolves#12478, #7232 and #5014
The feature is complete (incl. tex2lyx) except for
* file format change and lyx2lyx
* docbook/xhtml
* documentation
1/ put cusror in some display inset
2/ use shift-left until the cursor exits the inset
3/ see how the selection extends on the right.
This is not really a selection drawing bug, but rather the fact that
the anchor will be normalized to the first position after the inset,
which is in the next row.
This can be avoided by using the boundary property.
See discussion in bug #12520.
Difficult to decide, when to remove the sequence '%\n'.
The sequence is OK for latex output as a command separator,
but must be removed in searched string.
Alas, not all occurences are wrong. Sigh.
It is not a good idea to contruct a QChar from a char_type that is
really 32bits.
Use lyx::isSpace, which already catters for this case.
Since this code does not depend on qt anymore, move it to
support::countExpanders.
Get rid of Row::countSeparators, which is not used anymore.
Fixes bug #12519.
The functionality was mentioned, but it seems worth it to give the
command explicitly, so it is seen how "Branch:<branch name>" is used
to refer to the specific branch with name <branch name>.
Additionally, tweak a phrase in doc for buffer-forall.
In some situation the macros are not used with their unicode
representation. For instance all greek characters are used
as \alpha, \beta, ... in the latex output.
For the search it is more convenient to use the corresponding UTF-8 codes.
Wrong behaviour before this commit:
Open new lyx-file
insert
unicode-insert 0x025c 0x1d08
Open adv-find dialog
search for unicode 0x025c OK
search for unicode 0x1d08 OK
search with regex for unicode 0x025c OK
search with regex for unicode 0x1d08 ==> NOT OK (because we are searching for \textrevepsilon
and this was mapped to 0x025c
Fixes bug reported here:
https://www.mail-archive.com/lyx-devel@lists.lyx.org/msg217265.html
1. Start a new document.
2. Start a math inset and inside put "1+2".
3. Put the cursor to the right of "+".
4. Press <Shift> + L three times. This will select the entire math inset
(as expected).
5. Press <Shift> + R.
Before 503c7c16, the selection inside the math inset was preserved.
After 503c7c16, it is lost.
The problem is that InsetMathNest does too much for our needs and
resets the anchor (why, I do not know). Therefore, it is better to
duplicate the code.
These are just annoying. Note that the language mark cannot currently
be specified in a layout file, but it is not clear that there is a
need for that. Therefore I used the simple and hackish way.
This is actually a generic InsetInfo issue:
1/ the contents of the inset is computed in updateBuffer, so that it
is available for drawing but also for latex output (think batch
export). When it is called, it deletes the existing inner paragraph
and replaces it by a new one
2/ metrics build a new Row object that represents to paragraph
3/ draw() relies on this information
Now, imagine that updateBuffer() is called after metrics(). This can
happen for many reasons, and does happen here (display a shortcut info
and change the shortcut file from cua to emacs).
This problem has been here forever, but is only visible now that the
(experimental) bookmark display code needs to read the underlying
paragraph id.
The solution is to compute the inset contents at metrics time. This
is done by moving the relevant code to a new standalone build() method
that is called in metrics() but also in latex().
Except for dvi/ps output chain for which this trick was meant.
Also, issue an error message in this case. This is analogous to
the other output flavors now.
This is important for commands like !`, that are equivalent to \textexclamdown. However, ! is matched earlier, because the logic works with prefixes, hence the output doesn't make sense.
This avoid a crash when doing
command-sequence inset-forall Caption char-delete-forward; statistics; undo
in the user guide when a malformed selection is created.
The selection happens here because char-delete-forward will select the
caption instead of deleting it if the "force" parameter is not given.
This is a poor API IMO, it is the plain <del> action that should use a
special parameter.
Fix for bug #12456.
The labels are transmitted from Buffer to GuiRef by reference of refs_
in the getLabelList function. Previously, only one string was
transmitted. But I needed both the formatted string, e.g. "x enu:test"
or "Missing: enu:test", as well as the plain label, e.g. "enu:test".
The former is for the list of labels to choose from in GuiRef and the
latter for the label as shown in the line edit that contains the plain
label in order to create a new reference from it. Transmitting both is
what the pair achieves.
It does not make sense to issue the index processor before the
pagination is fixed. Particularly, if (classic) BibTeX is run,
we need one or more extra LaTeX runs after that before issuing
the index processor, since the citation labels and references are
only expanded then, which might change pagination. As a consequence,
we ended up in wrong index references.
This fixes a 16 year old bug report.
The minimal vamue is set to 10%, let's set the max to 1000%. This
avoids crashes when characters are too large.
The code is refactored to be more compact and the tests are more precise.
Fixes bug #12452.
Display manually set itemize symbols and their size in the work area.
Fix for bug #2277.
Also fixes a problem with document settings changed() not correctly emitted.
Before this patch, LyX would forcibly create an <abstract> tag even when there was no abstract in the document; this behaviour is sometimes desirable, but not when the abstract only contains comments (that's not valid DocBook: there must be a paragraph or assimilated within the abstract).
Inside a math inset when completing macro names, it could lead to crashes.
Note that this processUpdateFlags is present when outside of this if() branch.
When inserting inset over a selection, the layout is transferred if
the inset covers full paragraphs.
This is not the right policy in the case of environments. Until proper
code is written and tested, limit ourselves to command layouts.
Fixes bug #12251.
Typical example is a Labeling layout which label is an inline equation
larger than the screen. Before this commit, the row would not get
broken at all.
Two parts in the patch:
1/ when breaking the row in shortenIfNeeded, mark the last element as
AlwaysBreakAfter instead of BreakAfter, in case the next element is
NoBreakBefore.
2/ when nothing could be done, as last resort keep the first element
of the row only.
Prevent the return of impossible values for 'enum flags'.
For instance the result of '~Update::Force' at src/BufferView.cpp:3025 without this patch
is '4294967293'.
The string that Qt sees is not the original string, since we add
zero-width nonbreaking spaces around it, plus an override character to
force rendering direction. This means that translating positions
between these two representation can be a bit tricky.
We use a max(foo, 0) here to make sure that our intermediate
computation is postive.
Fixes part of bug #12452.
Setting sufficiently high value allows to use
ColorCode enums for new up to 32000 branch insets.
Previous setting printed messages if using more than 25 new branch insets.
"'ColorCode' ... src/Color.cpp:435:10: runtime error:
load of value 128, which is not a valid value for type"
It is not a good idea to take into account the horizontal scrolling
that may have happened. For example, this leads to display glitches
when a Description label is larger than text width.
This explains why SingleParUpdate strategy did not work with home/end
on a long row.
The spacing of Labeling, Description and friends shall be computed
when breaking the row, not when tokenizing it. Indeed, this is the
right place to determine its correct value.
To this end add a new MARGINSPACE row element type.
This allows to remove TextMetrics::labelEnd, which is not used anymore.
When a string is broken at the margin by the Qt algorithm, the space
at which breaking occurred is automatically skipped in width
computation. However, the ending space of the string is taken into
account and is visible for example at paragraph end.
When the trailing space is followed by a displayed inset, then the
space should be skipped too, which means that the width of the last
row element has to be recomputed. For the sake of performance, the
width of the element without trailing spaces is computed in advance in
FontMetrics::breakString.
This "no space" width will be used when trimming a row element of its trailing
spaces instead of the original one.
Additionally, do not trim trailing spaces when the row is flushed.
Fixes bug #12449.
The search widget triggers a showEvent() in updateTitle() leading to setting the focus to the default push button.
The check in updateTitle() for the need to restore the title avoids superfluous show events and avoids the unwanted focus change.
This ensures that we use a consistent Python interpreter in LyX.
$${python} is replaced by the Python version found.
Users can apply this in preferences and use the same version defined by
LyX.
An inset that resets its font (like Footnote) does not care at all
about enclosing font. Therefore the real starting point is the class
default font. This avoid cases where the footnote contents is forced
to \normalsize.
It turns out that the Greyedout note inset, did inherit font but was
declared as not doing it. This commmit changes the definition by
adding \normalfont\normalsize so that no inheritance happens.
Note that actually \normalfont resets everything but the font size.
This does not matter for footnote (which has its own font size) and
greyedout (which is fixed now), but may matter elsewhere. Also, I do
not know what the situation with HTML is.
We could not figure out the root issue, or at least not to the point
where we felt changing this code considering we could not trigger
any bug from a user perspective.
For now, we just add a comment in the code.
For more information, see our ML discussion here:
https://www.mail-archive.com/search?l=mid&q=20211227113249.53bf5a63%40admin1-desktop
This catches the case where the caption only contains a comment, as in export/export/latex/lyxbugs-resolved/cprotect/9313-comment-in-figure-float-caption. No duplicate work is performed to ensure the same level of performance as before.
The checkbox is hidden when backing store is enforced (wayland,
macOS). In practice, only X11 and Windows users will see it ; I only
have evidence of X11 people needing it, I can hide it for Windows
users too if necessary.
Fixes bug #12119.
LyX relies on a a backing store to draw when running under macOS or
Wayland, because Qt arbitrarily overwrites parts of the workarea
before we paint (and we paint only the parts that need to be painted).
However it seems that this is also necessary on X11 when the WM theme
is translucid. Since there is no way that I know of to detect this
situation, this patch adds a LyXRC setting to manually select this
drawing strategy.
Note that using a backing store is not always a good solution, since
this disables subpixel aliasing.
At this point there is no UI for the variable.
Fixes bug #12119
The default in the .ui is not considered in
GuiSearchWidget::restoreSession(), which sets a hard-coded default
if the stored setting is not found in the session file.
I'll start an ML discussion for whether the code in restoreSession()
should use the ui's default if the setting is not found in the
session.
For some reason, Qt can break strings before the first character
(although we try to prevent that). The code was not prepared to that,
now it is.
Remove a forgotten debug statement.
When a selection extends on more than a row, the space between the two
rows should always be painted in full. Otherwise, with layouts like
Chapter, the "Chapter" label may seem selected in part.
Increase the maximal size of the breakString cache (to compute where
to break lines) from 512kB to 10MB. This has a big impact of cache
hits on large file like the example in #12297, which is now 99%. On
this example the time taken by breakString decreases from 33.5us to
2.4us.
The string width cache has been increased fro 512kB to 1MB, but this
does not make such a big difference.
Additionally, comments and variable names have been improved.
Related to bug #12297.
Add new row flags Flush and FlushBefore to let insets indicate whether
they cause flushing of current row (eg. newline) or of previous row
(e.g. display insets).
Replace FontMetrics::breakAt, which returned the next break point,
with FontMetrics::breakString, which returns a vector of break points.
To this end, an additional parameter gives the available width for
next rows.
Rename various variables and methods accordingly. Factor the code in
breakString_helper to be more manageable.
Adapt Row::Element::splitAt to return a bool on sucess and provide
remaining row elements in a vector. The width noted above has been
added as parameters.
Rename the helper function splitFrom to moveElements and rewrite the
code to be more efficient.
Remove type of row element INVALID, which is not needed anymore.
The code in TextMetrics::breakParagraph is now much simpler.
In Row::finalize, remove the code that computed inconditionnally the
current element size, and make sure that this width will be computed
in all code paths of Row::Element::splitAt.