mirror of
https://gitea.nishi.boats/pyrite-dev/milsko
synced 2026-01-04 08:30:51 +00:00
Compare commits
77 Commits
224fc48ecd
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
30a100fd28 | ||
|
|
a148b3bedf | ||
|
|
bed668b84a | ||
|
|
6183a1ccda | ||
|
|
f32f6cefc0 | ||
|
|
f3683dece3 | ||
|
|
808495cccf | ||
|
|
6946c1eaf3 | ||
|
|
029e62d765 | ||
|
|
a03065ae52 | ||
|
|
324257c43f | ||
|
|
afecb04848 | ||
|
|
bed63dd245 | ||
|
|
67bd6029af | ||
|
|
72820e87f1 | ||
|
|
d3147ac087 | ||
|
|
4bdda59693 | ||
|
|
823c865791 | ||
|
|
3f9125d1ae | ||
|
|
549d235893 | ||
|
|
0daa527b1d | ||
|
|
0ca7f6ed8a | ||
|
|
e895e96941 | ||
|
|
0d79141a49 | ||
|
|
c80987ffe4 | ||
|
|
d3a7b0a01d | ||
|
|
e77c4f3c38 | ||
|
|
22b4737c33 | ||
|
|
509351a0a0 | ||
|
|
86effbdfd7 | ||
|
|
7b47524286 | ||
|
|
c8e7f58230 | ||
|
|
9ea54b4f88 | ||
|
|
55f82e4fbc | ||
|
|
a23016bc05 | ||
|
|
df99e66d87 | ||
|
|
e9fd2705d4 | ||
|
|
a824b4fc44 | ||
|
|
c7c8f236b0 | ||
|
|
bdc67d6369 | ||
|
|
873c75b882 | ||
|
|
e44eaa2c16 | ||
|
|
0d281c09ce | ||
|
|
2b30a06ecf | ||
|
|
188da6803e | ||
|
|
2304b493d1 | ||
|
|
91d9677bf7 | ||
|
|
f09960195f | ||
|
|
ab9d0ffc5f | ||
|
|
a67a0c11f8 | ||
|
|
dc8168df12 | ||
|
|
604ff72d6e | ||
|
|
a384add9e9 | ||
|
|
6123fd1304 | ||
|
|
b7488b9440 | ||
|
|
18511dec2f | ||
|
|
59ff6f1008 | ||
|
|
a27a01ce41 | ||
|
|
b0f4713ff1 | ||
|
|
8d4e845e7c | ||
|
|
aeaf0a4547 | ||
|
|
b366fc12a7 | ||
|
|
d8c08f80d6 | ||
|
|
bfa0a5811e | ||
|
|
19f52488b8 | ||
|
|
c6e7421b31 | ||
|
|
e3b3363e42 | ||
|
|
a815998ace | ||
|
|
75749697ba | ||
|
|
c9c3a00ed3 | ||
|
|
012650f06f | ||
|
|
72fbba1a74 | ||
|
|
b8a92f4ae0 | ||
|
|
724b008220 | ||
|
|
320de34ce8 | ||
|
|
d117241ba7 | ||
|
|
1907dd5d49 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -5,10 +5,12 @@ examples/*/*.exe
|
||||
!examples/*/
|
||||
!examples/*.*
|
||||
!examples/*/*.*
|
||||
*.exe
|
||||
*.o
|
||||
*.so
|
||||
*.dll
|
||||
*.lib
|
||||
*.a
|
||||
/Makefile
|
||||
/build
|
||||
compile_flags.txt
|
||||
|
||||
@@ -195,7 +195,6 @@ target_compile_definitions(
|
||||
_MILSKO
|
||||
)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
install(
|
||||
TARGETS Mw
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
58
examples/basic/clipboard.c
Normal file
58
examples/basic/clipboard.c
Normal 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);
|
||||
}
|
||||
23
examples/basic/sevensegment.c
Normal file
23
examples/basic/sevensegment.c
Normal 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);
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -21,6 +21,7 @@ struct _MwLLGDI {
|
||||
|
||||
int grabbed;
|
||||
int force_render;
|
||||
int get_clipboard;
|
||||
};
|
||||
|
||||
struct _MwLLGDIColor {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -29,6 +29,7 @@ struct _MwLLX11 {
|
||||
GC gc;
|
||||
Colormap colormap;
|
||||
Atom wm_delete;
|
||||
Atom wm_protocols;
|
||||
XIM xim;
|
||||
XIC xic;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" {
|
||||
|
||||
@@ -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
|
||||
|
||||
24
milsko.xml
24
milsko.xml
@@ -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>
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
use_backend("x11");
|
||||
if (param_get("experimental-wayland")) {
|
||||
use_backend("wayland", "x11");
|
||||
}
|
||||
else {
|
||||
use_backend("x11");
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
@@ -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;
|
||||
|
||||
17
pl/rules.pl
17
pl/rules.pl
@@ -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);
|
||||
|
||||
@@ -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
@@ -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) {
|
||||
|
||||
54
src/core.c
54
src/core.c
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
24
src/draw.c
24
src/draw.c
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -53,7 +53,7 @@ MwClassRec MwCheckBoxClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -204,7 +204,7 @@ MwClassRec MwComboBoxClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -143,7 +143,7 @@ MwClassRec MwNumberEntryClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -61,7 +61,7 @@ MwClassRec MwProgressBarClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -62,7 +62,7 @@ MwClassRec MwRadioBoxClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -50,7 +50,7 @@ MwClassRec MwSeparatorClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -496,7 +496,7 @@ MwClassRec MwTreeViewClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -191,7 +191,7 @@ MwClassRec MwViewportClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -524,7 +524,7 @@ MwClassRec MwVulkanClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -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
105
tools/gendcl.pl
Executable 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
382
vms/build.com
Normal 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
63
vms/clean.com
Normal 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;*
|
||||
Reference in New Issue
Block a user