Focus change events
This commit is contained in:
parent
f0ca89685b
commit
6db3fe2ec2
@ -52,7 +52,7 @@ class CCompiler(object):
|
|||||||
'"lib/shmemfonts.h"': (None, 'lib/shmemfonts.o', ['"lib/graphics.h"', '<ft2build.h>']),
|
'"lib/shmemfonts.h"': (None, 'lib/shmemfonts.o', ['"lib/graphics.h"', '<ft2build.h>']),
|
||||||
'"lib/wcwidth.h"': (None, 'lib/wcwidth.o', []),
|
'"lib/wcwidth.h"': (None, 'lib/wcwidth.o', []),
|
||||||
'"lib/window.h"': (None, 'lib/window.o', ['"lib/pthread.h"', '"lib/list.h"']),
|
'"lib/window.h"': (None, 'lib/window.o', ['"lib/pthread.h"', '"lib/list.h"']),
|
||||||
'"lib/yutani.h"': (None, 'lib/yutani.o', ['"lib/pthread.h"', '"lib/list.h"', '"lib/pex.h"', '"lib/graphics.h"']),
|
'"lib/yutani.h"': (None, 'lib/yutani.o', ['"lib/pthread.h"', '"lib/list.h"', '"lib/pex.h"', '"lib/graphics.h"', '"lib/hashmap.h"']),
|
||||||
'"gui/ttk/ttk.h"': (None, 'gui/ttk/lib/ttk-core.o', ['"lib/decorations.h"', '<cairo.h>', '<math.h>']),
|
'"gui/ttk/ttk.h"': (None, 'gui/ttk/lib/ttk-core.o', ['"lib/decorations.h"', '<cairo.h>', '<math.h>']),
|
||||||
'"gui/terminal/lib/termemu.h"':
|
'"gui/terminal/lib/termemu.h"':
|
||||||
(None, 'gui/terminal/lib/termemu.o', []),
|
(None, 'gui/terminal/lib/termemu.o', []),
|
||||||
|
@ -197,10 +197,16 @@ static void set_focused_window(yutani_globals_t * yg, yutani_server_window_t * w
|
|||||||
|
|
||||||
if (yg->focused_window) {
|
if (yg->focused_window) {
|
||||||
/* XXX Send focus change to old focused window */
|
/* XXX Send focus change to old focused window */
|
||||||
|
yutani_msg_t * response = yutani_msg_build_window_focus_change(yg->focused_window->wid, 0);
|
||||||
|
pex_send(yg->server, yg->focused_window->owner, response->size, (char *)response);
|
||||||
|
free(response);
|
||||||
}
|
}
|
||||||
yg->focused_window = w;
|
yg->focused_window = w;
|
||||||
if (w) {
|
if (w) {
|
||||||
/* XXX Send focus change to new focused window */
|
/* XXX Send focus change to new focused window */
|
||||||
|
yutani_msg_t * response = yutani_msg_build_window_focus_change(w->wid, 1);
|
||||||
|
pex_send(yg->server, w->owner, response->size, (char *)response);
|
||||||
|
free(response);
|
||||||
make_top(yg, w);
|
make_top(yg, w);
|
||||||
} else {
|
} else {
|
||||||
/* XXX */
|
/* XXX */
|
||||||
@ -604,6 +610,7 @@ int main(int argc, char * argv[]) {
|
|||||||
setenv("DISPLAY", yg->pex_endpoint, 1);
|
setenv("DISPLAY", yg->pex_endpoint, 1);
|
||||||
|
|
||||||
FILE * server = pex_bind(yg->pex_endpoint);
|
FILE * server = pex_bind(yg->pex_endpoint);
|
||||||
|
yg->server = server;
|
||||||
|
|
||||||
fprintf(stderr, "[yutani] Loading fonts...\n");
|
fprintf(stderr, "[yutani] Loading fonts...\n");
|
||||||
load_fonts();
|
load_fonts();
|
||||||
|
@ -70,6 +70,7 @@ typedef struct {
|
|||||||
char * pex_endpoint;
|
char * pex_endpoint;
|
||||||
|
|
||||||
yutani_server_window_t * focused_window;
|
yutani_server_window_t * focused_window;
|
||||||
|
FILE * server;
|
||||||
} yutani_globals_t;
|
} yutani_globals_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -144,6 +144,7 @@ static void render_decors() {
|
|||||||
} else {
|
} else {
|
||||||
render_decorations(&w, ctx, "Terminal");
|
render_decorations(&w, ctx, "Terminal");
|
||||||
}
|
}
|
||||||
|
yutani_flip(yctx, window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -972,10 +973,26 @@ void * handle_incoming(void * garbage) {
|
|||||||
while (!exit_application) {
|
while (!exit_application) {
|
||||||
yutani_msg_t * m = yutani_poll(yctx);
|
yutani_msg_t * m = yutani_poll(yctx);
|
||||||
if (m) {
|
if (m) {
|
||||||
if (m->type == YUTANI_MSG_KEY_EVENT) {
|
switch (m->type) {
|
||||||
struct yutani_msg_key_event * ke = (void*)m->data;
|
case YUTANI_MSG_KEY_EVENT:
|
||||||
int ret = (ke->event.action == KEY_ACTION_DOWN) && (ke->event.key);
|
{
|
||||||
key_event(ret, &ke->event);
|
struct yutani_msg_key_event * ke = (void*)m->data;
|
||||||
|
int ret = (ke->event.action == KEY_ACTION_DOWN) && (ke->event.key);
|
||||||
|
key_event(ret, &ke->event);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case YUTANI_MSG_WINDOW_FOCUS_CHANGE:
|
||||||
|
{
|
||||||
|
struct yutani_msg_window_focus_change * wf = (void*)m->data;
|
||||||
|
yutani_window_t * win = hashmap_get(yctx->windows, (void*)wf->wid);
|
||||||
|
if (win) {
|
||||||
|
win->focused = wf->focused;
|
||||||
|
render_decors();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
free(m);
|
free(m);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "graphics.h"
|
#include "graphics.h"
|
||||||
#include "kbd.h"
|
#include "kbd.h"
|
||||||
#include "mouse.h"
|
#include "mouse.h"
|
||||||
|
#include "hashmap.h"
|
||||||
|
|
||||||
yutani_msg_t * yutani_wait_for(yutani_t * y, uint32_t type) {
|
yutani_msg_t * yutani_wait_for(yutani_t * y, uint32_t type) {
|
||||||
do {
|
do {
|
||||||
@ -197,6 +198,22 @@ yutani_msg_t * yutani_msg_build_window_stack(yutani_wid_t wid, int z) {
|
|||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
yutani_msg_t * yutani_msg_build_window_focus_change(yutani_wid_t wid, int focused) {
|
||||||
|
size_t s = sizeof(struct yutani_message) + sizeof(struct yutani_msg_window_focus_change);
|
||||||
|
yutani_msg_t * msg = malloc(s);
|
||||||
|
|
||||||
|
msg->magic = YUTANI_MSG__MAGIC;
|
||||||
|
msg->type = YUTANI_MSG_WINDOW_FOCUS_CHANGE;
|
||||||
|
msg->size = s;
|
||||||
|
|
||||||
|
struct yutani_msg_window_focus_change * mw = (void *)msg->data;
|
||||||
|
|
||||||
|
mw->wid = wid;
|
||||||
|
mw->focused = focused;
|
||||||
|
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
int yutani_msg_send(yutani_t * y, yutani_msg_t * msg) {
|
int yutani_msg_send(yutani_t * y, yutani_msg_t * msg) {
|
||||||
return pex_reply(y->sock, msg->size, (char *)msg);
|
return pex_reply(y->sock, msg->size, (char *)msg);
|
||||||
}
|
}
|
||||||
@ -207,6 +224,7 @@ yutani_t * yutani_context_create(FILE * socket) {
|
|||||||
out->sock = socket;
|
out->sock = socket;
|
||||||
out->display_width = 0;
|
out->display_width = 0;
|
||||||
out->display_height = 0;
|
out->display_height = 0;
|
||||||
|
out->windows = hashmap_create_int(10);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,6 +271,9 @@ yutani_window_t * yutani_window_create(yutani_t * y, int width, int height) {
|
|||||||
win->height = mw->height;
|
win->height = mw->height;
|
||||||
win->bufid = mw->bufid;
|
win->bufid = mw->bufid;
|
||||||
win->wid = mw->wid;
|
win->wid = mw->wid;
|
||||||
|
win->focused = 0;
|
||||||
|
|
||||||
|
hashmap_set(y->windows, (void*)win->wid, win);
|
||||||
|
|
||||||
char key[1024];
|
char key[1024];
|
||||||
YUTANI_SHMKEY(key, 1024, win);
|
YUTANI_SHMKEY(key, 1024, win);
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "hashmap.h"
|
||||||
#include "graphics.h"
|
#include "graphics.h"
|
||||||
#include "kbd.h"
|
#include "kbd.h"
|
||||||
#include "mouse.h"
|
#include "mouse.h"
|
||||||
@ -20,6 +21,8 @@ typedef struct yutani_context {
|
|||||||
/* XXX display struct with more information? */
|
/* XXX display struct with more information? */
|
||||||
size_t display_width;
|
size_t display_width;
|
||||||
size_t display_height;
|
size_t display_height;
|
||||||
|
|
||||||
|
hashmap_t * windows;
|
||||||
} yutani_t;
|
} yutani_t;
|
||||||
|
|
||||||
typedef struct yutani_message {
|
typedef struct yutani_message {
|
||||||
@ -70,6 +73,11 @@ struct yutani_msg_window_stack {
|
|||||||
int z;
|
int z;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct yutani_msg_window_focus_change {
|
||||||
|
yutani_wid_t wid;
|
||||||
|
int focused;
|
||||||
|
};
|
||||||
|
|
||||||
struct yutani_msg_mouse_event {
|
struct yutani_msg_mouse_event {
|
||||||
yutani_wid_t wid;
|
yutani_wid_t wid;
|
||||||
mouse_device_packet_t event;
|
mouse_device_packet_t event;
|
||||||
@ -88,24 +96,25 @@ typedef struct yutani_window {
|
|||||||
} yutani_window_t;
|
} yutani_window_t;
|
||||||
|
|
||||||
/* Magic value */
|
/* Magic value */
|
||||||
#define YUTANI_MSG__MAGIC 0xABAD1DEA
|
#define YUTANI_MSG__MAGIC 0xABAD1DEA
|
||||||
|
|
||||||
/* Client messages */
|
/* Client messages */
|
||||||
#define YUTANI_MSG_HELLO 0x00000001
|
#define YUTANI_MSG_HELLO 0x00000001
|
||||||
#define YUTANI_MSG_WINDOW_NEW 0x00000002
|
#define YUTANI_MSG_WINDOW_NEW 0x00000002
|
||||||
#define YUTANI_MSG_FLIP 0x00000003
|
#define YUTANI_MSG_FLIP 0x00000003
|
||||||
#define YUTANI_MSG_KEY_EVENT 0x00000004
|
#define YUTANI_MSG_KEY_EVENT 0x00000004
|
||||||
#define YUTANI_MSG_MOUSE_EVENT 0x00000005
|
#define YUTANI_MSG_MOUSE_EVENT 0x00000005
|
||||||
#define YUTANI_MSG_WINDOW_MOVE 0x00000006
|
#define YUTANI_MSG_WINDOW_MOVE 0x00000006
|
||||||
#define YUTANI_MSG_WINDOW_CLOSE 0x00000007
|
#define YUTANI_MSG_WINDOW_CLOSE 0x00000007
|
||||||
#define YUTANI_MSG_WINDOW_SHOW 0x00000008
|
#define YUTANI_MSG_WINDOW_SHOW 0x00000008
|
||||||
#define YUTANI_MSG_WINDOW_HIDE 0x00000009
|
#define YUTANI_MSG_WINDOW_HIDE 0x00000009
|
||||||
#define YUTANI_MSG_WINDOW_STACK 0x0000000A
|
#define YUTANI_MSG_WINDOW_STACK 0x0000000A
|
||||||
#define YUTANI_MSG_GOODBYE 0x000000F0
|
#define YUTANI_MSG_WINDOW_FOCUS_CHANGE 0x0000000B
|
||||||
|
#define YUTANI_MSG_GOODBYE 0x000000F0
|
||||||
|
|
||||||
/* Server responses */
|
/* Server responses */
|
||||||
#define YUTANI_MSG_WELCOME 0x00010001
|
#define YUTANI_MSG_WELCOME 0x00010001
|
||||||
#define YUTANI_MSG_WINDOW_INIT 0x00010002
|
#define YUTANI_MSG_WINDOW_INIT 0x00010002
|
||||||
|
|
||||||
#define YUTANI_ZORDER_MAX 0xFFFF
|
#define YUTANI_ZORDER_MAX 0xFFFF
|
||||||
#define YUTANI_ZORDER_TOP 0xFFFF
|
#define YUTANI_ZORDER_TOP 0xFFFF
|
||||||
@ -123,6 +132,7 @@ yutani_msg_t * yutani_msg_build_key_event(yutani_wid_t wid, key_event_t * event)
|
|||||||
yutani_msg_t * yutani_msg_build_mouse_event(yutani_wid_t wid, mouse_device_packet_t * event);
|
yutani_msg_t * yutani_msg_build_mouse_event(yutani_wid_t wid, mouse_device_packet_t * event);
|
||||||
yutani_msg_t * yutani_msg_build_window_close(yutani_wid_t wid);
|
yutani_msg_t * yutani_msg_build_window_close(yutani_wid_t wid);
|
||||||
yutani_msg_t * yutani_msg_build_window_stack(yutani_wid_t wid, int z);
|
yutani_msg_t * yutani_msg_build_window_stack(yutani_wid_t wid, int z);
|
||||||
|
yutani_msg_t * yutani_msg_build_window_focus_change(yutani_wid_t wid, int focused);
|
||||||
|
|
||||||
int yutani_msg_send(yutani_t * y, yutani_msg_t * msg);
|
int yutani_msg_send(yutani_t * y, yutani_msg_t * msg);
|
||||||
yutani_t * yutani_context_create(FILE * socket);
|
yutani_t * yutani_context_create(FILE * socket);
|
||||||
|
Loading…
Reference in New Issue
Block a user