Compare commits

...

77 Commits

Author SHA1 Message Date
IoIxD
30a100fd28 wayland/opengl: set EGL_DEPTH_SIZE to 24 2026-01-03 19:21:03 -07:00
IoIxD
a148b3bedf wayland: use mutexes to ensure that MwLLDestroyImpl never conflicts with wayland events. 2026-01-03 18:27:34 -07:00
IoIxD
bed668b84a wayland: fix misc. crashes on the destruction of widgets 2026-01-02 14:19:48 -07:00
NishiOwO
6183a1ccda update license 2026-01-02 00:24:59 +09:00
IoIxD
f32f6cefc0 wayland: accidentally removed event_loop call from MwLLNextEventImpl 2025-12-30 22:44:04 -07:00
IoIxD
f3683dece3 undo HAS_OPENGL stuff 2025-12-30 22:38:01 -07:00
IoIxD
808495cccf wayland: misc fixes 2025-12-30 22:28:36 -07:00
IoIxD
6946c1eaf3 wayland: opengl support 2025-12-30 22:26:19 -07:00
IoIxD
029e62d765 wayland: opengl 2025-12-30 20:30:29 -07:00
IoIxD
a03065ae52 wayland: forgot to commit .h 2025-12-30 19:16:01 -07:00
IoIxD
324257c43f wayland: no pthreads needed 2025-12-30 19:15:33 -07:00
IoIxD
afecb04848 clipboard: don't set clipboard after pasting 2025-12-30 17:14:57 -07:00
IoIxD
bed63dd245 clipboard: fix syntax 2025-12-30 17:14:39 -07:00
IoIxD
67bd6029af wayland: finish clipboard 2025-12-30 17:12:12 -07:00
NishiOwO
72820e87f1 rename clipboard_received to clipboard 2025-12-31 04:35:10 +09:00
NishiOwO
d3147ac087 format 2025-12-31 04:29:27 +09:00
NishiOwO
4bdda59693 better api for clipboard 2025-12-31 04:29:13 +09:00
NishiOwO
823c865791 handle WM_DELETE_WINDOW better 2025-12-31 00:48:44 +09:00
NishiOwO
3f9125d1ae fix 2025-12-30 23:54:30 +09:00
NishiOwO
549d235893 better 2025-12-28 21:56:45 +09:00
NishiOwO
0daa527b1d fix 2025-12-28 18:03:37 +09:00
NishiOwO
0ca7f6ed8a dispatch children_update 2025-12-28 17:41:11 +09:00
NishiOwO
e895e96941 introduce MwNleftPadding to label 2025-12-25 15:39:54 +09:00
NishiOwO
0d79141a49 tiny fix 2025-12-25 04:21:33 +09:00
NishiOwO
c80987ffe4 better 2025-12-25 04:18:12 +09:00
NishiOwO
d3a7b0a01d oops 2025-12-25 04:03:05 +09:00
NishiOwO
e77c4f3c38 add MwNleftPadding to SubMenu 2025-12-25 03:56:04 +09:00
NishiOwO
22b4737c33 better separator 2025-12-25 02:27:41 +09:00
NishiOwO
509351a0a0 fix submenu 2025-12-25 00:19:27 +09:00
NishiOwO
86effbdfd7 fix 2025-12-24 22:52:26 +09:00
NishiOwO
7b47524286 improve submenu 2025-12-24 13:56:08 +09:00
NishiOwO
c8e7f58230 wrong 2025-12-23 22:11:22 +09:00
NishiOwO
9ea54b4f88 format 2025-12-23 22:08:55 +09:00
NishiOwO
55f82e4fbc update 2025-12-23 22:08:49 +09:00
NishiOwO
a23016bc05 yes 2025-12-23 18:14:00 +09:00
NishiOwO
df99e66d87 tiny fix 2025-12-23 18:10:50 +09:00
NishiOwO
e9fd2705d4 fix 2025-12-21 23:05:42 +09:00
NishiOwO
a824b4fc44 oops 2025-12-21 23:04:53 +09:00
NishiOwO
c7c8f236b0 yes 2025-12-21 23:03:33 +09:00
NishiOwO
bdc67d6369 text shadow 2025-12-21 23:02:02 +09:00
NishiOwO
873c75b882 fix 2025-12-21 22:21:10 +09:00
NishiOwO
e44eaa2c16 fix 2025-12-21 22:02:33 +09:00
NishiOwO
0d281c09ce i will work on vms port at some point 2025-12-21 20:25:57 +09:00
NishiOwO
2b30a06ecf wip VMS port 2025-12-21 19:29:05 +09:00
NishiOwO
188da6803e adjust some stuff 2025-12-21 15:33:48 +09:00
NishiOwO
2304b493d1 add MwNlength 2025-12-21 15:17:00 +09:00
NishiOwO
91d9677bf7 add seven segment 2025-12-21 14:38:07 +09:00
NishiOwO
f09960195f submenu 2025-12-21 12:08:08 +09:00
NishiOwO
ab9d0ffc5f improve submenu 2025-12-21 11:53:47 +09:00
NishiOwO
a67a0c11f8 fix 2025-12-19 23:31:05 +09:00
NishiOwO
dc8168df12 fix 2025-12-19 22:36:49 +09:00
NishiOwO
604ff72d6e add MwNbitmapFont 2025-12-19 22:35:35 +09:00
IoIxD
a384add9e9 wayland: properly do MwLLPending and MwLLNextEvent 2025-12-18 23:50:03 -07:00
IoIxD
6123fd1304 wayland: implement tool windows. add destructors for protocols 2025-12-18 23:32:51 -07:00
IoIxD
b7488b9440 wayland: seperate MwLLPending and MwLLNextEvent 2025-12-18 19:59:40 -07:00
IoIxD
18511dec2f wayland: remove a few unused fields 2025-12-18 18:27:44 -07:00
IoIxD
59ff6f1008 wayland: add icon support 2025-12-18 18:21:57 -07:00
IoIxD
a27a01ce41 wayland: MwLLGetClipboardImpl. 2025-12-18 17:46:23 -07:00
IoIxD
b0f4713ff1 wayland: remove unused cursor_shape 2025-12-18 13:46:22 -07:00
IoIxD
8d4e845e7c wayland: MwLLGetScreenSize 2025-12-18 13:43:45 -07:00
IoIxD
aeaf0a4547 wayland: MwLLGetCursorCoordImpl 2025-12-18 13:16:16 -07:00
IoIxD
b366fc12a7 Merge branch 'master' of ssh://gitea.nishi.boats:2222/pyrite-dev/milsko 2025-12-18 13:15:20 -07:00
IoIxD
d8c08f80d6 wayland: cursor support 2025-12-18 13:15:03 -07:00
NishiOwO
bfa0a5811e fix 2025-12-19 04:38:29 +09:00
NishiOwO
19f52488b8 fancy things 2025-12-19 03:57:45 +09:00
IoIxD
c6e7421b31 wayland: key modifiers 2025-12-18 11:36:04 -07:00
IoIxD
e3b3363e42 Merge branch 'master' of ssh://gitea.nishi.boats:2222/pyrite-dev/milsko 2025-12-18 11:29:12 -07:00
IoIxD
a815998ace wayland: fix pointer 2025-12-18 11:26:51 -07:00
NishiOwO
75749697ba netbsd wants pthread. idk why 2025-12-19 03:01:12 +09:00
NishiOwO
c9c3a00ed3 unrelated changes 2025-12-19 02:55:30 +09:00
NishiOwO
012650f06f tiny change 2025-12-19 01:37:02 +09:00
NishiOwO
72fbba1a74 force aliasing 2025-12-18 12:24:06 +09:00
IoIxD
b8a92f4ae0 wayland: buffer destroy/recreate in SetWHImpl too 2025-12-17 19:44:15 -07:00
IoIxD
724b008220 impl resizing in wayland 2025-12-17 19:41:05 -07:00
IoIxD
320de34ce8 remove opengl from wayland in favor of cairo 2025-12-17 19:14:54 -07:00
NishiOwO
d117241ba7 math 2025-12-18 11:08:23 +09:00
NishiOwO
1907dd5d49 optimization 2025-12-18 10:57:10 +09:00
52 changed files with 2704 additions and 722 deletions

2
.gitignore vendored
View File

@@ -5,10 +5,12 @@ examples/*/*.exe
!examples/*/
!examples/*.*
!examples/*/*.*
*.exe
*.o
*.so
*.dll
*.lib
*.a
/Makefile
/build
compile_flags.txt

View File

@@ -195,7 +195,6 @@ target_compile_definitions(
_MILSKO
)
include(GNUInstallDirs)
install(
TARGETS Mw
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}

View File

@@ -1,4 +1,4 @@
Copyright (c) 2025, Pyrite development team
Copyright (c) 2025-2026, Pyrite development team
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@@ -56,14 +56,16 @@ my %features = (
"vulkan" => "build Vulkan widget",
"vulkan-string-helper" => "use Vulkan string helper",
"shared" => "build shared library",
"static" => "build static library"
"static" => "build static library",
"experimental-wayland" => "enable WIP wayland backend",
);
my @features_keys = (
"1classic-theme", "1stb-image",
"1stb-truetype", "1freetype2",
"1opengl", "2xrender",
"1vulkan", "2vulkan-string-helper",
"1shared", "1static"
"1shared", "1static",
"1experimental-wayland"
);
foreach my $l (@ARGV) {

View File

@@ -0,0 +1,58 @@
#include <Mw/Milsko.h>
MwWidget window, instructions, text;
void resize(MwWidget handle, void* user_data, void* call_data) {
unsigned int w, h, mh;
(void)user_data;
(void)call_data;
w = MwGetInteger(handle, MwNwidth);
h = MwGetInteger(handle, MwNheight);
MwVaApply(instructions,
MwNy, 50 + mh,
MwNwidth, w - 50 * 2,
MwNheight, h - 125 - 50 * 3,
NULL);
MwVaApply(text,
MwNy, 200 + mh,
MwNwidth, w - 50 * 2,
MwNheight, h - 125 - 50 * 3,
NULL);
}
void clipboard(MwWidget handle, void* user_data, void* call_data) {
char* clipboard = call_data;
(void)handle;
(void)user_data;
if(clipboard != NULL) {
MwVaApply(text, MwNtext, clipboard);
MwForceRender(text);
}
MwForceRender(window);
}
int main() {
MwLibraryInit();
window = MwVaCreateWidget(MwWindowClass, "main", NULL, MwDEFAULT, MwDEFAULT, 400, 400,
MwNtitle, "clipboard",
NULL);
instructions = MwVaCreateWidget(MwLabelClass, "button", window, 50, 50, 300, 125,
MwNtext, "clipboard contents will show up below.",
NULL);
text = MwVaCreateWidget(MwLabelClass, "label", window, 50, 200, 300, 125,
MwNtext, "",
NULL);
MwAddUserHandler(window, MwNresizeHandler, resize, NULL);
MwAddUserHandler(window, MwNclipboardHandler, clipboard, NULL);
resize(window, NULL, NULL);
MwLoop(window);
}

View File

@@ -0,0 +1,23 @@
#include <Mw/Milsko.h>
int main() {
MwWidget wnd, label;
int W = 480, H = 40;
MwLibraryInit();
wnd = MwVaCreateWidget(MwWindowClass, "main", NULL, MwDEFAULT, MwDEFAULT, W, H,
MwNtitle, "seven segment",
NULL);
label = MwVaCreateWidget(MwLabelClass, "label", wnd, 0, 0, W, H,
MwNtext, " 123456:78.90 abcdef",
MwNsevenSegment, 1,
MwNalignment, MwALIGNMENT_BEGINNING,
MwNlength, 8,
NULL);
MwLabelSetSevenSegment(label, 0, (1 << 0) | (1 << 3) | (1 << 6));
MwLoop(wnd);
}

View File

@@ -52,6 +52,11 @@ MWDECL const char* MwDefaultDarkSubBackground;
*/
MWDECL const char* MwDefaultDarkSubForeground;
/*!
* @brief Default shadow difference
*/
MWDECL const int MwDefaultShadow;
/*!
* @brief Gets default border width
* @param handle Widget

View File

@@ -147,6 +147,7 @@ struct _MwLLHandler {
void (*key_released)(MwLL handle, void* data);
void (*focus_in)(MwLL handle, void* data);
void (*focus_out)(MwLL handle, void* data);
void (*clipboard)(MwLL handle, void* data);
};
#ifdef __cplusplus
@@ -203,7 +204,7 @@ MWDECL void (*MwLLFocus)(MwLL handle);
MWDECL void (*MwLLGrabPointer)(MwLL handle, int toggle);
MWDECL void (*MwLLSetClipboard)(MwLL handle, const char* text);
MWDECL char* (*MwLLGetClipboard)(MwLL handle);
MWDECL void (*MwLLGetClipboard)(MwLL handle);
MWDECL void (*MwLLGetCursorCoord)(MwLL handle, MwPoint* point);
MWDECL void (*MwLLGetScreenSize)(MwLL handle, MwRect* rect);

View File

@@ -21,6 +21,7 @@ struct _MwLLGDI {
int grabbed;
int force_render;
int get_clipboard;
};
struct _MwLLGDIColor {

View File

@@ -12,13 +12,11 @@
#include <Mw/LowLevel.h>
#include <wayland-client-protocol.h>
#include <wayland-egl.h>
#include <EGL/egl.h>
#include <GL/gl.h>
#include <GL/glext.h>
#include <wayland-client.h>
#include <xkbcommon/xkbcommon.h>
#include <cairo/cairo.h>
#include <pthread.h>
MWDECL int MwLLWaylandCallInit(void);
@@ -27,6 +25,8 @@ MWDECL int MwLLWaylandCallInit(void);
#include "Wayland/xdg-shell-client-protocol.h"
#include "Wayland/xdg-decoration-client-protocol.h"
#include "Wayland/cursor-shape-client-protocol.h"
#include "Wayland/primary-selection-client-protocol.h"
#include "Wayland/xdg-toplevel-icon-client-protocol.h"
#endif
struct _MwLLWayland;
@@ -37,6 +37,12 @@ typedef struct wayland_protocol {
} wayland_protocol_t;
typedef wayland_protocol_t*(wl_setup_func)(MwU32, struct _MwLLWayland*);
typedef void(wl_destroy_func)(struct _MwLLWayland* wayland, wayland_protocol_t* data);
typedef struct wayland_protocol_callback_table {
wl_setup_func* setup;
wl_destroy_func* destroy;
} wayland_protocol_callback_table_t;
struct _MwLLWaylandTopLevel {
struct xdg_surface* xdg_surface;
@@ -53,21 +59,79 @@ struct _MwLLWaylandTopLevel {
MwBool xdg_surface_created;
};
struct _MwLLWaylandSublevel {
struct wl_subsurface* subsurface;
struct wl_subcompositor* subcompositor;
MwLL parent;
struct xdg_surface* parent_xdg_surface;
};
struct _MwLLWaylandPopup {
struct xdg_surface* xdg_surface;
struct xdg_popup* xdg_popup;
struct xdg_positioner* xdg_positioner;
struct xdg_surface_listener xdg_surface_listener;
struct xdg_wm_base* xdg_wm_base;
MwLL parent;
};
/* Shared set of anything needed for a shm buffer. */
struct _MwLLWaylandShmBuffer {
struct wl_shm* shm;
struct wl_shm_pool* shm_pool;
struct wl_buffer* shm_buffer;
struct wl_surface* surface;
struct wl_output* output;
MwU8* buf;
MwU64 buf_size;
int fd;
MwBool setup;
};
enum _MwLLWaylandType {
MWLL_WAYLAND_UNKNOWN = 0,
MWLL_WAYLAND_TOPLEVEL,
MWLL_WAYLAND_SUBLEVEL,
MWLL_WAYLAND_POPUP,
};
typedef struct wl_clipboard_device_context {
union {
struct wl_data_device* wl;
struct zwp_primary_selection_device_v1* zwp;
} device;
union {
struct wl_data_offer* wl;
struct zwp_primary_selection_offer_v1* zwp;
} offer;
MwLL ll;
struct wl_seat* seat;
MwU32 capabilities;
} wl_clipboard_device_context_t;
struct _MwLLWayland {
struct _MwLLCommon common;
union {
/* Pointer for data that's only loaded if the widget is a toplevel */
struct _MwLLWaylandTopLevel* toplevel;
/* Pointer for data that's only loaded if the widget is a sublevel */
struct _MwLLWaylandSublevel* sublevel;
/* Pointer for data that's only loaded if the widget is a popup */
struct _MwLLWaylandPopup* popup;
};
enum {
MWLL_WAYLAND_TOPLEVEL = 0,
MWLL_WAYLAND_SUBLEVEL = 1, /* Sublevels are surfaces that have the toplevel as a parent. They could be implemented as subsurfaces if we ever switch away from OpenGL. Some parts of the code also call them subwidgets. */
} type;
enum _MwLLWaylandType type;
enum _MwLLWaylandType type_to_be;
/* Map of Wayland interfaces to their relevant setup functions. */
struct {
const char* key;
wl_setup_func* value;
wayland_protocol_callback_table_t* value;
}* wl_protocol_setup_map;
/* Map of Wayland interfaces to any information we keep about them once we've registered them. */
@@ -76,36 +140,66 @@ struct _MwLLWayland {
wayland_protocol_t* value;
}* wl_protocol_map;
MwBool always_render;
struct wl_display* display;
struct wl_registry* registry;
struct wl_compositor* compositor;
struct wl_subcompositor* subcompositor;
struct wl_surface* surface;
struct wl_registry_listener registry_listener;
struct wl_event_queue* event_queue;
struct wl_region* region;
struct wl_output* output;
EGLNativeWindowType egl_window_native;
EGLDisplay egl_display;
EGLContext egl_context;
EGLSurface egl_surface;
EGLConfig egl_config;
/* clipboard related stuff.
* Note that unlike most interfaces, we don't keep zwp_primary_selection stuff in a wayland_protocol_t because we use wl_data_device as a fallback and want to have it share memory space.*/
union {
struct wl_data_device_manager* wl;
struct zwp_primary_selection_device_manager_v1* zwp;
} clipboard_manager;
union {
struct wl_data_source* wl;
struct zwp_primary_selection_source_v1* zwp;
} clipboard_source;
char* clipboard_buffer;
MwBool supports_zwp;
uint32_t clipboard_serial;
wl_clipboard_device_context_t** clipboard_devices;
struct wl_pointer* pointer;
MwU32 pointer_serial;
struct wl_keyboard* keyboard;
MwU32 keyboard_serial;
MwU64 events_pending;
MwU32 mod_state;
MwLL* sublevels; /* stb_ds managed array of any sublevels */
MwBool configured; /* Whether or not xdg_toplevel_configure has run once */
MwBool egl_setup; /* Whether or not EGL has been set up */
MwBool has_set_xy /* Whether or not MwSetXY has been called */;
int resize_counter; /* Counter that's for a hack in event_loop */
MwU32 x, y, ww, wh; /* Window position */
MwU32 lw, lh; /* Last known window position */
MwPoint cur_mouse_pos; /* Currently known mouse position */
struct timeval timer;
MwU64 cooldown_timer;
MwU64 cooldown_timer_epoch;
MwU32 mw, mh; /* Monitor width and height as advertised by wl_output.mode */
MwLL parent;
MwLL topmost_parent; /* The parent at the top of all the other parents. Usually a toplevel. */
MwBool force_render;
MwBool disabled;
struct _MwLLWaylandShmBuffer framebuffer;
struct _MwLLWaylandShmBuffer cursor;
struct _MwLLWaylandShmBuffer* icon;
/*
Events mutex. Any time a keyboard/mouse event happens, we try to lock this for 100 milliseconds, then give up if we can't do it. This is used in conjunction with some code in the MwLLDestroyImpl to make sure that destroy is NEVER interferes with an ongoing event.
IOI_XD: This sounds like a hilariously rare edge case, so it's almost funnier that this happened with 100% certainty for me and I spent day(s) trying to figure out what was happening. */
pthread_mutex_t eventsMutex;
cairo_surface_t* cs;
cairo_t* cairo;
};
struct _MwLLWaylandColor {
@@ -114,8 +208,8 @@ struct _MwLLWaylandColor {
struct _MwLLWaylandPixmap {
struct _MwLLCommonPixmap common;
GLuint texture;
MwBool texture_deleted;
cairo_surface_t* cs;
};
#endif

View File

@@ -29,6 +29,7 @@ struct _MwLLX11 {
GC gc;
Colormap colormap;
Atom wm_delete;
Atom wm_protocols;
XIM xim;
XIC xic;

View File

@@ -35,6 +35,10 @@
#define MwNratio "Iratio"
#define MwNfixedSize "IfixedSize"
#define MwNmargin "Imargin"
#define MwNbitmapFont "IbitmapFont"
#define MwNsevenSegment "IsevenSegment"
#define MwNlength "Ilength"
#define MwNforceInverted "IforceInverted"
#define MwNtitle "Stitle"
#define MwNtext "Stext"
@@ -67,5 +71,6 @@
#define MwNdirectoryChosenHandler "CdirectoryChosen" /* char* */
#define MwNcolorChosenHandler "CcolorChosen" /* MwRGB* */
#define MwNdrawHandler "Cdraw" /* NULL */
#define MwNclipboardHandler "Cclipboard" /* char* */
#endif

View File

@@ -20,6 +20,9 @@ typedef struct _MwViewport* MwViewport;
typedef struct _MwListBox* MwListBox;
typedef struct _MwComboBox* MwComboBox;
typedef struct _MwTreeView* MwTreeView;
typedef struct _MwScrollBar* MwScrollBar;
typedef struct _MwLabel* MwLabel;
typedef struct _MwLabelSegment MwLabelSegment;
typedef struct _MwListBoxEntry MwListBoxEntry;
typedef struct _MwTreeViewEntry MwTreeViewEntry;
typedef struct _MwDirectoryEntry MwDirectoryEntry;
@@ -36,6 +39,7 @@ typedef void (*MwHandlerChildrenProp)(MwWidget handle, MwWidget child, const cha
typedef void (*MwHandlerKey)(MwWidget handle, int key);
typedef void (*MwHandlerMouse)(MwWidget handle, void* ptr);
typedef void (*MwHandlerExecute)(MwWidget handle, const char* name, void* out, va_list args);
typedef void (*MwHandlerClipboardReceived)(MwWidget handle, const char* data);
typedef void (*MwUserHandler)(MwWidget handle, void* user_data, void* call_data);
typedef void (*MwErrorHandler)(int code, const char* message, void* user_data);
@@ -105,6 +109,7 @@ struct _MwMenu {
int keep;
MwWidget wsub;
MwMenu* sub;
void* opaque;
};
struct _MwEntry {
@@ -164,6 +169,21 @@ struct _MwTreeView {
MwPoint pressed;
};
struct _MwScrollBar {
MwPoint point;
int drag;
int pos;
};
struct _MwLabel {
MwLabelSegment* segment;
};
struct _MwLabelSegment {
int key;
unsigned char value;
};
struct _MwDirectoryEntry {
char* name;
int type;
@@ -192,11 +212,11 @@ struct _MwClass {
MwHandler resize;
MwHandler children_update;
MwHandlerChildrenProp children_prop_change;
MwHandlerClipboardReceived clipboard;
void* reserved1;
void* reserved2;
void* reserved3;
void* reserved4;
void* reserved5;
};
#endif

View File

@@ -17,6 +17,17 @@ extern "C" {
*/
MWDECL MwClass MwLabelClass;
/*!
* @brief Sets the custom data for seven segment
* @param handle Widget
* @param index Index
* @param data Data, `GFEDCBA` as 7-bit value
* @note See https://en.wikipedia.org/wiki/File:7_Segment_Display_with_Labeled_Segments.svg for what alphabets mean here
* */
MwInline void MwLabelSetSevenSegment(MwWidget handle, int index, int data) {
MwVaWidgetExecute(handle, "mwLabelSetSevenSegment", NULL, index, data);
}
#ifdef __cplusplus
}
#endif

View File

@@ -9,6 +9,7 @@
#include <Mw/TypeDefs.h>
#include <Mw/Core.h>
#ifndef __gl_h_
#ifdef _WIN32
#include <windows.h>
#else
@@ -19,6 +20,7 @@
#ifndef GLAPIENTRY
#define GLAPIENTRY APIENTRY
#endif
#endif
#ifdef __cplusplus
extern "C" {

View File

@@ -18,8 +18,25 @@ extern "C" {
*/
MWDECL MwClass MwSubMenuClass;
MwInline void MwSubMenuAppear(MwWidget handle, MwMenu menu, MwPoint* point) {
MwVaWidgetExecute(handle, "mwSubMenuAppear", NULL, menu, point);
/*!
* @brief Makes submenu appear
* @param handle Handle
* @param menu Menu
* @param point Point
* @param diff_calc Toggles different way to calculate positiion
*/
MwInline void MwSubMenuAppear(MwWidget handle, MwMenu menu, MwPoint* point, int diff_calc) {
MwVaWidgetExecute(handle, "mwSubMenuAppear", NULL, menu, point, diff_calc);
}
/*!
* @brief Calculates the size of submenu
* @param handle Handle
* @param menu Menu
* @param rect Size
*/
MwInline void MwSubMenuGetSize(MwWidget handle, MwMenu menu, MwRect* rect) {
MwVaWidgetExecute(handle, "mwSubMenuGetSize", NULL, menu, rect);
}
#ifdef __cplusplus

View File

@@ -51,6 +51,8 @@
- MwNbackgroundPixmap
- MwNratio
- MwNfixedSize
- MwNbitmapFont
- MwNforceInverted
Integer properties must be prefixed with I.
String properties must be prefixed with S.
@@ -87,6 +89,10 @@
<integer name="ratio" />
<integer name="fixedSize" />
<integer name="margin" />
<integer name="bitmapFont" />
<integer name="sevenSegment" />
<integer name="length" />
<integer name="forceInverted" />
<string name="title" />
<string name="text" />
@@ -116,6 +122,7 @@
<handler name="directoryChosen" />
<handler name="colorChosen" />
<handler name="draw" />
<handler name="clipboard" />
</properties>
<enumerations>
<enumeration name="MwDIRECTION">
@@ -493,6 +500,8 @@
<property name="orientation" />
<property name="margin" />
<property name="padding" />
<property name="hasBorder" />
<property name="inverted" />
</properties>
</widget>
<widget name="Button">
@@ -526,6 +535,7 @@
<property name="pixmap" />
<property name="hasBorder" />
<property name="inverted" />
<property name="fillArea" />
</properties>
</widget>
<widget name="Label">
@@ -533,7 +543,18 @@
<property name="text" />
<property name="alignment" />
<property name="bold" />
<property name="sevenSegment" />
<property name="length" />
<property name="leftPadding" />
</properties>
<functions>
<function name="SetSevenSegment">
<arguments>
<integer name="index" />
<integer name="data" />
</arguments>
</function>
</functions>
</widget>
<widget name="ListBox">
<properties>
@@ -621,6 +642,9 @@
</functions>
</widget>
<widget name="SubMenu">
<properties>
<property name="leftPadding" />
</properties>
<functions>
<function name="Appear">
<arguments>

View File

@@ -1,3 +1,8 @@
use_backend("x11");
if (param_get("experimental-wayland")) {
use_backend("wayland", "x11");
}
else {
use_backend("x11");
}
1;

View File

@@ -2,5 +2,6 @@ add_incdir("-I/usr/X11R7/include -I/usr/pkg/include");
add_libdir(
"-L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib");
use_backend("x11");
add_libs("-lpthread");
1;

View File

@@ -29,19 +29,19 @@ if (grep(/^gdi$/, @backends)) {
if (grep(/^wayland$/, @backends)) {
add_cflags("-DUSE_WAYLAND");
new_object("src/backend/wayland.c");
if ($cross) {
add_libs("-lGL -lEGL -lwayland-egl -lwayland-client -lxkbcommon");
}
else {
add_libs("-lGL -lEGL");
add_cflags(`pkg-config --cflags wayland-egl wayland-client xkbcommon`);
add_libs(`pkg-config --libs wayland-egl wayland-client xkbcommon`);
add_cflags(`pkg-config --cflags cairo wayland-client xkbcommon`);
add_libs(`pkg-config --libs cairo wayland-client xkbcommon`);
if (param_get("opengl")) {
add_libs(`pkg-config --libs egl wayland-egl`);
}
scan_wayland_protocol("stable", "xdg-shell", "");
scan_wayland_protocol("stable", "tablet", "-v2");
scan_wayland_protocol("staging", "xdg-toplevel-icon", "-v1");
scan_wayland_protocol("staging", "cursor-shape", "-v1");
scan_wayland_protocol("unstable", "xdg-decoration", "-unstable-v1");
scan_wayland_protocol("unstable", "primary-selection", "-unstable-v1");
$gl_libs = "-lGL -lGLU";
}
@@ -52,6 +52,7 @@ if (param_get("stb-image")) {
if (param_get("stb-truetype")) {
add_cflags("-DUSE_STB_TRUETYPE");
}
if (param_get("freetype2")) {
add_cflags("-DUSE_FREETYPE2");
if ($cross) {
@@ -118,6 +119,8 @@ new_example("examples/basic/colorpicker");
new_example("examples/basic/combobox");
new_example("examples/basic/treeview");
new_example("examples/basic/box");
new_example("examples/basic/clipboard");
new_example("examples/basic/sevensegment");
if (param_get("opengl")) {
new_example("examples/gldemos/boing", $gl_libs);

View File

@@ -237,6 +237,7 @@ static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
r->common.copy_buffer = 1;
r->common.type = MwLLBackendGDI;
r->gdi.get_clipboard = 1;
r->gdi.force_render = 0;
r->gdi.grabbed = 0;
r->gdi.hWnd = CreateWindow("milsko", "Milsko", parent == NULL ? (WS_OVERLAPPEDWINDOW) : (WS_CHILD | WS_VISIBLE), x == MwDEFAULT ? CW_USEDEFAULT : x, y == MwDEFAULT ? CW_USEDEFAULT : y, width, height, parent == NULL ? NULL : parent->gdi.hWnd, 0, wc.hInstance, NULL);
@@ -383,6 +384,7 @@ static int MwLLPendingImpl(MwLL handle) {
(void)handle;
if(handle->gdi.get_clipboard) return 1;
return PeekMessage(&msg, handle->gdi.hWnd, 0, 0, PM_NOREMOVE) ? 1 : 0;
}
@@ -391,6 +393,24 @@ static void MwLLNextEventImpl(MwLL handle) {
(void)handle;
if(handle->gdi.get_clipboard) {
HGLOBAL hg;
if(OpenClipboard(handle->gdi.hWnd) != 0 && (hg = GetClipboardData(CF_TEXT)) != NULL) {
char* txt = malloc(GlobalSize(hg));
char* clp = GlobalLock(hg);
strcpy(txt, clp);
GlobalUnlock(hg);
CloseClipboard();
MwLLDispatch(handle, clipboard, txt);
free(txt);
}
handle->gdi.get_clipboard = 0;
}
while(PeekMessage(&msg, handle->gdi.hWnd, 0, 0, PM_NOREMOVE)) {
GetMessage(&msg, handle->gdi.hWnd, 0, 0);
TranslateMessage(&msg);
@@ -697,21 +717,8 @@ static void MwLLSetClipboardImpl(MwLL handle, const char* text) {
}
}
static char* MwLLGetClipboardImpl(MwLL handle) {
HGLOBAL hg;
char* r = NULL;
if(OpenClipboard(handle->gdi.hWnd) != 0 && (hg = GetClipboardData(CF_TEXT)) != NULL) {
char* lock;
r = malloc(GlobalSize(hg));
lock = GlobalLock(hg);
strcpy(r, lock);
GlobalUnlock(hg);
CloseClipboard();
}
return r;
static void MwLLGetClipboardImpl(MwLL handle) {
handle->gdi.get_clipboard = 1; /* nishi: we do this to make clipboard api work similar to other backends */
}
static void MwLLMakeToolWindowImpl(MwLL handle) {

File diff suppressed because it is too large Load Diff

View File

@@ -211,6 +211,7 @@ static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
r->x11.colormap = DefaultColormap(r->x11.display, XDefaultScreen(r->x11.display));
r->x11.wm_delete = XInternAtom(r->x11.display, "WM_DELETE_WINDOW", False);
r->x11.wm_protocols = XInternAtom(r->x11.display, "WM_PROTOCOLS", False);
XSetWMProtocols(r->x11.display, r->x11.window, &r->x11.wm_delete, 1);
r->x11.gc = XCreateGC(r->x11.display, r->x11.window, 0, NULL);
@@ -471,7 +472,7 @@ static void MwLLNextEventImpl(MwLL handle) {
handle->x11.width = ev.xconfigure.width;
handle->x11.height = ev.xconfigure.height;
} else if(ev.type == ClientMessage) {
if(ev.xclient.data.l[0] == (long)handle->x11.wm_delete) {
if(ev.xclient.message_type == handle->x11.wm_protocols && ev.xclient.data.l[0] == (long)handle->x11.wm_delete) {
MwLLDispatch(handle, close, NULL);
}
} else if(ev.type == FocusIn) {
@@ -956,45 +957,10 @@ static void MwLLSetClipboardImpl(MwLL handle, const char* text) {
(void)text;
}
static char* MwLLGetClipboardImpl(MwLL handle) {
Atom clip, target, prop;
XEvent ev;
XEvent* queue = NULL;
char* r = NULL;
static void MwLLGetClipboardImpl(MwLL handle) {
/* TODO */
clip = XInternAtom(handle->x11.display, "CLIPBOARD", 0);
target = XA_STRING;
prop = XInternAtom(handle->x11.display, "XSEL_DATA", 0);
XConvertSelection(handle->x11.display, clip, target, prop, handle->x11.window, CurrentTime);
while(1) {
XNextEvent(handle->x11.display, &ev);
if(ev.type == SelectionNotify) {
if(ev.xselection.selection == clip && ev.xselection.property != 0) {
Atom t;
unsigned long size, N;
char* data;
int format;
XGetWindowProperty(ev.xselection.display, ev.xselection.requestor, ev.xselection.property, 0, (~0L), 0, AnyPropertyType, &t, &format, &size, &N, (unsigned char**)&data);
if(t == target) {
r = MwStringDuplicate(data);
XFree(data);
}
XDeleteProperty(ev.xselection.display, ev.xselection.requestor, ev.xselection.property);
}
break;
}
}
while(arrlen(queue) > 0) {
XPutBackEvent(handle->x11.display, &queue[0]);
arrdel(queue, 0);
}
arrfree(queue);
return r;
(void)handle;
}
static void MwLLMakeToolWindowImpl(MwLL handle) {

View File

@@ -107,6 +107,13 @@ static void llfocusouthandler(MwLL handle, void* data) {
MwDispatchUserHandler(h, MwNfocusOutHandler, data);
}
static void llclipboardhandler(MwLL handle, void* data) {
MwWidget h = (MwWidget)handle->common.user;
MwDispatch3(h, clipboard, data);
MwDispatchUserHandler(h, MwNclipboardHandler, data);
}
MwWidget MwCreateWidget(MwClass widget_class, const char* name, MwWidget parent, int x, int y, unsigned int width, unsigned int height) {
MwWidget h = malloc(sizeof(*h));
@@ -148,6 +155,7 @@ MwWidget MwCreateWidget(MwClass widget_class, const char* name, MwWidget parent,
h->lowlevel->common.handler->key_released = llkeyrelhandler;
h->lowlevel->common.handler->focus_in = llfocusinhandler;
h->lowlevel->common.handler->focus_out = llfocusouthandler;
h->lowlevel->common.handler->clipboard = llclipboardhandler;
}
if(parent != NULL) arrput(parent->children, h);
@@ -261,6 +269,8 @@ void MwDestroyWidget(MwWidget handle) {
if(i == arrlen(handle->parent->destroy_queue)) {
arrput(handle->parent->destroy_queue, handle);
}
MwDispatch(handle->parent, children_update);
}
destroy_children(handle);
handle->destroyed = 1;
@@ -385,6 +395,9 @@ void MwSetInteger(MwWidget handle, const char* key, int n) {
MwDispatch3(handle, prop_change, key);
if(handle->parent != NULL) MwDispatch4(handle->parent, children_prop_change, handle, key);
}
if(strcmp(key, MwNforceInverted) == 0) {
MwForceRender(handle);
}
}
void MwSetText(MwWidget handle, const char* key, const char* value) {
@@ -428,6 +441,15 @@ void MwSetVoid(MwWidget handle, const char* key, void* value) {
}
}
static int inherit_integer(MwWidget handle, const char* key, int default_v) {
int v;
if(handle->parent != NULL && (v = MwGetInteger(handle->parent, key)) != MwDEFAULT) {
return v;
}
return default_v;
}
int MwGetInteger(MwWidget handle, const char* key) {
if(strcmp(key, MwNx) == 0 || strcmp(key, MwNy) == 0 || strcmp(key, MwNwidth) == 0 || strcmp(key, MwNheight) == 0) {
int x, y;
@@ -441,6 +463,18 @@ int MwGetInteger(MwWidget handle, const char* key) {
if(strcmp(key, MwNheight) == 0) return h;
return MwDEFAULT;
} else {
if(shgeti(handle->integer, key) == -1) {
#if defined(USE_STB_TRUETYPE) || defined(USE_FREETYPE2)
if(strcmp(key, MwNbitmapFont) == 0) return inherit_integer(handle, key, 0);
#else
if(strcmp(key, MwNbitmapFont) == 0) return inherit_integer(handle, key, 1);
#endif
#ifdef USE_CLASSIC_THEME
if(strcmp(key, MwNmodernLook) == 0) return inherit_integer(handle, key, 0);
#else
if(strcmp(key, MwNmodernLook) == 0) return inherit_integer(handle, key, 1);
#endif
}
return shget(handle->integer, key);
}
}
@@ -541,19 +575,6 @@ void MwVaListApply(MwWidget handle, va_list va) {
}
}
static void inherit_integer(MwWidget handle, const char* key, int default_value) {
int n;
MwWidget h = handle;
while(h != NULL) {
if((n = MwGetInteger(h, key)) != MwDEFAULT) {
MwSetInteger(handle, key, n);
return;
}
h = h->parent;
}
MwSetInteger(handle, key, default_value);
}
#if defined(USE_STB_TRUETYPE) || defined(USE_FREETYPE2)
static void set_font(MwWidget handle) {
void* f;
@@ -587,11 +608,6 @@ static void set_boldfont(MwWidget handle) {
void MwSetDefault(MwWidget handle) {
if(handle->lowlevel != NULL) MwLLSetCursor(handle->lowlevel, &MwCursorDefault, &MwCursorDefaultMask);
#ifdef USE_CLASSIC_THEME
inherit_integer(handle, MwNmodernLook, 0);
#else
inherit_integer(handle, MwNmodernLook, 1);
#endif
#if defined(USE_STB_TRUETYPE) || defined(USE_FREETYPE2)
set_font(handle);
set_boldfont(handle);
@@ -693,7 +709,7 @@ static void force_render_all(MwWidget handle) {
for(i = 0; i < arrlen(handle->children); i++) {
force_render_all(handle->children[i]);
}
MwForceRender(handle);
if(handle->lowlevel != NULL) MwForceRender(handle);
}
void MwToggleDarkTheme(MwWidget handle, int toggle) {

View File

@@ -10,6 +10,8 @@ const char* MwDefaultDarkForeground = "#ddd";
const char* MwDefaultDarkSubBackground = "#333";
const char* MwDefaultDarkSubForeground = "#ddd";
const int MwDefaultShadow = -32;
int MwDefaultBorderWidth(MwWidget handle) {
int bw = MwGetInteger(handle, MwNborderWidth);

View File

@@ -1,6 +1,7 @@
#include <Mw/Milsko.h>
#ifdef USE_STB_IMAGE
#ifdef NO_IMAGE
#elif defined(USE_STB_IMAGE)
#include "../external/stb_image.h"
#else
#include <png.h>
@@ -104,28 +105,25 @@ void MwDrawRect(MwWidget handle, MwRect* rect, MwLLColor color) {
void MwDrawRectFading(MwWidget handle, MwRect* rect, MwLLColor color) {
MwLLPixmap pixmap;
int y;
int x;
double darken = 0.;
int ColorDiff = get_color_diff(handle);
double darkenStep = (ColorDiff / 2.) / rect->height;
unsigned long sz = rect->width * rect->height * 4;
double darkenStep = (ColorDiff / 4.) / rect->height;
unsigned long sz = 1 * rect->height * 4;
unsigned char* data = malloc(sz);
memset(data, 0, sz);
for(y = 0; y < rect->height; y++) {
MwLLColor col = MwLightenColor(handle, color, -darken, -darken, -darken);
for(x = 0; x < rect->width; x++) {
int idx = ((y * rect->width) + x) * 4;
int idx = y * 4;
data[idx] = col->common.red;
data[idx + 1] = col->common.green;
data[idx + 2] = col->common.blue;
data[idx + 3] = 255;
}
MwLLFreeColor(col);
darken += darkenStep;
}
pixmap = MwLLCreatePixmap(handle->lowlevel, data, rect->width / 4, rect->height);
pixmap = MwLLCreatePixmap(handle->lowlevel, data, 1, rect->height);
MwLLDrawPixmap(handle->lowlevel, rect, pixmap);
MwLLDestroyPixmap(pixmap);
@@ -133,6 +131,9 @@ void MwDrawRectFading(MwWidget handle, MwRect* rect, MwLLColor color) {
}
void MwDrawFrame(MwWidget handle, MwRect* rect, MwLLColor color, int invert) {
int inv;
if((inv = MwGetInteger(handle, MwNforceInverted)) != MwDEFAULT && inv) invert = 1;
if(MwGetInteger(handle, MwNmodernLook)) {
MwDrawFrameEx(handle, rect, color, invert, MwDefaultBorderWidth(handle), 0, 0);
} else {
@@ -505,7 +506,8 @@ void MwDrawTriangle(MwWidget handle, MwRect* rect, MwLLColor color, int invert,
MwLLFreeColor(darker);
}
#ifndef USE_STB_IMAGE
#if defined(NO_IMAGE)
#elif !defined(USE_STB_IMAGE)
static void PNGCAPI user_error(png_structp png, const char* str) {
(void)str;
@@ -620,7 +622,9 @@ static unsigned char* load_jpeg(FILE* f, int* w, int* h) {
#endif
static unsigned char* load_image(const char* path, int* w, int* h) {
#ifdef USE_STB_IMAGE
#if defined(NO_IMAGE)
return NULL;
#elif defined(USE_STB_IMAGE)
int ch;
return stbi_load(path, w, h, &ch, 4);

View File

@@ -46,7 +46,7 @@ void (*MwLLFocus)(MwLL handle);
void (*MwLLGrabPointer)(MwLL handle, int toggle);
void (*MwLLSetClipboard)(MwLL handle, const char* text);
char* (*MwLLGetClipboard)(MwLL handle);
void (*MwLLGetClipboard)(MwLL handle);
void (*MwLLGetCursorCoord)(MwLL handle, MwPoint* point);
void (*MwLLGetScreenSize)(MwLL handle, MwRect* rect);

View File

@@ -294,7 +294,7 @@ static int ttf_MwTextHeight(MwWidget handle, int count) {
void MwDrawText(MwWidget handle, MwPoint* point, const char* text, int bold, int align, MwLLColor color) {
if(strlen(text) == 0) return;
#ifdef TTF
if(ttf_MwDrawText(handle, point, text, bold, align, color))
if(MwGetInteger(handle, MwNbitmapFont) || ttf_MwDrawText(handle, point, text, bold, align, color))
#endif
bitmap_MwDrawText(handle, point, text, bold, align, color);
}
@@ -304,7 +304,7 @@ int MwTextWidth(MwWidget handle, const char* text) {
#ifdef TTF
int st;
if((st = ttf_MwTextWidth(handle, text)) != -1) return st;
if(!MwGetInteger(handle, MwNbitmapFont) && (st = ttf_MwTextWidth(handle, text)) != -1) return st;
#else
(void)handle;
@@ -331,7 +331,7 @@ int MwTextHeight(MwWidget handle, const char* text) {
if(out == '\n') c++;
}
#ifdef TTF
if((st = ttf_MwTextHeight(handle, c)) != -1) return st;
if(!MwGetInteger(handle, MwNbitmapFont) && (st = ttf_MwTextHeight(handle, c)) != -1) return st;
#endif
return FontHeight * c;
}

View File

@@ -8,6 +8,8 @@ static int create(MwWidget handle) {
MwSetInteger(handle, MwNorientation, MwHORIZONTAL);
MwSetInteger(handle, MwNmargin, 0);
MwSetInteger(handle, MwNpadding, 0);
MwSetInteger(handle, MwNhasBorder, 0);
MwSetInteger(handle, MwNinverted, 1);
return 0;
}
@@ -20,6 +22,11 @@ static void draw(MwWidget handle) {
r.y = 0;
r.width = MwGetInteger(handle, MwNwidth);
r.height = MwGetInteger(handle, MwNheight);
if(MwGetInteger(handle, MwNhasBorder)) {
MwDrawFrame(handle, &r, base, MwGetInteger(handle, MwNinverted));
}
MwDrawRect(handle, &r, base);
MwLLFreeColor(base);
@@ -31,15 +38,17 @@ static void layout(MwWidget handle) {
int i;
int sum = 0;
int horiz = MwGetInteger(handle, MwNorientation) == MwHORIZONTAL ? 1 : 0;
int sz = MwGetInteger(handle, horiz ? MwNwidth : MwNheight) - MwGetInteger(handle, MwNpadding) * 2;
int fsz = MwGetInteger(handle, horiz ? MwNheight : MwNwidth) - MwGetInteger(handle, MwNpadding) * 2;
int sk = MwGetInteger(handle, MwNpadding);
int sz = MwGetInteger(handle, horiz ? MwNwidth : MwNheight) - (MwGetInteger(handle, MwNpadding) + (MwGetInteger(handle, MwNhasBorder) ? MwDefaultBorderWidth(handle) : 0)) * 2;
int fsz = MwGetInteger(handle, horiz ? MwNheight : MwNwidth) - (MwGetInteger(handle, MwNpadding) + (MwGetInteger(handle, MwNhasBorder) ? MwDefaultBorderWidth(handle) : 0)) * 2;
int sk = MwGetInteger(handle, MwNpadding) + (MwGetInteger(handle, MwNhasBorder) ? MwDefaultBorderWidth(handle) : 0);
for(i = 0; i < arrlen(handle->children); i++) {
int n = MwGetInteger(handle->children[i], MwNratio);
int s = MwGetInteger(handle->children[i], MwNfixedSize);
if(n == MwDEFAULT) n = 1;
if(handle->children[i]->destroyed) continue;
if(s != MwDEFAULT) {
sz -= s + Margin;
} else {
@@ -53,16 +62,17 @@ static void layout(MwWidget handle) {
int wsz;
if(n == MwDEFAULT) n = 1;
if(handle->children[i]->destroyed) continue;
if(s != MwDEFAULT) {
wsz = s;
} else {
wsz = sz * n / sum;
}
wsz -= Margin;
MwVaApply(handle->children[i],
horiz ? MwNx : MwNy, sk, /* this is what gets changed */
horiz ? MwNy : MwNx, MwGetInteger(handle, MwNpadding), /* fixed between widgets */
horiz ? MwNy : MwNx, MwGetInteger(handle, MwNpadding) + (MwGetInteger(handle, MwNhasBorder) ? MwDefaultBorderWidth(handle) : 0), /* fixed between widgets */
horiz ? MwNwidth : MwNheight, wsz, /* this is what gets changed */
horiz ? MwNheight : MwNwidth, fsz, /* fixed between widgets */
NULL);
@@ -104,7 +114,7 @@ MwClassRec MwBoxClassRec = {
resize, /* resize */
children_update, /* children_update */
children_prop_change, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -1,5 +1,7 @@
#include <Mw/Milsko.h>
#include "../../external/stb_ds.h"
static int create(MwWidget handle) {
MwSetDefault(handle);
@@ -18,6 +20,7 @@ static void draw(MwWidget handle) {
const char* str = MwGetText(handle, MwNtext);
MwLLPixmap px = MwGetVoid(handle, MwNpixmap);
MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap);
int inv;
if(str == NULL) str = "";
@@ -27,7 +30,7 @@ static void draw(MwWidget handle) {
r.height = MwGetInteger(handle, MwNheight);
if(MwGetInteger(handle, MwNflat)) {
if(handle->pressed) {
if(handle->pressed || ((inv = MwGetInteger(handle, MwNforceInverted)) != MwDEFAULT && inv)) {
MwDrawWidgetBack(handle, &r, base, handle->pressed, 1);
} else {
MwDrawRect(handle, &r, base);
@@ -36,7 +39,7 @@ static void draw(MwWidget handle) {
MwDrawWidgetBack(handle, &r, base, handle->pressed, 1);
}
if(bgpx != NULL) MwLLDrawPixmap(handle->lowlevel, &r, bgpx);
if(MwGetInteger(handle, MwNflat) && !handle->pressed) {
if(MwGetInteger(handle, MwNflat) && !(handle->pressed || ((inv = MwGetInteger(handle, MwNforceInverted)) != MwDEFAULT && inv))) {
r.x += MwDefaultBorderWidth(handle);
r.y += MwDefaultBorderWidth(handle);
r.width -= MwDefaultBorderWidth(handle) * 2;
@@ -104,7 +107,7 @@ MwClassRec MwButtonClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -53,7 +53,7 @@ MwClassRec MwCheckBoxClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -204,7 +204,7 @@ MwClassRec MwComboBoxClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -109,20 +109,7 @@ static void key(MwWidget handle, int code) {
} else if(code == MwLLKeyEnter) {
MwDispatchUserHandler(handle, MwNactivateHandler, NULL);
} else if(code == (MwLLControlMask | 'v')) {
char* c = MwLLGetClipboard(handle->lowlevel);
if(c != NULL) {
char* out = malloc(strlen(str) + strlen(c) + 1);
MwUTF8Copy(str, 0, out, 0, t->cursor);
MwUTF8Copy(c, 0, out, t->cursor, MwUTF8Length(c));
MwUTF8Copy(str, t->cursor, out, t->cursor + MwUTF8Length(c), MwUTF8Length(str) - t->cursor);
t->cursor += MwUTF8Length(c);
MwSetText(handle, MwNtext, out);
free(out);
free(c);
}
MwLLGetClipboard(handle->lowlevel);
} else if(!(code & MwLLKeyMask)) {
int incr = 0;
out = malloc(strlen(str) + 5 + 1);
@@ -157,6 +144,23 @@ static void prop_change(MwWidget handle, const char* prop) {
}
}
static void clipboard(MwWidget handle, const char* data) {
MwEntry t = handle->internal;
const char* str = MwGetText(handle, MwNtext);
char* out = malloc(strlen(str) + strlen(data) + 1);
if(str == NULL) str = "";
MwUTF8Copy(str, 0, out, 0, t->cursor);
MwUTF8Copy(data, 0, out, t->cursor, MwUTF8Length(data));
MwUTF8Copy(str, t->cursor, out, t->cursor + MwUTF8Length(data), MwUTF8Length(str) - t->cursor);
t->cursor += MwUTF8Length(data);
MwSetText(handle, MwNtext, out);
free(out);
}
MwClassRec MwEntryClassRec = {
create, /* create */
destroy, /* destroy */
@@ -173,7 +177,7 @@ MwClassRec MwEntryClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
clipboard, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -29,7 +29,6 @@ static void draw(MwWidget handle) {
rr.width = MwGetInteger(handle, MwNwidth) - (MwDefaultBorderWidth(handle) * 2);
rr.height = MwGetInteger(handle, MwNheight) - (MwDefaultBorderWidth(handle) * 2);
} else {
rr.x = 0;
rr.y = 0;
rr.width = MwGetInteger(handle, MwNwidth);
@@ -62,7 +61,7 @@ MwClassRec MwFrameClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -5,6 +5,7 @@ static int create(MwWidget handle) {
MwSetInteger(handle, MwNhasBorder, 0);
MwSetInteger(handle, MwNinverted, 1);
MwSetInteger(handle, MwNfillArea, 1);
return 0;
}
@@ -23,6 +24,13 @@ static void draw(MwWidget handle) {
MwDrawRect(handle, &r, base);
if(px != NULL) {
if(!MwGetInteger(handle, MwNfillArea)) {
r.x = (r.width - px->common.width) / 2;
r.y = (r.height - px->common.height) / 2;
r.width = px->common.width;
r.height = px->common.height;
}
MwLLDrawPixmap(handle->lowlevel, &r, px);
}
@@ -49,7 +57,7 @@ MwClassRec MwImageClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -1,21 +1,139 @@
#include <Mw/Milsko.h>
#include "../../external/stb_ds.h"
#define Spacing 1
static int create(MwWidget handle) {
MwLabel lab = malloc(sizeof(*lab));
lab->segment = NULL;
handle->internal = lab;
MwSetDefault(handle);
MwSetInteger(handle, MwNalignment, MwALIGNMENT_CENTER);
MwSetInteger(handle, MwNbold, 0);
MwSetInteger(handle, MwNsevenSegment, 0);
MwSetInteger(handle, MwNlength, 4);
MwSetInteger(handle, MwNleftPadding, 0);
return 0;
}
static void destroy(MwWidget handle) {
MwLabel lab = handle->internal;
hmfree(lab->segment);
free(handle->internal);
}
static void draw_v(MwWidget handle, unsigned char* raw, int x, int y, int stride, MwLLColor text) {
int cy, cx, b;
int l_one = MwGetInteger(handle, MwNlength) - (MwGetInteger(handle, MwNlength) % 2);
int s_one = (l_one * 3 / 4) - ((l_one * 3 / 4) % 2) + 1;
for(cy = y; cy < y + l_one; cy++) {
for(cx = x; cx < x + s_one; cx++) {
unsigned char* px = &raw[(cy * stride + cx) * 4];
px[0] = text->common.red;
px[1] = text->common.green;
px[2] = text->common.blue;
px[3] = 255;
}
}
b = y - (s_one - 1) / 2;
for(cy = b; cy < b + (s_one - 1) / 2; cy++) {
int w = (cy - b) * 2 + 1;
int b2 = x + (s_one - w) / 2;
for(cx = b2; cx < b2 + w; cx++) {
unsigned char* px;
px = &raw[(cy * stride + cx) * 4];
px[0] = text->common.red;
px[1] = text->common.green;
px[2] = text->common.blue;
px[3] = 255;
}
}
b = y + l_one;
for(cy = b; cy < b + (s_one - 1) / 2; cy++) {
int w = ((s_one - 1) / 2 - 1 - (cy - b)) * 2 + 1;
int b2 = x + (s_one - w) / 2;
for(cx = b2; cx < b2 + w; cx++) {
unsigned char* px;
px = &raw[(cy * stride + cx) * 4];
px[0] = text->common.red;
px[1] = text->common.green;
px[2] = text->common.blue;
px[3] = 255;
}
}
}
static void draw_h(MwWidget handle, unsigned char* raw, int x, int y, int stride, MwLLColor text) {
int cy, cx, b;
int l_one = MwGetInteger(handle, MwNlength) - (MwGetInteger(handle, MwNlength) % 2);
int s_one = (l_one * 3 / 4) - ((l_one * 3 / 4) % 2) + 1;
for(cx = x; cx < x + l_one; cx++) {
for(cy = y; cy < y + s_one; cy++) {
unsigned char* px = &raw[(cy * stride + cx) * 4];
px[0] = text->common.red;
px[1] = text->common.green;
px[2] = text->common.blue;
px[3] = 255;
}
}
b = x - (s_one - 1) / 2;
for(cx = b; cx < b + (s_one - 1) / 2; cx++) {
int w = (cx - b) * 2 + 1;
int b2 = y + (s_one - w) / 2;
for(cy = b2; cy < b2 + w; cy++) {
unsigned char* px;
px = &raw[(cy * stride + cx) * 4];
px[0] = text->common.red;
px[1] = text->common.green;
px[2] = text->common.blue;
px[3] = 255;
}
}
b = x + l_one;
for(cx = b; cx < b + (s_one - 1) / 2; cx++) {
int w = ((s_one - 1) / 2 - 1 - (cx - b)) * 2 + 1;
int b2 = y + (s_one - w) / 2;
for(cy = b2; cy < b2 + w; cy++) {
unsigned char* px;
px = &raw[(cy * stride + cx) * 4];
px[0] = text->common.red;
px[1] = text->common.green;
px[2] = text->common.blue;
px[3] = 255;
}
}
}
static void draw(MwWidget handle) {
MwRect r;
MwPoint p;
MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground));
MwLLColor text = MwParseColor(handle, MwGetText(handle, MwNforeground));
MwLLColor shadow = MwLightenColor(handle, base, MwDefaultShadow, MwDefaultShadow, MwDefaultShadow);
int align;
const char* str = MwGetText(handle, MwNtext);
MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap);
MwLabel lab = handle->internal;
int l_one = MwGetInteger(handle, MwNlength) - (MwGetInteger(handle, MwNlength) % 2);
int s_one = (l_one * 3 / 4) - ((l_one * 3 / 4) % 2) + 1;
if(str == NULL) str = "";
@@ -28,6 +146,173 @@ static void draw(MwWidget handle) {
if(bgpx != NULL) MwLLDrawPixmap(handle->lowlevel, &r, bgpx);
align = MwGetInteger(handle, MwNalignment);
if(MwGetInteger(handle, MwNsevenSegment)) {
MwLLPixmap px;
unsigned char* raw;
int w = 0, h = s_one * 3 + l_one * 2, i;
int x = 0;
/* so - this mode cannot do unicode.
* but you wouldn't show unicode on 7 segment anyways
*/
/* L
* S <--->
*
* S
* ^
* |
* L |
* |
* v
*/
for(i = 0; (hmgeti(lab->segment, i) != -1) || str[i] != 0; i++) {
if(i > 0 && ((hmgeti(lab->segment, i) != -1) || str[i] != '.')) w += Spacing;
if(hmgeti(lab->segment, i) != -1 || ('0' <= str[i] && str[i] <= '9') || ('A' <= str[i] && str[i] <= 'F') || ('a' <= str[i] && str[i] <= 'f')) {
w += l_one + s_one * 2;
} else if(str[i] == ':' || str[i] == ' ') {
w += s_one;
}
}
w++;
h++;
raw = malloc(w * h * 4);
memset(raw, 0, w * h * 4);
for(i = 0; (hmgeti(lab->segment, i) != -1) || str[i] != 0; i++) {
if((hmgeti(lab->segment, i) != -1) || ('0' <= str[i] && str[i] <= '9') || ('A' <= str[i] && str[i] <= 'F') || ('a' <= str[i] && str[i] <= 'f')) {
int la = 0, lb = 0, lc = 0, ld = 0, le = 0, lf = 0, lg = 0;
int j;
/* https://en.wikipedia.org/wiki/File:7_Segment_Display_with_Labeled_Segments.svg */
if(hmgeti(lab->segment, i) != -1) {
unsigned char c = hmget(lab->segment, i);
if(c & (1 << 0)) la = 1;
if(c & (1 << 1)) lb = 1;
if(c & (1 << 2)) lc = 1;
if(c & (1 << 3)) ld = 1;
if(c & (1 << 4)) le = 1;
if(c & (1 << 5)) lf = 1;
if(c & (1 << 6)) lg = 1;
} else {
if(str[i] == '0') {
la = lb = lc = ld = le = lf = 1;
} else if(str[i] == '1') {
lb = lc = 1;
} else if(str[i] == '2') {
la = lb = ld = le = lg = 1;
} else if(str[i] == '3') {
la = lb = lc = ld = lg = 1;
} else if(str[i] == '4') {
lb = lc = lf = lg = 1;
} else if(str[i] == '5') {
la = lc = ld = lf = lg = 1;
} else if(str[i] == '6') {
la = lc = ld = le = lf = lg = 1;
} else if(str[i] == '7') {
la = lb = lc = 1;
} else if(str[i] == '8') {
la = lb = lc = ld = le = lf = lg = 1;
} else if(str[i] == '9') {
la = lb = lc = ld = lf = lg = 1;
} else if(str[i] == 'A' || str[i] == 'a') {
la = lb = lc = le = lf = lg = 1;
} else if(str[i] == 'B' || str[i] == 'b') {
lc = ld = le = lf = lg = 1;
} else if(str[i] == 'C' || str[i] == 'c') {
ld = le = lg = 1;
} else if(str[i] == 'D' || str[i] == 'd') {
lb = lc = ld = le = lg = 1;
} else if(str[i] == 'E' || str[i] == 'e') {
la = ld = le = lf = lg = 1;
} else if(str[i] == 'F' || str[i] == 'f') {
la = le = lf = lg = 1;
}
}
for(j = 1; j >= 0; j--) {
MwLLColor cl = j == 1 ? shadow : text;
if(la) draw_h(handle, raw, x + s_one + j, j, w, cl);
if(lb) draw_v(handle, raw, x + s_one + l_one + j, s_one + j, w, cl);
if(lc) draw_v(handle, raw, x + s_one + l_one + j, s_one * 2 + l_one + j, w, cl);
if(ld) draw_h(handle, raw, x + s_one + j, s_one * 2 + l_one * 2 + j, w, cl);
if(le) draw_v(handle, raw, x + j, s_one * 2 + l_one + j, w, cl);
if(lf) draw_v(handle, raw, x + j, s_one + j, w, cl);
if(lg) draw_h(handle, raw, x + s_one + j, s_one + l_one + j, w, cl);
}
x += l_one + s_one * 2;
} else if(str[i] == ':') {
int cy, cx;
int j;
for(j = 1; j >= 0; j--) {
MwLLColor cl = j == 1 ? shadow : text;
for(cy = 1; cy < h - 1; cy++) {
int h = s_one / 2;
int c = (l_one - h) / 2 + s_one;
int c1 = (c <= cy && cy <= (c + h)) ? 1 : 0;
int c2 = ((s_one + l_one + c) <= cy && cy <= (s_one + l_one + c + h)) ? 1 : 0;
if(c1 || c2) {
for(cx = x; cx < x + s_one; cx++) {
unsigned char* px = &raw[((cy + j) * w + (cx + j)) * 4];
px[0] = cl->common.red;
px[1] = cl->common.green;
px[2] = cl->common.blue;
px[3] = 255;
}
}
}
}
x += s_one;
} else if(str[i] == ' ') {
x += s_one;
} else if(str[i] == '.') {
int cy, cx;
int j;
for(j = 1; j >= 0; j--) {
MwLLColor cl = j == 1 ? shadow : text;
for(cy = h - (s_one - 1) / 2 - 1; cy < h; cy++) {
for(cx = x - Spacing - (s_one - 1) / 2 - 1; cx < (x - Spacing); cx++) {
unsigned char* px = &raw[((cy + j) * w + (cx + j)) * 4];
px[0] = cl->common.red;
px[1] = cl->common.green;
px[2] = cl->common.blue;
px[3] = 255;
}
}
}
continue;
}
x += Spacing;
}
px = MwLoadRaw(handle, raw, w, h);
r.y = (r.height - h) / 2;
r.height = h;
if(align == MwALIGNMENT_CENTER) {
r.x = (r.width - w) / 2;
} else if(align == MwALIGNMENT_BEGINNING) {
r.x = 0;
} else if(align == MwALIGNMENT_END) {
r.x = r.width - w;
}
r.width = w;
MwLLDrawPixmap(handle->lowlevel, &r, px);
MwLLDestroyPixmap(px);
} else {
r.width -= MwGetInteger(handle, MwNleftPadding);
if(align == MwALIGNMENT_CENTER) {
p.x = r.width / 2;
} else if(align == MwALIGNMENT_BEGINNING) {
@@ -36,19 +321,47 @@ static void draw(MwWidget handle) {
p.x = r.width - MwTextWidth(handle, str) / 2;
}
p.y = r.height / 2;
MwDrawText(handle, &p, str, MwGetInteger(handle, MwNbold), MwALIGNMENT_CENTER, text);
p.x += MwGetInteger(handle, MwNleftPadding);
p.x += 1;
p.y += 1;
MwDrawText(handle, &p, str, MwGetInteger(handle, MwNbold), MwALIGNMENT_CENTER, shadow);
p.x -= 1;
p.y -= 1;
MwDrawText(handle, &p, str, MwGetInteger(handle, MwNbold), MwALIGNMENT_CENTER, text);
}
MwLLFreeColor(shadow);
MwLLFreeColor(text);
MwLLFreeColor(base);
}
static void prop_change(MwWidget handle, const char* key) {
if(strcmp(key, MwNtext) == 0 || strcmp(key, MwNalignment) == 0) MwForceRender(handle);
if(strcmp(key, MwNtext) == 0 || strcmp(key, MwNalignment) == 0 || strcmp(key, MwNsevenSegment) == 0 || strcmp(key, MwNlength) == 0 || strcmp(key, MwNleftPadding) == 0) MwForceRender(handle);
}
static void mwLabelSetSevenSegmentImpl(MwWidget handle, int index, unsigned char data) {
MwLabel lab = handle->internal;
hmput(lab->segment, index, data);
}
static void func_handler(MwWidget handle, const char* name, void* out, va_list va) {
(void)out;
if(strcmp(name, "mwLabelSetSevenSegment") == 0) {
int index = va_arg(va, int);
int data = va_arg(va, int);
mwLabelSetSevenSegmentImpl(handle, index, data);
}
}
MwClassRec MwLabelClassRec = {
create, /* create */
NULL, /* destroy */
destroy, /* destroy */
draw, /* draw */
NULL, /* click */
NULL, /* parent_resize */
@@ -57,12 +370,12 @@ MwClassRec MwLabelClassRec = {
NULL, /* mouse_up */
NULL, /* mouse_down */
NULL, /* key */
NULL, /* execute */
func_handler, /* execute */
NULL, /* tick */
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -258,7 +258,6 @@ static void frame_draw(MwWidget handle) {
if(j == (arrlen(lb->list[i].name) - 1)) p.x -= MwDefaultBorderWidth(handle);
if(arrlen(lb->alignment) <= j || lb->alignment[j] == MwALIGNMENT_BEGINNING) {
p.x += 4;
MwDrawText(handle, &p, str, 0, MwALIGNMENT_BEGINNING, selected ? base2 : text2);
p.x -= 4;
@@ -609,7 +608,7 @@ MwClassRec MwListBoxClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -129,7 +129,7 @@ static void mouse_down(MwWidget handle, void* ptr) {
p2.y = p.y + th / 2 + 5;
m->sub[i]->wsub = MwCreateWidget(MwSubMenuClass, "submenu", handle, 0, 0, 0, 0);
MwSubMenuAppear(m->sub[i]->wsub, m->sub[i], &p2);
MwSubMenuAppear(m->sub[i]->wsub, m->sub[i], &p2, 0);
} else if(m->sub[i]->wsub != NULL && m->sub[i]->keep) {
MwDestroyWidget(m->sub[i]->wsub);
m->sub[i]->wsub = NULL;
@@ -204,7 +204,7 @@ MwClassRec MwMenuClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -143,7 +143,7 @@ MwClassRec MwNumberEntryClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -1,12 +1,6 @@
#include <Mw/Milsko.h>
#include <Mw/Widget/OpenGL.h>
#ifdef USE_WAYLAND
#include <stb_ds.h>
#include <pthread.h>
#include <sys/time.h>
#endif
#ifdef USE_GDI
typedef HGLRC(WINAPI* MWwglCreateContext)(HDC);
typedef BOOL(WINAPI* MWwglMakeCurrent)(HDC, HGLRC);
@@ -48,6 +42,19 @@ typedef struct x11opengl {
} x11opengl_t;
#endif
#ifdef USE_WAYLAND
#include <EGL/egl.h>
#include <wayland-egl-core.h>
typedef struct waylandopengl {
EGLNativeWindowType egl_window_native;
EGLDisplay egl_display;
EGLContext egl_context;
EGLSurface egl_surface;
EGLConfig egl_config;
} waylandopengl_t;
#endif
static int create(MwWidget handle) {
void* r = NULL;
#ifdef USE_GDI
@@ -110,8 +117,91 @@ static int create(MwWidget handle) {
}
#endif
#ifdef USE_WAYLAND
/* Wayland uses OpenGL as its backend so its already initialized */
if(handle->lowlevel->common.type == MwLLBackendWayland) {
int err;
EGLint numConfigs;
EGLint majorVersion;
EGLint minorVersion;
EGLContext context;
EGLSurface surface;
EGLint fbAttribs[] =
{
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_DEPTH_SIZE, 24,
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
EGL_NONE};
EGLint contextAttribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 1,
EGL_CONTEXT_MAJOR_VERSION, 1,
EGL_CONTEXT_MINOR_VERSION, 1,
EGL_NONE};
EGLDisplay display;
waylandopengl_t* o = r = malloc(sizeof(*o));
MwLL topmost_parent = handle->lowlevel->wayland.parent;
topmost_parent->wayland.always_render = MwTRUE;
while(topmost_parent->wayland.parent != NULL) {
topmost_parent = topmost_parent->wayland.parent;
topmost_parent->wayland.always_render = MwTRUE;
}
display = eglGetDisplay((EGLNativeDisplayType)handle->lowlevel->wayland.display);
if(display == EGL_NO_DISPLAY) {
printf("ERROR: eglGetDisplay, %0X\n", eglGetError());
return MwFALSE;
}
/* Initialize EGL */
if(!eglInitialize(display, &majorVersion, &minorVersion)) {
printf("ERROR: eglInitialize, %0X\n", eglGetError());
return MwFALSE;
}
/* Get configs */
if((eglGetConfigs(display, NULL, 0, &numConfigs) != EGL_TRUE) || (numConfigs == 0)) {
printf("ERROR: eglGetConfigs, %0X\n", eglGetError());
return MwFALSE;
}
/* Choose config */
if((eglChooseConfig(display, fbAttribs, &o->egl_config, 1, &numConfigs) != EGL_TRUE) || (numConfigs != 1)) {
printf("ERROR: eglChooseConfig, %0X\n", eglGetError());
return MwFALSE;
}
o->egl_window_native =
(EGLNativeWindowType)wl_egl_window_create(handle->lowlevel->wayland.framebuffer.surface, handle->lowlevel->wayland.ww, handle->lowlevel->wayland.wh);
if(o->egl_window_native == EGL_NO_SURFACE) {
printf("ERROR: wl_egl_window_create, EGL_NO_SURFACE\n");
return MwFALSE;
}
/* Create a surface */
surface = eglCreateWindowSurface(display, o->egl_config, o->egl_window_native, NULL);
if(surface == EGL_NO_SURFACE) {
printf("ERROR: eglCreateWindowSurface, %0X\n", eglGetError());
return MwFALSE;
}
eglBindAPI(EGL_OPENGL_API);
/* Create a GL context */
context = eglCreateContext(display, o->egl_config, EGL_NO_CONTEXT, contextAttribs);
if(context == EGL_NO_CONTEXT) {
printf("ERROR: eglCreateContext, %0X\n", eglGetError());
return MwFALSE;
}
if(!eglMakeCurrent(display, surface, surface, context)) {
printf("ERROR: eglMakeCurrent (setup): %0X\n", eglGetError());
}
o->egl_display = display;
o->egl_surface = surface;
o->egl_context = context;
}
#endif
@@ -146,7 +236,9 @@ static void destroy(MwWidget handle) {
}
#endif
#ifdef USE_WAYLAND
/* Wayland uses OpenGL as its backend so its destroyed accordingly */
if(handle->lowlevel->common.type == MwLLBackendWayland) {
/* todo */
}
#endif
free(handle->internal);
@@ -169,6 +261,11 @@ static void mwOpenGLMakeCurrentImpl(MwWidget handle) {
#endif
#ifdef USE_WAYLAND
if(handle->lowlevel->common.type == MwLLBackendWayland) {
waylandopengl_t* o = handle->internal;
if(!eglMakeCurrent(o->egl_display, o->egl_surface, o->egl_surface, o->egl_context)) {
printf("ERROR: eglMakeCurrent, %0X\n", eglGetError());
}
}
#endif
}
@@ -189,14 +286,15 @@ static void mwOpenGLSwapBufferImpl(MwWidget handle) {
}
#endif
#ifdef USE_WAYLAND
#define tp handle->lowlevel->wayland.topmost_parent->wayland
if(handle->lowlevel->common.type == MwLLBackendWayland) {
if(!eglSwapBuffers(
tp.egl_display, tp.egl_surface)) {
printf("Userland error: eglSwapBuffers, %0X\n", eglGetError());
waylandopengl_t* o = handle->internal;
eglSwapInterval(o->egl_display, 0);
if(!eglSwapBuffers(o->egl_display, o->egl_surface)) {
printf("ERROR: eglSwapBuffers, %0X\n", eglGetError());
};
wl_egl_window_resize((struct wl_egl_window*)o->egl_window_native, handle->lowlevel->wayland.ww, handle->lowlevel->wayland.wh, 0, 0);
MwLLForceRender(handle->lowlevel);
}
}
#undef topmost_parent
#endif
}
@@ -252,7 +350,7 @@ MwClassRec MwOpenGLClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -61,7 +61,7 @@ MwClassRec MwProgressBarClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -62,7 +62,7 @@ MwClassRec MwRadioBoxClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -1,13 +1,7 @@
#include <Mw/Milsko.h>
typedef struct scrollbar {
MwPoint point;
int drag;
int pos;
} scrollbar_t;
static int create(MwWidget handle) {
scrollbar_t* scr = malloc(sizeof(*scr));
MwScrollBar scr = malloc(sizeof(*scr));
handle->internal = scr;
@@ -63,7 +57,7 @@ static void draw(MwWidget handle) {
MwRect r, rt, rbar;
MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground));
MwLLColor dark = MwLightenColor(handle, base, -64, -64, -64);
scrollbar_t* scr = handle->internal;
MwScrollBar scr = handle->internal;
int or ;
int uy, dy, ux, dx;
MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap);
@@ -145,7 +139,7 @@ static void draw(MwWidget handle) {
static void mouse_move(MwWidget handle) {
int or = MwGetInteger(handle, MwNorientation);
scrollbar_t* scr = handle->internal;
MwScrollBar scr = handle->internal;
if(!handle->pressed) return;
@@ -175,7 +169,7 @@ static void mouse_down(MwWidget handle, void* ptr) {
int ww = MwGetInteger(handle, MwNwidth);
int wh = MwGetInteger(handle, MwNheight);
int or = MwGetInteger(handle, MwNorientation);
scrollbar_t* scr = handle->internal;
MwScrollBar scr = handle->internal;
MwLLMouse* m = ptr;
if(m->button == MwLLMouseWheelUp) {
@@ -278,7 +272,7 @@ MwClassRec MwScrollBarClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -50,7 +50,7 @@ MwClassRec MwSeparatorClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -6,6 +6,7 @@ static int create(MwWidget handle) {
MwLLBeginStateChange(handle->lowlevel);
MwSetDefault(handle);
MwSetInteger(handle, MwNleftPadding, 0);
return 0;
}
@@ -53,25 +54,27 @@ static void draw(MwWidget handle) {
rc.x = MwDefaultBorderWidth(handle) * 2;
rc.y = p.y;
rc.width = r.width - (rc.x * 2);
rc.height = MwDefaultBorderWidth(handle) * 2;
rc.width = r.width - (rc.x * 2) - MwGetInteger(handle, MwNleftPadding);
rc.height = 2;
MwDrawFrame(handle, &rc, base, 1);
rc.x += MwGetInteger(handle, MwNleftPadding);
p.y += MwDefaultBorderWidth(handle) * 2 + 1;
MwDrawFrameEx(handle, &rc, base, 1, 1, 0, 0);
p.y += 2 + 1;
} else {
int tw = MwTextWidth(handle, menu->sub[i]->name);
int th = MwTextHeight(handle, menu->sub[i]->name);
if(menu->sub[i]->wsub != NULL) {
r.x = 0;
r.x = MwGetInteger(handle, MwNleftPadding);
r.y = p.y - 3;
r.width = tw + 15 + 5 * 2;
r.width = MwGetInteger(handle, MwNwidth) - MwGetInteger(handle, MwNleftPadding);
r.height = th + 3 * 2;
MwDrawWidgetBack(handle, &r, base, 0, MwTRUE);
}
p.x = 5 + tw / 2;
p.x = 5 + tw / 2 + MwGetInteger(handle, MwNleftPadding);
p.y += th / 2;
MwDrawText(handle, &p, menu->sub[i]->name, menu->sub[i]->wsub != NULL ? 1 : 0, MwALIGNMENT_CENTER, text);
@@ -79,7 +82,7 @@ static void draw(MwWidget handle) {
if(arrlen(menu->sub[i]->sub) > 0) {
MwRect tr;
tr.x = p.x + tw / 2 + 5;
tr.x = MwGetInteger(handle, MwNwidth) - MwDefaultBorderWidth(handle) - 11 - 2;
tr.y = p.y - th / 2 + 2;
tr.width = tr.height = 11;
@@ -116,7 +119,11 @@ static void click(MwWidget handle) {
int th = MwTextHeight(handle, menu->sub[i]->name);
rc.height = th;
if(rc.x <= handle->mouse_point.x && rc.y <= handle->mouse_point.y && handle->mouse_point.x <= (int)(rc.x + rc.width) && handle->mouse_point.y <= (int)(rc.y + rc.height)) {
if(strcmp(menu->sub[i]->name, "----") == 0) {
rc.height = 2 - 1;
}
if(MwGetInteger(handle, MwNleftPadding) <= handle->mouse_point.x && rc.y <= handle->mouse_point.y && handle->mouse_point.y <= (int)(rc.y + rc.height)) {
if(menu->sub[i]->wsub == NULL && arrlen(menu->sub[i]->sub) > 0) {
MwPoint p;
int j;
@@ -126,14 +133,14 @@ static void click(MwWidget handle) {
menu->sub[j]->wsub = NULL;
}
p.x = rc.x + rc.width + 3;
p.x = MwGetInteger(handle, MwNwidth);
p.y = rc.y - 3;
menu->sub[i]->wsub = MwCreateWidget(MwSubMenuClass, "submenu", handle, 0, 0, 0, 0);
MwSubMenuAppear(menu->sub[i]->wsub, menu->sub[i], &p);
MwSubMenuAppear(menu->sub[i]->wsub, menu->sub[i], &p, 0);
i = -1;
} else if(menu->sub[i]->wsub != NULL && arrlen(menu->sub[i]->sub) > 0) {
while(w->parent->widget_class != MwMenuClass) w = w->parent;
while(w->parent->widget_class == MwSubMenuClass) w = w->parent;
MwDestroyWidget(menu->sub[i]->wsub);
menu->sub[i]->wsub = NULL;
@@ -142,7 +149,7 @@ static void click(MwWidget handle) {
MwForceRender(handle);
} else if(strcmp(menu->sub[i]->name, "----") != 0 && arrlen(menu->sub[i]->sub) == 0) {
while(w->parent->widget_class != MwMenuClass) w = w->parent;
while(w->parent->widget_class == MwSubMenuClass) w = w->parent;
MwGetBeforeStep(w, &jmp);
MwDestroyWidget(w);
@@ -159,34 +166,60 @@ static void click(MwWidget handle) {
}
}
static void mwSubMenuAppearImpl(MwWidget handle, MwMenu menu, MwPoint* point) {
int i, w = 0, h = 0;
static void mwSubMenuAppearImpl(MwWidget handle, MwMenu menu, MwPoint* point, int diff_calc) {
MwRect rc, sz;
MwPoint p = *point;
MwSubMenuGetSize(handle, menu, &sz);
MwGetScreenSize(handle, &rc);
handle->internal = menu;
if(diff_calc) {
p.y = p.y - sz.height;
}
MwLLMakeToolWindow(handle->lowlevel);
MwLLDetach(handle->lowlevel, point);
MwLLDetach(handle->lowlevel, &p);
if(MwGetInteger(handle, MwNy) + sz.height > rc.height) {
MwVaApply(handle,
MwNy, rc.height - sz.height,
NULL);
}
MwLLEndStateChange(handle->lowlevel);
MwVaApply(handle,
MwNwidth, sz.width,
MwNheight, sz.height,
NULL);
}
static void mwSubMenuGetSizeImpl(MwWidget handle, MwMenu menu, MwRect* rect) {
int i;
rect->width = 0;
rect->height = 0;
for(i = 0; i < arrlen(menu->sub); i++) {
if(strcmp(menu->sub[i]->name, "----") == 0) {
h += MwDefaultBorderWidth(handle) * 2 + 2;
rect->height += 2 + 2;
} else {
int tw = MwTextWidth(handle, menu->sub[i]->name);
h += MwTextHeight(handle, menu->sub[i]->name) + 3;
if(tw > w) {
w = tw;
rect->height += MwTextHeight(handle, menu->sub[i]->name) + 3;
if(tw > rect->width) {
rect->width = tw;
}
}
}
w += 10 + 15;
h += 3;
rect->width += MwGetInteger(handle, MwNleftPadding);
MwVaApply(handle,
MwNwidth, w,
MwNheight, h,
NULL);
rect->width += 10 + 15;
rect->height += 3;
rect->width += 16;
}
static void func_handler(MwWidget handle, const char* name, void* out, va_list va) {
@@ -195,7 +228,12 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v
if(strcmp(name, "mwSubMenuAppear") == 0) {
MwMenu menu = va_arg(va, MwMenu);
MwPoint* point = va_arg(va, MwPoint*);
mwSubMenuAppearImpl(handle, menu, point);
int diff_calc = va_arg(va, int);
mwSubMenuAppearImpl(handle, menu, point, diff_calc);
} else if(strcmp(name, "mwSubMenuGetSize") == 0) {
MwMenu menu = va_arg(va, MwMenu);
MwRect* rect = va_arg(va, MwRect*);
mwSubMenuGetSizeImpl(handle, menu, rect);
}
}
@@ -215,7 +253,7 @@ MwClassRec MwSubMenuClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -496,7 +496,7 @@ MwClassRec MwTreeViewClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -191,7 +191,7 @@ MwClassRec MwViewportClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -524,7 +524,7 @@ MwClassRec MwVulkanClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

View File

@@ -59,7 +59,7 @@ MwClassRec MwWindowClassRec = {
NULL, /* resize */
NULL, /* children_update */
NULL, /* children_prop_change */
NULL,
NULL, /* clipboard */
NULL,
NULL,
NULL,

105
tools/gendcl.pl Executable file
View File

@@ -0,0 +1,105 @@
#!/usr/bin/env perl
our $clean = 0;
my @objs = ();
sub compile {
my ($source) = @_;
my $object = "";
my $dir = "";
$dir = $source;
$dir =~ s/\/([^\/]+)$//;
$source =~ s/^(.+)\/([^\/]+)$/[\/\1]\2/;
$source =~ s/\//\./g;
$object = $source;
$object =~ s/\.c$/.obj/;
print(OUT "\$ if f\$search(\"$object;*\") .eqs. \"\"\n");
print(OUT "\$ then\n");
print(OUT "\$ write sys\$output \"CC $object\"\n");
print(OUT
"\$ cc /include_directory=(\"./include\",\"./$dir\") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=$object $source\n"
);
print(OUT "\$ endif\n");
push(@objs, $object);
}
sub clean {
my ($source) = @_;
my $object = "";
my $dir = "";
$source =~ s/^(.+)\/([^\/]+)$/[\/\1]\2/;
$source =~ s/\//\./g;
$object = $source;
$object =~ s/\.c$/.obj/;
print(OUT
"\$ if f\$search(\"$object\") .nes. \"\" then delete $object;*\n");
}
sub thing {
if ($clean) {
clean($_[0]);
}
else {
compile($_[0]);
}
}
sub scan {
my ($dir) = @_;
opendir(my $dh, $dir);
while (my $file = readdir($dh)) {
if ( !(($dir . "/" . $file) eq "src/widget/opengl.c")
&& !(($dir . "/" . $file) eq "src/widget/vulkan.c")
&& !(($dir . "/" . $file) eq "external/stb_truetype.c")
&& !(($dir . "/" . $file) eq "external/stb_image.c")
&& ($file =~ /\.c$/))
{
thing($dir . "/" . $file);
}
}
closedir($dh);
}
for (my $i = 0 ; $i < 2 ; $i++) {
$clean = $i;
open(OUT, ">", $i == 0 ? "vms/build.com" : "vms/clean.com");
scan("src");
scan("src/cursor");
scan("src/widget");
scan("src/dialog");
scan("src/font");
scan("src/icon");
scan("src/abstract");
scan("external");
thing("src/backend/x11.c");
if ($i == 0) {
print(OUT "\$ if f\$search(\"[.src]MwSHR.exe;*\") .eqs. \"\"\n");
print(OUT "\$ then\n");
print(OUT "\$ write sys\$output \"LINK [.src]MwSHR.exe\"\n");
print(OUT "\$ OPEN /WRITE LINK_OPT LINK.OPT\n");
foreach my $obj (@objs) {
print(OUT "\$ WRITE LINK_OPT \"$obj\"\n");
}
print(OUT "\$ WRITE LINK_OPT \"SYS\$LIBRARY:DECW\$XLIBSHR/SHARE\"\n");
print(OUT "\$ WRITE LINK_OPT \"SYS\$LIBRARY:DPML\$SHR/SHARE\"\n");
print(OUT "\$ CLOSE LINK_OPT\n");
print(OUT "\$ link /SHAREABLE=[.src]MwSHR.exe LINK.OPT/options\n");
print(OUT "\$ DELETE LINK.OPT;*\n");
print(OUT "\$ endif\n");
}
else {
clean("src/MwSHR.exe");
}
close(OUT);
}

382
vms/build.com Normal file
View File

@@ -0,0 +1,382 @@
$ if f$search("[.src]color.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src]color.obj"
$ cc /include_directory=("./include","./src") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src]color.obj [.src]color.c
$ endif
$ if f$search("[.src]core.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src]core.obj"
$ cc /include_directory=("./include","./src") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src]core.obj [.src]core.c
$ endif
$ if f$search("[.src]default.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src]default.obj"
$ cc /include_directory=("./include","./src") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src]default.obj [.src]default.c
$ endif
$ if f$search("[.src]draw.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src]draw.obj"
$ cc /include_directory=("./include","./src") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src]draw.obj [.src]draw.c
$ endif
$ if f$search("[.src]error.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src]error.obj"
$ cc /include_directory=("./include","./src") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src]error.obj [.src]error.c
$ endif
$ if f$search("[.src]lowlevel.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src]lowlevel.obj"
$ cc /include_directory=("./include","./src") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src]lowlevel.obj [.src]lowlevel.c
$ endif
$ if f$search("[.src]string.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src]string.obj"
$ cc /include_directory=("./include","./src") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src]string.obj [.src]string.c
$ endif
$ if f$search("[.src]text.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src]text.obj"
$ cc /include_directory=("./include","./src") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src]text.obj [.src]text.c
$ endif
$ if f$search("[.src]unicode.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src]unicode.obj"
$ cc /include_directory=("./include","./src") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src]unicode.obj [.src]unicode.c
$ endif
$ if f$search("[.src.cursor]arrow.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.cursor]arrow.obj"
$ cc /include_directory=("./include","./src/cursor") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.cursor]arrow.obj [.src.cursor]arrow.c
$ endif
$ if f$search("[.src.cursor]cross.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.cursor]cross.obj"
$ cc /include_directory=("./include","./src/cursor") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.cursor]cross.obj [.src.cursor]cross.c
$ endif
$ if f$search("[.src.cursor]default.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.cursor]default.obj"
$ cc /include_directory=("./include","./src/cursor") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.cursor]default.obj [.src.cursor]default.c
$ endif
$ if f$search("[.src.cursor]hidden.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.cursor]hidden.obj"
$ cc /include_directory=("./include","./src/cursor") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.cursor]hidden.obj [.src.cursor]hidden.c
$ endif
$ if f$search("[.src.cursor]text.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.cursor]text.obj"
$ cc /include_directory=("./include","./src/cursor") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.cursor]text.obj [.src.cursor]text.c
$ endif
$ if f$search("[.src.widget]button.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]button.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]button.obj [.src.widget]button.c
$ endif
$ if f$search("[.src.widget]checkbox.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]checkbox.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]checkbox.obj [.src.widget]checkbox.c
$ endif
$ if f$search("[.src.widget]combobox.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]combobox.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]combobox.obj [.src.widget]combobox.c
$ endif
$ if f$search("[.src.widget]entry.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]entry.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]entry.obj [.src.widget]entry.c
$ endif
$ if f$search("[.src.widget]frame.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]frame.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]frame.obj [.src.widget]frame.c
$ endif
$ if f$search("[.src.widget]image.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]image.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]image.obj [.src.widget]image.c
$ endif
$ if f$search("[.src.widget]label.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]label.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]label.obj [.src.widget]label.c
$ endif
$ if f$search("[.src.widget]listbox.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]listbox.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]listbox.obj [.src.widget]listbox.c
$ endif
$ if f$search("[.src.widget]menu.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]menu.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]menu.obj [.src.widget]menu.c
$ endif
$ if f$search("[.src.widget]numberentry.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]numberentry.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]numberentry.obj [.src.widget]numberentry.c
$ endif
$ if f$search("[.src.widget]progressbar.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]progressbar.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]progressbar.obj [.src.widget]progressbar.c
$ endif
$ if f$search("[.src.widget]radiobox.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]radiobox.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]radiobox.obj [.src.widget]radiobox.c
$ endif
$ if f$search("[.src.widget]scrollbar.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]scrollbar.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]scrollbar.obj [.src.widget]scrollbar.c
$ endif
$ if f$search("[.src.widget]separator.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]separator.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]separator.obj [.src.widget]separator.c
$ endif
$ if f$search("[.src.widget]submenu.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]submenu.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]submenu.obj [.src.widget]submenu.c
$ endif
$ if f$search("[.src.widget]treeview.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]treeview.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]treeview.obj [.src.widget]treeview.c
$ endif
$ if f$search("[.src.widget]viewport.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]viewport.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]viewport.obj [.src.widget]viewport.c
$ endif
$ if f$search("[.src.widget]window.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]window.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]window.obj [.src.widget]window.c
$ endif
$ if f$search("[.src.widget]box.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.widget]box.obj"
$ cc /include_directory=("./include","./src/widget") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.widget]box.obj [.src.widget]box.c
$ endif
$ if f$search("[.src.dialog]colorpicker.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.dialog]colorpicker.obj"
$ cc /include_directory=("./include","./src/dialog") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.dialog]colorpicker.obj [.src.dialog]colorpicker.c
$ endif
$ if f$search("[.src.dialog]directorychooser.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.dialog]directorychooser.obj"
$ cc /include_directory=("./include","./src/dialog") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.dialog]directorychooser.obj [.src.dialog]directorychooser.c
$ endif
$ if f$search("[.src.dialog]filechooser.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.dialog]filechooser.obj"
$ cc /include_directory=("./include","./src/dialog") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.dialog]filechooser.obj [.src.dialog]filechooser.c
$ endif
$ if f$search("[.src.dialog]messagebox.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.dialog]messagebox.obj"
$ cc /include_directory=("./include","./src/dialog") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.dialog]messagebox.obj [.src.dialog]messagebox.c
$ endif
$ if f$search("[.src.font]boldfont.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.font]boldfont.obj"
$ cc /include_directory=("./include","./src/font") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.font]boldfont.obj [.src.font]boldfont.c
$ endif
$ if f$search("[.src.font]boldttf.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.font]boldttf.obj"
$ cc /include_directory=("./include","./src/font") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.font]boldttf.obj [.src.font]boldttf.c
$ endif
$ if f$search("[.src.font]font.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.font]font.obj"
$ cc /include_directory=("./include","./src/font") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.font]font.obj [.src.font]font.c
$ endif
$ if f$search("[.src.font]ttf.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.font]ttf.obj"
$ cc /include_directory=("./include","./src/font") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.font]ttf.obj [.src.font]ttf.c
$ endif
$ if f$search("[.src.icon]back.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]back.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]back.obj [.src.icon]back.c
$ endif
$ if f$search("[.src.icon]clock.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]clock.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]clock.obj [.src.icon]clock.c
$ endif
$ if f$search("[.src.icon]computer.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]computer.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]computer.obj [.src.icon]computer.c
$ endif
$ if f$search("[.src.icon]directory.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]directory.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]directory.obj [.src.icon]directory.c
$ endif
$ if f$search("[.src.icon]down.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]down.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]down.obj [.src.icon]down.c
$ endif
$ if f$search("[.src.icon]error.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]error.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]error.obj [.src.icon]error.c
$ endif
$ if f$search("[.src.icon]file.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]file.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]file.obj [.src.icon]file.c
$ endif
$ if f$search("[.src.icon]forward.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]forward.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]forward.obj [.src.icon]forward.c
$ endif
$ if f$search("[.src.icon]info.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]info.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]info.obj [.src.icon]info.c
$ endif
$ if f$search("[.src.icon]left.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]left.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]left.obj [.src.icon]left.c
$ endif
$ if f$search("[.src.icon]news.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]news.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]news.obj [.src.icon]news.c
$ endif
$ if f$search("[.src.icon]note.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]note.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]note.obj [.src.icon]note.c
$ endif
$ if f$search("[.src.icon]right.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]right.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]right.obj [.src.icon]right.c
$ endif
$ if f$search("[.src.icon]search.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]search.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]search.obj [.src.icon]search.c
$ endif
$ if f$search("[.src.icon]up.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]up.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]up.obj [.src.icon]up.c
$ endif
$ if f$search("[.src.icon]warning.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.icon]warning.obj"
$ cc /include_directory=("./include","./src/icon") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.icon]warning.obj [.src.icon]warning.c
$ endif
$ if f$search("[.src.abstract]directory.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.abstract]directory.obj"
$ cc /include_directory=("./include","./src/abstract") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.abstract]directory.obj [.src.abstract]directory.c
$ endif
$ if f$search("[.src.abstract]dynamic.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.abstract]dynamic.obj"
$ cc /include_directory=("./include","./src/abstract") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.abstract]dynamic.obj [.src.abstract]dynamic.c
$ endif
$ if f$search("[.src.abstract]time.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.abstract]time.obj"
$ cc /include_directory=("./include","./src/abstract") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.abstract]time.obj [.src.abstract]time.c
$ endif
$ if f$search("[.external]stb_ds.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.external]stb_ds.obj"
$ cc /include_directory=("./include","./external") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.external]stb_ds.obj [.external]stb_ds.c
$ endif
$ if f$search("[.src.backend]x11.obj;*") .eqs. ""
$ then
$ write sys$output "CC [.src.backend]x11.obj"
$ cc /include_directory=("./include","./src/backend") /define=(_MILSKO,USE_X11,NO_IMAGE) /object=[.src.backend]x11.obj [.src.backend]x11.c
$ endif
$ if f$search("[.src]MwSHR.exe;*") .eqs. ""
$ then
$ write sys$output "LINK [.src]MwSHR.exe"
$ OPEN /WRITE LINK_OPT LINK.OPT
$ WRITE LINK_OPT "[.src]color.obj"
$ WRITE LINK_OPT "[.src]core.obj"
$ WRITE LINK_OPT "[.src]default.obj"
$ WRITE LINK_OPT "[.src]draw.obj"
$ WRITE LINK_OPT "[.src]error.obj"
$ WRITE LINK_OPT "[.src]lowlevel.obj"
$ WRITE LINK_OPT "[.src]string.obj"
$ WRITE LINK_OPT "[.src]text.obj"
$ WRITE LINK_OPT "[.src]unicode.obj"
$ WRITE LINK_OPT "[.src.cursor]arrow.obj"
$ WRITE LINK_OPT "[.src.cursor]cross.obj"
$ WRITE LINK_OPT "[.src.cursor]default.obj"
$ WRITE LINK_OPT "[.src.cursor]hidden.obj"
$ WRITE LINK_OPT "[.src.cursor]text.obj"
$ WRITE LINK_OPT "[.src.widget]button.obj"
$ WRITE LINK_OPT "[.src.widget]checkbox.obj"
$ WRITE LINK_OPT "[.src.widget]combobox.obj"
$ WRITE LINK_OPT "[.src.widget]entry.obj"
$ WRITE LINK_OPT "[.src.widget]frame.obj"
$ WRITE LINK_OPT "[.src.widget]image.obj"
$ WRITE LINK_OPT "[.src.widget]label.obj"
$ WRITE LINK_OPT "[.src.widget]listbox.obj"
$ WRITE LINK_OPT "[.src.widget]menu.obj"
$ WRITE LINK_OPT "[.src.widget]numberentry.obj"
$ WRITE LINK_OPT "[.src.widget]progressbar.obj"
$ WRITE LINK_OPT "[.src.widget]radiobox.obj"
$ WRITE LINK_OPT "[.src.widget]scrollbar.obj"
$ WRITE LINK_OPT "[.src.widget]separator.obj"
$ WRITE LINK_OPT "[.src.widget]submenu.obj"
$ WRITE LINK_OPT "[.src.widget]treeview.obj"
$ WRITE LINK_OPT "[.src.widget]viewport.obj"
$ WRITE LINK_OPT "[.src.widget]window.obj"
$ WRITE LINK_OPT "[.src.widget]box.obj"
$ WRITE LINK_OPT "[.src.dialog]colorpicker.obj"
$ WRITE LINK_OPT "[.src.dialog]directorychooser.obj"
$ WRITE LINK_OPT "[.src.dialog]filechooser.obj"
$ WRITE LINK_OPT "[.src.dialog]messagebox.obj"
$ WRITE LINK_OPT "[.src.font]boldfont.obj"
$ WRITE LINK_OPT "[.src.font]boldttf.obj"
$ WRITE LINK_OPT "[.src.font]font.obj"
$ WRITE LINK_OPT "[.src.font]ttf.obj"
$ WRITE LINK_OPT "[.src.icon]back.obj"
$ WRITE LINK_OPT "[.src.icon]clock.obj"
$ WRITE LINK_OPT "[.src.icon]computer.obj"
$ WRITE LINK_OPT "[.src.icon]directory.obj"
$ WRITE LINK_OPT "[.src.icon]down.obj"
$ WRITE LINK_OPT "[.src.icon]error.obj"
$ WRITE LINK_OPT "[.src.icon]file.obj"
$ WRITE LINK_OPT "[.src.icon]forward.obj"
$ WRITE LINK_OPT "[.src.icon]info.obj"
$ WRITE LINK_OPT "[.src.icon]left.obj"
$ WRITE LINK_OPT "[.src.icon]news.obj"
$ WRITE LINK_OPT "[.src.icon]note.obj"
$ WRITE LINK_OPT "[.src.icon]right.obj"
$ WRITE LINK_OPT "[.src.icon]search.obj"
$ WRITE LINK_OPT "[.src.icon]up.obj"
$ WRITE LINK_OPT "[.src.icon]warning.obj"
$ WRITE LINK_OPT "[.src.abstract]directory.obj"
$ WRITE LINK_OPT "[.src.abstract]dynamic.obj"
$ WRITE LINK_OPT "[.src.abstract]time.obj"
$ WRITE LINK_OPT "[.external]stb_ds.obj"
$ WRITE LINK_OPT "[.src.backend]x11.obj"
$ WRITE LINK_OPT "SYS$LIBRARY:DECW$XLIBSHR/SHARE/SHARE"
$ WRITE LINK_OPT "SYS$LIBRARY:DPML$SHR/SHARE/SHARE"
$ CLOSE LINK_OPT
$ link /SHAREABLE=[.src]MwSHR.exe LINK.OPT/options
$ DELETE LINK.OPT;*
$ endif

63
vms/clean.com Normal file
View File

@@ -0,0 +1,63 @@
$ if f$search("[.src]color.obj") .nes. "" then delete [.src]color.obj;*
$ if f$search("[.src]core.obj") .nes. "" then delete [.src]core.obj;*
$ if f$search("[.src]default.obj") .nes. "" then delete [.src]default.obj;*
$ if f$search("[.src]draw.obj") .nes. "" then delete [.src]draw.obj;*
$ if f$search("[.src]error.obj") .nes. "" then delete [.src]error.obj;*
$ if f$search("[.src]lowlevel.obj") .nes. "" then delete [.src]lowlevel.obj;*
$ if f$search("[.src]string.obj") .nes. "" then delete [.src]string.obj;*
$ if f$search("[.src]text.obj") .nes. "" then delete [.src]text.obj;*
$ if f$search("[.src]unicode.obj") .nes. "" then delete [.src]unicode.obj;*
$ if f$search("[.src.cursor]arrow.obj") .nes. "" then delete [.src.cursor]arrow.obj;*
$ if f$search("[.src.cursor]cross.obj") .nes. "" then delete [.src.cursor]cross.obj;*
$ if f$search("[.src.cursor]default.obj") .nes. "" then delete [.src.cursor]default.obj;*
$ if f$search("[.src.cursor]hidden.obj") .nes. "" then delete [.src.cursor]hidden.obj;*
$ if f$search("[.src.cursor]text.obj") .nes. "" then delete [.src.cursor]text.obj;*
$ if f$search("[.src.widget]button.obj") .nes. "" then delete [.src.widget]button.obj;*
$ if f$search("[.src.widget]checkbox.obj") .nes. "" then delete [.src.widget]checkbox.obj;*
$ if f$search("[.src.widget]combobox.obj") .nes. "" then delete [.src.widget]combobox.obj;*
$ if f$search("[.src.widget]entry.obj") .nes. "" then delete [.src.widget]entry.obj;*
$ if f$search("[.src.widget]frame.obj") .nes. "" then delete [.src.widget]frame.obj;*
$ if f$search("[.src.widget]image.obj") .nes. "" then delete [.src.widget]image.obj;*
$ if f$search("[.src.widget]label.obj") .nes. "" then delete [.src.widget]label.obj;*
$ if f$search("[.src.widget]listbox.obj") .nes. "" then delete [.src.widget]listbox.obj;*
$ if f$search("[.src.widget]menu.obj") .nes. "" then delete [.src.widget]menu.obj;*
$ if f$search("[.src.widget]numberentry.obj") .nes. "" then delete [.src.widget]numberentry.obj;*
$ if f$search("[.src.widget]progressbar.obj") .nes. "" then delete [.src.widget]progressbar.obj;*
$ if f$search("[.src.widget]radiobox.obj") .nes. "" then delete [.src.widget]radiobox.obj;*
$ if f$search("[.src.widget]scrollbar.obj") .nes. "" then delete [.src.widget]scrollbar.obj;*
$ if f$search("[.src.widget]separator.obj") .nes. "" then delete [.src.widget]separator.obj;*
$ if f$search("[.src.widget]submenu.obj") .nes. "" then delete [.src.widget]submenu.obj;*
$ if f$search("[.src.widget]treeview.obj") .nes. "" then delete [.src.widget]treeview.obj;*
$ if f$search("[.src.widget]viewport.obj") .nes. "" then delete [.src.widget]viewport.obj;*
$ if f$search("[.src.widget]window.obj") .nes. "" then delete [.src.widget]window.obj;*
$ if f$search("[.src.widget]box.obj") .nes. "" then delete [.src.widget]box.obj;*
$ if f$search("[.src.dialog]colorpicker.obj") .nes. "" then delete [.src.dialog]colorpicker.obj;*
$ if f$search("[.src.dialog]directorychooser.obj") .nes. "" then delete [.src.dialog]directorychooser.obj;*
$ if f$search("[.src.dialog]filechooser.obj") .nes. "" then delete [.src.dialog]filechooser.obj;*
$ if f$search("[.src.dialog]messagebox.obj") .nes. "" then delete [.src.dialog]messagebox.obj;*
$ if f$search("[.src.font]boldfont.obj") .nes. "" then delete [.src.font]boldfont.obj;*
$ if f$search("[.src.font]boldttf.obj") .nes. "" then delete [.src.font]boldttf.obj;*
$ if f$search("[.src.font]font.obj") .nes. "" then delete [.src.font]font.obj;*
$ if f$search("[.src.font]ttf.obj") .nes. "" then delete [.src.font]ttf.obj;*
$ if f$search("[.src.icon]back.obj") .nes. "" then delete [.src.icon]back.obj;*
$ if f$search("[.src.icon]clock.obj") .nes. "" then delete [.src.icon]clock.obj;*
$ if f$search("[.src.icon]computer.obj") .nes. "" then delete [.src.icon]computer.obj;*
$ if f$search("[.src.icon]directory.obj") .nes. "" then delete [.src.icon]directory.obj;*
$ if f$search("[.src.icon]down.obj") .nes. "" then delete [.src.icon]down.obj;*
$ if f$search("[.src.icon]error.obj") .nes. "" then delete [.src.icon]error.obj;*
$ if f$search("[.src.icon]file.obj") .nes. "" then delete [.src.icon]file.obj;*
$ if f$search("[.src.icon]forward.obj") .nes. "" then delete [.src.icon]forward.obj;*
$ if f$search("[.src.icon]info.obj") .nes. "" then delete [.src.icon]info.obj;*
$ if f$search("[.src.icon]left.obj") .nes. "" then delete [.src.icon]left.obj;*
$ if f$search("[.src.icon]news.obj") .nes. "" then delete [.src.icon]news.obj;*
$ if f$search("[.src.icon]note.obj") .nes. "" then delete [.src.icon]note.obj;*
$ if f$search("[.src.icon]right.obj") .nes. "" then delete [.src.icon]right.obj;*
$ if f$search("[.src.icon]search.obj") .nes. "" then delete [.src.icon]search.obj;*
$ if f$search("[.src.icon]up.obj") .nes. "" then delete [.src.icon]up.obj;*
$ if f$search("[.src.icon]warning.obj") .nes. "" then delete [.src.icon]warning.obj;*
$ if f$search("[.src.abstract]directory.obj") .nes. "" then delete [.src.abstract]directory.obj;*
$ if f$search("[.src.abstract]dynamic.obj") .nes. "" then delete [.src.abstract]dynamic.obj;*
$ if f$search("[.src.abstract]time.obj") .nes. "" then delete [.src.abstract]time.obj;*
$ if f$search("[.external]stb_ds.obj") .nes. "" then delete [.external]stb_ds.obj;*
$ if f$search("[.src.backend]x11.obj") .nes. "" then delete [.src.backend]x11.obj;*
$ if f$search("[.src]MwSHR.exe") .nes. "" then delete [.src]MwSHR.exe;*