Focus change events

This commit is contained in:
Kevin Lange 2014-04-13 18:28:42 -07:00
parent f0ca89685b
commit 6db3fe2ec2
6 changed files with 75 additions and 19 deletions

View File

@ -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', []),

View File

@ -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();

View File

@ -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;

View File

@ -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);
} }

View File

@ -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);

View File

@ -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);