Handle window state change requests.

SVN revision: 14547
This commit is contained in:
sebastid 2005-05-02 09:19:55 +00:00 committed by sebastid
parent 5118e70689
commit 2eaa1ce1c7
5 changed files with 393 additions and 88 deletions

View File

@ -577,6 +577,7 @@ e_border_raise(E_Border *bd)
E_OBJECT_CHECK(bd);
E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
_e_border_reorder_after(bd, NULL);
printf("raise layer: %d\n", bd->layer);
e_container_window_raise(bd->zone->container, bd->win, bd->layer);
{
E_Event_Border_Raise *ev;
@ -960,9 +961,7 @@ e_border_fullscreen(E_Border *bd)
e_hints_window_fullscreen_set(bd, 1);
bd->layer = 200;
e_border_raise(bd);
e_container_window_raise(bd->zone->container, bd->win, 200);
e_border_move_resize(bd,
bd->zone->x - bd->client_inset.l,
bd->zone->y - bd->client_inset.t,
@ -990,7 +989,6 @@ e_border_unfullscreen(E_Border *bd)
e_border_move_resize(bd, bd->saved.x, bd->saved.y, bd->saved.w, bd->saved.h);
bd->layer = 100;
bd->fullscreen = 0;
bd->changes.pos = 1;
bd->changes.size = 1;
@ -1460,8 +1458,8 @@ _e_border_cb_window_configure_request(void *data, int ev_type, void *ev)
bd = e_border_find_by_client_window(e->win);
if (!bd)
{
printf("generic config request %x %i %i %ix%i ...\n",
e->win, e->x, e->y, e->w, e->h);
printf("generic config request 0x%x 0x%lx %i %i %ix%i %i 0x%x 0x%x...\n",
e->win, e->value_mask, e->x, e->y, e->w, e->h, e->border, e->abovewin, e->detail);
ecore_x_window_configure(e->win, e->value_mask,
e->x, e->y, e->w, e->h, e->border,
e->abovewin, e->detail);
@ -1567,22 +1565,27 @@ _e_border_cb_window_configure_request(void *data, int ev_type, void *ev)
{
if (e->detail == ECORE_X_WINDOW_STACK_ABOVE)
{
printf("config raise\n");
e_border_raise(bd);
}
else if (e->detail == ECORE_X_WINDOW_STACK_BELOW)
{
printf("config lower\n");
e_border_lower(bd);
}
else if (e->detail == ECORE_X_WINDOW_STACK_TOP_IF)
{
printf("config topif\n");
/* FIXME: do */
}
else if (e->detail == ECORE_X_WINDOW_STACK_BOTTOM_IF)
{
printf("config bottomif\n");
/* FIXME: do */
}
else if (e->detail == ECORE_X_WINDOW_STACK_OPPOSITE)
{
printf("config opposite\n");
/* FIXME: do */
}
}
@ -1880,83 +1883,7 @@ _e_border_cb_window_state(void *data, int ev_type, void *ev)
if (!bd) return 1;
printf("State: 0x%x %d %d\n", bd->client.win, e->state[0], e->state[1]);
for (i = 0; i < 2; i++)
{
int set;
if (e->state[i] != ECORE_X_WINDOW_STATE_UNKNOWN)
{
switch (e->action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
ecore_x_netwm_window_state_set(bd->client.win, e->state[i], 0);
set = 0;
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
ecore_x_netwm_window_state_set(bd->client.win, e->state[i], 1);
set = 1;
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
if (ecore_x_netwm_window_state_isset(bd->client.win, e->state[i]))
{
ecore_x_netwm_window_state_set(bd->client.win, e->state[i], 0);
set = 0;
}
else
{
ecore_x_netwm_window_state_set(bd->client.win, e->state[i], 1);
set = 1;
}
break;
}
if (e->state[i] == ECORE_X_WINDOW_STATE_ABOVE)
{
if (set)
{
bd->layer = 150;
bd->client.netwm.state.stacking = 1;
}
else
{
bd->layer = 100;
bd->client.netwm.state.stacking = 0;
}
e_border_raise(bd);
}
else if (e->state[i] == ECORE_X_WINDOW_STATE_BELOW)
{
if (set)
{
bd->layer = 50;
bd->client.netwm.state.stacking = 2;
}
else
{
bd->layer = 100;
bd->client.netwm.state.stacking = 0;
}
e_border_raise(bd);
}
else if (e->state[i] == ECORE_X_WINDOW_STATE_FULLSCREEN)
{
if (set)
{
bd->layer = 200;
bd->client.netwm.state.fullscreen = 1;
e_border_fullscreen(bd);
}
else
{
bd->layer = 100;
bd->client.netwm.state.fullscreen = 0;
e_border_unfullscreen(bd);
}
e_border_raise(bd);
}
}
}
e_hints_window_state_update(bd, e->state[i], e->action);
return 1;
}

View File

@ -334,6 +334,8 @@ EAPI void e_border_shade(E_Border *bd, E_Direction dir);
EAPI void e_border_unshade(E_Border *bd, E_Direction dir);
EAPI void e_border_maximize(E_Border *bd);
EAPI void e_border_unmaximize(E_Border *bd);
EAPI void e_border_fullscreen(E_Border *bd);
EAPI void e_border_unfullscreen(E_Border *bd);
EAPI void e_border_iconify(E_Border *bd);
EAPI void e_border_uniconify(E_Border *bd);
EAPI void e_border_stick(E_Border *bd);

View File

@ -262,8 +262,6 @@ e_hints_window_init(E_Border *bd)
bd->layer = 150;
else if (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_DOCK)
bd->layer = 150;
else if (bd->client.netwm.state.fullscreen)
bd->layer = 200;
else
bd->layer = 100;
e_container_window_raise(bd->zone->container, bd->win, bd->layer);
@ -274,6 +272,8 @@ e_hints_window_init(E_Border *bd)
e_border_shade(bd, e_hints_window_shade_direction_get(bd));
if (bd->client.netwm.state.maximized_v && bd->client.netwm.state.maximized_h)
e_border_maximize(bd);
if (bd->client.netwm.state.fullscreen)
e_border_fullscreen(bd);
if (bd->client.icccm.state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
e_border_iconify(bd);
/* If a window isn't iconic, and is one the current desk,
@ -329,6 +329,382 @@ void e_hints_window_type_get(E_Border *bd)
bd->client.netwm.type = ecore_x_netwm_window_type_get(bd->client.win);
}
void
e_hints_window_state_update(E_Border *bd, Ecore_X_Window_State state,
Ecore_X_Window_State_Action action)
{
int changed;
switch (state)
{
case ECORE_X_WINDOW_STATE_ICONIFIED:
if (action != ECORE_X_WINDOW_STATE_ACTION_ADD) return;
if (bd->client.icccm.state == ECORE_X_WINDOW_STATE_HINT_ICONIC) return;
e_border_iconify(bd);
break;
case ECORE_X_WINDOW_STATE_MODAL:
changed = 0;
switch (action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
if (bd->client.netwm.state.modal)
{
bd->client.netwm.state.modal = 0;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
if (!bd->client.netwm.state.modal)
{
bd->client.netwm.state.modal = 1;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
bd->client.netwm.state.modal = !bd->client.netwm.state.modal;
changed = 1;
break;
}
if (changed)
{
ecore_x_netwm_window_state_set(bd->client.win,
ECORE_X_WINDOW_STATE_MODAL,
bd->client.netwm.state.modal);
}
break;
case ECORE_X_WINDOW_STATE_STICKY:
changed = 0;
switch (action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
if (bd->client.netwm.state.sticky)
{
bd->client.netwm.state.sticky = 0;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
if (!bd->client.netwm.state.sticky)
{
bd->client.netwm.state.sticky = 1;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
bd->client.netwm.state.sticky = !bd->client.netwm.state.sticky;
changed = 1;
break;
}
if (changed)
{
ecore_x_netwm_window_state_set(bd->client.win,
ECORE_X_WINDOW_STATE_STICKY,
bd->client.netwm.state.sticky);
if (bd->client.netwm.state.sticky)
e_border_stick(bd);
else
e_border_unstick(bd);
}
break;
case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
changed = 0;
switch (action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
if (bd->client.netwm.state.maximized_v)
{
bd->client.netwm.state.maximized_v = 0;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
if (!bd->client.netwm.state.maximized_v)
{
bd->client.netwm.state.maximized_v = 1;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
bd->client.netwm.state.maximized_v = !bd->client.netwm.state.maximized_v;
changed = 1;
break;
}
if (changed)
{
ecore_x_netwm_window_state_set(bd->client.win,
ECORE_X_WINDOW_STATE_MAXIMIZED_VERT,
bd->client.netwm.state.maximized_v);
if ((bd->client.netwm.state.maximized_v)
&& (bd->client.netwm.state.maximized_h))
e_border_maximize(bd);
else if ((!bd->client.netwm.state.maximized_v)
&& (!bd->client.netwm.state.maximized_h))
e_border_unmaximize(bd);
}
break;
case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
changed = 0;
switch (action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
if (bd->client.netwm.state.maximized_h)
{
bd->client.netwm.state.maximized_h = 0;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
if (!bd->client.netwm.state.maximized_h)
{
bd->client.netwm.state.maximized_h = 1;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
bd->client.netwm.state.maximized_h = !bd->client.netwm.state.maximized_h;
changed = 1;
break;
}
if (changed)
{
ecore_x_netwm_window_state_set(bd->client.win,
ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ,
bd->client.netwm.state.maximized_h);
if ((bd->client.netwm.state.maximized_v)
&& (bd->client.netwm.state.maximized_h))
e_border_maximize(bd);
else if ((!bd->client.netwm.state.maximized_v)
&& (!bd->client.netwm.state.maximized_h))
e_border_unmaximize(bd);
}
break;
case ECORE_X_WINDOW_STATE_SHADED:
changed = 0;
switch (action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
if (bd->client.netwm.state.shaded)
{
bd->client.netwm.state.shaded = 0;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
if (!bd->client.netwm.state.shaded)
{
bd->client.netwm.state.shaded = 1;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
bd->client.netwm.state.shaded = !bd->client.netwm.state.shaded;
changed = 1;
break;
}
if (changed)
{
ecore_x_netwm_window_state_set(bd->client.win,
ECORE_X_WINDOW_STATE_SHADED,
bd->client.netwm.state.shaded);
if (bd->client.netwm.state.shaded)
e_border_shade(bd, e_hints_window_shade_direction_get(bd));
else
e_border_unshade(bd, e_hints_window_shade_direction_get(bd));
}
break;
case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
changed = 0;
switch (action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
if (bd->client.netwm.state.skip_taskbar)
{
bd->client.netwm.state.skip_taskbar = 0;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
if (!bd->client.netwm.state.skip_taskbar)
{
bd->client.netwm.state.skip_taskbar = 1;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
bd->client.netwm.state.skip_taskbar = !bd->client.netwm.state.skip_taskbar;
changed = 1;
break;
}
if (changed)
{
ecore_x_netwm_window_state_set(bd->client.win,
ECORE_X_WINDOW_STATE_SKIP_TASKBAR,
bd->client.netwm.state.skip_taskbar);
}
break;
case ECORE_X_WINDOW_STATE_SKIP_PAGER:
changed = 0;
switch (action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
if (bd->client.netwm.state.skip_pager)
{
bd->client.netwm.state.skip_pager = 0;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
if (!bd->client.netwm.state.skip_pager)
{
bd->client.netwm.state.skip_pager = 1;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
bd->client.netwm.state.skip_pager = !bd->client.netwm.state.skip_pager;
changed = 1;
break;
}
if (changed)
{
/* FIXME, we have a pager, care about this! */
ecore_x_netwm_window_state_set(bd->client.win,
ECORE_X_WINDOW_STATE_SKIP_PAGER,
bd->client.netwm.state.skip_pager);
}
break;
case ECORE_X_WINDOW_STATE_HIDDEN:
/* Ignore */
break;
case ECORE_X_WINDOW_STATE_FULLSCREEN:
changed = 0;
switch (action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
if (bd->client.netwm.state.fullscreen)
{
bd->client.netwm.state.fullscreen = 0;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
if (!bd->client.netwm.state.fullscreen)
{
bd->client.netwm.state.fullscreen = 1;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
bd->client.netwm.state.fullscreen = !bd->client.netwm.state.fullscreen;
changed = 1;
break;
}
if (changed)
{
ecore_x_netwm_window_state_set(bd->client.win,
ECORE_X_WINDOW_STATE_FULLSCREEN,
bd->client.netwm.state.fullscreen);
if (bd->client.netwm.state.fullscreen)
e_border_fullscreen(bd);
else
e_border_unfullscreen(bd);
}
break;
case ECORE_X_WINDOW_STATE_ABOVE:
changed = 0;
switch (action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
if (bd->client.netwm.state.stacking == 1)
{
bd->client.netwm.state.stacking = 0;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
if (bd->client.netwm.state.stacking == 0)
{
bd->client.netwm.state.stacking = 1;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
if (bd->client.netwm.state.stacking == 1)
{
bd->client.netwm.state.stacking = 0;
changed = 1;
}
else if (bd->client.netwm.state.stacking == 0)
{
bd->client.netwm.state.stacking = 1;
changed = 1;
}
break;
}
if (changed)
{
ecore_x_netwm_window_state_set(bd->client.win,
ECORE_X_WINDOW_STATE_ABOVE,
bd->client.netwm.state.stacking);
if (bd->client.netwm.state.stacking)
bd->layer = 150;
else
bd->layer = 100;
e_border_raise(bd);
}
break;
case ECORE_X_WINDOW_STATE_BELOW:
changed = 0;
switch (action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
if (bd->client.netwm.state.stacking == 2)
{
bd->client.netwm.state.stacking = 0;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
if (bd->client.netwm.state.stacking == 0)
{
bd->client.netwm.state.stacking = 2;
changed = 1;
}
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
if (bd->client.netwm.state.stacking == 2)
{
bd->client.netwm.state.stacking = 0;
changed = 1;
}
else if (bd->client.netwm.state.stacking == 0)
{
bd->client.netwm.state.stacking = 2;
changed = 1;
}
break;
}
if (changed)
{
ecore_x_netwm_window_state_set(bd->client.win,
ECORE_X_WINDOW_STATE_BELOW,
bd->client.netwm.state.stacking);
if (bd->client.netwm.state.stacking)
bd->layer = 50;
else
bd->layer = 100;
e_border_raise(bd);
}
break;
case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
/* FIXME */
break;
case ECORE_X_WINDOW_STATE_UNKNOWN:
/* Ignore */
break;
}
}
void
e_hints_window_state_get(E_Border *bd)
{

View File

@ -23,6 +23,9 @@ EAPI void e_hints_window_state_get(E_Border *bd);
EAPI void e_hints_window_type_set(E_Border *bd);
EAPI void e_hints_window_type_get(E_Border *bd);
EAPI void e_hints_window_state_update(E_Border *bd, Ecore_X_Window_State state,
Ecore_X_Window_State_Action action);
EAPI void e_hints_window_visible_set(E_Border *bd);
EAPI void e_hints_window_iconic_set(E_Border *bd);
EAPI void e_hints_window_hidden_set(E_Border *bd);

View File

@ -3,8 +3,6 @@
*/
#include "e.h"
extern E_Config *e_config;
typedef struct _Main_Data Main_Data;
struct _Main_Data
@ -607,7 +605,6 @@ _e_int_menus_themes_pre_cb(void *data, E_Menu *m)
for (l = e_config->themes; l; l = l->next)
{
E_Config_Theme *et;
char buf[256];
et = l->data;
if (!strcmp(et->category, "theme"))