summaryrefslogtreecommitdiff
path: root/src/user/include
diff options
context:
space:
mode:
authorBenji Dial <benji6283@gmail.com>2021-03-08 14:46:19 -0500
committerBenji Dial <benji6283@gmail.com>2021-03-08 14:46:19 -0500
commit8221fd5451f094defa9866f98026b74a969f7693 (patch)
tree9f0e9595fd15bdecbe667f823deded7428547b44 /src/user/include
parent1a5ece4f52ef17c7c868e95eb26e98137d5cab6f (diff)
downloadportland-os-8221fd5451f094defa9866f98026b74a969f7693.tar.gz
resizable widgets, default widget implementation for some functions, reimplementing meminfo in raleigh
Diffstat (limited to 'src/user/include')
-rw-r--r--src/user/include/cxx/raleigh/w/button.h4
-rw-r--r--src/user/include/cxx/raleigh/w/label.h12
-rw-r--r--src/user/include/cxx/raleigh/w/padding.h4
-rw-r--r--src/user/include/cxx/raleigh/w/vbox.h4
-rw-r--r--src/user/include/cxx/raleigh/widget.h28
-rw-r--r--src/user/include/cxx/raleigh/window.h6
-rw-r--r--src/user/include/cxx/structs/duple.h13
-rw-r--r--src/user/include/knob/key.h3
8 files changed, 48 insertions, 26 deletions
diff --git a/src/user/include/cxx/raleigh/w/button.h b/src/user/include/cxx/raleigh/w/button.h
index 03e17ab..71ccae2 100644
--- a/src/user/include/cxx/raleigh/w/button.h
+++ b/src/user/include/cxx/raleigh/w/button.h
@@ -12,10 +12,8 @@ namespace raleigh {
void notify_window_change() override;
void paint(_pixel_t *pixbuf, uint32_t pitch) override;
void handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) override;
+ void notify_child_size_change(widget &child, coord old_size) override;
void notify_has_opaque_parent(widget *parent) override;
- void handle_key(struct key_packet kp) override;
- void on_focus() override;
- void on_unfocus() override;
private:
widget &inner;
void (*on_click)(button &);
diff --git a/src/user/include/cxx/raleigh/w/label.h b/src/user/include/cxx/raleigh/w/label.h
index 4b1dae2..a78ce46 100644
--- a/src/user/include/cxx/raleigh/w/label.h
+++ b/src/user/include/cxx/raleigh/w/label.h
@@ -7,19 +7,17 @@
namespace raleigh {
class label : public widget {
public:
- //this pointer is used directly, and the contents of the string should not be changed afterward
+ //value's data is copied
label(const char *value, const char *font="fixed-10", bool bg_transparent=true,
_pixel_t fg=RGB(00, 00, 00), _pixel_t bg=RGB(bf, bf, bf));
- void notify_window_change() override;
+ void change_value(const char *new_value);
+
void paint(_pixel_t *pixbuf, uint32_t pitch) override;
- void handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) override;
void notify_has_opaque_parent(widget *parent) override;
- void handle_key(struct key_packet kp) override;
- void on_focus() override;
- void on_unfocus() override;
private:
- const char *const value;
+ char *value;
+ uint32_t v_size;
const struct font_info *const fi;
bool bg_transparent;
const _pixel_t fg;
diff --git a/src/user/include/cxx/raleigh/w/padding.h b/src/user/include/cxx/raleigh/w/padding.h
index 792e204..1bdb9ee 100644
--- a/src/user/include/cxx/raleigh/w/padding.h
+++ b/src/user/include/cxx/raleigh/w/padding.h
@@ -12,9 +12,7 @@ namespace raleigh {
void paint(_pixel_t *pixbuf, uint32_t pitch) override;
void handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) override;
void notify_has_opaque_parent(widget *parent) override;
- void handle_key(struct key_packet kp) override;
- void on_focus() override;
- void on_unfocus() override;
+ void notify_child_size_change(widget &child, coord old_size) override;
private:
widget &inner;
uint32_t pad_by;
diff --git a/src/user/include/cxx/raleigh/w/vbox.h b/src/user/include/cxx/raleigh/w/vbox.h
index 02bffd3..f715f95 100644
--- a/src/user/include/cxx/raleigh/w/vbox.h
+++ b/src/user/include/cxx/raleigh/w/vbox.h
@@ -14,9 +14,7 @@ namespace raleigh {
void paint(_pixel_t *pixbuf, uint32_t pitch) override;
void handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) override;
void notify_has_opaque_parent(widget *parent) override;
- void handle_key(struct key_packet kp) override;
- void on_focus() override;
- void on_unfocus() override;
+ void notify_child_size_change(widget &from, coord old_size) override;
private:
dllist<widget &> widgets;
};
diff --git a/src/user/include/cxx/raleigh/widget.h b/src/user/include/cxx/raleigh/widget.h
index 54b9287..1b2cf6f 100644
--- a/src/user/include/cxx/raleigh/widget.h
+++ b/src/user/include/cxx/raleigh/widget.h
@@ -12,12 +12,15 @@ namespace raleigh {
namespace raleigh {
class widget {
public:
- coord size;
-
- //set by window class (or parent widget)
+ //these three are set by window class (or parent widget)
+ widget *parent;//set to zero when root widget
window *w;
coord window_offset;
+ //derived classes should not set this outside of the initializer
+ //instead, they should call widget::set_size(coord)
+ coord size;
+
//fewest steps up that a widget can be redrawn without needing its parents
//if a widget is opaque, it will set this to a pointer to itself, and then call
// notify_has_opaque_parent on any children, passing itself as an argument.
@@ -25,14 +28,21 @@ namespace raleigh {
// and then call notify_has_opaque_parent on any children (with the opaque parent).
widget *closest_opaque;
- //called by window class (or parent widget)
- virtual void notify_window_change() = 0;
+ //these are called by window class (or parent widgets)
+ virtual void notify_window_change();
virtual void paint(_pixel_t *pixbuf, uint32_t pitch) = 0;
- virtual void handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) = 0;
+ virtual void handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up);
virtual void notify_has_opaque_parent(widget *parent) = 0;
- virtual void handle_key(struct key_packet kp) = 0;
- virtual void on_focus() = 0;
- virtual void on_unfocus() = 0;
+ virtual void handle_key(struct key_packet kp);
+ virtual void on_focus();
+ virtual void on_unfocus();
+ //this next one is not to be called by child widgets
+ //they should call window::notify_widget_size_change(widget &), which will call this if necessary
+ virtual void notify_child_size_change(widget &child, coord old_size);
+
+ protected:
+ widget();
+ void set_size(coord to);
};
}
diff --git a/src/user/include/cxx/raleigh/window.h b/src/user/include/cxx/raleigh/window.h
index 21ae511..0dd9341 100644
--- a/src/user/include/cxx/raleigh/window.h
+++ b/src/user/include/cxx/raleigh/window.h
@@ -7,6 +7,8 @@ namespace raleigh {
#include <raleigh/runtime.h>
#include <raleigh/widget.h>
+#include <structs/dllist.h>
+#include <structs/duple.h>
#include <pland/syscall.h>
#include <raleigh/util.h>
@@ -16,7 +18,10 @@ namespace raleigh {
public:
//pass on_close to specify a close handler. if on_close returns false, the window will not be closed.
window(widget &root, _pixel_t bg_color=RGB(bf, bf, bf), bool (*on_close)(window &)=0);
+ void add_keybind(struct key_packet kp, void (*handler)(window &));
+
void notify_needs_paint(widget &from);
+ void notify_widget_size_change(widget &from, coord old_size);
enum try_actions_return_t {NONE, GOOD, DELETE};
try_actions_return_t try_actions();
void show();
@@ -31,6 +36,7 @@ namespace raleigh {
bool needs_repaint;
void paint_full();
bool (*on_close)(window &);
+ dllist<duple<struct key_packet, void (*)(window &)>> keybinds;
};
}
diff --git a/src/user/include/cxx/structs/duple.h b/src/user/include/cxx/structs/duple.h
new file mode 100644
index 0000000..874e4f6
--- /dev/null
+++ b/src/user/include/cxx/structs/duple.h
@@ -0,0 +1,13 @@
+#ifndef STRUCTS_DUPLE_H
+#define STRUCTS_DUPLE_H
+
+template<class at, class bt>
+class duple {
+public:
+ duple(at a, bt b)
+ : a(a), b(b) {}
+ at a;
+ bt b;
+};
+
+#endif \ No newline at end of file
diff --git a/src/user/include/knob/key.h b/src/user/include/knob/key.h
index d532afd..3597e2a 100644
--- a/src/user/include/knob/key.h
+++ b/src/user/include/knob/key.h
@@ -7,7 +7,8 @@ extern "C" {
#include <keypack.h>
-char key_to_char(struct key_packet kp) __attribute__ ((pure));
+char key_to_char(struct key_packet kp) __attribute__ ((const));
+bool match_side_agnostic(struct key_packet a, struct key_packet b) __attribute__ ((const));
#ifdef __cplusplus
}