fix sloppy focus

git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@231 b9cfdab3-6d41-4d17-bbe4-086880011989
This commit is contained in:
NishiOwO
2025-10-08 18:03:46 +00:00
parent 795bb2d03f
commit 7b0173e7c4
18 changed files with 125 additions and 38 deletions

View File

@@ -43,6 +43,7 @@ struct _MwLLHandler {
void (*resize)(MwLL handle, void* data);
void (*close)(MwLL handle, void* data);
void (*move)(MwLL handle, void* data);
void (*key)(MwLL handle, void* data);
};
#ifdef __cplusplus

View File

@@ -14,6 +14,7 @@
#include <sys/types.h>
#include <assert.h>
#include <math.h>
#include <ctype.h>
#ifndef _WIN32
#include <unistd.h>
#include <sys/ipc.h>

View File

@@ -26,6 +26,7 @@ typedef void* MwWidget;
typedef void (*MwHandler)(MwWidget handle);
typedef int (*MwHandler2)(MwWidget handle);
typedef void (*MwHandler3)(MwWidget handle, const char* key);
typedef void (*MwHandler4)(MwWidget handle, int key);
typedef void (*MwUserHandler)(MwWidget handle, void* user_data, void* call_data);
typedef void (*MwErrorHandler)(int code, const char* message, void* user_data);
@@ -118,6 +119,12 @@ struct _MwClass {
MwHandler mouse_move;
MwHandler mouse_up;
MwHandler mouse_down;
MwHandler4 key;
void* reserved1;
void* reserved2;
void* reserved3;
void* reserved4;
void* reserved5;
};
struct _MwFont {

View File

@@ -389,8 +389,3 @@ void MwLLDetach(MwLL handle, MwPoint* point) {
SetWindowLongPtr(handle->hWnd, GWL_STYLE, style);
}
void MwLLShow(MwLL handle, int show) {
ShowWindow(handle->hWnd, show ? SW_NORMAL : SW_HIDE);
if(show) SetFocus(handle->hWnd);
}

View File

@@ -1,7 +1,7 @@
/* $Id$ */
#include <Mw/Milsko.h>
static unsigned long mask = ExposureMask | StructureNotifyMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | EnterWindowMask;
static unsigned long mask = ExposureMask | StructureNotifyMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | EnterWindowMask | KeymapNotify;
static void create_pixmap(MwLL handle) {
XWindowAttributes attr;
@@ -150,6 +150,8 @@ void MwLLNextEvent(MwLL handle) {
p.y = ev.xbutton.y;
MwLLDispatch(handle, down, &p);
XSetInputFocus(handle->display, handle->window, RevertToNone, CurrentTime);
}
} else if(ev.type == ButtonRelease) {
if(ev.xbutton.button == Button1) {
@@ -179,6 +181,19 @@ void MwLLNextEvent(MwLL handle) {
p.y = ev.xmotion.y;
MwLLDispatch(handle, move, &p);
} else if(ev.type == KeyPress) {
int n;
KeySym sym = XLookupKeysym(&ev.xkey, 0);
char* str = XKeysymToString(sym);
char s = str == NULL ? 0 : str[0];
if(ev.xkey.state & (ShiftMask | LockMask)) {
n = toupper((int)s);
} else {
n = s;
}
MwLLDispatch(handle, key, &n);
}
if(render) {
int x, y;

View File

@@ -66,6 +66,13 @@ static void llmovehandler(MwLL handle, void* data) {
MwDispatch(h, mouse_move);
}
static void llkeyhandler(MwLL handle, void* data) {
MwWidget h = (MwWidget)handle->user;
int key = *(int*)data;
MwDispatch3(h, key, key);
}
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));
@@ -92,6 +99,7 @@ MwWidget MwCreateWidget(MwClass widget_class, const char* name, MwWidget parent,
h->lowlevel->handler->resize = llresizehandler;
h->lowlevel->handler->close = llclosehandler;
h->lowlevel->handler->move = llmovehandler;
h->lowlevel->handler->key = llkeyhandler;
if(parent != NULL) arrput(parent->children, h);

View File

@@ -74,6 +74,11 @@ MwClassRec MwButtonClassRec = {
prop_change, /* prop_change */
NULL, /* mouse_move */
MwForceRender, /* mouse_up */
MwForceRender /* mouse_down */
};
MwForceRender, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwButtonClass = &MwButtonClassRec;

View File

@@ -46,6 +46,11 @@ MwClassRec MwCheckBoxClassRec = {
prop_change, /* prop_change */
NULL, /* mouse_move */
MwForceRender, /* mouse_up */
MwForceRender /* mouse_down */
};
MwForceRender, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwCheckBoxClass = &MwCheckBoxClassRec;

View File

@@ -32,6 +32,11 @@ MwClassRec MwFrameClassRec = {
NULL, /* prop_change */
NULL, /* mouse_move */
NULL, /* mouse_up */
NULL /* mouse_down */
};
NULL, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwFrameClass = &MwFrameClassRec;

View File

@@ -33,6 +33,11 @@ MwClassRec MwImageClassRec = {
prop_change, /* prop_change */
NULL, /* mouse_move */
NULL, /* mouse_up */
NULL /* mouse_down */
};
NULL, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwImageClass = &MwImageClassRec;

View File

@@ -53,6 +53,11 @@ MwClassRec MwLabelClassRec = {
prop_change, /* prop_change */
NULL, /* mouse_move */
NULL, /* mouse_up */
NULL /* mouse_down */
};
NULL, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwLabelClass = &MwLabelClassRec;

View File

@@ -175,8 +175,13 @@ MwClassRec MwMenuClassRec = {
NULL, /* prop_change */
NULL, /* mouse_move */
mouse_up, /* mouse_up */
mouse_down /* mouse_down */
};
mouse_down, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwMenuClass = &MwMenuClassRec;
MwMenu MwMenuAdd(MwWidget handle, MwMenu menu, const char* name) {

View File

@@ -137,8 +137,13 @@ MwClassRec MwOpenGLClassRec = {
NULL, /* prop_change */
NULL, /* mouse_move */
NULL, /* mouse_up */
NULL /* mouse_down */
};
NULL, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwOpenGLClass = &MwOpenGLClassRec;
void MwOpenGLMakeCurrent(MwWidget handle) {

View File

@@ -194,8 +194,13 @@ MwClassRec MwScrollBarClassRec = {
prop_change, /* prop_change */
mouse_move, /* mouse_move */
MwForceRender, /* mouse_up */
mouse_down /* mouse_down */
};
mouse_down, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwScrollBarClass = &MwScrollBarClassRec;
int MwScrollBarGetVisibleLength(MwWidget handle) {

View File

@@ -155,8 +155,13 @@ MwClassRec MwSubMenuClassRec = {
NULL, /* prop_change */
NULL, /* mouse_move */
MwForceRender, /* mouse_up */
MwForceRender /* mouse_down */
};
MwForceRender, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwSubMenuClass = &MwSubMenuClassRec;
void MwSubMenuAppear(MwWidget handle, MwMenu menu, MwPoint* point) {

View File

@@ -25,14 +25,19 @@ static void draw(MwWidget handle) {
}
MwClassRec MwTextClassRec = {
create, /* create */
NULL, /* destroy */
draw, /* draw */
NULL, /* click */
NULL, /* parent_resize */
NULL, /* prop_change */
NULL, /* mouse_move */
NULL, /* mouse_up */
NULL /* mouse_down */
};
create, /* create */
NULL, /* destroy */
draw, /* draw */
NULL, /* click */
NULL, /* parent_resize */
NULL, /* prop_change */
NULL, /* mouse_move */
MwForceRender, /* mouse_up */
MwForceRender, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwTextClass = &MwTextClassRec;

View File

@@ -512,6 +512,11 @@ MwClassRec MwVulkanClassRec = {
NULL, /* prop_change */
NULL, /* mouse_move */
NULL, /* mouse_up */
NULL /* mouse_down */
};
NULL, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwVulkanClass = &MwVulkanClassRec;

View File

@@ -30,8 +30,13 @@ MwClassRec MwWindowClassRec = {
NULL, /* prop_change */
NULL, /* mouse_move */
NULL, /* mouse_up */
NULL /* mouse_down */
};
NULL, /* mouse_down */
NULL, /* key */
NULL,
NULL,
NULL,
NULL,
NULL};
MwClass MwWindowClass = &MwWindowClassRec;
void MwWindowSetIcon(MwWidget handle, MwLLPixmap pixmap) {