diff options
Diffstat (limited to 'src/app.c')
-rw-r--r-- | src/app.c | 47 |
1 files changed, 29 insertions, 18 deletions
@@ -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 | ||
356 | iDocumentWidget *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 | |||
354 | iBool handleCommand_App(const char *cmd) { | 378 | iBool 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")) { |