Sorry, they don't quite work right yet. I'll fix the bug tomorrow. :) SVN revision: 12698devs/princeamd/enlightenment-0.17-elive
parent
605b862187
commit
112ca3b2d2
16 changed files with 363 additions and 144 deletions
@ -1 +1,168 @@ |
||||
/*
|
||||
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 |
||||
*/ |
||||
#include "e.h" |
||||
|
||||
/* E_Desk is a child object of E_Zone. A desk is essentially a background
|
||||
* and an associated set of client windows. Each zone can have an arbitrary |
||||
* number of desktops. |
||||
*/ |
||||
|
||||
static void _e_desk_free(E_Desk *desk); |
||||
|
||||
E_Desk * |
||||
e_desk_new(E_Zone *zone) |
||||
{ |
||||
E_Desk *desk; |
||||
char name[40]; |
||||
|
||||
desk = E_OBJECT_ALLOC(E_Desk, _e_desk_free); |
||||
memset(desk, 0, sizeof(E_Desk)); |
||||
if (!desk) return NULL; |
||||
|
||||
desk->zone = zone; |
||||
desk->num = evas_list_count(zone->desks) + 1; |
||||
snprintf(name, sizeof(name), "Desktop %d", desk->num); |
||||
desk->name = strdup(name); |
||||
e_object_ref(E_OBJECT(zone)); |
||||
zone->desks = evas_list_append(zone->desks, desk); |
||||
|
||||
return desk; |
||||
} |
||||
|
||||
void |
||||
e_desk_name_set(E_Desk *desk, const char *name) |
||||
{ |
||||
E_OBJECT_CHECK(desk); |
||||
if (desk->name) |
||||
free(desk->name); |
||||
desk->name = strdup(name); |
||||
} |
||||
|
||||
void |
||||
e_desk_show(E_Desk *desk) |
||||
{ |
||||
Evas_List *l; |
||||
|
||||
E_OBJECT_CHECK(desk); |
||||
|
||||
for (l = desk->zone->clients; l; l = l->next) |
||||
{ |
||||
E_Border *bd = l->data; |
||||
|
||||
if (evas_list_find(desk->clients, bd)) |
||||
e_border_show(bd); |
||||
else |
||||
e_border_hide(bd); |
||||
} |
||||
|
||||
for (l = desk->zone->desks; l; l = l->next) |
||||
{ |
||||
E_Desk *d = l->data; |
||||
d->visible = 0; |
||||
} |
||||
desk->visible = 1; |
||||
} |
||||
|
||||
void |
||||
e_desk_remove(E_Desk *desk) |
||||
{ |
||||
Evas_List *l; |
||||
E_Desk *previous; |
||||
|
||||
E_OBJECT_CHECK(desk); |
||||
if (evas_list_count(desk->zone->desks) < 2) |
||||
return; |
||||
l = evas_list_find(desk->zone->desks, desk); |
||||
l = l->prev; |
||||
if (!l) l = evas_list_last(desk->zone->desks); |
||||
previous = l->data; |
||||
|
||||
for (l = desk->clients; l; l = l->next) |
||||
{ |
||||
E_Border *bd = l->data; |
||||
bd->desk = previous; |
||||
} |
||||
desk->zone->desks = evas_list_remove(desk->zone->desks, desk); |
||||
e_desk_show(previous); |
||||
|
||||
evas_list_free(desk->clients); |
||||
e_object_del(E_OBJECT(desk)); |
||||
} |
||||
|
||||
E_Desk * |
||||
e_desk_current_get(E_Zone *zone) |
||||
{ |
||||
Evas_List *l; |
||||
|
||||
E_OBJECT_CHECK(man); |
||||
|
||||
for (l = zone->desks; l; l = l->next) |
||||
{ |
||||
E_Desk *desk = l->data; |
||||
if (desk->visible) |
||||
return desk; |
||||
} |
||||
|
||||
return NULL;
|
||||
} |
||||
|
||||
void |
||||
e_desk_next(E_Zone *zone) |
||||
{ |
||||
Evas_List *l; |
||||
E_Desk *desk; |
||||
|
||||
E_OBJECT_CHECK(zone); |
||||
|
||||
if (evas_list_count(zone->desks) < 2) |
||||
return; |
||||
|
||||
/* Locate the position of the current desktop in the list */ |
||||
desk = e_desk_current_get(zone); |
||||
l = evas_list_find_list(zone->desks, desk); |
||||
if (!l) return; /* Couldn't help putting this here */ |
||||
|
||||
l = l->next; |
||||
if (!l) l = zone->desks; /* Wraparound */ |
||||
|
||||
/* Show the desktop */ |
||||
desk = l->data; |
||||
e_desk_show(desk); |
||||
} |
||||
|
||||
void |
||||
e_desk_prev(E_Zone *zone) |
||||
{ |
||||
Evas_List *l; |
||||
E_Desk *desk; |
||||
|
||||
E_OBJECT_CHECK(zone); |
||||
|
||||
if (evas_list_count(zone->desks) < 2) |
||||
return; |
||||
|
||||
/* Locate the position of the current desktop in the list */ |
||||
desk = e_desk_current_get(zone); |
||||
l = evas_list_find_list(zone->desks, desk); |
||||
if (!l) return; /* Couldn't help putting this here */ |
||||
|
||||
l = l->prev; |
||||
if (!l) l = evas_list_last(zone->desks); /* Wraparound */ |
||||
|
||||
/* Show the desktop */ |
||||
desk = l->data; |
||||
e_desk_show(desk); |
||||
} |
||||
|
||||
static void |
||||
_e_desk_free(E_Desk *desk) |
||||
{ |
||||
E_Zone *zone = desk->zone; |
||||
if (desk->name) |
||||
free(desk->name); |
||||
zone->desks = evas_list_remove(zone->desks, desk); |
||||
e_object_unref(E_OBJECT(desk->zone)); |
||||
free(desk); |
||||
} |
||||
|
||||
|
@ -1,4 +1,28 @@ |
||||
#ifndef E_DESK_H |
||||
#define E_DESK_H |
||||
|
||||
typedef struct _E_Desk E_Desk; |
||||
|
||||
struct _E_Desk |
||||
{ |
||||
E_Object e_obj_inherit; |
||||
|
||||
E_Zone *zone; |
||||
char *name; |
||||
int num; |
||||
char visible : 1; |
||||
|
||||
Evas_Object *bg_object; |
||||
|
||||
Evas_List *clients; |
||||
}; |
||||
|
||||
EAPI E_Desk *e_desk_new(E_Zone *zone); |
||||
EAPI void e_desk_name_set(E_Desk *desk, const char *name); |
||||
EAPI void e_desk_show(E_Desk *desk); |
||||
EAPI E_Desk *e_desk_current_get(E_Zone *zone); |
||||
EAPI void e_desk_next(E_Zone *zone); |
||||
EAPI void e_desk_prev(E_Zone *zone); |
||||
|
||||
#endif |
||||
|
||||
|
Loading…
Reference in new issue