diff --git a/rainbow/Gtk/DrawImage.cpp b/rainbow/Gtk/DrawImage.cpp index 27faa7db8..fdb81974b 100644 --- a/rainbow/Gtk/DrawImage.cpp +++ b/rainbow/Gtk/DrawImage.cpp @@ -166,23 +166,25 @@ void BackDraw::Destroy() { } +#define FCURSOR_(x) { static Image h; ONCELOCK { h = CreateImage(Size(1, 1), Black); h.SetAuxData(x + 1); } return h; } -Image Image::Arrow() { return Null; } -Image Image::Hand() { return Null; } -Image Image::Wait() { return Null; } -Image Image::IBeam() { return Null; } -Image Image::No() { return Null; } -Image Image::SizeAll() { return Null; } -Image Image::SizeHorz() { return Null; } -Image Image::SizeVert() { return Null; } -Image Image::SizeTopLeft() { return Null; } -Image Image::SizeTop() { return Null; } -Image Image::SizeTopRight() { return Null; } -Image Image::SizeLeft() { return Null; } -Image Image::SizeRight() { return Null; } -Image Image::SizeBottomLeft() { return Null; } -Image Image::SizeBottom() { return Null; } -Image Image::SizeBottomRight() { return Null; } +Image Image::Arrow() FCURSOR_(GDK_LEFT_PTR) +Image Image::Wait() FCURSOR_(GDK_WATCH) +Image Image::IBeam() FCURSOR_(GDK_XTERM) +Image Image::No() FCURSOR_(GDK_CIRCLE) +Image Image::SizeAll() FCURSOR_(GDK_FLEUR) +Image Image::SizeHorz() FCURSOR_(GDK_SB_H_DOUBLE_ARROW) +Image Image::SizeVert() FCURSOR_(GDK_DOUBLE_ARROW) +Image Image::SizeTopLeft() FCURSOR_(GDK_TOP_LEFT_CORNER) +Image Image::SizeTop() FCURSOR_(GDK_TOP_SIDE) +Image Image::SizeTopRight() FCURSOR_(GDK_TOP_RIGHT_CORNER) +Image Image::SizeLeft() FCURSOR_(GDK_LEFT_SIDE) +Image Image::SizeRight() FCURSOR_(GDK_RIGHT_SIDE) +Image Image::SizeBottomLeft() FCURSOR_(GDK_BOTTOM_LEFT_CORNER) +Image Image::SizeBottom() FCURSOR_(GDK_BOTTOM_SIDE) +Image Image::SizeBottomRight() FCURSOR_(GDK_BOTTOM_RIGHT_CORNER) +Image Image::Cross() FCURSOR_(GDK_CROSSHAIR) +Image Image::Hand() FCURSOR_(GDK_HAND1) END_UPP_NAMESPACE diff --git a/rainbow/Gtk/Gtk.h b/rainbow/Gtk/Gtk.h index 8fe07b4f5..f534823bf 100644 --- a/rainbow/Gtk/Gtk.h +++ b/rainbow/Gtk/Gtk.h @@ -139,6 +139,7 @@ void DrawDragRect(SystemDraw& w, const Rect& rect1, const Rect& rect2, const Rec #define GUIPLATFORM_CTRL_TOP_DECLS \ GtkWidget *window; \ GtkIMContext *im_context; \ + int64 cursor_id; //$ } #define GUIPLATFORM_CTRL_DECLS_INCLUDE diff --git a/rainbow/Gtk/Wnd.cpp b/rainbow/Gtk/Wnd.cpp index 520cac2a7..1a4473d10 100644 --- a/rainbow/Gtk/Wnd.cpp +++ b/rainbow/Gtk/Wnd.cpp @@ -74,6 +74,7 @@ void Ctrl::Create(Ctrl *owner, bool popup) top = new Top; top->window = gtk_window_new(popup ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); + top->cursor_id = -1; gtk_widget_set_events(top->window, 0xffffffff); g_signal_connect(top->window, "event", G_CALLBACK(GtkProc), this); if(owner && owner->top) @@ -117,6 +118,35 @@ Vector Ctrl::GetTopCtrls() void Ctrl::SetMouseCursor(const Image& image) { GuiLock __; + int64 id = image.GetSerialId(); + Ctrl *topctrl; + Top *top; + if(mouseCtrl) + topctrl = mouseCtrl->GetTopCtrl(); + if(topctrl) + top = topctrl->top; + if(top && id != top->cursor_id) { + top->cursor_id = id; + int64 aux = image.GetAuxData(); + GdkCursor *c = NULL; + if(aux) + c = gdk_cursor_new((GdkCursorType)(aux - 1)); + else + if(IsNull(image)) + c = gdk_cursor_new(GDK_BLANK_CURSOR); + else { + Point p = image.GetHotSpot(); + ImageGdk m; + m.Set(image); + GdkPixbuf *pb = m; + if(pb) + c = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), pb, p.x, p.y); + } + if(c) { + gdk_window_set_cursor(topctrl->gdk(), c); + gdk_cursor_unref(c); + } + } } Ctrl *Ctrl::GetOwner() diff --git a/rainbow/GtkMain/main.cpp b/rainbow/GtkMain/main.cpp index 93b68514d..300e71eee 100644 --- a/rainbow/GtkMain/main.cpp +++ b/rainbow/GtkMain/main.cpp @@ -75,7 +75,19 @@ struct MyApp : TopWindow { pos = p; Refresh(); } - + + virtual Image CursorImage(Point p, dword keyflags) + { + Size sz = GetSize(); + if(p.x < sz.cx / 4) + return Image::Arrow(); + if(p.x < 2 * sz.cx / 4) + return Image::Hand(); + if(p.x < 3 * sz.cx / 4) + return CtrlImg::ibeam0(); + return CtrlImg::HelpCursor0(); + } + virtual void Paint(Draw& w) { int fcy = GetStdFontCy(); w.DrawRect(GetSize(), White());