forked from enlightenment/enlightenment
add hook to borders to allow layout to b adjusted by modules
add a layout module - good proof of concept SVN revision: 30517
This commit is contained in:
parent
27f81d1ea2
commit
5af386933f
|
@ -248,6 +248,8 @@ src/modules/ibox/Makefile
|
||||||
src/modules/ibox/module.desktop
|
src/modules/ibox/module.desktop
|
||||||
src/modules/start/Makefile
|
src/modules/start/Makefile
|
||||||
src/modules/start/module.desktop
|
src/modules/start/module.desktop
|
||||||
|
src/modules/layout/Makefile
|
||||||
|
src/modules/layout/module.desktop
|
||||||
src/preload/Makefile
|
src/preload/Makefile
|
||||||
data/Makefile
|
data/Makefile
|
||||||
data/fonts/Makefile
|
data/fonts/Makefile
|
||||||
|
|
|
@ -100,7 +100,9 @@ static void _e_border_pointer_resize_begin(E_Border *bd);
|
||||||
static void _e_border_pointer_resize_end(E_Border *bd);
|
static void _e_border_pointer_resize_end(E_Border *bd);
|
||||||
static void _e_border_pointer_move_begin(E_Border *bd);
|
static void _e_border_pointer_move_begin(E_Border *bd);
|
||||||
static void _e_border_pointer_move_end(E_Border *bd);
|
static void _e_border_pointer_move_end(E_Border *bd);
|
||||||
|
|
||||||
|
static void _e_border_hook_call(E_Border_Hook_Point hookpoint, E_Border *bd);
|
||||||
|
|
||||||
/* local subsystem globals */
|
/* local subsystem globals */
|
||||||
static Evas_List *handlers = NULL;
|
static Evas_List *handlers = NULL;
|
||||||
static Evas_List *borders = NULL;
|
static Evas_List *borders = NULL;
|
||||||
|
@ -1704,7 +1706,7 @@ e_border_maximize(E_Border *bd, E_Maximize max)
|
||||||
|
|
||||||
{
|
{
|
||||||
int x1, y1, x2, y2;
|
int x1, y1, x2, y2;
|
||||||
int w, h;
|
int w, h, pw, ph;
|
||||||
|
|
||||||
bd->pre_res_change.valid = 0;
|
bd->pre_res_change.valid = 0;
|
||||||
if (!(bd->maximized & E_MAXIMIZE_HORIZONTAL))
|
if (!(bd->maximized & E_MAXIMIZE_HORIZONTAL))
|
||||||
|
@ -1753,8 +1755,8 @@ e_border_maximize(E_Border *bd, E_Maximize max)
|
||||||
}
|
}
|
||||||
w = bd->zone->w;
|
w = bd->zone->w;
|
||||||
h = bd->zone->h;
|
h = bd->zone->h;
|
||||||
|
e_border_resize_limit(bd, &w, &h);
|
||||||
/* center x-direction */
|
/* center x-direction */
|
||||||
// e_border_resize_limit(bd, &w, &h);
|
|
||||||
x1 = bd->zone->x + (bd->zone->w - w) / 2;
|
x1 = bd->zone->x + (bd->zone->w - w) / 2;
|
||||||
/* center y-direction */
|
/* center y-direction */
|
||||||
y1 = bd->zone->y + (bd->zone->h - h) / 2;
|
y1 = bd->zone->y + (bd->zone->h - h) / 2;
|
||||||
|
@ -1782,7 +1784,13 @@ e_border_maximize(E_Border *bd, E_Maximize max)
|
||||||
|
|
||||||
w = x2 - x1;
|
w = x2 - x1;
|
||||||
h = y2 - y1;
|
h = y2 - y1;
|
||||||
|
pw = w;
|
||||||
|
ph = h;
|
||||||
e_border_resize_limit(bd, &w, &h);
|
e_border_resize_limit(bd, &w, &h);
|
||||||
|
/* center x-direction */
|
||||||
|
x1 = x1 + (pw - w) / 2;
|
||||||
|
/* center y-direction */
|
||||||
|
y1 = y1 + (ph - h) / 2;
|
||||||
if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)
|
if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)
|
||||||
e_border_move_resize(bd, x1, y1, w, h);
|
e_border_move_resize(bd, x1, y1, w, h);
|
||||||
else if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL)
|
else if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL)
|
||||||
|
@ -1805,7 +1813,13 @@ e_border_maximize(E_Border *bd, E_Maximize max)
|
||||||
|
|
||||||
w = x2 - x1;
|
w = x2 - x1;
|
||||||
h = y2 - y1;
|
h = y2 - y1;
|
||||||
|
pw = w;
|
||||||
|
ph = h;
|
||||||
e_border_resize_limit(bd, &w, &h);
|
e_border_resize_limit(bd, &w, &h);
|
||||||
|
/* center x-direction */
|
||||||
|
x1 = x1 + (pw - w) / 2;
|
||||||
|
/* center y-direction */
|
||||||
|
y1 = y1 + (ph - h) / 2;
|
||||||
if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)
|
if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)
|
||||||
e_border_move_resize(bd, x1, y1, w, h);
|
e_border_move_resize(bd, x1, y1, w, h);
|
||||||
else if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL)
|
else if ((max & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL)
|
||||||
|
@ -5631,6 +5645,8 @@ _e_border_eval(E_Border *bd)
|
||||||
bd->user_skip_winlist = rem->prop.skip_winlist;
|
bd->user_skip_winlist = rem->prop.skip_winlist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_e_border_hook_call(E_BORDER_HOOK_EVAL_POST_FETCH, bd);
|
||||||
|
|
||||||
if ((bd->client.border.changed) && (!bd->shaded) &&
|
if ((bd->client.border.changed) && (!bd->shaded) &&
|
||||||
(!(((bd->maximized & E_MAXIMIZE_TYPE) == E_MAXIMIZE_FULLSCREEN))))
|
(!(((bd->maximized & E_MAXIMIZE_TYPE) == E_MAXIMIZE_FULLSCREEN))))
|
||||||
|
@ -7345,3 +7361,73 @@ _e_border_pointer_move_end(E_Border *bd)
|
||||||
{
|
{
|
||||||
e_pointer_type_pop(bd->pointer, bd, "move");
|
e_pointer_type_pop(bd->pointer, bd, "move");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Evas_List *_e_border_hooks = NULL;
|
||||||
|
static int _e_border_hooks_delete = 0;
|
||||||
|
static int _e_border_hooks_walking = 0;
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_border_hooks_clean(void)
|
||||||
|
{
|
||||||
|
Evas_List *l, *pl;
|
||||||
|
|
||||||
|
for (l = _e_border_hooks; l;)
|
||||||
|
{
|
||||||
|
E_Border_Hook *bh;
|
||||||
|
|
||||||
|
bh = l->data;
|
||||||
|
pl = l;
|
||||||
|
l = l->next;
|
||||||
|
if (bh->delete_me)
|
||||||
|
{
|
||||||
|
_e_border_hooks = evas_list_remove_list(_e_border_hooks, pl);
|
||||||
|
free(bh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_border_hook_call(E_Border_Hook_Point hookpoint, E_Border *bd)
|
||||||
|
{
|
||||||
|
Evas_List *l;
|
||||||
|
|
||||||
|
_e_border_hooks_walking++;
|
||||||
|
for (l = _e_border_hooks; l; l = l->next)
|
||||||
|
{
|
||||||
|
E_Border_Hook *bh;
|
||||||
|
|
||||||
|
bh = l->data;
|
||||||
|
if (bh->delete_me) continue;
|
||||||
|
if (bh->hookpoint == hookpoint) bh->func(bh->data, bd);
|
||||||
|
}
|
||||||
|
_e_border_hooks_walking--;
|
||||||
|
if ((_e_border_hooks_walking == 0) && (_e_border_hooks_delete > 0))
|
||||||
|
_e_border_hooks_clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI E_Border_Hook *
|
||||||
|
e_border_hook_add(E_Border_Hook_Point hookpoint, void (*func) (void *data, E_Border *bd), void *data)
|
||||||
|
{
|
||||||
|
E_Border_Hook *bh;
|
||||||
|
|
||||||
|
bh = E_NEW(E_Border_Hook, 1);
|
||||||
|
if (!bh) return NULL;
|
||||||
|
bh->hookpoint = hookpoint;
|
||||||
|
bh->func = func;
|
||||||
|
bh->data = data;
|
||||||
|
_e_border_hooks = evas_list_append(_e_border_hooks, bh);
|
||||||
|
return bh;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
e_border_hook_del(E_Border_Hook *bh)
|
||||||
|
{
|
||||||
|
bh->delete_me = 1;
|
||||||
|
if (_e_border_hooks_walking == 0)
|
||||||
|
{
|
||||||
|
_e_border_hooks = evas_list_remove(_e_border_hooks, bh);
|
||||||
|
free(bh);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_e_border_hooks_delete++;
|
||||||
|
}
|
||||||
|
|
|
@ -71,8 +71,14 @@ typedef enum _E_Window_Placement
|
||||||
E_WINDOW_PLACEMENT_MANUAL
|
E_WINDOW_PLACEMENT_MANUAL
|
||||||
} E_Window_Placement;
|
} E_Window_Placement;
|
||||||
|
|
||||||
|
typedef enum _E_Border_Hook_Point
|
||||||
|
{
|
||||||
|
E_BORDER_HOOK_EVAL_POST_FETCH
|
||||||
|
} E_Border_Hook_Point;
|
||||||
|
|
||||||
typedef struct _E_Border E_Border;
|
typedef struct _E_Border E_Border;
|
||||||
typedef struct _E_Border_Pending_Move_Resize E_Border_Pending_Move_Resize;
|
typedef struct _E_Border_Pending_Move_Resize E_Border_Pending_Move_Resize;
|
||||||
|
typedef struct _E_Border_Hook E_Border_Hook;
|
||||||
typedef struct _E_Event_Border_Resize E_Event_Border_Resize;
|
typedef struct _E_Event_Border_Resize E_Event_Border_Resize;
|
||||||
typedef struct _E_Event_Border_Move E_Event_Border_Move;
|
typedef struct _E_Event_Border_Move E_Event_Border_Move;
|
||||||
typedef struct _E_Event_Border_Add E_Event_Border_Add;
|
typedef struct _E_Event_Border_Add E_Event_Border_Add;
|
||||||
|
@ -472,6 +478,14 @@ struct _E_Border_Pending_Move_Resize
|
||||||
unsigned char resize : 1;
|
unsigned char resize : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _E_Border_Hook
|
||||||
|
{
|
||||||
|
E_Border_Hook_Point hookpoint;
|
||||||
|
void (*func) (void *data, E_Border *bd);
|
||||||
|
void *data;
|
||||||
|
unsigned char delete_me : 1;
|
||||||
|
};
|
||||||
|
|
||||||
struct _E_Event_Border_Resize
|
struct _E_Event_Border_Resize
|
||||||
{
|
{
|
||||||
E_Border *border;
|
E_Border *border;
|
||||||
|
@ -644,6 +658,9 @@ EAPI void e_border_signal_resize_begin(E_Border *bd, const char *dir, const char
|
||||||
EAPI void e_border_signal_resize_end(E_Border *bd, const char *dir, const char *sig, const char *src);
|
EAPI void e_border_signal_resize_end(E_Border *bd, const char *dir, const char *sig, const char *src);
|
||||||
EAPI void e_border_resize_limit(E_Border *bd, int *w, int *h);
|
EAPI void e_border_resize_limit(E_Border *bd, int *w, int *h);
|
||||||
|
|
||||||
|
EAPI E_Border_Hook *e_border_hook_add(E_Border_Hook_Point hookpoint, void (*func) (void *data, E_Border *bd), void *data);
|
||||||
|
EAPI void e_border_hook_del(E_Border_Hook *bh);
|
||||||
|
|
||||||
extern EAPI int E_EVENT_BORDER_RESIZE;
|
extern EAPI int E_EVENT_BORDER_RESIZE;
|
||||||
extern EAPI int E_EVENT_BORDER_MOVE;
|
extern EAPI int E_EVENT_BORDER_MOVE;
|
||||||
extern EAPI int E_EVENT_BORDER_ADD;
|
extern EAPI int E_EVENT_BORDER_ADD;
|
||||||
|
|
|
@ -8,4 +8,5 @@ battery \
|
||||||
temperature \
|
temperature \
|
||||||
cpufreq \
|
cpufreq \
|
||||||
ibox \
|
ibox \
|
||||||
start
|
start \
|
||||||
|
layout
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
MODULE = layout
|
||||||
|
|
||||||
|
# data files for the module
|
||||||
|
filesdir = $(libdir)/enlightenment/modules/$(MODULE)
|
||||||
|
files_DATA = \
|
||||||
|
e-module-$(MODULE).edj module.desktop
|
||||||
|
|
||||||
|
EXTRA_DIST = $(files_DATA)
|
||||||
|
|
||||||
|
# the module .so file
|
||||||
|
INCLUDES = -I. \
|
||||||
|
-I$(top_srcdir) \
|
||||||
|
-I$(top_srcdir)/src/modules/$(MODULE) \
|
||||||
|
-I$(top_srcdir)/src/bin \
|
||||||
|
-I$(top_srcdir)/src/lib \
|
||||||
|
-I$(top_srcdir)/src/modules \
|
||||||
|
@e_cflags@
|
||||||
|
pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH)
|
||||||
|
pkg_LTLIBRARIES = module.la
|
||||||
|
module_la_SOURCES = e_mod_main.c \
|
||||||
|
e_mod_main.h
|
||||||
|
module_la_LIBADD = @e_libs@ @dlopen_libs@
|
||||||
|
module_la_LDFLAGS = -module -avoid-version
|
||||||
|
module_la_DEPENDENCIES = $(top_builddir)/config.h
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE)
|
Binary file not shown.
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
||||||
|
*/
|
||||||
|
#include "e.h"
|
||||||
|
#include "e_mod_main.h"
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
/**/
|
||||||
|
/* actual module specifics */
|
||||||
|
|
||||||
|
static E_Module *layout_module = NULL;
|
||||||
|
static E_Border_Hook *hook = NULL;
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_module_layout_cb_hook(void *data, E_Border *bd)
|
||||||
|
{
|
||||||
|
/* FIXME: make some modification based on policy */
|
||||||
|
printf("Window:\n"
|
||||||
|
" Title: [%s][%s]\n"
|
||||||
|
" Class: %s::%s\n"
|
||||||
|
" Geometry: %ix%i+%i+%i\n"
|
||||||
|
" New: %i\n"
|
||||||
|
, bd->client.icccm.title, bd->client.netwm.name
|
||||||
|
, bd->client.icccm.name, bd->client.icccm.class
|
||||||
|
, bd->x, bd->y, bd->w, bd->h
|
||||||
|
, bd->new_client
|
||||||
|
);
|
||||||
|
if ((bd->client.icccm.transient_for != 0) ||
|
||||||
|
(bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DIALOG))
|
||||||
|
{
|
||||||
|
bd->client.e.state.centered = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
e_border_unmaximize(bd, E_MAXIMIZE_BOTH);
|
||||||
|
e_border_move(bd,
|
||||||
|
bd->zone->x + (bd->zone->w / 2),
|
||||||
|
bd->zone->y + (bd->zone->h / 2));
|
||||||
|
e_border_resize(bd, 1, 1);
|
||||||
|
if (bd->bordername) evas_stringshare_del(bd->bordername);
|
||||||
|
bd->bordername = evas_stringshare_add("borderless");
|
||||||
|
bd->client.icccm.base_w = 1;
|
||||||
|
bd->client.icccm.base_h = 1;
|
||||||
|
bd->client.icccm.min_w = 1;
|
||||||
|
bd->client.icccm.min_h = 1;
|
||||||
|
bd->client.icccm.max_w = 32767;
|
||||||
|
bd->client.icccm.max_h = 32767;
|
||||||
|
bd->client.icccm.min_aspect = 0.0;
|
||||||
|
bd->client.icccm.max_aspect = 0.0;
|
||||||
|
}
|
||||||
|
e_border_maximize(bd, E_MAXIMIZE_FILL | E_MAXIMIZE_BOTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**/
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
/**/
|
||||||
|
|
||||||
|
/**/
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
/**/
|
||||||
|
/* module setup */
|
||||||
|
EAPI E_Module_Api e_modapi =
|
||||||
|
{
|
||||||
|
E_MODULE_API_VERSION,
|
||||||
|
"Layout"
|
||||||
|
};
|
||||||
|
|
||||||
|
EAPI void *
|
||||||
|
e_modapi_init(E_Module *m)
|
||||||
|
{
|
||||||
|
layout_module = m;
|
||||||
|
|
||||||
|
hook = e_border_hook_add(E_BORDER_HOOK_EVAL_POST_FETCH,
|
||||||
|
_e_module_layout_cb_hook, NULL);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI int
|
||||||
|
e_modapi_shutdown(E_Module *m)
|
||||||
|
{
|
||||||
|
if (hook)
|
||||||
|
{
|
||||||
|
e_border_hook_del(hook);
|
||||||
|
hook = NULL;
|
||||||
|
}
|
||||||
|
layout_module = NULL;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI int
|
||||||
|
e_modapi_save(E_Module *m)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI int
|
||||||
|
e_modapi_about(E_Module *m)
|
||||||
|
{
|
||||||
|
e_module_dialog_show(m, _("Enlightenment Layout Module"),
|
||||||
|
_("Can restrict or implement specific window layout policies for specialised situations."));
|
||||||
|
return 1;
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
||||||
|
*/
|
||||||
|
#ifndef E_MOD_MAIN_H
|
||||||
|
#define E_MOD_MAIN_H
|
||||||
|
|
||||||
|
EAPI extern E_Module_Api e_modapi;
|
||||||
|
|
||||||
|
EAPI void *e_modapi_init (E_Module *m);
|
||||||
|
EAPI int e_modapi_shutdown (E_Module *m);
|
||||||
|
EAPI int e_modapi_save (E_Module *m);
|
||||||
|
EAPI int e_modapi_about (E_Module *m);
|
||||||
|
EAPI int e_modapi_config (E_Module *m);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,4 @@
|
||||||
|
[Desktop Entry]
|
||||||
|
Type=Link
|
||||||
|
Name=Layout
|
||||||
|
Icon=e-module-layout
|
Loading…
Reference in New Issue