mirror of
https://git.code.sf.net/p/flwm/flwm
synced 2025-12-12 07:16:57 -05:00
Fixes for the cursor under fltk2.0
This commit is contained in:
70
Frame.C
70
Frame.C
@ -79,6 +79,9 @@ Frame::Frame(XWindow window, XWindowAttributes* existing) :
|
|||||||
max_w_button(BUTTON_LEFT,BUTTON_TOP+BUTTON_H,BUTTON_W,BUTTON_H,"w"),
|
max_w_button(BUTTON_LEFT,BUTTON_TOP+BUTTON_H,BUTTON_W,BUTTON_H,"w"),
|
||||||
min_w_button(BUTTON_LEFT,BUTTON_TOP+2*BUTTON_H,BUTTON_W,BUTTON_H,"W")
|
min_w_button(BUTTON_LEFT,BUTTON_TOP+2*BUTTON_H,BUTTON_W,BUTTON_H,"W")
|
||||||
{
|
{
|
||||||
|
#if FL_MAJOR_VERSION > 1
|
||||||
|
clear_double_buffer();
|
||||||
|
#endif
|
||||||
close_button.callback(button_cb_static);
|
close_button.callback(button_cb_static);
|
||||||
iconize_button.callback(button_cb_static);
|
iconize_button.callback(button_cb_static);
|
||||||
max_h_button.type(FL_TOGGLE_BUTTON);
|
max_h_button.type(FL_TOGGLE_BUTTON);
|
||||||
@ -1023,8 +1026,8 @@ void Frame::set_size(int nx, int ny, int nw, int nh, int warp) {
|
|||||||
int minh = (nh < h()) ? nh : h();
|
int minh = (nh < h()) ? nh : h();
|
||||||
XClearArea(fl_display, fl_xid(this), 0, minh-BOTTOM, w(), BOTTOM, 1);
|
XClearArea(fl_display, fl_xid(this), 0, minh-BOTTOM, w(), BOTTOM, 1);
|
||||||
// see if label or close box moved, erase the minimum area:
|
// see if label or close box moved, erase the minimum area:
|
||||||
int old_label_y = label_y;
|
// int old_label_y = label_y;
|
||||||
int old_label_h = label_h;
|
// int old_label_h = label_h;
|
||||||
h(nh); show_hide_buttons();
|
h(nh); show_hide_buttons();
|
||||||
#if 1 //def SHOW_CLOCK
|
#if 1 //def SHOW_CLOCK
|
||||||
int t = label_y + 3; // we have to clear the entire label area
|
int t = label_y + 3; // we have to clear the entire label area
|
||||||
@ -1247,7 +1250,8 @@ void Frame::draw() {
|
|||||||
#else
|
#else
|
||||||
# if FL_MAJOR_VERSION>1
|
# if FL_MAJOR_VERSION>1
|
||||||
static fltk::FrameBox framebox(0,"AAAAJJWWNNTT");
|
static fltk::FrameBox framebox(0,"AAAAJJWWNNTT");
|
||||||
framebox.draw(0,0,w(),h(),style(),fltk::INVISIBLE); // INVISIBLE = draw edge only
|
drawstyle(style(),fltk::INVISIBLE); // INVISIBLE = draw edge only
|
||||||
|
framebox.draw(Rectangle(w(),h()));
|
||||||
# else
|
# else
|
||||||
fl_frame("AAAAWWJJTTNN",0,0,w(),h());
|
fl_frame("AAAAWWJJTTNN",0,0,w(),h());
|
||||||
# endif
|
# endif
|
||||||
@ -1297,10 +1301,10 @@ void Frame::redraw_clock() {
|
|||||||
|
|
||||||
void FrameButton::draw() {
|
void FrameButton::draw() {
|
||||||
#if FL_MAJOR_VERSION>1
|
#if FL_MAJOR_VERSION>1
|
||||||
const int x = 0;
|
const int x = value()?1:0;
|
||||||
const int y = 0;
|
const int y = x;
|
||||||
FL_UP_BOX->draw(0,0,w(),h(),style(),
|
drawstyle(style(),flags()|fltk::OUTPUT);
|
||||||
value() ? (fltk::INVISIBLE|fltk::VALUE) : fltk::INVISIBLE);
|
FL_UP_BOX->draw(Rectangle(w(),h()));
|
||||||
#else
|
#else
|
||||||
const int x = this->x();
|
const int x = this->x();
|
||||||
const int y = this->y();
|
const int y = this->y();
|
||||||
@ -1456,17 +1460,17 @@ void Frame::set_cursor(int r) {
|
|||||||
c = FL_CURSOR_NESW;
|
c = FL_CURSOR_NESW;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#if FL_MAJOR_VERSION>1
|
||||||
|
cursor(c);
|
||||||
|
#else
|
||||||
static Frame* previous_frame;
|
static Frame* previous_frame;
|
||||||
static Fl_Cursor previous_cursor;
|
static Fl_Cursor previous_cursor;
|
||||||
if (this != previous_frame || c != previous_cursor) {
|
if (this != previous_frame || c != previous_cursor) {
|
||||||
previous_frame = this;
|
previous_frame = this;
|
||||||
previous_cursor = c;
|
previous_cursor = c;
|
||||||
#if FL_MAJOR_VERSION>1
|
|
||||||
cursor(c);
|
|
||||||
#else
|
|
||||||
cursor(c, CURSOR_FG_SLOT, CURSOR_BG_SLOT);
|
cursor(c, CURSOR_FG_SLOT, CURSOR_BG_SLOT);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef AUTO_RAISE
|
#ifdef AUTO_RAISE
|
||||||
@ -1488,10 +1492,17 @@ static Frame* cursor_inside = 0;
|
|||||||
int Frame::handle(int e) {
|
int Frame::handle(int e) {
|
||||||
static int what, dx, dy, ix, iy, iw, ih;
|
static int what, dx, dy, ix, iy, iw, ih;
|
||||||
// see if child widget handles event:
|
// see if child widget handles event:
|
||||||
if (Fl_Window::handle(e) && e != FL_ENTER && e != FL_MOVE) {
|
#if FL_MAJOR_VERSION > 1
|
||||||
|
if (fltk::Group::handle(e) && e != FL_ENTER && e != FL_MOVE) {
|
||||||
if (e == FL_PUSH) set_cursor(-1);
|
if (e == FL_PUSH) set_cursor(-1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (Fl_Group::handle(e) && e != FL_ENTER && e != FL_MOVE) {
|
||||||
|
if (e == FL_PUSH) set_cursor(-1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
switch (e) {
|
switch (e) {
|
||||||
|
|
||||||
case FL_SHOW:
|
case FL_SHOW:
|
||||||
@ -1521,42 +1532,33 @@ int Frame::handle(int e) {
|
|||||||
#endif
|
#endif
|
||||||
goto GET_CROSSINGS;
|
goto GET_CROSSINGS;
|
||||||
|
|
||||||
case 0:
|
case FL_MOVE:
|
||||||
GET_CROSSINGS:
|
GET_CROSSINGS:
|
||||||
// set cursor_inside to true when the mouse is inside a window
|
// set cursor_inside to true when the mouse is inside a window
|
||||||
// set it false when mouse is on a frame or outside a window.
|
// set it false when mouse is on a frame or outside a window.
|
||||||
// fltk mangles the X enter/leave events, we need the original ones:
|
// fltk mangles the X enter/leave events, we need the original ones:
|
||||||
|
|
||||||
switch (fl_xevent->type) {
|
switch (fl_xevent->type) {
|
||||||
case EnterNotify:
|
|
||||||
|
|
||||||
// see if cursor skipped over frame and directly to interior:
|
|
||||||
if (fl_xevent->xcrossing.detail == NotifyVirtual ||
|
|
||||||
fl_xevent->xcrossing.detail == NotifyNonlinearVirtual)
|
|
||||||
cursor_inside = this;
|
|
||||||
|
|
||||||
else {
|
|
||||||
// cursor is now pointing at frame:
|
|
||||||
cursor_inside = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// fall through to FL_MOVE:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LeaveNotify:
|
case LeaveNotify:
|
||||||
if (fl_xevent->xcrossing.detail == NotifyInferior) {
|
if (fl_xevent->xcrossing.detail == NotifyInferior) {
|
||||||
// cursor moved from frame to interior
|
// cursor moved from frame to interior
|
||||||
cursor_inside = this;
|
cursor_inside = this;
|
||||||
set_cursor(-1);
|
break;
|
||||||
|
} else {
|
||||||
|
// cursor moved to another window
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 1;
|
|
||||||
|
|
||||||
default:
|
case EnterNotify:
|
||||||
return 0; // other X event we don't understand
|
// see if cursor skipped over frame and directly to interior:
|
||||||
|
if (fl_xevent->xcrossing.detail == NotifyVirtual ||
|
||||||
|
fl_xevent->xcrossing.detail == NotifyNonlinearVirtual)
|
||||||
|
cursor_inside = this;
|
||||||
|
else {
|
||||||
|
// cursor is now pointing at frame:
|
||||||
|
cursor_inside = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case FL_MOVE:
|
|
||||||
if (Fl::belowmouse() != this || cursor_inside == this)
|
if (Fl::belowmouse() != this || cursor_inside == this)
|
||||||
set_cursor(-1);
|
set_cursor(-1);
|
||||||
else
|
else
|
||||||
|
|||||||
@ -150,6 +150,7 @@ static struct {int key; void (*func)();} keybindings[] = {
|
|||||||
{0}};
|
{0}};
|
||||||
|
|
||||||
int Handle_Hotkey() {
|
int Handle_Hotkey() {
|
||||||
|
#if 0
|
||||||
for (int i = 0; keybindings[i].key; i++) {
|
for (int i = 0; keybindings[i].key; i++) {
|
||||||
if (Fl::test_shortcut(keybindings[i].key) ||
|
if (Fl::test_shortcut(keybindings[i].key) ||
|
||||||
(keybindings[i].key & 0xFFFF) == FL_Delete
|
(keybindings[i].key & 0xFFFF) == FL_Delete
|
||||||
@ -159,6 +160,7 @@ int Handle_Hotkey() {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
3
main.C
3
main.C
@ -43,10 +43,11 @@ static int xerror_handler(Display* d, XErrorEvent* e) {
|
|||||||
class Fl_Root : public Fl_Window {
|
class Fl_Root : public Fl_Window {
|
||||||
int handle(int);
|
int handle(int);
|
||||||
public:
|
public:
|
||||||
Fl_Root() : Fl_Window(0,0,Fl::w(),Fl::h()) {}
|
Fl_Root() : Fl_Window(0,0,Fl::w(),Fl::h()) {clear_double_buffer();}
|
||||||
void show() {
|
void show() {
|
||||||
if (!shown()) Fl_X::set_xid(this, RootWindow(fl_display, fl_screen));
|
if (!shown()) Fl_X::set_xid(this, RootWindow(fl_display, fl_screen));
|
||||||
}
|
}
|
||||||
|
void flush() {}
|
||||||
};
|
};
|
||||||
Fl_Window *Root;
|
Fl_Window *Root;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user