summaryrefslogtreecommitdiff
path: root/src/app.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/app.c')
-rw-r--r--src/app.c47
1 files changed, 29 insertions, 18 deletions
diff --git a/src/app.c b/src/app.c
index 41e96b2d..6f076c97 100644
--- a/src/app.c
+++ b/src/app.c
@@ -57,6 +57,7 @@ struct Impl_App {
57 iBool pendingRefresh; 57 iBool pendingRefresh;
58 iGmCerts * certs; 58 iGmCerts * certs;
59 iVisited * visited; 59 iVisited * visited;
60 int tabEnum;
60 /* Preferences: */ 61 /* Preferences: */
61 iBool retainWindowSize; 62 iBool retainWindowSize;
62 float uiScale; 63 float uiScale;
@@ -151,6 +152,7 @@ static void init_App_(iApp *d, int argc, char **argv) {
151 d->pendingRefresh = iFalse; 152 d->pendingRefresh = iFalse;
152 d->certs = new_GmCerts(dataDir_App_); 153 d->certs = new_GmCerts(dataDir_App_);
153 d->visited = new_Visited(); 154 d->visited = new_Visited();
155 d->tabEnum = 0;
154 loadPrefs_App_(d); 156 loadPrefs_App_(d);
155 load_Visited(d->visited, dataDir_App_); 157 load_Visited(d->visited, dataDir_App_);
156#if defined (iHaveLoadEmbed) 158#if defined (iHaveLoadEmbed)
@@ -351,6 +353,28 @@ iDocumentWidget *document_Command(const char *cmd) {
351 return document_App(); 353 return document_App();
352} 354}
353 355
356iDocumentWidget *newTab_App(const iDocumentWidget *duplicateOf) {
357 iApp *d = &app_;
358 iWidget *tabs = findWidget_App("doctabs");
359 setFlags_Widget(tabs, hidden_WidgetFlag, iFalse);
360 iWidget *newTabButton = findChild_Widget(tabs, "newtab");
361 removeChild_Widget(newTabButton->parent, newTabButton);
362 iDocumentWidget *doc;
363 if (duplicateOf) {
364 doc = duplicate_DocumentWidget(duplicateOf);
365 }
366 else {
367 doc = new_DocumentWidget();
368 }
369 setId_Widget(as_Widget(doc), format_CStr("document%03d", ++d->tabEnum));
370 appendTabPage_Widget(tabs, iClob(doc), "", 0, 0);
371 addChild_Widget(findChild_Widget(tabs, "tabs.buttons"), iClob(newTabButton));
372 postCommandf_App("tabs.switch page:%p", doc);
373 arrange_Widget(tabs);
374 refresh_Widget(tabs);
375 return doc;
376}
377
354iBool handleCommand_App(const char *cmd) { 378iBool handleCommand_App(const char *cmd) {
355 iApp *d = &app_; 379 iApp *d = &app_;
356 if (equal_Command(cmd, "open")) { 380 if (equal_Command(cmd, "open")) {
@@ -363,6 +387,9 @@ iBool handleCommand_App(const char *cmd) {
363 return iTrue; 387 return iTrue;
364 } 388 }
365 iDocumentWidget *doc = document_Command(cmd); 389 iDocumentWidget *doc = document_Command(cmd);
390 if (argLabel_Command(cmd, "newtab")) {
391 doc = newTab_App(NULL);
392 }
366 iHistory *history = history_DocumentWidget(doc); 393 iHistory *history = history_DocumentWidget(doc);
367 const iBool isHistory = argLabel_Command(cmd, "history") != 0; 394 const iBool isHistory = argLabel_Command(cmd, "history") != 0;
368 if (!isHistory) { 395 if (!isHistory) {
@@ -393,27 +420,11 @@ iBool handleCommand_App(const char *cmd) {
393 return iFalse; 420 return iFalse;
394 } 421 }
395 else if (equal_Command(cmd, "tabs.new")) { 422 else if (equal_Command(cmd, "tabs.new")) {
396 iWidget *tabs = findWidget_App("doctabs"); 423 const iBool isDuplicate = argLabel_Command(cmd, "duplicate") != 0;
397 setFlags_Widget(tabs, hidden_WidgetFlag, iFalse); 424 iDocumentWidget *newDoc = newTab_App(isDuplicate ? document_App() : NULL);
398 iWidget *newTabButton = findChild_Widget(tabs, "newtab");
399 removeChild_Widget(newTabButton->parent, newTabButton);
400 iDocumentWidget *newDoc;
401 const iBool isDuplicate = (argLabel_Command(cmd, "duplicate") != 0);
402 if (isDuplicate) {
403 newDoc = duplicate_DocumentWidget(document_App());
404 }
405 else {
406 newDoc = new_DocumentWidget();
407 }
408 setId_Widget(as_Widget(newDoc), format_CStr("document%03d", tabCount_Widget(tabs)));
409 appendTabPage_Widget(tabs, iClob(newDoc), "", 0, 0);
410 addChild_Widget(findChild_Widget(tabs, "tabs.buttons"), iClob(newTabButton));
411 postCommandf_App("tabs.switch page:%p", newDoc);
412 if (!isDuplicate) { 425 if (!isDuplicate) {
413 postCommand_App("navigate.home"); 426 postCommand_App("navigate.home");
414 } 427 }
415 arrange_Widget(tabs);
416 refresh_Widget(tabs);
417 return iTrue; 428 return iTrue;
418 } 429 }
419 else if (equal_Command(cmd, "tabs.close")) { 430 else if (equal_Command(cmd, "tabs.close")) {