mirror of
https://gitea.nishi.boats/pyrite-dev/milsko
synced 2026-01-10 03:13:28 +00:00
Compare commits
57 Commits
188da6803e
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
da33a1a3c6 | ||
|
|
2d3bd9213e | ||
|
|
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 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -5,10 +5,12 @@ examples/*/*.exe
|
||||
!examples/*/
|
||||
!examples/*.*
|
||||
!examples/*/*.*
|
||||
*.exe
|
||||
*.o
|
||||
*.so
|
||||
*.dll
|
||||
*.lib
|
||||
*.dylib
|
||||
*.a
|
||||
/Makefile
|
||||
/build
|
||||
|
||||
@@ -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
|
||||
|
||||
69
Makefile.pl
69
Makefile.pl
@@ -18,7 +18,7 @@ our $cflags = "-fPIC -D_MILSKO";
|
||||
our $libdir = "";
|
||||
our $ldflags = "";
|
||||
our $math = "-lm";
|
||||
our $shared = "-shared";
|
||||
our @shared = "-shared";
|
||||
our @backends = ();
|
||||
|
||||
our $library_prefix = "lib";
|
||||
@@ -45,10 +45,11 @@ param_set("vulkan", 0);
|
||||
param_set("vulkan-string-helper", 1);
|
||||
param_set("shared", 1);
|
||||
param_set("static", 1);
|
||||
param_set("examples", 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",
|
||||
@@ -166,7 +167,7 @@ print(OUT "LIBDIR = ${libdir}\n");
|
||||
print(OUT "LDFLAGS = ${ldflags}\n");
|
||||
print(OUT "LIBS = ${math} ${libs}\n");
|
||||
print(OUT "MATH = ${math}\n");
|
||||
print(OUT "SHARED = ${shared}\n");
|
||||
print(OUT "SHARED = @{shared}\n");
|
||||
print(OUT "\n");
|
||||
print(OUT ".PHONY: all format clean distclean lib examples install\n");
|
||||
print(OUT "\n");
|
||||
@@ -219,45 +220,59 @@ foreach my $l (@library_targets) {
|
||||
my $s = $l;
|
||||
my $o = $object_suffix;
|
||||
$o =~ s/\./\\\./g;
|
||||
$s =~ s/$o$/.c/;
|
||||
|
||||
if ($l =~ /appkit/) {
|
||||
$s =~ s/$o$/.m/;
|
||||
|
||||
} else {
|
||||
$s =~ s/$o$/.c/;
|
||||
}
|
||||
|
||||
if ($l =~ /^external\//) {
|
||||
$warn = "";
|
||||
}
|
||||
|
||||
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");
|
||||
print(OUT "examples: " . join(" ", @examples_targets) . "\n");
|
||||
print(OUT "\n");
|
||||
foreach my $l (@examples_targets) {
|
||||
my $libs = "";
|
||||
my $s = $l;
|
||||
my $o = $executable_suffix;
|
||||
$o =~ s/\./\\\./g;
|
||||
$s =~ s/$o$//;
|
||||
if(param_get("examples")) {
|
||||
print(OUT "examples: " . join(" ", @examples_targets) . "\n");
|
||||
print(OUT "\n");
|
||||
foreach my $l (@examples_targets) {
|
||||
my $libs = "";
|
||||
my $s = $l;
|
||||
my $o = $executable_suffix;
|
||||
$o =~ s/\./\\\./g;
|
||||
$s =~ s/$o$//;
|
||||
|
||||
if (defined($examples_libs{$l})) {
|
||||
$libs = $examples_libs{$l};
|
||||
}
|
||||
if (defined($examples_libs{$l})) {
|
||||
$libs = $examples_libs{$l};
|
||||
}
|
||||
|
||||
print(OUT
|
||||
"${l}: ${s}${object_suffix} src/${library_prefix}Mw${library_suffix}\n"
|
||||
);
|
||||
print(OUT
|
||||
" \$(CC) -L src -Wl,-R./src \$\(LIBDIR) -o ${l} ${s}${object_suffix} -lMw ${math} ${libs}\n"
|
||||
);
|
||||
print(OUT "${s}${object_suffix}: ${s}.c\n");
|
||||
print(OUT
|
||||
" \$(CC) -c \$\(INCDIR) -o ${s}${object_suffix} ${s}.c -lMw ${math}\n"
|
||||
);
|
||||
print(OUT
|
||||
"${l}: ${s}${object_suffix} src/${library_prefix}Mw${library_suffix}\n"
|
||||
);
|
||||
if (grep(/^appkit$/, @backends)) {
|
||||
print(OUT
|
||||
" \$(CC) -L./src \$\(LIBDIR) -o ${l} ${s}${object_suffix} -lMw ${math} ${libs}\n"
|
||||
);
|
||||
} else {
|
||||
print(OUT
|
||||
" \$(CC) -L src -Wl,-R./src \$\(LIBDIR) -o ${l} ${s}${object_suffix} -lMw ${math} ${libs}\n"
|
||||
);
|
||||
}
|
||||
print(OUT "${s}${object_suffix}: ${s}.c\n");
|
||||
print(OUT
|
||||
" \$(CC) -c \$\(INCDIR) -o ${s}${object_suffix} ${s}.c -lMw ${math}\n"
|
||||
);
|
||||
}
|
||||
}
|
||||
print(OUT "\n");
|
||||
print(OUT "clean:\n");
|
||||
print(OUT
|
||||
" rm -f */*.o */*/*.o */*/*/*.o */*.exe */*/*.exe */*/*/*.exe src/*.so src/*.dll src/*.a "
|
||||
" rm -f */*.o */*/*.o */*/*/*.o */*.exe */*/*.exe */*/*/*.exe src/*.so src/*.dll src/*.dylib src/*.a "
|
||||
. join(" ", @examples_targets)
|
||||
. "\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",
|
||||
NULL);
|
||||
text = MwVaCreateWidget(MwLabelClass, "label", window, 50, 200, 300, 125,
|
||||
MwNtext, "",
|
||||
NULL);
|
||||
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(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
|
||||
|
||||
@@ -27,12 +27,14 @@ enum MwLLBackends {
|
||||
MwLLBackendX11 = 0,
|
||||
MwLLBackendGDI,
|
||||
MwLLBackendWayland,
|
||||
MwLLBackendAppKit,
|
||||
};
|
||||
|
||||
struct _MwLLCommon {
|
||||
void* user;
|
||||
int copy_buffer;
|
||||
int type;
|
||||
int coordinate_type;
|
||||
|
||||
MwLLHandler handler;
|
||||
};
|
||||
@@ -60,6 +62,9 @@ struct _MwLLCommonPixmap {
|
||||
#ifdef USE_WAYLAND
|
||||
#include <Mw/LowLevel/Wayland.h>
|
||||
#endif
|
||||
#ifdef USE_APPKIT
|
||||
#include <Mw/LowLevel/AppKit.h>
|
||||
#endif
|
||||
|
||||
union _MwLL {
|
||||
struct _MwLLCommon common;
|
||||
@@ -72,6 +77,9 @@ union _MwLL {
|
||||
#ifdef USE_WAYLAND
|
||||
struct _MwLLWayland wayland;
|
||||
#endif
|
||||
#ifdef USE_APPKIT
|
||||
struct _MwLLAppKit appkit;
|
||||
#endif
|
||||
};
|
||||
|
||||
union _MwLLColor {
|
||||
@@ -85,6 +93,9 @@ union _MwLLColor {
|
||||
#ifdef USE_WAYLAND
|
||||
struct _MwLLWaylandColor wayland;
|
||||
#endif
|
||||
#ifdef USE_APPKIT
|
||||
struct _MwLLAppKitColor appkit;
|
||||
#endif
|
||||
};
|
||||
|
||||
union _MwLLPixmap {
|
||||
@@ -98,6 +109,9 @@ union _MwLLPixmap {
|
||||
#ifdef USE_WAYLAND
|
||||
struct _MwLLWaylandPixmap wayland;
|
||||
#endif
|
||||
#ifdef USE_APPKIT
|
||||
struct _MwLLAppKitPixmap appkit;
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
#include <Mw/TypeDefs.h>
|
||||
@@ -147,6 +161,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 +218,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);
|
||||
|
||||
27
include/Mw/LowLevel/AppKit.h
Normal file
27
include/Mw/LowLevel/AppKit.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/*!
|
||||
* @file Mw/LowLevel/AppKit.h
|
||||
* @brief Work in progress AppKit Backend
|
||||
* @warning This is used internally.
|
||||
*/
|
||||
#ifndef __MW_LOWLEVEL_APPKIT_H__
|
||||
#define __MW_LOWLEVEL_APPKIT_H__
|
||||
|
||||
#include <Mw/MachDep.h>
|
||||
#include <Mw/TypeDefs.h>
|
||||
#include <Mw/LowLevel.h>
|
||||
|
||||
MWDECL int MwLLAppKitCallInit(void);
|
||||
|
||||
struct _MwLLAppKit {
|
||||
struct _MwLLCommon common;
|
||||
};
|
||||
|
||||
struct _MwLLAppKitColor {
|
||||
struct _MwLLCommonColor common;
|
||||
};
|
||||
|
||||
struct _MwLLAppKitPixmap {
|
||||
struct _MwLLCommonPixmap common;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -47,6 +47,11 @@
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <mach/clock.h>
|
||||
#include <mach/mach.h>
|
||||
#endif
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265
|
||||
#endif
|
||||
|
||||
@@ -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 {
|
||||
@@ -195,26 +197,32 @@ struct _MwListBoxPacket {
|
||||
};
|
||||
|
||||
struct _MwClass {
|
||||
MwHandlerWithStatus create;
|
||||
MwHandler destroy;
|
||||
MwHandler draw;
|
||||
MwHandler click;
|
||||
MwHandler parent_resize;
|
||||
MwHandlerProp prop_change;
|
||||
MwHandler mouse_move;
|
||||
MwHandlerMouse mouse_up;
|
||||
MwHandlerMouse mouse_down;
|
||||
MwHandlerKey key;
|
||||
MwHandlerExecute execute;
|
||||
MwHandler tick;
|
||||
MwHandler resize;
|
||||
MwHandler children_update;
|
||||
MwHandlerChildrenProp children_prop_change;
|
||||
void* reserved1;
|
||||
void* reserved2;
|
||||
void* reserved3;
|
||||
void* reserved4;
|
||||
void* reserved5;
|
||||
MwHandlerWithStatus create;
|
||||
MwHandler destroy;
|
||||
MwHandler draw;
|
||||
MwHandler click;
|
||||
MwHandler parent_resize;
|
||||
MwHandlerProp prop_change;
|
||||
MwHandler mouse_move;
|
||||
MwHandlerMouse mouse_up;
|
||||
MwHandlerMouse mouse_down;
|
||||
MwHandlerKey key;
|
||||
MwHandlerExecute execute;
|
||||
MwHandler tick;
|
||||
MwHandler resize;
|
||||
MwHandler children_update;
|
||||
MwHandlerChildrenProp children_prop_change;
|
||||
MwHandlerClipboardReceived clipboard;
|
||||
void* reserved1;
|
||||
void* reserved2;
|
||||
void* reserved3;
|
||||
void* reserved4;
|
||||
};
|
||||
|
||||
/* 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>
|
||||
|
||||
8
pl/ostype/Darwin.pl
Normal file
8
pl/ostype/Darwin.pl
Normal file
@@ -0,0 +1,8 @@
|
||||
$library_suffix = ".dylib";
|
||||
set_shared_flag("-dynamiclib");
|
||||
|
||||
use_backend("appkit");
|
||||
|
||||
add_cflags("-DSTBI_NO_THREAD_LOCALS");
|
||||
|
||||
1;
|
||||
14
pl/rules.pl
14
pl/rules.pl
@@ -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,14 @@ 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 (grep(/^appkit$/, @backends)) {
|
||||
add_cflags("-DUSE_APPKIT");
|
||||
new_object("src/backend/appkit.m");
|
||||
|
||||
$gl_libs = "-lGL -lGLU";
|
||||
}
|
||||
|
||||
if (param_get("stb-image")) {
|
||||
@@ -48,6 +59,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) {
|
||||
|
||||
@@ -40,10 +40,14 @@ sub new_example {
|
||||
push(@examples_targets, "${_[0]}${executable_suffix}");
|
||||
}
|
||||
|
||||
sub set_shared_flag {
|
||||
@shared = $_[0];
|
||||
}
|
||||
|
||||
sub new_object {
|
||||
my @l = glob($_[0]);
|
||||
foreach my $e (@l) {
|
||||
$e =~ s/\.c$/$object_suffix/;
|
||||
$e =~ s/\.(c|m)$/$object_suffix/;
|
||||
push(@library_targets, $e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ void* MwDynamicSymbol(void* handle, const char* symbol) {
|
||||
void MwDynamicClose(void* handle) {
|
||||
FreeLibrary(handle);
|
||||
}
|
||||
#elif defined(__unix__)
|
||||
#elif defined(__unix__) || defined(__APPLE__)
|
||||
void* MwDynamicOpen(const char* path) {
|
||||
return dlopen(path, RTLD_LOCAL | RTLD_LAZY);
|
||||
}
|
||||
|
||||
@@ -8,6 +8,30 @@ long MwTimeGetTick(void) {
|
||||
void MwTimeSleep(int ms) {
|
||||
Sleep(ms);
|
||||
}
|
||||
#elif defined(__APPLE__)
|
||||
long MwTimeGetTick(void) {
|
||||
struct timespec ts;
|
||||
long n = 0;
|
||||
clock_serv_t cclock;
|
||||
mach_timespec_t mts;
|
||||
|
||||
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
|
||||
clock_get_time(cclock, &mts);
|
||||
mach_port_deallocate(mach_task_self(), cclock);
|
||||
|
||||
n += ts.tv_nsec / 1000 / 1000;
|
||||
n += ts.tv_sec * 1000;
|
||||
|
||||
return n;
|
||||
}
|
||||
void MwTimeSleep(int ms) {
|
||||
struct timespec ts;
|
||||
|
||||
ts.tv_sec = ms / 1000;
|
||||
ts.tv_nsec = (ms % 1000) * 1000 * 1000;
|
||||
|
||||
nanosleep(&ts, NULL);
|
||||
}
|
||||
#elif defined(__unix__)
|
||||
long MwTimeGetTick(void) {
|
||||
struct timespec ts;
|
||||
|
||||
214
src/backend/appkit.m
Normal file
214
src/backend/appkit.m
Normal file
@@ -0,0 +1,214 @@
|
||||
#include <Mw/Milsko.h>
|
||||
|
||||
#include "../../external/stb_ds.h"
|
||||
|
||||
static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
|
||||
MwLL r;
|
||||
(void)x;
|
||||
(void)y;
|
||||
(void)width;
|
||||
(void)height;
|
||||
|
||||
r = malloc(sizeof(*r));
|
||||
|
||||
|
||||
MwLLCreateCommon(r);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static void MwLLDestroyImpl(MwLL handle) {
|
||||
MwLLDestroyCommon(handle);
|
||||
|
||||
free(handle);
|
||||
}
|
||||
|
||||
static void MwLLBeginDrawImpl(MwLL handle) {
|
||||
(void)handle;
|
||||
}
|
||||
|
||||
static void MwLLEndDrawImpl(MwLL handle) {
|
||||
(void)handle;
|
||||
}
|
||||
|
||||
static void MwLLPolygonImpl(MwLL handle, MwPoint* points, int points_count, MwLLColor color) {
|
||||
(void)points;
|
||||
(void)points_count;
|
||||
(void)color;
|
||||
}
|
||||
|
||||
static void MwLLLineImpl(MwLL handle, MwPoint* points, MwLLColor color) {
|
||||
(void)handle;
|
||||
(void)points;
|
||||
(void)color;
|
||||
}
|
||||
|
||||
static MwLLColor MwLLAllocColorImpl(MwLL handle, int r, int g, int b) {
|
||||
MwLLColor c = malloc(sizeof(*c));
|
||||
MwLLColorUpdate(handle, c, r, g, b);
|
||||
return c;
|
||||
}
|
||||
|
||||
static void MwLLColorUpdateImpl(MwLL handle, MwLLColor c, int r, int g, int b) {
|
||||
(void)handle;
|
||||
|
||||
c->common.red = r;
|
||||
c->common.green = g;
|
||||
c->common.blue = b;
|
||||
}
|
||||
|
||||
static void MwLLGetXYWHImpl(MwLL handle, int* x, int* y, unsigned int* w, unsigned int* h) {
|
||||
*x = 0;
|
||||
*y = 0;
|
||||
*w = 0;
|
||||
*h = 0;
|
||||
}
|
||||
|
||||
static void MwLLSetXYImpl(MwLL handle, int x, int y) {
|
||||
(void)handle;
|
||||
(void)x;
|
||||
(void)y;
|
||||
}
|
||||
|
||||
static void MwLLSetWHImpl(MwLL handle, int w, int h) {
|
||||
(void)handle;
|
||||
(void)w;
|
||||
(void)h;
|
||||
}
|
||||
|
||||
static void MwLLFreeColorImpl(MwLLColor color) {
|
||||
free(color);
|
||||
}
|
||||
|
||||
static int MwLLPendingImpl(MwLL handle) {
|
||||
(void)handle;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void MwLLNextEventImpl(MwLL handle) {
|
||||
(void)handle;
|
||||
}
|
||||
|
||||
static void MwLLSetTitleImpl(MwLL handle, const char* title) {
|
||||
(void)title;
|
||||
(void)handle;
|
||||
}
|
||||
|
||||
static MwLLPixmap MwLLCreatePixmapImpl(MwLL handle, unsigned char* data, int width, int height) {
|
||||
(void)handle;
|
||||
|
||||
MwLLPixmap r = malloc(sizeof(*r));
|
||||
|
||||
r->common.raw = malloc(4 * width * height);
|
||||
memcpy(r->common.raw, data, 4 * width * height);
|
||||
|
||||
r->common.width = width;
|
||||
r->common.height = height;
|
||||
|
||||
MwLLPixmapUpdate(r);
|
||||
return r;
|
||||
}
|
||||
|
||||
static void MwLLPixmapUpdateImpl(MwLLPixmap r) {
|
||||
(void)r;
|
||||
}
|
||||
|
||||
static void MwLLDestroyPixmapImpl(MwLLPixmap pixmap) {
|
||||
free(pixmap);
|
||||
}
|
||||
|
||||
static void MwLLDrawPixmapImpl(MwLL handle, MwRect* rect, MwLLPixmap pixmap) {
|
||||
(void)handle;
|
||||
(void)rect;
|
||||
(void)pixmap;
|
||||
}
|
||||
|
||||
static void MwLLSetIconImpl(MwLL handle, MwLLPixmap pixmap) {
|
||||
(void)handle;
|
||||
(void)pixmap;
|
||||
}
|
||||
|
||||
static void MwLLForceRenderImpl(MwLL handle) {
|
||||
(void)handle;
|
||||
}
|
||||
|
||||
static void MwLLSetCursorImpl(MwLL handle, MwCursor* image, MwCursor* mask) {
|
||||
(void)handle;
|
||||
(void)image;
|
||||
(void)mask;
|
||||
}
|
||||
|
||||
static void MwLLDetachImpl(MwLL handle, MwPoint* point) {
|
||||
(void)handle;
|
||||
(void)point;
|
||||
}
|
||||
|
||||
static void MwLLShowImpl(MwLL handle, int show) {
|
||||
(void)handle;
|
||||
(void)show;
|
||||
}
|
||||
|
||||
static void MwLLMakePopupImpl(MwLL handle, MwLL parent) {
|
||||
(void)handle;
|
||||
(void)parent;
|
||||
}
|
||||
|
||||
static void MwLLSetSizeHintsImpl(MwLL handle, int minx, int miny, int maxx, int maxy) {
|
||||
(void)handle;
|
||||
(void)minx;
|
||||
(void)miny;
|
||||
(void)maxx;
|
||||
(void)maxy;
|
||||
}
|
||||
|
||||
static void MwLLMakeBorderlessImpl(MwLL handle, int toggle) {
|
||||
(void)handle;
|
||||
(void)toggle;
|
||||
}
|
||||
|
||||
static void MwLLFocusImpl(MwLL handle) {
|
||||
(void)handle;
|
||||
}
|
||||
|
||||
static void MwLLGrabPointerImpl(MwLL handle, int toggle) {
|
||||
(void)handle;
|
||||
(void)toggle;
|
||||
}
|
||||
|
||||
static void MwLLSetClipboardImpl(MwLL handle, const char* text) {
|
||||
(void)handle;
|
||||
(void)text;
|
||||
}
|
||||
|
||||
static void MwLLGetClipboardImpl(MwLL handle) {
|
||||
(void)handle;
|
||||
}
|
||||
|
||||
static void MwLLMakeToolWindowImpl(MwLL handle) {
|
||||
(void)handle;
|
||||
}
|
||||
|
||||
static void MwLLGetCursorCoordImpl(MwLL handle, MwPoint* point) {
|
||||
(void)handle;
|
||||
(void)point;
|
||||
}
|
||||
|
||||
static void MwLLGetScreenSizeImpl(MwLL handle, MwRect* rect) {
|
||||
(void)handle;
|
||||
(void)rect;
|
||||
}
|
||||
|
||||
static void MwLLBeginStateChangeImpl(MwLL handle) {
|
||||
MwLLShow(handle, 0);
|
||||
}
|
||||
|
||||
static void MwLLEndStateChangeImpl(MwLL handle) {
|
||||
MwLLShow(handle, 1);
|
||||
}
|
||||
|
||||
static int MwLLAppKitCallInitImpl(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include "call.c"
|
||||
CALL(AppKit);
|
||||
@@ -237,12 +237,13 @@ static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
|
||||
r->common.copy_buffer = 1;
|
||||
r->common.type = MwLLBackendGDI;
|
||||
|
||||
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);
|
||||
r->gdi.hInstance = wc.hInstance;
|
||||
r->gdi.cursor = NULL;
|
||||
r->gdi.icon = NULL;
|
||||
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);
|
||||
r->gdi.hInstance = wc.hInstance;
|
||||
r->gdi.cursor = NULL;
|
||||
r->gdi.icon = NULL;
|
||||
|
||||
u->ll = r;
|
||||
u->min_set = 0;
|
||||
@@ -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);
|
||||
@@ -209,8 +210,9 @@ static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
|
||||
r->x11.grabbed = 0;
|
||||
r->x11.force_render = 0;
|
||||
|
||||
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.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);
|
||||
|
||||
@@ -1,55 +1,70 @@
|
||||
#include <Mw/Milsko.h>
|
||||
|
||||
MwLL (*MwLLCreate)(MwLL parent, int x, int y, int width, int height);
|
||||
void (*MwLLDestroy)(MwLL handle);
|
||||
/* Older GCC doesn't like this part of the code because of common sections.
|
||||
What are common sections? This question is so obscure and unknown
|
||||
that newer GCC actually compiles with -fno-common by default because
|
||||
not enough people ever figured this out. But when compiling under
|
||||
older Mac OS X. specifically the gcc that comes with tigerbrew (this
|
||||
has not yet been tried under XCode 10.5), this comes up. Furthermore,
|
||||
adding -fno-common to either the cflags or ldflags doesn't seem to fix this.
|
||||
But what does fix it is using GNU attributes. So...yeah, sure, we'll just do
|
||||
this.*/
|
||||
#ifdef __APPLE__
|
||||
#define NOCOMMON __attribute__((nocommon))
|
||||
#else
|
||||
#define NOCOMMON
|
||||
#endif
|
||||
|
||||
void (*MwLLPolygon)(MwLL handle, MwPoint* points, int points_count, MwLLColor color);
|
||||
void (*MwLLLine)(MwLL handle, MwPoint* points, MwLLColor color);
|
||||
NOCOMMON MwLL (*MwLLCreate)(MwLL parent, int x, int y, int width, int height);
|
||||
NOCOMMON void (*MwLLDestroy)(MwLL handle);
|
||||
|
||||
void (*MwLLBeginDraw)(MwLL handle);
|
||||
void (*MwLLEndDraw)(MwLL handle);
|
||||
NOCOMMON void (*MwLLPolygon)(MwLL handle, MwPoint* points, int points_count, MwLLColor color);
|
||||
NOCOMMON void (*MwLLLine)(MwLL handle, MwPoint* points, MwLLColor color);
|
||||
|
||||
MwLLColor (*MwLLAllocColor)(MwLL handle, int r, int g, int b);
|
||||
void (*MwLLColorUpdate)(MwLL handle, MwLLColor c, int r, int g, int b);
|
||||
void (*MwLLFreeColor)(MwLLColor color);
|
||||
NOCOMMON void (*MwLLBeginDraw)(MwLL handle);
|
||||
NOCOMMON void (*MwLLEndDraw)(MwLL handle);
|
||||
|
||||
void (*MwLLGetXYWH)(MwLL handle, int* x, int* y, unsigned int* w, unsigned int* h);
|
||||
void (*MwLLSetXY)(MwLL handle, int x, int y);
|
||||
void (*MwLLSetWH)(MwLL handle, int w, int h);
|
||||
NOCOMMON MwLLColor (*MwLLAllocColor)(MwLL handle, int r, int g, int b);
|
||||
NOCOMMON void (*MwLLColorUpdate)(MwLL handle, MwLLColor c, int r, int g, int b);
|
||||
NOCOMMON void (*MwLLFreeColor)(MwLLColor color);
|
||||
|
||||
void (*MwLLSetTitle)(MwLL handle, const char* title);
|
||||
NOCOMMON void (*MwLLGetXYWH)(MwLL handle, int* x, int* y, unsigned int* w, unsigned int* h);
|
||||
NOCOMMON void (*MwLLSetXY)(MwLL handle, int x, int y);
|
||||
NOCOMMON void (*MwLLSetWH)(MwLL handle, int w, int h);
|
||||
|
||||
int (*MwLLPending)(MwLL handle);
|
||||
void (*MwLLNextEvent)(MwLL handle);
|
||||
NOCOMMON void (*MwLLSetTitle)(MwLL handle, const char* title);
|
||||
|
||||
MwLLPixmap (*MwLLCreatePixmap)(MwLL handle, unsigned char* data, int width, int height);
|
||||
void (*MwLLPixmapUpdate)(MwLLPixmap pixmap);
|
||||
void (*MwLLDestroyPixmap)(MwLLPixmap pixmap);
|
||||
void (*MwLLDrawPixmap)(MwLL handle, MwRect* rect, MwLLPixmap pixmap);
|
||||
void (*MwLLSetIcon)(MwLL handle, MwLLPixmap pixmap);
|
||||
NOCOMMON int (*MwLLPending)(MwLL handle);
|
||||
NOCOMMON void (*MwLLNextEvent)(MwLL handle);
|
||||
|
||||
void (*MwLLForceRender)(MwLL handle);
|
||||
NOCOMMON MwLLPixmap (*MwLLCreatePixmap)(MwLL handle, unsigned char* data, int width, int height);
|
||||
NOCOMMON void (*MwLLPixmapUpdate)(MwLLPixmap pixmap);
|
||||
NOCOMMON void (*MwLLDestroyPixmap)(MwLLPixmap pixmap);
|
||||
NOCOMMON void (*MwLLDrawPixmap)(MwLL handle, MwRect* rect, MwLLPixmap pixmap);
|
||||
NOCOMMON void (*MwLLSetIcon)(MwLL handle, MwLLPixmap pixmap);
|
||||
|
||||
void (*MwLLSetCursor)(MwLL handle, MwCursor* image, MwCursor* mask);
|
||||
void (*MwLLDetach)(MwLL handle, MwPoint* point);
|
||||
void (*MwLLShow)(MwLL handle, int show);
|
||||
NOCOMMON void (*MwLLForceRender)(MwLL handle);
|
||||
|
||||
void (*MwLLSetSizeHints)(MwLL handle, int minx, int miny, int maxx, int maxy);
|
||||
void (*MwLLMakeBorderless)(MwLL handle, int toggle);
|
||||
void (*MwLLMakeToolWindow)(MwLL handle);
|
||||
void (*MwLLMakePopup)(MwLL handle, MwLL parent);
|
||||
NOCOMMON void (*MwLLSetCursor)(MwLL handle, MwCursor* image, MwCursor* mask);
|
||||
NOCOMMON void (*MwLLDetach)(MwLL handle, MwPoint* point);
|
||||
NOCOMMON void (*MwLLShow)(MwLL handle, int show);
|
||||
|
||||
void (*MwLLBeginStateChange)(MwLL handle);
|
||||
void (*MwLLEndStateChange)(MwLL handle);
|
||||
NOCOMMON void (*MwLLSetSizeHints)(MwLL handle, int minx, int miny, int maxx, int maxy);
|
||||
NOCOMMON void (*MwLLMakeBorderless)(MwLL handle, int toggle);
|
||||
NOCOMMON void (*MwLLMakeToolWindow)(MwLL handle);
|
||||
NOCOMMON void (*MwLLMakePopup)(MwLL handle, MwLL parent);
|
||||
|
||||
void (*MwLLFocus)(MwLL handle);
|
||||
void (*MwLLGrabPointer)(MwLL handle, int toggle);
|
||||
NOCOMMON void (*MwLLBeginStateChange)(MwLL handle);
|
||||
NOCOMMON void (*MwLLEndStateChange)(MwLL handle);
|
||||
|
||||
void (*MwLLSetClipboard)(MwLL handle, const char* text);
|
||||
char* (*MwLLGetClipboard)(MwLL handle);
|
||||
NOCOMMON void (*MwLLFocus)(MwLL handle);
|
||||
NOCOMMON void (*MwLLGrabPointer)(MwLL handle, int toggle);
|
||||
|
||||
void (*MwLLGetCursorCoord)(MwLL handle, MwPoint* point);
|
||||
void (*MwLLGetScreenSize)(MwLL handle, MwRect* rect);
|
||||
NOCOMMON void (*MwLLSetClipboard)(MwLL handle, const char* text);
|
||||
NOCOMMON void (*MwLLGetClipboard)(MwLL handle);
|
||||
|
||||
NOCOMMON void (*MwLLGetCursorCoord)(MwLL handle, MwPoint* point);
|
||||
NOCOMMON void (*MwLLGetScreenSize)(MwLL handle, MwRect* rect);
|
||||
|
||||
void MwLLCreateCommon(MwLL handle) {
|
||||
handle->common.handler = malloc(sizeof(*handle->common.handler));
|
||||
|
||||
@@ -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) {
|
||||
MwVaApply(handle,
|
||||
MwNy, rc.height - h,
|
||||
NULL);
|
||||
if(handle->lowlevel->common.coordinate_type == MwCoordinatesGlobal) {
|
||||
if(MwGetInteger(handle, MwNy) + sz.height > rc.height) {
|
||||
MwVaApply(handle,
|
||||
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