@@ -43,6 +43,7 @@ static void BrowserView_OnDestroy(LCUI_Widget w)
4343 BrowserView self ;
4444
4545 self = Widget_GetData (w , browser_proto );
46+ LinkedList_ClearData (& self -> pages , free );
4647}
4748
4849static void BrowserView_OnPageTabClick (LCUI_Widget w , LCUI_WidgetEvent e ,
@@ -54,6 +55,15 @@ static void BrowserView_OnPageTabClick(LCUI_Widget w, LCUI_WidgetEvent e,
5455 BrowserView_Active (page -> browser , page -> id );
5556}
5657
58+ static void BrowserView_OnPageTabClose (LCUI_Widget w , LCUI_WidgetEvent e ,
59+ void * arg )
60+ {
61+ Page page ;
62+
63+ page = e -> data ;
64+ BrowserView_Close (page -> browser , page -> id );
65+ }
66+
5767static void BrowserView_OnPageLoad (LCUI_Widget w , LCUI_WidgetEvent e , void * arg )
5868{
5969 Page page ;
@@ -99,6 +109,8 @@ int BrowserView_Load(LCUI_Widget w, const char *path)
99109 Widget_Append (self -> tabbar , page -> tab );
100110 Widget_BindEvent (page -> tab , "mousedown" , BrowserView_OnPageTabClick ,
101111 page , NULL );
112+ Widget_BindEvent (page -> tab , "TabClose" , BrowserView_OnPageTabClose ,
113+ page , NULL );
102114 Widget_BindEvent (page -> frame , "PageLoad" , BrowserView_OnPageLoad , page ,
103115 NULL );
104116 Widget_BindEvent (page -> frame , "PageLoaded" , BrowserView_OnPageLoaded ,
@@ -135,6 +147,42 @@ LCUI_BOOL BrowserView_Active(LCUI_Widget w, int id)
135147 return TRUE;
136148}
137149
150+ LCUI_BOOL BrowserView_Close (LCUI_Widget w , int id )
151+ {
152+ Page page ;
153+ BrowserView self ;
154+ LinkedListNode * node ;
155+
156+ self = Widget_GetData (w , browser_proto );
157+ for (LinkedList_Each (node , & self -> pages )) {
158+ page = node -> data ;
159+ if (page -> id != id ) {
160+ continue ;
161+ }
162+ Widget_Destroy (page -> tab );
163+ Widget_Destroy (page -> frame );
164+ if (self -> current_page == page ) {
165+ if (node -> next ) {
166+ page = node -> next -> data ;
167+ } else if (node -> prev ) {
168+ page = node -> prev -> data ;
169+ }
170+ self -> current_page = page ;
171+ if (page ) {
172+ Widget_AddClass (page -> tab , "active" );
173+ Widget_Append (w , page -> frame );
174+ }
175+ }
176+ LinkedList_Unlink (& self -> pages , node );
177+ free (node -> data );
178+ if (self -> pages .length < 1 ) {
179+ LCUI_Quit ();
180+ }
181+ return TRUE;
182+ }
183+ return FALSE;
184+ }
185+
138186void UI_InitBrowserView (void )
139187{
140188 browser_proto = LCUIWidget_NewPrototype ("browser" , NULL );
0 commit comments