mirror of
https://gitea.nishi.boats/pyrite-dev/milsko
synced 2026-01-09 10:53:27 +00:00
Compare commits
55 Commits
188da6803e
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
079cfa18b9 | ||
|
|
debdaf998e | ||
|
|
1f1318d0e1 | ||
|
|
85df90ceaf | ||
|
|
e2aecbf9d4 | ||
|
|
d3751c0bf9 | ||
|
|
54cdd85015 | ||
|
|
d784770ca9 | ||
|
|
12f279e83a | ||
|
|
8cdffa12ae | ||
|
|
933b5198c7 | ||
|
|
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 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -5,6 +5,7 @@ examples/*/*.exe
|
||||
!examples/*/
|
||||
!examples/*.*
|
||||
!examples/*/*.*
|
||||
*.exe
|
||||
*.o
|
||||
*.so
|
||||
*.dll
|
||||
|
||||
@@ -16,6 +16,8 @@ option(BUILD_EXAMPLES "Build examples" OFF)
|
||||
option(USE_STB_IMAGE "Use stb_image" ON)
|
||||
option(USE_STB_TRUETYPE "Use stb_truetype" OFF)
|
||||
option(USE_FREETYPE2 "Use FreeType 2" ON)
|
||||
option(BUILD_SHARED "Build a shared library" ON)
|
||||
option(BUILD_STATIC "Build a static library" OFF)
|
||||
|
||||
file(
|
||||
GLOB
|
||||
@@ -61,11 +63,22 @@ if(TRY_OPENGL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(BUILD_STATIC)
|
||||
message(STATUS "Building Milsko as a static library")
|
||||
add_library(
|
||||
Mw
|
||||
${SOURCES}
|
||||
)
|
||||
elseif(BUILD_SHARED)
|
||||
message(STATUS "Building Milsko as a shared library")
|
||||
add_library(
|
||||
Mw
|
||||
SHARED
|
||||
${SOURCES}
|
||||
)
|
||||
else()
|
||||
message(ERROR "Must either build a shared library or a static library")
|
||||
endif()
|
||||
|
||||
if(USE_STB_IMAGE)
|
||||
target_compile_definitions(
|
||||
@@ -195,7 +208,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
|
||||
|
||||
@@ -48,7 +48,7 @@ param_set("static", 1);
|
||||
|
||||
my %features = (
|
||||
"classic-theme" => "use classic theme",
|
||||
"stb-image" => "use stb_image instead of libjpeg/libpng",
|
||||
"stb-image" => "use stb_image, instead use libjpeg/libpng",
|
||||
"stb-truetype" => "use stb_truetype",
|
||||
"freetype2" => "use FreeType2",
|
||||
"xrender" => "use XRender",
|
||||
@@ -226,7 +226,7 @@ foreach my $l (@library_targets) {
|
||||
}
|
||||
|
||||
print(OUT "${l}: ${s}\n");
|
||||
print(OUT " \$(CC) $warn \$(CFLAGS\) \$\(INCDIR) -c -o ${l} ${s}\n");
|
||||
print(OUT " \$(CC) $warn \$\(INCDIR) \$(CFLAGS\) -c -o ${l} ${s}\n");
|
||||
}
|
||||
print(OUT "\n");
|
||||
print(OUT "\n");
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#define _MILSKO
|
||||
#include <Mw/Milsko.h>
|
||||
|
||||
MwWidget window, button, text;
|
||||
MwWidget window, instructions, text;
|
||||
|
||||
void resize(MwWidget handle, void* user_data, void* call_data) {
|
||||
unsigned int w, h, mh;
|
||||
@@ -12,7 +11,7 @@ void resize(MwWidget handle, void* user_data, void* call_data) {
|
||||
w = MwGetInteger(handle, MwNwidth);
|
||||
h = MwGetInteger(handle, MwNheight);
|
||||
|
||||
MwVaApply(button,
|
||||
MwVaApply(instructions,
|
||||
MwNy, 50 + mh,
|
||||
MwNwidth, w - 50 * 2,
|
||||
MwNheight, h - 125 - 50 * 3,
|
||||
@@ -24,40 +23,34 @@ void resize(MwWidget handle, void* user_data, void* call_data) {
|
||||
MwNheight, h - 125 - 50 * 3,
|
||||
NULL);
|
||||
}
|
||||
void clipboard(MwWidget handle, void* user_data, void* call_data) {
|
||||
char* clipboard = call_data;
|
||||
|
||||
void handler(MwWidget handle, void* user_data, void* call_data) {
|
||||
(void)handle;
|
||||
(void)user_data;
|
||||
(void)call_data;
|
||||
char* clipboard;
|
||||
|
||||
clipboard = MwLLGetClipboard(handle->lowlevel);
|
||||
|
||||
if(clipboard != NULL) {
|
||||
MwVaApply(text, MwNtext, clipboard);
|
||||
MwForceRender(text);
|
||||
}
|
||||
|
||||
resize(window, NULL, NULL);
|
||||
MwForceRender(window);
|
||||
}
|
||||
|
||||
int main() {
|
||||
MwMenu m, m2;
|
||||
|
||||
MwLibraryInit();
|
||||
|
||||
window = MwVaCreateWidget(MwWindowClass, "main", NULL, MwDEFAULT, MwDEFAULT, 400, 400,
|
||||
MwNtitle, "clipboard",
|
||||
NULL);
|
||||
button = MwVaCreateWidget(MwButtonClass, "button", window, 50, 50, 300, 125,
|
||||
MwNtext, "get clipboard contents",
|
||||
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(button, MwNactivateHandler, handler, NULL);
|
||||
MwAddUserHandler(window, MwNclipboardHandler, clipboard, NULL);
|
||||
|
||||
resize(window, NULL, NULL);
|
||||
|
||||
|
||||
@@ -354,6 +354,11 @@ MWDECL void MwGetCursorCoord(MwWidget handle, MwPoint* point);
|
||||
*/
|
||||
MWDECL void MwGetScreenSize(MwWidget handle, MwRect* rect);
|
||||
|
||||
/*!
|
||||
* @brief Reports whether a widget reports global or local coordinates upon GetXY/SetXY. Anything with a parent reports local, and most backends report global coordinates being supported for top level windows, but some (Wayland) do not.
|
||||
*/
|
||||
MWDECL int MwGetCoordinateType(MwWidget handle);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -33,6 +33,7 @@ struct _MwLLCommon {
|
||||
void* user;
|
||||
int copy_buffer;
|
||||
int type;
|
||||
int coordinate_type;
|
||||
|
||||
MwLLHandler handler;
|
||||
};
|
||||
@@ -147,6 +148,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 +205,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 {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <wayland-client.h>
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
#include <cairo/cairo.h>
|
||||
#include <pthread.h>
|
||||
|
||||
MWDECL int MwLLWaylandCallInit(void);
|
||||
|
||||
@@ -73,7 +74,7 @@ struct _MwLLWaylandPopup {
|
||||
struct xdg_positioner* xdg_positioner;
|
||||
struct xdg_surface_listener xdg_surface_listener;
|
||||
struct xdg_wm_base* xdg_wm_base;
|
||||
MwLL parent;
|
||||
MwLL topmost_parent;
|
||||
};
|
||||
|
||||
/* Shared set of anything needed for a shm buffer. */
|
||||
@@ -97,6 +98,21 @@ enum _MwLLWaylandType {
|
||||
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;
|
||||
|
||||
@@ -124,6 +140,8 @@ struct _MwLLWayland {
|
||||
wayland_protocol_t* value;
|
||||
}* wl_protocol_map;
|
||||
|
||||
MwBool always_render;
|
||||
|
||||
struct wl_display* display;
|
||||
struct wl_registry* registry;
|
||||
struct wl_compositor* compositor;
|
||||
@@ -131,12 +149,29 @@ struct _MwLLWayland {
|
||||
struct wl_region* region;
|
||||
struct wl_output* output;
|
||||
|
||||
struct wl_pointer* pointer;
|
||||
struct wl_keyboard* keyboard;
|
||||
MwU32 pointer_serial;
|
||||
/* 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.*/
|
||||
|
||||
MwBool events_pending;
|
||||
MwBool test;
|
||||
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;
|
||||
|
||||
@@ -149,10 +184,20 @@ struct _MwLLWayland {
|
||||
|
||||
MwLL parent;
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
@@ -29,6 +29,7 @@ struct _MwLLX11 {
|
||||
GC gc;
|
||||
Colormap colormap;
|
||||
Atom wm_delete;
|
||||
Atom wm_protocols;
|
||||
XIM xim;
|
||||
XIC xic;
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#define MwNbitmapFont "IbitmapFont"
|
||||
#define MwNsevenSegment "IsevenSegment"
|
||||
#define MwNlength "Ilength"
|
||||
#define MwNforceInverted "IforceInverted"
|
||||
|
||||
#define MwNtitle "Stitle"
|
||||
#define MwNtext "Stext"
|
||||
@@ -70,5 +71,6 @@
|
||||
#define MwNdirectoryChosenHandler "CdirectoryChosen" /* char* */
|
||||
#define MwNcolorChosenHandler "CcolorChosen" /* MwRGB* */
|
||||
#define MwNdrawHandler "Cdraw" /* NULL */
|
||||
#define MwNclipboardHandler "Cclipboard" /* char* */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -39,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);
|
||||
@@ -108,6 +109,7 @@ struct _MwMenu {
|
||||
int keep;
|
||||
MwWidget wsub;
|
||||
MwMenu* sub;
|
||||
void* opaque;
|
||||
};
|
||||
|
||||
struct _MwEntry {
|
||||
@@ -210,11 +212,17 @@ struct _MwClass {
|
||||
MwHandler resize;
|
||||
MwHandler children_update;
|
||||
MwHandlerChildrenProp children_prop_change;
|
||||
MwHandlerClipboardReceived clipboard;
|
||||
void* reserved1;
|
||||
void* reserved2;
|
||||
void* reserved3;
|
||||
void* reserved4;
|
||||
void* reserved5;
|
||||
};
|
||||
|
||||
/* Whether or not GetXY/SetXY works with global or local coordinates */
|
||||
enum MwCoordinateType {
|
||||
MwCoordinatesGlobal = 0,
|
||||
MwCoordinatesLocal,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#include <Mw/TypeDefs.h>
|
||||
#include <Mw/Core.h>
|
||||
|
||||
#ifndef __gl_h_
|
||||
#if !defined(MW_OPENGL_NO_INCLUDE) && !defined(__gl_h_)
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
|
||||
@@ -29,6 +29,16 @@ MwInline void MwSubMenuAppear(MwWidget handle, MwMenu menu, MwPoint* point, int
|
||||
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
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
- MwNratio
|
||||
- MwNfixedSize
|
||||
- MwNbitmapFont
|
||||
- MwNforceInverted
|
||||
|
||||
Integer properties must be prefixed with I.
|
||||
String properties must be prefixed with S.
|
||||
@@ -91,6 +92,7 @@
|
||||
<integer name="bitmapFont" />
|
||||
<integer name="sevenSegment" />
|
||||
<integer name="length" />
|
||||
<integer name="forceInverted" />
|
||||
|
||||
<string name="title" />
|
||||
<string name="text" />
|
||||
@@ -120,6 +122,7 @@
|
||||
<handler name="directoryChosen" />
|
||||
<handler name="colorChosen" />
|
||||
<handler name="draw" />
|
||||
<handler name="clipboard" />
|
||||
</properties>
|
||||
<enumerations>
|
||||
<enumeration name="MwDIRECTION">
|
||||
@@ -542,6 +545,7 @@
|
||||
<property name="bold" />
|
||||
<property name="sevenSegment" />
|
||||
<property name="length" />
|
||||
<property name="leftPadding" />
|
||||
</properties>
|
||||
<functions>
|
||||
<function name="SetSevenSegment">
|
||||
@@ -638,6 +642,9 @@
|
||||
</functions>
|
||||
</widget>
|
||||
<widget name="SubMenu">
|
||||
<properties>
|
||||
<property name="leftPadding" />
|
||||
</properties>
|
||||
<functions>
|
||||
<function name="Appear">
|
||||
<arguments>
|
||||
|
||||
@@ -32,6 +32,10 @@ if (grep(/^wayland$/, @backends)) {
|
||||
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");
|
||||
@@ -39,7 +43,7 @@ if (grep(/^wayland$/, @backends)) {
|
||||
scan_wayland_protocol("unstable", "xdg-decoration", "-unstable-v1");
|
||||
scan_wayland_protocol("unstable", "primary-selection", "-unstable-v1");
|
||||
|
||||
$gl_libs = "-lEGL -lwayland-egl lGL -lGLU";
|
||||
$gl_libs = "-lGL -lGLU";
|
||||
}
|
||||
|
||||
if (param_get("stb-image")) {
|
||||
@@ -48,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) {
|
||||
|
||||
@@ -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
@@ -159,6 +159,7 @@ static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
|
||||
r->x11.toplevel = 0;
|
||||
}
|
||||
r->x11.window = XCreateSimpleWindow(r->x11.display, p, px, py, width, height, 0, 0, WhitePixel(r->x11.display, DefaultScreen(r->x11.display)));
|
||||
|
||||
sh.flags = PWinGravity;
|
||||
sh.win_gravity = StaticGravity;
|
||||
XSetWMNormalHints(r->x11.display, r->x11.window, &sh);
|
||||
@@ -211,6 +212,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);
|
||||
@@ -411,6 +413,7 @@ static void MwLLFreeColorImpl(MwLLColor color) {
|
||||
|
||||
static int MwLLPendingImpl(MwLL handle) {
|
||||
XEvent ev;
|
||||
|
||||
if(XCheckTypedWindowEvent(handle->x11.display, handle->x11.window, ClientMessage, &ev) || XCheckWindowEvent(handle->x11.display, handle->x11.window, mask, &ev)) {
|
||||
XPutBackEvent(handle->x11.display, &ev);
|
||||
return 1;
|
||||
@@ -420,6 +423,7 @@ static int MwLLPendingImpl(MwLL handle) {
|
||||
|
||||
static void MwLLNextEventImpl(MwLL handle) {
|
||||
XEvent ev;
|
||||
|
||||
while(XCheckTypedWindowEvent(handle->x11.display, handle->x11.window, ClientMessage, &ev) || XCheckWindowEvent(handle->x11.display, handle->x11.window, mask, &ev)) {
|
||||
int render = 0;
|
||||
if(ev.type == Expose) {
|
||||
@@ -471,7 +475,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 +960,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) {
|
||||
|
||||
22
src/core.c
22
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));
|
||||
|
||||
@@ -114,6 +121,7 @@ MwWidget MwCreateWidget(MwClass widget_class, const char* name, MwWidget parent,
|
||||
|
||||
h->parent = parent;
|
||||
h->children = NULL;
|
||||
|
||||
if(widget_class != NULL) {
|
||||
if((h->lowlevel = MwLLCreate(parent == NULL ? NULL : parent->lowlevel, x, y, width, height)) == NULL) {
|
||||
free(h->name);
|
||||
@@ -148,6 +156,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 +270,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 +396,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) {
|
||||
@@ -784,3 +798,11 @@ void MwGetCursorCoord(MwWidget handle, MwPoint* point) {
|
||||
void MwGetScreenSize(MwWidget handle, MwRect* rect) {
|
||||
MwLLGetScreenSize(handle->lowlevel, rect);
|
||||
}
|
||||
|
||||
int MwGetCoordinateType(MwWidget handle) {
|
||||
if(handle->parent == NULL || handle->parent->lowlevel == NULL) {
|
||||
return handle->lowlevel->common.coordinate_type;
|
||||
} else {
|
||||
return MwCoordinatesLocal;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
13
src/draw.c
13
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>
|
||||
@@ -130,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 {
|
||||
@@ -502,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;
|
||||
|
||||
@@ -617,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);
|
||||
|
||||
@@ -47,6 +47,8 @@ static void layout(MwWidget handle) {
|
||||
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 {
|
||||
@@ -60,6 +62,8 @@ static void layout(MwWidget handle) {
|
||||
int wsz;
|
||||
if(n == MwDEFAULT) n = 1;
|
||||
|
||||
if(handle->children[i]->destroyed) continue;
|
||||
|
||||
if(s != MwDEFAULT) {
|
||||
wsz = s;
|
||||
} else {
|
||||
@@ -110,7 +114,7 @@ MwClassRec MwBoxClassRec = {
|
||||
resize, /* resize */
|
||||
children_update, /* children_update */
|
||||
children_prop_change, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -20,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 = "";
|
||||
|
||||
@@ -29,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);
|
||||
@@ -38,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;
|
||||
@@ -106,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,
|
||||
|
||||
@@ -61,7 +61,7 @@ MwClassRec MwFrameClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -57,7 +57,7 @@ MwClassRec MwImageClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -15,6 +15,7 @@ static int create(MwWidget handle) {
|
||||
MwSetInteger(handle, MwNbold, 0);
|
||||
MwSetInteger(handle, MwNsevenSegment, 0);
|
||||
MwSetInteger(handle, MwNlength, 4);
|
||||
MwSetInteger(handle, MwNleftPadding, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -126,7 +127,7 @@ static void draw(MwWidget handle) {
|
||||
MwPoint p;
|
||||
MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground));
|
||||
MwLLColor text = MwParseColor(handle, MwGetText(handle, MwNforeground));
|
||||
MwLLColor shadow = MwLightenColor(handle, base, -32, -32, -32);
|
||||
MwLLColor shadow = MwLightenColor(handle, base, MwDefaultShadow, MwDefaultShadow, MwDefaultShadow);
|
||||
int align;
|
||||
const char* str = MwGetText(handle, MwNtext);
|
||||
MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap);
|
||||
@@ -253,10 +254,11 @@ static void draw(MwWidget handle) {
|
||||
for(j = 1; j >= 0; j--) {
|
||||
MwLLColor cl = j == 1 ? shadow : text;
|
||||
for(cy = 1; cy < h - 1; cy++) {
|
||||
int c = (l_one - s_one) / 2 + s_one;
|
||||
int h = s_one / 2;
|
||||
int c = (l_one - h) / 2 + s_one;
|
||||
|
||||
int c1 = (c <= cy && cy <= (c + s_one)) ? 1 : 0;
|
||||
int c2 = ((s_one + l_one + c) <= cy && cy <= (s_one + l_one + c + s_one)) ? 1 : 0;
|
||||
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++) {
|
||||
@@ -309,6 +311,8 @@ static void draw(MwWidget handle) {
|
||||
|
||||
MwLLDestroyPixmap(px);
|
||||
} else {
|
||||
r.width -= MwGetInteger(handle, MwNleftPadding);
|
||||
|
||||
if(align == MwALIGNMENT_CENTER) {
|
||||
p.x = r.width / 2;
|
||||
} else if(align == MwALIGNMENT_BEGINNING) {
|
||||
@@ -317,6 +321,15 @@ static void draw(MwWidget handle) {
|
||||
p.x = r.width - MwTextWidth(handle, str) / 2;
|
||||
}
|
||||
p.y = r.height / 2;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -326,7 +339,7 @@ static void draw(MwWidget handle) {
|
||||
}
|
||||
|
||||
static void prop_change(MwWidget handle, const char* key) {
|
||||
if(strcmp(key, MwNtext) == 0 || strcmp(key, MwNalignment) == 0 || strcmp(key, MwNsevenSegment) == 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) {
|
||||
@@ -362,7 +375,7 @@ MwClassRec MwLabelClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
@@ -608,7 +608,7 @@ MwClassRec MwListBoxClassRec = {
|
||||
NULL, /* resize */
|
||||
NULL, /* children_update */
|
||||
NULL, /* children_prop_change */
|
||||
NULL,
|
||||
NULL, /* clipboard */
|
||||
NULL,
|
||||
NULL,
|
||||
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,
|
||||
|
||||
@@ -42,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
|
||||
@@ -105,7 +118,90 @@ static int create(MwWidget handle) {
|
||||
#endif
|
||||
#ifdef USE_WAYLAND
|
||||
if(handle->lowlevel->common.type == MwLLBackendWayland) {
|
||||
/* todo */
|
||||
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) {
|
||||
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
|
||||
|
||||
@@ -165,7 +261,11 @@ static void mwOpenGLMakeCurrentImpl(MwWidget handle) {
|
||||
#endif
|
||||
#ifdef USE_WAYLAND
|
||||
if(handle->lowlevel->common.type == MwLLBackendWayland) {
|
||||
/* todo */
|
||||
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
|
||||
}
|
||||
@@ -187,7 +287,13 @@ static void mwOpenGLSwapBufferImpl(MwWidget handle) {
|
||||
#endif
|
||||
#ifdef USE_WAYLAND
|
||||
if(handle->lowlevel->common.type == MwLLBackendWayland) {
|
||||
/* todo */
|
||||
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);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -209,7 +315,7 @@ static void* mwOpenGLGetProcAddressImpl(MwWidget handle, const char* name) {
|
||||
#endif
|
||||
#ifdef USE_WAYLAND
|
||||
if(handle->lowlevel->common.type == MwLLBackendWayland) {
|
||||
/* todo */
|
||||
return eglGetProcAddress(name);
|
||||
}
|
||||
#endif
|
||||
return NULL;
|
||||
@@ -244,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,
|
||||
|
||||
@@ -272,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, 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);
|
||||
@@ -160,49 +167,64 @@ static void click(MwWidget handle) {
|
||||
}
|
||||
|
||||
static void mwSubMenuAppearImpl(MwWidget handle, MwMenu menu, MwPoint* point, int diff_calc) {
|
||||
int i, w = 0, h = 0;
|
||||
MwRect rc;
|
||||
MwRect rc, sz;
|
||||
MwPoint p = *point;
|
||||
|
||||
MwSubMenuGetSize(handle, menu, &sz);
|
||||
|
||||
MwGetScreenSize(handle, &rc);
|
||||
|
||||
handle->internal = menu;
|
||||
|
||||
for(i = 0; i < arrlen(menu->sub); i++) {
|
||||
if(strcmp(menu->sub[i]->name, "----") == 0) {
|
||||
h += MwDefaultBorderWidth(handle) * 2 + 2;
|
||||
} else {
|
||||
int tw = MwTextWidth(handle, menu->sub[i]->name);
|
||||
h += MwTextHeight(handle, menu->sub[i]->name) + 3;
|
||||
if(tw > w) {
|
||||
w = tw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
w += 10 + 15;
|
||||
h += 3;
|
||||
|
||||
if(diff_calc) {
|
||||
p.y = rc.height - p.y - h;
|
||||
p.y = p.y - sz.height;
|
||||
}
|
||||
|
||||
MwLLMakeToolWindow(handle->lowlevel);
|
||||
MwLLDetach(handle->lowlevel, &p);
|
||||
|
||||
if(MwGetInteger(handle, MwNy) + h > rc.height) {
|
||||
if(handle->lowlevel->common.coordinate_type == MwCoordinatesGlobal) {
|
||||
if(MwGetInteger(handle, MwNy) + sz.height > rc.height) {
|
||||
MwVaApply(handle,
|
||||
MwNy, rc.height - h,
|
||||
MwNy, rc.height - sz.height,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
MwLLEndStateChange(handle->lowlevel);
|
||||
|
||||
MwVaApply(handle,
|
||||
MwNwidth, w,
|
||||
MwNheight, h,
|
||||
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) {
|
||||
rect->height += 2 + 2;
|
||||
} else {
|
||||
int tw = MwTextWidth(handle, menu->sub[i]->name);
|
||||
rect->height += MwTextHeight(handle, menu->sub[i]->name) + 3;
|
||||
if(tw > rect->width) {
|
||||
rect->width = tw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rect->width += MwGetInteger(handle, MwNleftPadding);
|
||||
|
||||
rect->width += 10 + 15;
|
||||
rect->height += 3;
|
||||
|
||||
rect->width += 16;
|
||||
}
|
||||
|
||||
static void func_handler(MwWidget handle, const char* name, void* out, va_list va) {
|
||||
(void)out;
|
||||
|
||||
@@ -211,6 +233,10 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v
|
||||
MwPoint* point = va_arg(va, MwPoint*);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -230,7 +256,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,
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
#ifdef USE_X11
|
||||
#define VK_USE_PLATFORM_XLIB_KHR 1
|
||||
#endif
|
||||
#ifdef USE_WAYLAND
|
||||
#define VK_USE_PLATFORM_WAYLAND_KHR 1
|
||||
#endif
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <vulkan/vulkan_core.h>
|
||||
|
||||
@@ -22,6 +25,9 @@
|
||||
#ifdef USE_X11
|
||||
#include <vulkan/vulkan_xlib.h>
|
||||
#endif
|
||||
#ifdef USE_WAYLAND
|
||||
#include <vulkan/vulkan_wayland.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAS_VK_ENUM_STRING_HELPER
|
||||
#include <vulkan/vk_enum_string_helper.h>
|
||||
@@ -219,6 +225,20 @@ static MwErrorEnum vulkan_instance_setup(MwWidget handle, vulkan_t* o) {
|
||||
arrput(enabledExtensions, VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_WAYLAND
|
||||
if(handle->lowlevel->common.type == MwLLBackendWayland) {
|
||||
MwLL topmost_parent = handle->lowlevel->wayland.parent;
|
||||
|
||||
arrput(enabledExtensions, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
|
||||
/* take this opprutunity to set the widget to always render */
|
||||
topmost_parent->wayland.always_render = MwTRUE;
|
||||
|
||||
while(topmost_parent->wayland.parent != NULL) {
|
||||
topmost_parent = topmost_parent->wayland.parent;
|
||||
topmost_parent->wayland.always_render = MwTRUE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* passing null gives us all the extensions provided by the current vulkan implementation */
|
||||
VK_CMD(_vkEnumerateInstanceExtensionProperties(NULL, &extension_count, NULL));
|
||||
@@ -313,6 +333,20 @@ static MwErrorEnum vulkan_surface_setup(MwWidget handle, vulkan_t* o) {
|
||||
};
|
||||
VK_CMD(_vkCreateXlibSurfaceKHR(o->vkInstance, &createInfo, NULL, &o->vkSurface));
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_WAYLAND
|
||||
if(handle->lowlevel->common.type == MwLLBackendWayland) {
|
||||
LOAD_VK_FUNCTION(vkCreateWaylandSurfaceKHR);
|
||||
|
||||
VkWaylandSurfaceCreateInfoKHR createInfo = {
|
||||
.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR,
|
||||
.pNext = NULL,
|
||||
.flags = 0,
|
||||
.display = handle->lowlevel->wayland.display,
|
||||
.surface = handle->lowlevel->wayland.framebuffer.surface,
|
||||
};
|
||||
VK_CMD(_vkCreateWaylandSurfaceKHR(o->vkInstance, &createInfo, NULL, &o->vkSurface));
|
||||
}
|
||||
#endif
|
||||
return MwEsuccess;
|
||||
}
|
||||
@@ -524,7 +558,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