mirror of
https://github.com/fltk/fltk.git
synced 2026-05-29 04:26:27 +08:00
FLUID: minor improvemnets to buffer handling (#1152)
The described crash can not be reproduced. The changes improve the stability of the call that causes the crash.
This commit is contained in:
+2
-2
@@ -156,7 +156,7 @@ void undo_cb(Fl_Widget *, void *) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Restore old browser position.
|
// Restore old browser position.
|
||||||
// Ideally, we would save the browser position insied the undo file.
|
// Ideally, we would save the browser position inside the undo file.
|
||||||
if (widget_browser) widget_browser->restore_scroll_position();
|
if (widget_browser) widget_browser->restore_scroll_position();
|
||||||
|
|
||||||
undo_current --;
|
undo_current --;
|
||||||
@@ -178,7 +178,7 @@ void undo_checkpoint_once(int type) {
|
|||||||
undo_checkpoint();
|
undo_checkpoint();
|
||||||
undo_once_type = type;
|
undo_once_type = type;
|
||||||
} else {
|
} else {
|
||||||
// do not add more checkpoints for the same undo typw
|
// do not add more checkpoints for the same undo type
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+17
-10
@@ -1,7 +1,7 @@
|
|||||||
//
|
//
|
||||||
// Widget Browser code for the Fast Light Tool Kit (FLTK).
|
// Widget Browser code for the Fast Light Tool Kit (FLTK).
|
||||||
//
|
//
|
||||||
// Copyright 1998-2023 by Bill Spitzak and others.
|
// Copyright 1998-2024 by Bill Spitzak and others.
|
||||||
//
|
//
|
||||||
// This library is free software. Distribution and use rights are outlined in
|
// This library is free software. Distribution and use rights are outlined in
|
||||||
// the file "COPYING" which should have been included with this file. If this
|
// the file "COPYING" which should have been included with this file. If this
|
||||||
@@ -143,8 +143,8 @@ void reveal_in_browser(Fl_Type *t) {
|
|||||||
\param[out] p return the resulting string in this buffer, terminated with
|
\param[out] p return the resulting string in this buffer, terminated with
|
||||||
a NUL byte
|
a NUL byte
|
||||||
\param[in] str copy this string; utf8 aware
|
\param[in] str copy this string; utf8 aware
|
||||||
\param[in] maxl maximum number of letter to copy until we print
|
\param[in] maxl maximum number of letters to copy until we print
|
||||||
the elipsis (...)
|
the ellipsis (...)
|
||||||
\param[in] quote if set, the resulting string is embedded in double quotes
|
\param[in] quote if set, the resulting string is embedded in double quotes
|
||||||
\param[in] trunc_lf if set, truncates at first newline
|
\param[in] trunc_lf if set, truncates at first newline
|
||||||
\returns pointer to end of string (before terminating null byte).
|
\returns pointer to end of string (before terminating null byte).
|
||||||
@@ -159,16 +159,23 @@ static char *copy_trunc(char *p, const char *str, int maxl, int quote, int trunc
|
|||||||
{
|
{
|
||||||
int size = 0; // truncated string size in characters
|
int size = 0; // truncated string size in characters
|
||||||
int bs; // size of UTF-8 character in bytes
|
int bs; // size of UTF-8 character in bytes
|
||||||
|
if (!p) return NULL; // bad buffer
|
||||||
|
if (!str) { // no input string
|
||||||
|
if (quote) { *p++='"'; *p++='"'; }
|
||||||
|
*p = 0;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
const char *end = str + strlen(str); // end of input string
|
const char *end = str + strlen(str); // end of input string
|
||||||
if (quote) *p++ = '"'; // opening quote
|
if (quote) *p++ = '"'; // opening quote
|
||||||
while (size < maxl) { // maximum <maxl> characters
|
while (size < maxl) { // maximum <maxl> characters
|
||||||
if (*str == '\n') {
|
if (*str == '\n') {
|
||||||
if (trunc_lf) { // handle trunc at \n
|
if (trunc_lf) { // handle trunc at \n
|
||||||
*p++ = 0;
|
if (quote) *p++ = '"'; // closing quote
|
||||||
|
*p = 0;
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
*p++ = '\\'; *p++ = 'n';
|
*p++ = '\\'; *p++ = 'n';
|
||||||
str++; size++;
|
str++; size+=2;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!(*str & (-32))) break; // end of string (0 or control char)
|
if (!(*str & (-32))) break; // end of string (0 or control char)
|
||||||
@@ -197,7 +204,7 @@ static char *copy_trunc(char *p, const char *str, int maxl, int quote, int trunc
|
|||||||
|
|
||||||
\param[in] X, Y, W, H position and size of widget
|
\param[in] X, Y, W, H position and size of widget
|
||||||
\param[in] l optional label
|
\param[in] l optional label
|
||||||
\todo It would be nice to be able to grab one or more nodes and mmove them
|
\todo It would be nice to be able to grab one or more nodes and move them
|
||||||
within the hierarchy.
|
within the hierarchy.
|
||||||
*/
|
*/
|
||||||
Widget_Browser::Widget_Browser(int X,int Y,int W,int H,const char*l) :
|
Widget_Browser::Widget_Browser(int X,int Y,int W,int H,const char*l) :
|
||||||
@@ -305,7 +312,7 @@ void Widget_Browser::item_draw(void *v, int X, int Y, int, int) const {
|
|||||||
// cast to a more general type
|
// cast to a more general type
|
||||||
Fl_Type *l = (Fl_Type *)v;
|
Fl_Type *l = (Fl_Type *)v;
|
||||||
|
|
||||||
char buf[340]; // edit buffer: large enough to hold 80 UTF-8 chars + nul
|
char buf[500]; // edit buffer: large enough to hold 80 UTF-8 chars + nul
|
||||||
|
|
||||||
// calculate the horizontal start position of this item
|
// calculate the horizontal start position of this item
|
||||||
// 3 is the edge of the browser
|
// 3 is the edge of the browser
|
||||||
@@ -446,7 +453,7 @@ void Widget_Browser::item_draw(void *v, int X, int Y, int, int) const {
|
|||||||
*/
|
*/
|
||||||
int Widget_Browser::item_width(void *v) const {
|
int Widget_Browser::item_width(void *v) const {
|
||||||
|
|
||||||
char buf[340]; // edit buffer: large enough to hold 80 UTF-8 chars + nul
|
char buf[500]; // edit buffer: large enough to hold 80 UTF-8 chars + nul
|
||||||
|
|
||||||
Fl_Type *l = (Fl_Type *)v;
|
Fl_Type *l = (Fl_Type *)v;
|
||||||
|
|
||||||
@@ -562,7 +569,7 @@ int Widget_Browser::handle(int e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Save the current scrollbar postion during rebuild.
|
Save the current scrollbar position during rebuild.
|
||||||
*/
|
*/
|
||||||
void Widget_Browser::save_scroll_position() {
|
void Widget_Browser::save_scroll_position() {
|
||||||
saved_h_scroll_ = hposition();
|
saved_h_scroll_ = hposition();
|
||||||
@@ -570,7 +577,7 @@ void Widget_Browser::save_scroll_position() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Restore the previous scrollbar postion after rebuild.
|
Restore the previous scrollbar position after rebuild.
|
||||||
*/
|
*/
|
||||||
void Widget_Browser::restore_scroll_position() {
|
void Widget_Browser::restore_scroll_position() {
|
||||||
hposition(saved_h_scroll_);
|
hposition(saved_h_scroll_);
|
||||||
|
|||||||
Reference in New Issue
Block a user