mirror of
https://github.com/ip7z/7zip.git
synced 2026-04-21 06:03:40 +00:00
**Arquivos-Chave** [CompressDialog.cpp](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/GUI/CompressDialog.cpp), [CompressDialog.h](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/GUI/CompressDialog.h), [CompressDialog.rc](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/GUI/CompressDialog.rc), [UpdateGUI.cpp](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/GUI/UpdateGUI.cpp), [Update.h](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/Common/Update.h), [LangUtils.cpp](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/FileManager/LangUtils.cpp), [Build.mak](c:/Users/ferna/DEV/CPP/7zip/CPP/Build.mak), [makefile](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/Bundles/Fm/makefile), [7zipUninstall.c](c:/Users/ferna/DEV/CPP/7zip/C/Util/7zipUninstall/7zipUninstall.c), [7zipInstall.c](c:/Users/ferna/DEV/CPP/7zip/C/Util/7zipInstall/7zipInstall.c) **English** Suggested title: `Support multiple output archives, per-item packaging flow, and packaging/uninstall hardening` This PR extends the fork’s compression flow to support multiple output archives and, when the operation starts from multiple selected items, to execute per-item packaging with isolated destinations. The change is carried from the UI down to the options/execution layer, with safe initialization of the new state so the legacy behavior remains intact when the feature is not used. - The data model was extended to carry multiple destinations and item→archive mappings through `ArcPaths`, `SeparateItemMode`, `SeparateItemPaths`, `SeparateItemArchivePaths`, `ItemPaths`, `ItemOutputItemPaths`, and `ItemArcPaths`. - The compression dialog was reworked to accept up to 5 output paths, with an output-count selector, extra combo boxes, dynamic layout resizing, and per-item groups when multiple items are selected. - Archive name and extension handling was hardened: when the format or SFX state changes, the code removes the previous extension before appending the new one, preventing outputs such as `.7z.zip` or `.exe.exe`, while preserving `KeepName` formats and hash-based handlers. - Dialog finalization now validates empty and duplicate paths, normalizes final output paths, and blocks unsafe combinations with `Delete after compression`, especially when the same source item could feed more than one output. - The update pipeline no longer assumes a single `CUpdateArchiveCommand`. `UpdateGUI` now accepts multiple targets, recomputes `WorkingDir` per archive path, and, in separate-item mode, calls `UpdateArchive()` once per item/destination so failures stay isolated and the item-to-output mapping remains explicit. - Input items are now collected from the `censor` with explicit deduplication, keeping the actual UI selection aligned with the execution layer. - Language lookup and packaging were adapted for redistributed layouts: `LangUtils.cpp` now searches parent directories for `Lang`, while the File Manager bundle makefile copies language files into the relevant output folders. - The makefiles were hardened with explicit dependencies for the new resources, and `Build.mak` stops passing `$**` to `rc`, using only the target `.rc` file as the actual resource compiler input. - The uninstaller was strengthened for real Windows shell scenarios: it removes stale shell-extension CLSIDs first, tries to unload `7-zip.dll` and `7-zip32.dll` from `explorer.exe`, clears `read-only` attributes, removes `.tmp*` variants, schedules locked files for deletion after reboot, notifies shell association changes, and self-elevates with `runas`. - The installer now writes fork-specific uninstall metadata (`DisplayName`, `DisplayVersion`, `Publisher`), making it easier to distinguish the fork from the official build in Windows “Programs and Features”. Upstream note: the code already contains groundwork for a text-based output-path editor, but the corresponding UI entry point is currently hidden; the visible behavior today is the inline multi-output/per-item layout. The current `AboutDialog.*` files do not show a semantic diff and look like line-ending-only changes, so I would keep them out of the functional PR. Se quiser, eu também posso transformar isso no formato exato de corpo de PR do GitHub, com seções como `Summary`, `Motivation`, `Implementation Details`, `Risks` e `Validation`, já pronto para colar. **Português** Título sugerido: `Support multiple output archives, per-item packaging flow, and packaging/uninstall hardening` Este PR amplia o fluxo de compressão do fork para suportar múltiplos arquivos de saída e, quando a operação parte de múltiplos itens selecionados, executar um empacotamento item a item com isolamento de destino. A mudança foi propagada da UI até a camada de opções/execução, com inicialização segura dos novos estados para preservar o comportamento legado quando o recurso não é utilizado. - A estrutura de dados foi estendida para transportar múltiplos destinos e mapeamentos item→arquivo com `ArcPaths`, `SeparateItemMode`, `SeparateItemPaths`, `SeparateItemArchivePaths`, `ItemPaths`, `ItemOutputItemPaths` e `ItemArcPaths`. - A janela de compressão foi reestruturada para aceitar até 5 caminhos de saída, com contador de destinos, combos adicionais, redimensionamento dinâmico do layout e grupos por item quando há multi-seleção. - O tratamento de nomes e extensões foi endurecido: ao trocar formato ou SFX, o código remove a extensão anterior antes de anexar a nova, evitando resultados como `.7z.zip` ou `.exe.exe`, sem quebrar formatos `KeepName` ou handlers baseados em hash. - O fechamento do diálogo agora valida caminhos vazios e duplicados, normaliza caminhos finais e bloqueia combinações inseguras com `Delete after compression`, especialmente quando o mesmo item poderia alimentar múltiplos outputs. - O pipeline de update deixou de assumir um único `CUpdateArchiveCommand`. O `UpdateGUI` agora aceita vários destinos, recompõe `WorkingDir` por arquivo de saída e, em modo separado, executa `UpdateArchive()` individualmente por item/destino para isolar erros e preservar o vínculo entre item selecionado e arquivo gerado. - A coleta dos itens de entrada passou a ser feita a partir do `censor`, com deduplicação explícita, garantindo consistência entre a seleção real da UI e a execução. - O suporte a idiomas e empacotamento foi ajustado para layouts redistribuídos: `LangUtils.cpp` agora procura a pasta `Lang` subindo a árvore de diretórios, enquanto o bundle do File Manager copia os arquivos de idioma para os diretórios de saída relevantes. - Os makefiles foram fortalecidos com dependências explícitas dos novos recursos, e `Build.mak` deixou de passar `$**` ao `rc`, usando apenas o `.rc` alvo como entrada efetiva do compilador de recursos. - O desinstalador foi reforçado para cenários reais do Windows: remoção prévia de CLSIDs da shell extension, tentativa de descarregar `7-zip.dll` e `7-zip32.dll` do `explorer.exe`, limpeza de arquivos `read-only`, remoção de variantes `.tmp*`, agendamento para exclusão após reboot quando o arquivo está travado, notificação de alteração de associações e autoelevação com `runas`. - O instalador também passou a gravar metadados próprios do fork no registro de desinstalação (`DisplayName`, `DisplayVersion`, `Publisher`), facilitando a distinção entre o fork e a build oficial no painel “Programs and Features”. Nota para a equipe upstream: a infraestrutura de um editor textual de caminhos de saída já existe no código, mas a entrada visual correspondente permanece oculta; hoje, o comportamento efetivamente exposto é o layout inline com múltiplos destinos e o fluxo por item em multi-seleção. Os arquivos `AboutDialog.*` não exibem diff semântico no estado atual e parecem ser apenas normalização de fim de linha, então eu os separaria da PR funcional.
689 lines
26 KiB
Markdown
689 lines
26 KiB
Markdown
# Release Notes: 7-Zip Fork
|
|
|
|
**Version / Versão:** 2026.3.19.0
|
|
**Author / Autor:** Fernando Nillsson Cidade
|
|
|
|
## Languages
|
|
|
|
- [Português](#português)
|
|
- [English](#english)
|
|
|
|
---
|
|
|
|
## Português
|
|
|
|
# Notas de Lançamento: 7-Zip Fork
|
|
|
|
**Versão:** 2026.3.19.0
|
|
**Autor:** Fernando Nillsson Cidade
|
|
|
|
## Resumo técnico da release
|
|
|
|
Esta release consolida alterações estruturais e funcionais relevantes sobre a base do 7-Zip, com foco principal na expansão do fluxo de compressão pela GUI, customização institucional do fork, reorganização do pipeline de build, sincronização local dos idiomas, geração local do instalador e fortalecimento do ciclo de desinstalação.
|
|
|
|
Do ponto de vista arquitetural, a versão `2026.3.19.0` altera diretamente estes subsistemas:
|
|
|
|
- interface de compressão da GUI
|
|
- backend de roteamento de operações de atualização e compressão
|
|
- diálogo `Sobre o 7-Zip`
|
|
- mecanismo de localização e sincronização de idiomas
|
|
- pipeline de build do File Manager e do instalador
|
|
- instalador e metadados persistidos no Windows
|
|
- desinstalador e limpeza de DLLs e artefatos temporários
|
|
|
|
## Escopo da release
|
|
|
|
### Componentes impactados
|
|
|
|
- `CPP/7zip/UI/GUI/CompressDialog.cpp`
|
|
- `CPP/7zip/UI/GUI/CompressDialog.h`
|
|
- `CPP/7zip/UI/GUI/CompressDialog.rc`
|
|
- `CPP/7zip/UI/GUI/CompressDialogRes.h`
|
|
- `CPP/7zip/UI/GUI/UpdateGUI.cpp`
|
|
- `CPP/7zip/UI/Common/Update.h`
|
|
- `CPP/7zip/UI/FileManager/AboutDialog.cpp`
|
|
- `CPP/7zip/UI/FileManager/AboutDialog.rc`
|
|
- `CPP/7zip/UI/FileManager/AboutDialogRes.h`
|
|
- `CPP/7zip/UI/FileManager/LangUtils.cpp`
|
|
- `C/Util/7zipInstall/7zipInstall.c`
|
|
- `C/Util/7zipUninstall/7zipUninstall.c`
|
|
- `CPP/7zip/Bundles/Fm/makefile`
|
|
- `CPP/7zip/UI/GUI/makefile`
|
|
- `CPP/Build.mak`
|
|
- `.vscode/7zip-installer-task.ps1`
|
|
- `Lang/*`
|
|
- `InstallerAssets/*`
|
|
|
|
## Alterações funcionais consolidadas
|
|
|
|
### 1. Expansão da janela `Adicionar ao arquivo compactado`
|
|
|
|
O fluxo de compressão da GUI foi ampliado para permitir cenários multi-item e multi-destino dentro do mesmo diálogo, sem exigir uma etapa externa de mapeamento manual.
|
|
|
|
#### 1.1 Grupos independentes por item selecionado
|
|
|
|
Quando múltiplos arquivos ou diretórios são selecionados na GUI principal e o usuário aciona `Adicionar`, o diálogo passa a construir um grupo lógico por item selecionado. Cada grupo mantém isolamento de estado e de widgets, incluindo:
|
|
|
|
- identificação visual do item de origem
|
|
- controle individual da quantidade de saídas
|
|
- campos independentes de caminho de saída
|
|
- persistência local do nome base do item selecionado
|
|
|
|
Essa alteração substitui a lógica anterior, que operava sobre uma única coleção agregada, por um modelo de grupos independentes associados diretamente ao item de origem.
|
|
|
|
#### 1.2 Múltiplas saídas por grupo
|
|
|
|
Cada grupo suporta até 5 saídas de empacotamento. Para isso, a camada de recursos e a camada de diálogo foram alteradas para instanciar múltiplos campos `Arquivo` e múltiplos botões `...`, mantendo sincronização entre estado visual e estado interno.
|
|
|
|
Comportamento consolidado:
|
|
|
|
- a primeira saída do grupo é inicializada com o caminho padrão sugerido
|
|
- as saídas adicionais permanecem vazias até ação explícita do usuário
|
|
- mudanças em `Quantidade` redimensionam o conjunto efetivamente ativo de saídas
|
|
- a navegação por `...` atua sobre a linha correta do grupo correspondente
|
|
|
|
Essa alteração elimina o comportamento anterior em que saídas adicionais herdavam indevidamente o mesmo caminho inicial do primeiro item.
|
|
|
|
#### 1.3 Layout dinâmico em runtime
|
|
|
|
O diálogo deixa de trabalhar com uma reserva fixa de espaço para cinco saídas sempre visíveis. A janela agora ajusta a disposição vertical dos controles conforme:
|
|
|
|
- número de grupos carregados
|
|
- quantidade de saídas habilitadas em cada grupo
|
|
- necessidade de exibir ou ocultar linhas extras
|
|
|
|
Na prática, houve reestruturação do cálculo de posicionamento, da altura do diálogo e da visibilidade dos widgets associados a cada linha de saída.
|
|
|
|
#### 1.4 Correções de geração de nome e extensão
|
|
|
|
O fluxo de composição do nome do arquivo compactado foi corrigido para resolver inconsistências de normalização de extensão, especialmente em cenários com nomes já terminados no sufixo do formato corrente.
|
|
|
|
Problemas corrigidos:
|
|
|
|
- `Download.7z.7z`
|
|
- `.7z..7z`
|
|
- nomes vazios derivados de diretórios com barra final
|
|
- reaplicação indevida de extensão quando o formato era alterado
|
|
|
|
Também foi ajustada a lógica de atualização dos caminhos extras para que linhas vazias não passem a receber extensões automaticamente.
|
|
|
|
### 2. Ajustes no backend de compressão
|
|
|
|
O backend que prepara e dispara as operações de compressão foi expandido para receber o novo modelo de saídas por grupo e por item.
|
|
|
|
#### 2.1 Propagação de estado entre GUI e camada de atualização
|
|
|
|
O conjunto de opções transportado entre o diálogo e o backend foi estendido para suportar:
|
|
|
|
- múltiplos caminhos por grupo
|
|
- associação entre item selecionado e saídas correspondentes
|
|
- preservação do comportamento legado quando a operação continua sendo simples
|
|
|
|
Os principais pontos de integração dessa consolidação foram:
|
|
|
|
- `CPP/7zip/UI/GUI/UpdateGUI.cpp`
|
|
- `CPP/7zip/UI/Common/Update.h`
|
|
|
|
#### 2.2 Correção de reaplicação indevida de extensão
|
|
|
|
O fluxo do File Manager que originalmente entrava com modo de nome automático passou a respeitar corretamente caminhos já explicitados na GUI, evitando dupla reaplicação de extensão em operações confirmadas pelo usuário.
|
|
|
|
### 3. Customização da janela `Sobre o 7-Zip`
|
|
|
|
O diálogo `Sobre o 7-Zip` foi expandido para preservar o bloco institucional original do projeto e adicionar um bloco institucional do fork, com identidade própria do mantenedor.
|
|
|
|
#### 3.1 Conteúdo adicional incorporado
|
|
|
|
O diálogo agora incorpora:
|
|
|
|
- observação de que a build refere-se a um fork
|
|
- identificação da versão do fork
|
|
- data de referência do fork
|
|
- copyright específico do autor
|
|
- link para o repositório do fork
|
|
- manutenção da linha informando que o 7-Zip é software grátis
|
|
|
|
#### 3.2 Integração com recursos e runtime
|
|
|
|
As alterações envolveram:
|
|
|
|
- aumento e reorganização do layout do recurso `.rc`
|
|
- novos controles dedicados no diálogo
|
|
- resolução de textos por idioma
|
|
- fallback seguro para strings padrão quando necessário
|
|
- tratamento do link do repositório como ação clicável
|
|
|
|
### 4. Sistema de idiomas e localização
|
|
|
|
O fork consolida `Lang/` na raiz do repositório como a fonte principal de verdade dos arquivos de idioma utilizados na GUI, no File Manager local e no stage do instalador.
|
|
|
|
#### 4.1 Novas entradas de idioma
|
|
|
|
Foram incorporadas novas chaves e novos blocos de tradução para suportar:
|
|
|
|
- o rótulo `Quantidade`
|
|
- o conteúdo expandido da janela `Sobre`
|
|
- a linha de repositório do fork
|
|
|
|
Na prática, o rótulo `Quantidade` foi associado ao ID `4021`, enquanto o bloco `2900` passou a acomodar a expansão das informações exibidas no diálogo `Sobre`.
|
|
|
|
#### 4.2 Normalização dos arquivos de idioma
|
|
|
|
Foi implementado um fluxo de normalização para evitar que a aba `Language` da GUI acuse erros como `Error in Lang file`.
|
|
|
|
Os principais cuidados adotados foram:
|
|
|
|
- inserção ordenada dos IDs
|
|
- remoção de duplicidades inválidas
|
|
- preservação da estrutura esperada pelo parser do 7-Zip
|
|
- sincronização automática entre raiz `Lang/` e diretórios de runtime
|
|
|
|
#### 4.3 Cobertura ampliada de idiomas
|
|
|
|
Os idiomas presentes no projeto passaram a receber suporte para os novos elementos da janela `Sobre` e para o rótulo `Quantidade`, com sincronização para:
|
|
|
|
- `CPP/7zip/UI/FileManager/x64/Lang`
|
|
- `CPP/7zip/Bundles/Fm/x64/Lang`
|
|
- `dist/installer-full/stage/Lang`
|
|
|
|
### 5. Reorganização do pipeline de build e do instalador
|
|
|
|
O pipeline do instalador foi redesenhado para deixar de depender do download do instalador oficial como base de montagem.
|
|
|
|
#### 5.1 Substituição do modelo baseado em download
|
|
|
|
Antes, o fluxo de empacotamento dependia de:
|
|
|
|
- download do instalador oficial
|
|
- extração de payload externo
|
|
- sobreposição posterior de binários locais
|
|
|
|
Agora, o `stage` do instalador passa a ser montado localmente a partir de:
|
|
|
|
- binários compilados no workspace
|
|
- ativos estáticos versionados no repositório
|
|
- base local de idiomas
|
|
- documentação local do projeto
|
|
|
|
#### 5.2 Introdução de ativos locais do instalador
|
|
|
|
Os arquivos antes obtidos da extração do instalador oficial foram movidos para o repositório, com uso direto a partir de:
|
|
|
|
- `InstallerAssets/7-zip.chm`
|
|
- `InstallerAssets/History.txt`
|
|
- `InstallerAssets/descript.ion`
|
|
|
|
#### 5.3 Saída final renomeada do instalador
|
|
|
|
O artefato final gerado por este fork passa a ser:
|
|
|
|
- `dist/7z2026.3.19.0-x64.exe`
|
|
|
|
Isso substitui o nome padronizado anterior derivado da versão upstream.
|
|
|
|
### 6. Personalização do instalador e do Painel de Controle
|
|
|
|
O instalador foi ajustado para registrar metadados próprios do fork no Windows.
|
|
|
|
#### 6.1 Metadados de registro alterados
|
|
|
|
Ao instalar o produto, a chave de desinstalação passa a gravar:
|
|
|
|
- `DisplayName = 7-Zip 2026.3.19.0 (x64)`
|
|
- `DisplayVersion = 2026.3.19.0`
|
|
- `Publisher = Fernando Nillsson Cidade`
|
|
|
|
Esses dados são persistidos na entrada:
|
|
|
|
- `Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\7-Zip`
|
|
|
|
#### 6.2 Coerência entre binário, instalador e identidade visual
|
|
|
|
A release alinha:
|
|
|
|
- nome do instalador
|
|
- versão apresentada ao usuário
|
|
- identidade do fork na janela `Sobre`
|
|
- metadados exibidos pelo Painel de Controle
|
|
|
|
### 7. Fortalecimento do desinstalador
|
|
|
|
O subsistema de remoção foi endurecido para reduzir sobras pós-desinstalação e para evitar comportamento agressivo sobre o Windows Explorer.
|
|
|
|
#### 7.1 Limpeza explícita de arquivos temporários
|
|
|
|
O desinstalador passou a tratar de forma explícita sobras como:
|
|
|
|
- `7-zip.dll.tmp`
|
|
- variantes temporárias correlatas
|
|
|
|
#### 7.2 Elevação administrativa e remoção mais segura
|
|
|
|
O fluxo agora tenta operar com privilégios apropriados quando necessário, evitando falhas silenciosas na remoção de arquivos instalados em diretórios protegidos do sistema.
|
|
|
|
#### 7.3 Correção da estratégia de remoção de DLLs em uso
|
|
|
|
Uma solução intermediária baseada em encerramento amplo de processos do Explorer mostrou-se intrusiva, pois podia fechar janelas do Explorador de Arquivos e afetar temporariamente a barra de tarefas. A implementação consolidada substitui esse comportamento por uma estratégia menos agressiva de descarregamento da shell extension, preservando o ambiente do usuário.
|
|
|
|
Resultado esperado:
|
|
|
|
- menos sobras de DLLs
|
|
- menor necessidade de reinicialização
|
|
- ausência do efeito colateral de fechar globalmente o Explorer
|
|
|
|
### 8. Robustez de build incremental
|
|
|
|
Foram incluídas correções de dependência para evitar composições inválidas entre objetos antigos e cabeçalhos novos, bem como para garantir a regeneração de recursos quando arquivos `.rc` são alterados.
|
|
|
|
#### 8.1 Ajustes aplicados
|
|
|
|
- dependências explícitas para módulos que consomem `CompressDialog.h`
|
|
- dependências explícitas para módulos que consomem `Update.h`
|
|
- dependências explícitas de `AboutDialog.rc` e `AboutDialogRes.h` para regeneração de `resource.res`
|
|
- sincronização automática das bases locais de idioma usadas pelos binários de teste
|
|
|
|
#### 8.2 Benefícios práticos
|
|
|
|
Essas alterações reduzem falhas como:
|
|
|
|
- fechamento inesperado do `7zFM.exe` após mudança estrutural de diálogo
|
|
- binários relincados com recursos antigos
|
|
- runtime carregando idiomas desatualizados
|
|
|
|
## Impacto técnico por subsistema
|
|
|
|
### GUI de compressão
|
|
|
|
- novo modelo de grupos por item
|
|
- novo modelo de múltiplas saídas por grupo
|
|
- layout recalculado em runtime
|
|
- correção de normalização de nomes e extensões
|
|
|
|
### Backend de update e compressão
|
|
|
|
- expansão da estrutura de opções
|
|
- repasse correto dos caminhos configurados pela GUI
|
|
- preservação de compatibilidade com fluxo simples
|
|
|
|
### Recursos e localização
|
|
|
|
- expansão de recursos `.rc`
|
|
- adição de novos IDs
|
|
- sincronização de idioma raiz para runtime
|
|
- normalização automática dos arquivos de tradução
|
|
|
|
### Instalador
|
|
|
|
- geração local do `stage`
|
|
- uso de ativos versionados no próprio repositório
|
|
- nome final do instalador alinhado à identidade do fork
|
|
- metadados do produto customizados no Windows
|
|
|
|
### Desinstalador
|
|
|
|
- limpeza reforçada de arquivos temporários
|
|
- remoção mais segura de DLLs
|
|
- comportamento menos intrusivo sobre shell e Explorer
|
|
|
|
## Artefatos relevantes desta release
|
|
|
|
- `CPP/7zip/UI/FileManager/x64/7zFM.exe`
|
|
- `CPP/7zip/Bundles/Fm/x64/7zFM.exe`
|
|
- `dist/7z2026.3.19.0-x64.exe`
|
|
- `Lang/*`
|
|
- `InstallerAssets/*`
|
|
|
|
## Compatibilidade e observações operacionais
|
|
|
|
- a base upstream do 7-Zip foi preservada, com extensões direcionadas principalmente ao File Manager e ao pipeline local de build e instalação
|
|
- a nova lógica de compressão afeta principalmente o fluxo acionado pela GUI `Adicionar ao arquivo compactado`
|
|
- a coerência visual e institucional do fork depende da sincronização correta entre recursos, idiomas e binários locais
|
|
- a normalização de `Lang/` deve continuar sendo executada pelo script de build para evitar regressões na aba `Language`
|
|
|
|
## Resultado consolidado
|
|
|
|
A release `7-Zip Fork 2026.3.19.0` transforma o projeto em uma variante operacionalmente mais orientada a fluxos avançados de empacotamento, com suporte nativo a múltiplos destinos por item, identidade institucional do fork, pipeline de distribuição autocontido, cobertura de localização ampliada e ciclo de instalação e desinstalação mais controlado.
|
|
|
|
## Autoria
|
|
|
|
**Fernando Nillsson Cidade**
|
|
|
|
---
|
|
|
|
## English
|
|
|
|
# Release Notes: 7-Zip Fork
|
|
|
|
**Version:** 2026.3.19.0
|
|
**Author:** Fernando Nillsson Cidade
|
|
|
|
## Technical release summary
|
|
|
|
This release consolidates a set of structural and functional changes on top of the 7-Zip codebase, with primary focus on expanding the GUI compression workflow, establishing fork-specific product identity, reorganizing the build pipeline, synchronizing local language assets, producing the installer locally, and strengthening the uninstall lifecycle.
|
|
|
|
From an architectural perspective, version `2026.3.19.0` directly affects these subsystems:
|
|
|
|
- GUI compression interface
|
|
- update and compression backend routing
|
|
- `About 7-Zip` dialog
|
|
- language lookup and synchronization mechanism
|
|
- File Manager and installer build pipeline
|
|
- installer and Windows product metadata
|
|
- uninstaller and cleanup of DLLs and temporary artifacts
|
|
|
|
## Release scope
|
|
|
|
### Impacted components
|
|
|
|
- `CPP/7zip/UI/GUI/CompressDialog.cpp`
|
|
- `CPP/7zip/UI/GUI/CompressDialog.h`
|
|
- `CPP/7zip/UI/GUI/CompressDialog.rc`
|
|
- `CPP/7zip/UI/GUI/CompressDialogRes.h`
|
|
- `CPP/7zip/UI/GUI/UpdateGUI.cpp`
|
|
- `CPP/7zip/UI/Common/Update.h`
|
|
- `CPP/7zip/UI/FileManager/AboutDialog.cpp`
|
|
- `CPP/7zip/UI/FileManager/AboutDialog.rc`
|
|
- `CPP/7zip/UI/FileManager/AboutDialogRes.h`
|
|
- `CPP/7zip/UI/FileManager/LangUtils.cpp`
|
|
- `C/Util/7zipInstall/7zipInstall.c`
|
|
- `C/Util/7zipUninstall/7zipUninstall.c`
|
|
- `CPP/7zip/Bundles/Fm/makefile`
|
|
- `CPP/7zip/UI/GUI/makefile`
|
|
- `CPP/Build.mak`
|
|
- `.vscode/7zip-installer-task.ps1`
|
|
- `Lang/*`
|
|
- `InstallerAssets/*`
|
|
|
|
## Consolidated functional changes
|
|
|
|
### 1. `Add to Archive` dialog expansion
|
|
|
|
The GUI compression flow was expanded to support both multi-item and multi-destination scenarios within the same dialog, without requiring an external manual mapping step.
|
|
|
|
#### 1.1 Independent groups per selected item
|
|
|
|
When multiple files or directories are selected in the main GUI and the user triggers `Add`, the dialog now creates one logical group per selected item. Each group maintains isolated state and widgets, including:
|
|
|
|
- visual identification of the source item
|
|
- per-group output quantity control
|
|
- independent output path fields
|
|
- local persistence of the selected item's base name
|
|
|
|
This change replaces the previous model, which operated over a single aggregated collection, with a structure of independent groups directly associated with the source item.
|
|
|
|
#### 1.2 Multiple outputs per group
|
|
|
|
Each group supports up to 5 archive outputs. To enable this, both the resource layer and the dialog layer were expanded to instantiate multiple `Archive` fields and multiple `...` buttons while keeping the visual state synchronized with the internal state.
|
|
|
|
Consolidated behavior:
|
|
|
|
- the first group output is initialized with the suggested default path
|
|
- additional outputs remain blank until explicit user action
|
|
- changes to `Quantity` resize the active set of outputs
|
|
- the `...` browser acts on the correct line inside the corresponding group
|
|
|
|
This removes the previous behavior where extra outputs incorrectly inherited the same initial path from the first item.
|
|
|
|
#### 1.3 Dynamic runtime layout
|
|
|
|
The dialog no longer reserves a fixed block of space for five always-visible outputs. Instead, the window now adapts its vertical layout according to:
|
|
|
|
- number of loaded groups
|
|
- number of enabled outputs in each group
|
|
- whether extra lines need to be shown or hidden
|
|
|
|
In practical terms, this required restructuring control positioning, dialog height calculation, and visibility handling for widgets tied to each output line.
|
|
|
|
#### 1.4 File name and extension generation fixes
|
|
|
|
The archive name composition flow was corrected to resolve extension normalization issues, especially in cases where the user-provided name already ended with the current format suffix.
|
|
|
|
Fixed issues:
|
|
|
|
- `Download.7z.7z`
|
|
- `.7z..7z`
|
|
- empty names derived from directories with trailing separators
|
|
- incorrect extension reapplication when the format changed
|
|
|
|
The extra-output update flow was also adjusted so that blank lines do not receive artificial extensions automatically.
|
|
|
|
### 2. Compression backend adjustments
|
|
|
|
The backend responsible for preparing and dispatching compression operations was expanded to accept the new model of outputs per group and per item.
|
|
|
|
#### 2.1 State propagation between GUI and update layer
|
|
|
|
The options structure transported between the dialog and the backend was extended to support:
|
|
|
|
- multiple paths per group
|
|
- association between selected items and their corresponding outputs
|
|
- preservation of legacy behavior when the operation remains simple
|
|
|
|
The main integration points for this consolidation were:
|
|
|
|
- `CPP/7zip/UI/GUI/UpdateGUI.cpp`
|
|
- `CPP/7zip/UI/Common/Update.h`
|
|
|
|
#### 2.2 Fix for incorrect extension reapplication
|
|
|
|
The File Manager flow that originally entered with automatic archive-name mode was adjusted to respect paths already made explicit in the GUI, preventing double extension reapplication after user confirmation.
|
|
|
|
### 3. `About 7-Zip` dialog customization
|
|
|
|
The `About 7-Zip` dialog was expanded to preserve the original project block while adding a fork-specific institutional block with maintainer identity.
|
|
|
|
#### 3.1 Additional content introduced
|
|
|
|
The dialog now includes:
|
|
|
|
- a note that the build refers to a fork
|
|
- fork version identification
|
|
- fork reference date
|
|
- author-specific copyright
|
|
- a link to the fork repository
|
|
- preservation of the line stating that 7-Zip is free software
|
|
|
|
#### 3.2 Integration with resources and runtime
|
|
|
|
The implementation involved:
|
|
|
|
- resizing and reorganizing the `.rc` dialog layout
|
|
- adding dedicated dialog controls
|
|
- resolving texts through language resources
|
|
- safe fallback to default strings when needed
|
|
- handling the repository entry as a clickable action
|
|
|
|
### 4. Language and localization system
|
|
|
|
The fork consolidates root `Lang/` as the single source of truth for language files consumed by the GUI, the local File Manager runtime, and the installer stage.
|
|
|
|
#### 4.1 New language entries
|
|
|
|
New translation keys and blocks were added to support:
|
|
|
|
- the `Quantity` label
|
|
- the expanded `About` dialog content
|
|
- the fork repository line
|
|
|
|
In practice, the `Quantity` label was bound to ID `4021`, while block `2900` was extended to accommodate the additional information displayed by the `About` dialog.
|
|
|
|
#### 4.2 Language file normalization
|
|
|
|
A normalization flow was implemented to prevent the GUI `Language` tab from reporting errors such as `Error in Lang file`.
|
|
|
|
Key safeguards included:
|
|
|
|
- ordered insertion of IDs
|
|
- removal of invalid duplicates
|
|
- preservation of the structure expected by the 7-Zip parser
|
|
- automatic synchronization between root `Lang/` and runtime language directories
|
|
|
|
#### 4.3 Expanded language coverage
|
|
|
|
Existing project languages now support the new `About` dialog elements and the `Quantity` label, with synchronization to:
|
|
|
|
- `CPP/7zip/UI/FileManager/x64/Lang`
|
|
- `CPP/7zip/Bundles/Fm/x64/Lang`
|
|
- `dist/installer-full/stage/Lang`
|
|
|
|
### 5. Build pipeline and installer reorganization
|
|
|
|
The installer pipeline was redesigned to remove the dependency on downloading the official installer as the assembly base.
|
|
|
|
#### 5.1 Replacing the download-based model
|
|
|
|
Previously, the packaging flow depended on:
|
|
|
|
- downloading the official installer
|
|
- extracting an external payload
|
|
- overlaying local binaries afterwards
|
|
|
|
Now, the installer `stage` is assembled locally from:
|
|
|
|
- binaries compiled in the workspace
|
|
- static assets versioned in the repository
|
|
- local language assets
|
|
- local project documentation
|
|
|
|
#### 5.2 Introduction of local installer assets
|
|
|
|
Files previously obtained from the extracted official installer were moved into the repository and are now consumed directly from:
|
|
|
|
- `InstallerAssets/7-zip.chm`
|
|
- `InstallerAssets/History.txt`
|
|
- `InstallerAssets/descript.ion`
|
|
|
|
#### 5.3 Renamed final installer output
|
|
|
|
The final artifact generated by this fork is now:
|
|
|
|
- `dist/7z2026.3.19.0-x64.exe`
|
|
|
|
This replaces the previous default name derived from the upstream release number.
|
|
|
|
### 6. Installer and Control Panel customization
|
|
|
|
The installer was adjusted to persist fork-specific product metadata in Windows.
|
|
|
|
#### 6.1 Modified registry metadata
|
|
|
|
When the product is installed, the uninstall key now writes:
|
|
|
|
- `DisplayName = 7-Zip 2026.3.19.0 (x64)`
|
|
- `DisplayVersion = 2026.3.19.0`
|
|
- `Publisher = Fernando Nillsson Cidade`
|
|
|
|
These values are stored at:
|
|
|
|
- `Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\7-Zip`
|
|
|
|
#### 6.2 Consistency across binary, installer, and visual identity
|
|
|
|
This release aligns:
|
|
|
|
- installer file name
|
|
- user-facing version string
|
|
- fork identity shown in the `About` dialog
|
|
- metadata displayed in Windows Control Panel
|
|
|
|
### 7. Uninstaller hardening
|
|
|
|
The removal subsystem was reinforced to reduce uninstall leftovers while avoiding aggressive behavior against Windows Explorer.
|
|
|
|
#### 7.1 Explicit cleanup of temporary files
|
|
|
|
The uninstaller now explicitly handles leftovers such as:
|
|
|
|
- `7-zip.dll.tmp`
|
|
- related temporary variants
|
|
|
|
#### 7.2 Administrative elevation and safer removal
|
|
|
|
The flow now attempts to operate with proper privileges when needed, avoiding silent failures while removing files installed under protected system directories.
|
|
|
|
#### 7.3 Fix for the DLL-in-use removal strategy
|
|
|
|
An intermediate solution based on broad Explorer process termination proved too intrusive because it could close File Explorer windows and temporarily affect the taskbar. The consolidated implementation replaces that behavior with a less aggressive shell-extension unload strategy that preserves the user environment.
|
|
|
|
Expected result:
|
|
|
|
- fewer leftover DLLs
|
|
- lower need for reboot fallback
|
|
- no side effect of globally closing Explorer
|
|
|
|
### 8. Incremental build robustness
|
|
|
|
Dependency corrections were added to avoid invalid combinations of old object files with newer headers and to guarantee resource regeneration whenever `.rc` files change.
|
|
|
|
#### 8.1 Applied adjustments
|
|
|
|
- explicit dependencies for modules consuming `CompressDialog.h`
|
|
- explicit dependencies for modules consuming `Update.h`
|
|
- explicit dependencies from `AboutDialog.rc` and `AboutDialogRes.h` to regenerate `resource.res`
|
|
- automatic synchronization of local language bases used by test binaries
|
|
|
|
#### 8.2 Practical benefits
|
|
|
|
These changes reduce issues such as:
|
|
|
|
- unexpected `7zFM.exe` termination after structural dialog changes
|
|
- relinking binaries with outdated resources
|
|
- runtime loading stale language files
|
|
|
|
## Technical impact by subsystem
|
|
|
|
### Compression GUI
|
|
|
|
- new per-item grouping model
|
|
- new multiple-output-per-group model
|
|
- runtime-recalculated layout
|
|
- file name and extension normalization fixes
|
|
|
|
### Update and compression backend
|
|
|
|
- expanded options structure
|
|
- proper propagation of GUI-configured output paths
|
|
- preserved compatibility with simple workflows
|
|
|
|
### Resources and localization
|
|
|
|
- expanded `.rc` resources
|
|
- new control/resource IDs
|
|
- synchronization from root language base to runtime
|
|
- automatic normalization of translation files
|
|
|
|
### Installer
|
|
|
|
- local stage generation
|
|
- use of repository-versioned assets
|
|
- final installer name aligned with fork identity
|
|
- custom product metadata in Windows
|
|
|
|
### Uninstaller
|
|
|
|
- stronger temporary-file cleanup
|
|
- safer DLL removal flow
|
|
- less intrusive shell and Explorer behavior
|
|
|
|
## Relevant artifacts in this release
|
|
|
|
- `CPP/7zip/UI/FileManager/x64/7zFM.exe`
|
|
- `CPP/7zip/Bundles/Fm/x64/7zFM.exe`
|
|
- `dist/7z2026.3.19.0-x64.exe`
|
|
- `Lang/*`
|
|
- `InstallerAssets/*`
|
|
|
|
## Compatibility and operational notes
|
|
|
|
- the upstream 7-Zip base was preserved, with extensions focused mainly on the File Manager and the local build/install pipeline
|
|
- the new compression logic primarily affects the GUI path driven by `Add to Archive`
|
|
- visual and institutional consistency of the fork depends on correct synchronization between resources, languages, and local binaries
|
|
- `Lang/` normalization should continue to be executed by the build script to avoid regressions in the `Language` tab
|
|
|
|
## Consolidated result
|
|
|
|
Release `7-Zip Fork 2026.3.19.0` turns the project into a variant more strongly oriented toward advanced packaging workflows, with native support for multiple output destinations per item, fork-specific product identity, a self-contained distribution pipeline, expanded localization coverage, and a more controlled installation and uninstallation cycle.
|
|
|
|
## Authorship
|
|
|
|
**Fernando Nillsson Cidade**
|