summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Input.cxx103
-rw-r--r--src/Fl_Input_.cxx10
-rw-r--r--src/Fl_Text_Buffer.cxx27
-rw-r--r--src/Fl_Text_Display.cxx35
-rw-r--r--src/Fl_Text_Editor.cxx24
-rw-r--r--src/fl_draw_image_mac.cxx3
-rw-r--r--src/fl_utf.c7
-rw-r--r--src/fl_utf8.cxx6
8 files changed, 115 insertions, 100 deletions
diff --git a/src/Fl_Input.cxx b/src/Fl_Input.cxx
index 1ebda7d85..39dc8c5bd 100644
--- a/src/Fl_Input.cxx
+++ b/src/Fl_Input.cxx
@@ -146,10 +146,27 @@ int Fl_Input::handle_key() {
if (Fl::event_state() & FL_CTRL) ascii = ctrl('C');
else if (Fl::event_state() & FL_SHIFT) ascii = ctrl('V');
break;
- case FL_Delete: // FIXME
- if (Fl::event_state() & FL_SHIFT) ascii = ctrl('X');
- else ascii = ctrl('D');
- break;
+ case FL_Delete:
+#ifdef __APPLE__
+ if (mods==0 || mods==FL_CTRL) { // delete next char
+ ascii = ctrl('D');
+ } else if (mods==FL_ALT) { // delete next word
+ if (mark() != position()) return cut();
+ cut(position(), word_end(position()));
+ return 1;
+ } else if (mods==FL_META) { // delete to the end of the line
+ if (mark() != position()) return cut();
+ cut(position(), line_end(position()));
+ return 1;
+ } else return 1;
+#else
+ if (mods==0) {
+ ascii = ctrl('D');
+ } else if (mods==FL_SHIFT) {
+ ascii = ctrl('X');
+ } else return 1;
+#endif
+ break;
case FL_Left:
#ifdef __APPLE__
if (mods==0) { // char left
@@ -190,18 +207,31 @@ int Fl_Input::handle_key() {
} else return 1;
#endif // __APPLE__
break;
- case FL_Page_Up: // FIXME
- fl_font(textfont(),textsize()); //ensure current font is set to ours
- repeat_num=h()/fl_height(); // number of lines to scroll
- if (!repeat_num) repeat_num=1;
+ case FL_Page_Up:
+#ifdef __APPLE__
+ if (mods==0) { // scroll text one page
+ // OS X scrolls the view, but does not move the cursor
+ // Fl_Input has no scroll control, so instead we move the cursor by one page
+ repeat_num = linesPerPage();
+ ascii = ctrl('P');
+ } else if (mods==FL_ALT) { // move cursor one page
+ repeat_num = linesPerPage();
+ ascii = ctrl('P');
+ } else return 1;
+ break;
+#else
+ repeat_num = linesPerPage();
+ // fall through
+#endif
case FL_Up:
#ifdef __APPLE__
if (mods==0) { // line up
ascii = ctrl('P');
- } else if (mods==FL_CTRL) {
- return 1; // FIXME scroll text down one page
- // FIXME Fl_Inut_ does not support an independent scroll value
- // (heck, it doesn't even support a scrollbar - what do you expect ;-)
+ } else if (mods==FL_CTRL) { // scroll text down one page
+ // OS X scrolls the view, but does not move the cursor
+ // Fl_Input has no scroll control, so instead we move the cursor by one page
+ repeat_num = linesPerPage();
+ ascii = ctrl('P');
} else if (mods==FL_ALT) { // line start and up
if (line_start(position())==position() && position()>0)
return shift_position(line_start(position()-1)) + NORMAL_INPUT_MOVE;
@@ -214,21 +244,37 @@ int Fl_Input::handle_key() {
#else
if (mods==0) { // line up
ascii = ctrl('P');
- } else if (mods==FL_CTRL) {
- return 1; // FIXME scroll text down one line
+ } else if (mods==FL_CTRL) { // scroll text down one line
+ // Fl_Input has no scroll control, so instead we move the cursor by one page
+ ascii = ctrl('P');
} else return 1;
#endif
break;
- case FL_Page_Down: // FIXME
- fl_font(textfont(),textsize());
- repeat_num=h()/fl_height();
- if (!repeat_num) repeat_num=1;
+ case FL_Page_Down:
+#ifdef __APPLE__
+ if (mods==0) { // scroll text one page
+ // OS X scrolls the view, but does not move the cursor
+ // Fl_Input has no scroll control, so instead we move the cursor by one page
+ repeat_num = linesPerPage();
+ ascii = ctrl('N');
+ } else if (mods==FL_ALT) { // move cursor one page
+ repeat_num = linesPerPage();
+ ascii = ctrl('N');
+ } else return 1;
+ break;
+#else
+ repeat_num = linesPerPage();
+ // fall through
+#endif
case FL_Down:
#ifdef __APPLE__
if (mods==0) { // line down
ascii = ctrl('N');
} else if (mods==FL_CTRL) {
- return 1; // FIXME scroll text up one page
+ // OS X scrolls the view, but does not move the cursor
+ // Fl_Input has no scroll control, so instead we move the cursor by one page
+ repeat_num = linesPerPage();
+ ascii = ctrl('N');
} else if (mods==FL_ALT) { // line end and down
if (line_end(position())==position() && position()<size())
return shift_position(line_end(position()+1)) + NORMAL_INPUT_MOVE;
@@ -241,15 +287,19 @@ int Fl_Input::handle_key() {
#else
if (mods==0) { // line down
ascii = ctrl('N');
- } else if (mods==FL_CTRL) {
- return 1; // FIXME scroll text up one line
+ } else if (mods==FL_CTRL) { // scroll text up one line
+ // Fl_Input has no scroll control, so instead we move the cursor by one page
+ ascii = ctrl('N');
} else return 1;
#endif
break;
case FL_Home:
#ifdef __APPLE__
- if (mods==0) {
- return 1; // FIXME scroll display to the top
+ if (mods==0) { // scroll display to the top
+ // OS X scrolls the view, but does not move the cursor
+ // Fl_Input has no scroll control, so instead we move the cursor by one page
+ shift_position(0);
+ return 1;
} else return 1;
#else
if (mods==0) {
@@ -262,8 +312,11 @@ int Fl_Input::handle_key() {
break;
case FL_End:
#ifdef __APPLE__
- if (mods==0) {
- return 1; // FIXME scroll display to the bottom
+ if (mods==0) { // scroll display to the bottom
+ // OS X scrolls the view, but does not move the cursor
+ // Fl_Input has no scroll control, so instead we move the cursor by one page
+ shift_position(size());
+ return 1;
} else return 1;
#else
if (mods==0) {
diff --git a/src/Fl_Input_.cxx b/src/Fl_Input_.cxx
index e82d8badb..1e74c309a 100644
--- a/src/Fl_Input_.cxx
+++ b/src/Fl_Input_.cxx
@@ -1024,6 +1024,16 @@ Fl_Input_::~Fl_Input_() {
if (bufsize) free((void*)buffer);
}
+int Fl_Input_::linesPerPage() {
+ int n = 1;
+ if (input_type() == FL_MULTILINE_INPUT) {
+ fl_font(textfont(),textsize()); //ensure current font is set to ours
+ n = h()/fl_height(); // number of lines to scroll
+ if (n<=0) n = 1;
+ }
+ return n;
+}
+
//
// End of "$Id$".
//
diff --git a/src/Fl_Text_Buffer.cxx b/src/Fl_Text_Buffer.cxx
index 391faf7f6..55f82abd8 100644
--- a/src/Fl_Text_Buffer.cxx
+++ b/src/Fl_Text_Buffer.cxx
@@ -83,27 +83,6 @@ static int undocut; // number of characters deleted there
static int undoinsert; // number of characters inserted
static int undoyankcut; // length of valid contents of buffer, even if undocut=0
-static int utf_len(char c)
-{
- if (!(c & 0x80)) return 1;
- if (c & 0x40) {
- if (c & 0x20) {
- if (c & 0x10) {
- if (c & 0x08) {
- if (c & 0x04) {
- return 6;
- }
- return 5;
- }
- return 4;
- }
- return 3;
- }
- return 2;
- }
- return 0;
-}
-
static void undobuffersize(int n) {
if (n > undobufferlength) {
if (undobuffer) {
@@ -991,7 +970,7 @@ int Fl_Text_Buffer::expand_character(int pos, int indent, char *outStr) {
mTabDist, mNullSubsChar);
if (ret > 1 && (c & 0x80)) {
int i;
- i = utf_len(c);
+ i = fl_utf8len(c);
while (i > 1) {
i--;
pos++;
@@ -1040,7 +1019,7 @@ int Fl_Text_Buffer::expand_character(char c, int indent, char *outStr, int tabDi
return 0;
} else if (c & 0x80) {
*outStr = c;
- return utf_len(c);
+ return fl_utf8len(c);
}
/* Otherwise, just return the character */
@@ -1068,7 +1047,7 @@ int Fl_Text_Buffer::character_width(char c, int indent, int tabDist, char nullSu
else if ((c & 0x80) && !(c & 0x40))
return 0;
else if (c & 0x80) {
- return utf_len(c);
+ return fl_utf8len(c);
}
return 1;
}
diff --git a/src/Fl_Text_Display.cxx b/src/Fl_Text_Display.cxx
index ea00b0ac8..cb63b8f66 100644
--- a/src/Fl_Text_Display.cxx
+++ b/src/Fl_Text_Display.cxx
@@ -77,27 +77,6 @@ static int scroll_x = 0;
// CET - FIXME
#define TMPFONTWIDTH 6
-static int utf_len(char c)
-{
- if (!(c & 0x80)) return 1;
- if (c & 0x40) {
- if (c & 0x20) {
- if (c & 0x10) {
- if (c & 0x08) {
- if (c & 0x04) {
- return 6;
- }
- return 5;
- }
- return 4;
- }
- return 3;
- }
- return 2;
- }
- return 0;
-}
-
/** Creates a new text display widget.*/
Fl_Text_Display::Fl_Text_Display(int X, int Y, int W, int H, const char* l)
: Fl_Group(X, Y, W, H, l) {
@@ -872,7 +851,7 @@ int Fl_Text_Display::position_to_xy( int pos, int* X, int* Y ) {
mBuffer->tab_distance(), mBuffer->null_substitution_character() );
if (charLen > 1 && (lineStr[ charIndex ] & 0x80)) {
int i, ii = 0;;
- i = utf_len(lineStr[ charIndex ]);
+ i = fl_utf8len(lineStr[ charIndex ]);
while (i > 1) {
i--;
ii++;
@@ -1626,7 +1605,7 @@ void Fl_Text_Display::draw_vline(int visLineNum, int leftClip, int rightClip,
expandedChar, buf->tab_distance(), buf->null_substitution_character() );
if (charIndex < lineLen && charLen > 1 && (lineStr[ charIndex ] & 0x80)) {
int i, ii = 0;;
- i = utf_len(lineStr[ charIndex ]);
+ i = fl_utf8len(lineStr[ charIndex ]);
while (i > 1) {
i--;
ii++;
@@ -1664,7 +1643,7 @@ void Fl_Text_Display::draw_vline(int visLineNum, int leftClip, int rightClip,
buf->tab_distance(), buf->null_substitution_character() );
if (charIndex < lineLen && charLen > 1 && (lineStr[ charIndex ] & 0x80)) {
int i, ii = 0;;
- i = utf_len(lineStr[ charIndex ]);
+ i = fl_utf8len(lineStr[ charIndex ]);
while (i > 1) {
i--;
ii++;
@@ -1687,7 +1666,7 @@ void Fl_Text_Display::draw_vline(int visLineNum, int leftClip, int rightClip,
*outPtr = expandedChar[ i ];
int l = 1;
if (*outPtr & 0x80) {
- l = utf_len(*outPtr);
+ l = fl_utf8len(*outPtr);
}
charWidth = string_width( &expandedChar[ i ], l, charStyle );
} else
@@ -1711,7 +1690,7 @@ void Fl_Text_Display::draw_vline(int visLineNum, int leftClip, int rightClip,
buf->tab_distance(), buf->null_substitution_character() );
if (charIndex < lineLen && charLen > 1 && (lineStr[ charIndex ] & 0x80)) {
int i, ii = 0;;
- i = utf_len(lineStr[ charIndex ]);
+ i = fl_utf8len(lineStr[ charIndex ]);
while (i > 1) {
i--;
ii++;
@@ -1734,7 +1713,7 @@ void Fl_Text_Display::draw_vline(int visLineNum, int leftClip, int rightClip,
*outPtr = expandedChar[ i ];
int l = 1;
if (*outPtr & 0x80) {
- l = utf_len(*outPtr);
+ l = fl_utf8len(*outPtr);
}
charWidth = string_width( &expandedChar[ i ], l, charStyle );
} else
@@ -2071,7 +2050,7 @@ int Fl_Text_Display::xy_to_position( int X, int Y, int posType ) {
mBuffer->tab_distance(), mBuffer->null_substitution_character() );
if (charLen > 1 && (lineStr[ charIndex ] & 0x80)) {
int i, ii = 0;;
- i = utf_len(lineStr[ charIndex ]);
+ i = fl_utf8len(lineStr[ charIndex ]);
while (i > 1) {
i--;
ii++;
diff --git a/src/Fl_Text_Editor.cxx b/src/Fl_Text_Editor.cxx
index d70626b75..bd56eeb6c 100644
--- a/src/Fl_Text_Editor.cxx
+++ b/src/Fl_Text_Editor.cxx
@@ -34,26 +34,6 @@
#include <FL/Fl_Text_Editor.H>
#include <FL/fl_ask.H>
-static int utf_len(char c)
-{
- if (!(c & 0x80)) return 1;
- if (c & 0x40) {
- if (c & 0x20) {
- if (c & 0x10) {
- if (c & 0x08) {
- if (c & 0x04) {
- return 6;
- }
- return 5;
- }
- return 4;
- }
- return 3;
- }
- return 2;
- }
- return 0;
-}
/* Keyboard Control Matrix
@@ -268,7 +248,7 @@ int Fl_Text_Editor::kf_backspace(int, Fl_Text_Editor* e) {
int l = 1;
char c = e->buffer()->character(e->insert_position());
if (c & 0x80 && c & 0x40) {
- l = utf_len(c);
+ l = fl_utf8len(c);
}
e->buffer()->select(e->insert_position(), e->insert_position()+l);
}
@@ -429,7 +409,7 @@ int Fl_Text_Editor::kf_delete(int, Fl_Text_Editor* e) {
int l = 1;
char c = e->buffer()->character(e->insert_position());
if (c & 0x80 && c & 0x40) {
- l = utf_len(c);
+ l = fl_utf8len(c);
}
e->buffer()->select(e->insert_position(), e->insert_position()+l);
}
diff --git a/src/fl_draw_image_mac.cxx b/src/fl_draw_image_mac.cxx
index 343e0f84c..5e7a1ce1e 100644
--- a/src/fl_draw_image_mac.cxx
+++ b/src/fl_draw_image_mac.cxx
@@ -75,7 +75,8 @@ static void innards(const uchar *buf, int X, int Y, int W, int H,
lut = CGColorSpaceCreateDeviceRGB();
CGDataProviderRef src = CGDataProviderCreateWithData( 0L, array, linedelta*H, 0L);
CGImageRef img = CGImageCreate( W, H, 8, 8*delta, linedelta,
- lut, delta&1?kCGImageAlphaNone:kCGImageAlphaNoneSkipLast,
+ //lut, delta&1?kCGImageAlphaNone:kCGImageAlphaNoneSkipLast,
+ lut, delta&1?kCGImageAlphaNone:kCGImageAlphaLast,
src, 0L, false, kCGRenderingIntentDefault);
// draw the image into the destination context
if (img) {
diff --git a/src/fl_utf.c b/src/fl_utf.c
index a48a785e2..e9ed34896 100644
--- a/src/fl_utf.c
+++ b/src/fl_utf.c
@@ -28,6 +28,11 @@
#include <string.h>
#include <stdlib.h>
+/** \addtogroup fl_unicode
+ @{
+*/
+
+
#if 0
/**
\defgroup fl_unichar Unicode Character Functions
@@ -844,3 +849,5 @@ int fl_utf8test(const char* src, unsigned srclen) {
}
return ret;
}
+
+/** @} */
diff --git a/src/fl_utf8.cxx b/src/fl_utf8.cxx
index d5416e7ef..c9a320600 100644
--- a/src/fl_utf8.cxx
+++ b/src/fl_utf8.cxx
@@ -76,6 +76,10 @@ extern "C" {
#undef fl_open
+/** \addtogroup fl_unicode
+ @{
+*/
+
/*** NOTE : all functions are LIMITED to 24 bits Unicode values !!! ***/
/*** but only 16 bits are really used under Linux and win32 ***/
@@ -793,6 +797,8 @@ void fl_make_path_for_file( const char *path )
free( p );
}
+/** @} */
+
//
// End of "$Id: $".
//