static list_t* Frame_List;
-static Frame_T* master_frame(void){
- return (Frame_T*) Frame_List->head->contents;
-}
-
void screen_init(void) {
Frame_List = list_new();
list_push_back(Frame_List, frame_new());
- state_set_focused_frame(master_frame());
+ state_set_focused_node(Frame_List->head);
}
void screen_deinit(void) {
state_set_screen_resized(true);
}
+static int get_focused_frame_index(void){
+ int i = 0;
+ list_node_t* n = Frame_List->head;
+ while(n != state_get_focused_node() && n != Frame_List->tail){ n = n->next; i++; }
+ if(n != state_get_focused_node()) i = -1;
+ return i;
+}
+
void screen_close(void) {
- int num_frames = list_size(Frame_List);
- if(num_frames > 1){
- list_delete(Frame_List, 0);
- state_set_focused_frame(master_frame());
+ if (Frame_List->head != Frame_List->tail) {
+ int i = get_focused_frame_index();
+ list_node_t* new_focus = state_get_focused_node()->next;
+ if(i >= 0){ /* negative if node not found */
+ list_delete(Frame_List, i);
+ // new_focus will be null if rm-d tail: set it to new tail
+ if(new_focus == NULL) new_focus = Frame_List->tail;
+ state_set_focused_node(new_focus);
+ state_set_screen_dirty(true);
+ state_set_screen_resized(true);
+ }
}
- state_set_screen_dirty(true);
- state_set_screen_resized(true);
}
static void screen_place_windows(void) {
+#include <stddef.h> // needed because of a bug in list.h: size_t undefined.
+#include "list.h"
+
#include "frame.h"
#include "state.h"
#include "screen.h"
/** Whether the aardvark should be displayed */
static bool AardvarkOn = false;
-/** A pointer to the currently focused frame */
-static Frame_T* Focused_Frame = 0;
+/** A pointer to the currently focused node */
+static list_node_t* Focused_Node = NULL;
static Mode_T CurrentMode = 0;
AardvarkOn = val;
}
+list_node_t* state_get_focused_node(void) {
+ return Focused_Node;
+}
+
Frame_T* state_get_focused_frame(void) {
- return Focused_Frame;
+ return Focused_Node ? (Frame_T*)Focused_Node->contents : NULL;
}
WorkDir_T* state_get_focused_workdir(void) {
- return Focused_Frame->workdir;
+ Frame_T* focused_frame = state_get_focused_frame();
+ return focused_frame ? focused_frame->workdir : NULL;
}
-void state_set_focused_frame(Frame_T *p_frame) {
- Focused_Frame = p_frame;
+void state_set_focused_node(list_node_t *p_node) {
+ Focused_Node = p_node;
}
Mode_T state_get_mode() {
#define STATE_H
#include <stdbool.h>
+#include "list.h"
+
#include "frame.h"
#include "workdir.h"
void state_set_screen_resized(bool val);
bool state_get_aardvark_mode(void);
void state_set_aardvark_mode(bool val);
+void state_set_focused_node(list_node_t* p_node);
+list_node_t* state_get_focused_node(void);
Frame_T* state_get_focused_frame(void);
WorkDir_T* state_get_focused_workdir(void);
-void state_set_focused_frame(Frame_T* p_frame);
Mode_T state_get_mode(void);
void state_set_mode(Mode_T);