From 2334ffcbf8d621c0d4feaa6c1323efc0c130e3dc Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 31 Mar 2019 22:09:10 +0200 Subject: [PATCH] WindowServer: Add a WSCursor class (a bitmap and a hotspot.) Also import a bunch of cursors I drew. Only the default ("arrow") cursor is ever used so far. --- Base/res/cursors/arrow.png | Bin 0 -> 466 bytes Base/res/cursors/disallowed.png | Bin 0 -> 500 bytes Base/res/cursors/i-beam.png | Bin 0 -> 280 bytes Base/res/cursors/resize-diagonal-bltr.png | Bin 0 -> 463 bytes Base/res/cursors/resize-diagonal-tlbr.png | Bin 0 -> 456 bytes Base/res/cursors/resize-horizontal.png | Bin 0 -> 7484 bytes Base/res/cursors/resize-vertical.png | Bin 0 -> 7461 bytes Servers/WindowServer/Makefile | 3 ++- Servers/WindowServer/WSCursor.cpp | 21 ++++++++++++++++ Servers/WindowServer/WSCursor.h | 22 +++++++++++++++++ Servers/WindowServer/WSWindowManager.cpp | 28 +++++++++++++--------- Servers/WindowServer/WSWindowManager.h | 14 ++++++++--- SharedGraphics/Point.h | 7 ++++++ 13 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 Base/res/cursors/arrow.png create mode 100644 Base/res/cursors/disallowed.png create mode 100644 Base/res/cursors/i-beam.png create mode 100644 Base/res/cursors/resize-diagonal-bltr.png create mode 100644 Base/res/cursors/resize-diagonal-tlbr.png create mode 100644 Base/res/cursors/resize-horizontal.png create mode 100644 Base/res/cursors/resize-vertical.png create mode 100644 Servers/WindowServer/WSCursor.cpp create mode 100644 Servers/WindowServer/WSCursor.h diff --git a/Base/res/cursors/arrow.png b/Base/res/cursors/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..427b92027a9c599512b1f3a1eedd01bf94c247d5 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0y~yVBlw9U=ZbCV_;yIIeW`?1_lPUByV>YhW{YAVDIwD z3=9mM1s;*b3=De8Ak0{?)V_>?fq}im)7O>#F|$0kw(&LXUTy{k2FViFh!W@g+}zZ> z5(ej@)Wnk16ovB4k_-iRPv3y>Mm}){21YAS7sn8b)4f-G{q8sjv^`vY{F%CrQ`3ni zjVA&p9dA5kTeHKFZ^C53rwnr%Si3m_OeV-DoS1R;`lOFMk2P1Otlo8h{i?g6dKw=+ z_Z+sl7n$hWAhv$Pl`@WBxoTkyyAJJMyAUH$vs!XIDFh5Zsc-%D9*C&!Wve7mV1v)&91ev zU*FNbwoG=#l-AQX+-|>r+YxvCQ_|wtsq$EqXsCOD&9?RJ-|pVyxN!v+X~6 z>jmdL3f5ejW_#)vPwaobS4T?r?z?|P?_2Q}`yE{`oFhy3+BW_QpSg6AO SHh&6=H3m;tKbLh*2~7aMZO63$ literal 0 HcmV?d00001 diff --git a/Base/res/cursors/disallowed.png b/Base/res/cursors/disallowed.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7d5f26cd40402b5225c0a04eefef501c8dbbc0 GIT binary patch literal 500 zcmeAS@N?(olHy`uVBq!ia0y~yU=Rgi4mJh`hLz$=r!g=vuqAoByDNJrDG?k8%Q7L2|{%qB@Ig{m!o4_%e0t<>Xf3DW+GB->gcIo~QR<)v9$G_byfMI4)9m)w*Ms>7Uj-RrBd0 z?~)tp3u|tqaZWQ@n!2b+c)H=u#cR4hM(z>+>Ufp0df|rN4-0&Y$`8rz>rZ#v(S5sr zg5OnJo?x%eK5U6s&CaZpXqlVBW*zz4T)3@FK+f*rihHg{ zO55T)V(Y$}g?_SUx_#sC?u`7!n>_QwQvNrsxP2@$L3#mPb7_iUrY>hIPM?{f09FDwxG{_EoME^$kTy9fB!z4B&YU|{fc^>bP0l+XkK$cNBu literal 0 HcmV?d00001 diff --git a/Base/res/cursors/i-beam.png b/Base/res/cursors/i-beam.png new file mode 100644 index 0000000000000000000000000000000000000000..febaa9d0a8976053d8545e8bb9461faa51b6f0c2 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0y~yU|?rpU=ZbCV_;zD^7-P-z`($k|H*Y zfq{Xuz$3Dlfk96hgc&QA+LwX!m3aEPvOi{)=hom`nm6et0|SF(iEBiObAE1aYF-J0 zb5UwyNotBhd1gt5g1e`0KzJjcI0FMigQtsQh{pM+mmIm640%{DTtCxcu&Zdb`-R{0 z)6Xr~F)=fChLht5CbmQQpX==!m;7*XRB>|FjhwN;yM=fCi9SjHIR(cViFVdQ&MBb@0Nn{=8~^|S literal 0 HcmV?d00001 diff --git a/Base/res/cursors/resize-diagonal-bltr.png b/Base/res/cursors/resize-diagonal-bltr.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6fc76681ff67618e198db296cb8849d79183ca GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0y~yU=Rgi4mJh`hLz$=r!g=vuqAoByDN|7(8Cz`!6`;u=xnoS&PUnpeW$ zT$GwvlA5AWo>`Ki;O^-g5Z=fq&cMKE?&;zfVsZNJR7bzV1_G}0g|~Z%vX&m6WL$Ed z^Mzyst9e6n!JK=ozMibJl~h`;uzIMZ9hBb?wELr&PGr}jkDuq;8*~0y{*-}VhA}ar zxygHhr~w;?;*#b$zbn^qEm*dQ_1VXVcUE!favV_Kz$)gP5I$j7r4^%J!|y4qyH4v-(u&vBTaE7%Q0Wv3%{SznMAv#O%*K?cxV! z+RW23)}Q)#Nl@_9Im(kiaaFLyHI}dB5nO$`FLRkjZ_qnt=kxpi3adU?yK2wGc6rW( zpEJBZ&b^eib$9K7MK{GOIAu<)J81Z6=lSrY-YaHig%98V*V@N0o4udw#)I%#3=9km Mp00i_>zopr0LW#wg8%>k literal 0 HcmV?d00001 diff --git a/Base/res/cursors/resize-diagonal-tlbr.png b/Base/res/cursors/resize-diagonal-tlbr.png new file mode 100644 index 0000000000000000000000000000000000000000..2c51df5bfb7aaf5c1662b7fedfd5c7ca1b94d1cd GIT binary patch literal 456 zcmeAS@N?(olHy`uVBq!ia0y~yU=Rgi4mJh`hLz$=r!g=vuqAoByDk6vN-J?mWU8(=t(*7%`QiFC0T#{)3|AUz z*>6QHY@1-as&>Kh{A=ycPMu-UYgE19HaVY7^n=t4#^MKSS#+FK|GL#q?K{0)-qAFX zM~=DufZPS~J6`u*{eDmv`}3~%d-nsJ7Z`4zyfU9TN=P&Ql#lP@jNj`Xh*U7dHL!k= zYm5(m5wI~bOLMBq{jvu6#+5>WtN&}Z@=ZA$7QODtL&1XSjPn_Vzur%u(){n*tc~mM>TSsq$S>eLCOczx7u}=D>Lt+uk4e$iTqB;OXk;vd$@? F2>^s2xSjw2 literal 0 HcmV?d00001 diff --git a/Base/res/cursors/resize-horizontal.png b/Base/res/cursors/resize-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b714f736cf0fc457aa5d21ea1e6556a86631e2 GIT binary patch literal 7484 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 + +WSCursor::WSCursor(Retained&& bitmap, const Point& hotspot) + : m_bitmap(move(bitmap)) + , m_hotspot(hotspot) +{ +} + +WSCursor::~WSCursor() +{ +} + +Retained WSCursor::create(Retained&& bitmap) +{ + return adopt(*new WSCursor(move(bitmap), bitmap->rect().center())); +} + +Retained WSCursor::create(Retained&& bitmap, const Point& hotspot) +{ + return adopt(*new WSCursor(move(bitmap), hotspot)); +} diff --git a/Servers/WindowServer/WSCursor.h b/Servers/WindowServer/WSCursor.h new file mode 100644 index 0000000000..7125ad2a78 --- /dev/null +++ b/Servers/WindowServer/WSCursor.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +class WSCursor : public Retainable { +public: + static Retained create(Retained&&, const Point& hotspot); + static Retained create(Retained&&); + ~WSCursor(); + + Point hotspot() const { return m_hotspot; } + const GraphicsBitmap& bitmap() const { return *m_bitmap; } + + Rect rect() const { return m_bitmap->rect(); } + Size size() const { return m_bitmap->size(); } + +private: + WSCursor(Retained&&, const Point&); + + RetainPtr m_bitmap; + Point m_hotspot; +}; diff --git a/Servers/WindowServer/WSWindowManager.cpp b/Servers/WindowServer/WSWindowManager.cpp index 2de9c04b98..23a8503115 100644 --- a/Servers/WindowServer/WSWindowManager.cpp +++ b/Servers/WindowServer/WSWindowManager.cpp @@ -16,6 +16,7 @@ #include #include #include +#include "WSCursor.h" #ifdef KERNEL #include @@ -199,8 +200,13 @@ WSWindowManager::WSWindowManager() m_highlight_window_border_color2 = Color::from_rgb(0xfabbbb); m_highlight_window_title_color = Color::White; - m_cursor_bitmap_inner = CharacterBitmap::create_from_ascii(cursor_bitmap_inner_ascii, 12, 17); - m_cursor_bitmap_outer = CharacterBitmap::create_from_ascii(cursor_bitmap_outer_ascii, 12, 17); + m_arrow_cursor = WSCursor::create(*GraphicsBitmap::load_from_file("/res/cursors/arrow.png"), { 2, 2 }); + m_resize_horizontally_cursor = WSCursor::create(*GraphicsBitmap::load_from_file("/res/cursors/resize-horizontal.png")); + m_resize_vertically_cursor = WSCursor::create(*GraphicsBitmap::load_from_file("/res/cursors/resize-vertical.png")); + m_resize_diagonally_tlbr_cursor = WSCursor::create(*GraphicsBitmap::load_from_file("/res/cursors/resize-diagonal-tlbr.png")); + m_resize_diagonally_bltr_cursor = WSCursor::create(*GraphicsBitmap::load_from_file("/res/cursors/resize-diagonal-bltr.png")); + m_i_beam_cursor = WSCursor::create(*GraphicsBitmap::load_from_file("/res/cursors/i-beam.png")); + m_disallowed_cursor = WSCursor::create(*GraphicsBitmap::load_from_file("/res/cursors/disallowed.png")); m_wallpaper_path = "/res/wallpapers/retro.rgb"; m_wallpaper = GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, m_wallpaper_path, { 1024, 768 }); @@ -880,9 +886,8 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_ void WSWindowManager::compose() { auto dirty_rects = move(m_dirty_rects); - auto cursor_location = m_screen.cursor_location(); dirty_rects.add(m_last_cursor_rect); - dirty_rects.add({ cursor_location.x(), cursor_location.y(), (int)m_cursor_bitmap_inner->width(), (int)m_cursor_bitmap_inner->height() }); + dirty_rects.add(current_cursor_rect()); #ifdef DEBUG_COUNTERS dbgprintf("[WM] compose #%u (%u rects)\n", ++m_compose_count, dirty_rects.rects().size()); #endif @@ -988,11 +993,14 @@ void WSWindowManager::compose() flush(r); } +Rect WSWindowManager::current_cursor_rect() const +{ + return { m_screen.cursor_location().translated(-active_cursor().hotspot()), active_cursor().size() }; +} + void WSWindowManager::invalidate_cursor() { - auto cursor_location = m_screen.cursor_location(); - Rect cursor_rect { cursor_location.x(), cursor_location.y(), (int)m_cursor_bitmap_inner->width(), (int)m_cursor_bitmap_inner->height() }; - invalidate(cursor_rect); + invalidate(current_cursor_rect()); } Rect WSWindowManager::menubar_rect() const @@ -1073,14 +1081,12 @@ void WSWindowManager::draw_window_switcher() void WSWindowManager::draw_cursor() { - auto cursor_location = m_screen.cursor_location(); - Rect cursor_rect { cursor_location.x(), cursor_location.y(), (int)m_cursor_bitmap_inner->width(), (int)m_cursor_bitmap_inner->height() }; + Rect cursor_rect = current_cursor_rect(); Color inner_color = Color::White; Color outer_color = Color::Black; if (m_screen.mouse_button_state() & (unsigned)MouseButton::Left) swap(inner_color, outer_color); - m_back_painter->draw_bitmap(cursor_location, *m_cursor_bitmap_inner, inner_color); - m_back_painter->draw_bitmap(cursor_location, *m_cursor_bitmap_outer, outer_color); + m_back_painter->blit(cursor_rect.location(), active_cursor().bitmap(), active_cursor().rect()); m_last_cursor_rect = cursor_rect; } diff --git a/Servers/WindowServer/WSWindowManager.h b/Servers/WindowServer/WSWindowManager.h index 62e5a2eb50..751ad94f44 100644 --- a/Servers/WindowServer/WSWindowManager.h +++ b/Servers/WindowServer/WSWindowManager.h @@ -13,6 +13,7 @@ #include #include #include +#include #include class WSAPIClientRequest; @@ -23,7 +24,6 @@ class WSClientWantsToPaintMessage; class WSWindow; class WSClientConnection; class WSWindowSwitcher; -class CharacterBitmap; class GraphicsBitmap; enum class ResizeDirection { None, Left, UpLeft, Up, UpRight, Right, DownRight, Down, DownLeft }; @@ -84,6 +84,9 @@ public: bool set_wallpaper(const String& path); String wallpaper_path() const { return m_wallpaper_path; } + const WSCursor& active_cursor() const { return *m_arrow_cursor; } + Rect current_cursor_rect() const; + private: void process_mouse_event(WSMouseEvent&, WSWindow*& event_window); bool process_ongoing_window_resize(WSMouseEvent&, WSWindow*& event_window); @@ -154,8 +157,13 @@ private: bool m_pending_compose_event { false }; - RetainPtr m_cursor_bitmap_inner; - RetainPtr m_cursor_bitmap_outer; + RetainPtr m_arrow_cursor; + RetainPtr m_resize_horizontally_cursor; + RetainPtr m_resize_vertically_cursor; + RetainPtr m_resize_diagonally_tlbr_cursor; + RetainPtr m_resize_diagonally_bltr_cursor; + RetainPtr m_i_beam_cursor; + RetainPtr m_disallowed_cursor; OwnPtr m_back_painter; OwnPtr m_front_painter; diff --git a/SharedGraphics/Point.h b/SharedGraphics/Point.h index 5a00512b7d..87680ce22f 100644 --- a/SharedGraphics/Point.h +++ b/SharedGraphics/Point.h @@ -28,6 +28,13 @@ public: move_by(delta.x(), delta.y()); } + Point translated(const Point& delta) const + { + Point point = *this; + point.move_by(delta); + return point; + } + Point translated(int dx, int dy) const { Point point = *this;