-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdesktop.c
executable file
·104 lines (95 loc) · 2.74 KB
/
desktop.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "desktop.h"
desktop *cria_desktop(void) {
desktop *desk = malloc(sizeof(desktop));
if (!desk)
falha_aloc();
desk->lista_caixas = cria_lista();
desk->desenha = &desenha_desktop;
desk->monitora = &monitora_desktop;
desk->atualiza = &atualiza_desktop;
return desk;
}
desktop *insere_elemento(desktop *xdesktop, caixa *xcaixa) { /*pressupoe caixa e desktop alocados*/
xdesktop->lista_caixas->insere(xdesktop->lista_caixas, xcaixa);
return xdesktop;
}
desktop *remove_elemento(desktop *xdesktop, unsigned int poslist) {
xdesktop->lista_caixas->remove(xdesktop->lista_caixas, poslist);
return xdesktop;
}
desktop *gerencia_remocao(desktop *xdesktop){
long int esc = 1;
long int id_insercao;
limpa_buffer();
while(esc){
printf("Gostaria de remover alguma caixa (1->s/0->n)? ");
scanf("%ld",&esc);
if (esc){
printf("Digite seu numero na ordem de insercao: ");
scanf("%ld",&id_insercao);
xdesktop = remove_elemento(xdesktop,id_insercao);
}
}
return xdesktop;
}
desktop *desenha_desktop(desktop *xdesktop) {
if (xdesktop->lista_caixas->prox) {
lista *no_ativo;
lista *perc = xdesktop->lista_caixas->prox;
colore_tela();
do{ /*lembre q a lista tem noh sentinela*/
if (perc->comando->visibilidade)
perc->comando->desenha(perc->comando);
perc=perc->prox;
} while(perc!=xdesktop->lista_caixas->prox);
printf("\n"); /*a fim de posicionar o cursor*/
no_ativo = busca_por_ativo(xdesktop->lista_caixas);
if (!no_ativo) { /*1a vez q desenhamos*/
lista *aux = xdesktop->lista_caixas->prox;
if (aux->comando->disponibilidade == false)
aux = proxima_caixa_disp(perc);
aux->comando->ativado = true;
goto_xy(aux->comando->x, aux->comando->y);
} else
trata_cursor(no_ativo->comando);
} else {
puts("Nao ha controles neste desktop. O programa será abortado.");
free_lista(&(xdesktop->lista_caixas));
free(xdesktop);
restaura_tela();
exit(0);
}
return xdesktop;
}
desktop *monitora_desktop(desktop *xdesktop) {
if (xdesktop->lista_caixas->prox) {
lista *no_ativo = busca_por_ativo(xdesktop->lista_caixas);
struct termios conf;
int carac;
tcgetattr (0, &conf);
sem_enter(conf);
carac = le_caracter();
if (carac == TAB) {
no_ativo->comando->ativado = false;
no_ativo->comando = garante_invisib_itens(no_ativo->comando);
no_ativo = proxima_caixa_disp(no_ativo);
no_ativo->comando->ativado = true;
}
tcsetattr(0, TCSANOW, &conf);
if (carac == ESC) {
free_lista(&(xdesktop->lista_caixas));
free(xdesktop);
restaura_tela();
exit(0);
}
if (carac == DEL) {
clrscr();
xdesktop = gerencia_remocao(xdesktop);
}
no_ativo->comando->monitora(no_ativo->comando, carac);
}
return xdesktop;
}
desktop *atualiza_desktop(desktop *xdesktop) {
return xdesktop;
}