Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Aumentar a compatibilidade do Portugol-Studio com o macOS #1097

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

eduardomozart
Copy link

@eduardomozart eduardomozart commented Apr 10, 2023

Executei os passos do #1081 (comment) e fui capaz de instalar o Portugol Studio 2.7.5 no macOS. Por algum motivo, o arquivo ''*.dmg'' está falhando ao montar no macOS (aparentemente esse problema começou à partir da versão 2.7.3 do Portugol Studio). O arquivo monta normalmente através do Terminal, portanto, acredito que o problema esteja relacionado a soma de verificação (CHECKSUM) do arquivo de instalação *.dmg, mas não tenho certeza.

Porém, após a instalação, o programa travava ao iniciar no macOS Monterey 12.6.4 (Intel). Aparentemente esse problema está relacionado a versão do Java 8 empacotada com o pacote.

  1. Pude resolver o problema instalando a versão atualizada do OpenJDK 8 à partir do Homebrew. Atualmente, a versão do Homebrew é a 8u362, enquanto a empacotada com o Portugol Studio é a 8u181.
brew install openjdk@8
  1. Após a instalação do Java 8 do Homebrew, você precisará substituir a versão do Java empacotada com o Portugol Studio com a versão do Java 8 do Homebrew através dos comandos:
sudo mv "/Applications/Portugol Studio.app/Contents/Resources/IDE/java/java-mac/" "/Applications/Portugol Studio.app/Contents/Resources/IDE/java/java-mac.old/"
sudo ln -s /usr/local/opt/openjdk@8 "/Applications/Portugol Studio.app/Contents/Resources/IDE/java/java-mac"

O ideal seria que o pacote do Portugol-Studio fosse reempacotado com uma versão do Java8 compatível com o macOS Monterey.

As correções acima provavelmente corrigem os problemas relatados com os Bug Reports #880 e #990.

Ainda assim, usar um Stub não é a solução mais indicada, já que na Dock é exibido "java" ao invés do "Portugol Studio", e não é possível criar um atalho para a aplicação na Dock dessa forma (já que é exibido o executável "Java" ao invés do ícone do aplicativo do Portugol na Dock e a propriedade -Xdock:name não funciona mais em novas versões do macOS, apenas muda o nome do título na janela). O ideal seria criar um bundle de aplicativo macOS usando ferramentas específicas para isso ao invés de um shell script ou Stub para executar o Portugol Studio.


Para corrigir o problema dos Bug Reports #239 e #876 (arquivos *.por não abrem no macOS):

Esse problema ocorre porque quando o usuário abre um arquivo associado a um programa, ele não passa o nome do arquivo como um argumento (como ocorre no mundo Windows), ao invés disso, ele passa como um kAEOpenDocuments (Apple Events). Baseado no https://github.com/RichardBronosky/AppleScript-droplet, eu criei um stub (programa falso) em Apple Script que intercepta esses eventos ("On Open") e repassa eles para o script executar-studio-mac.command. Essa alternativa também permite que múltiplos arquivos sejam abertos através do Portugol Studio ao mesmo tempo (por exemplo, selecionar múltiplos arquivos *.por e abri-los através do Finder).

O problema da abordagem anterior é que o usuário precisa atribuir permissões ao Bash para executar o Portugol Studio, e essa permissão é atribuída a todos os programas (por exemplo, ao abrir um arquivo *.porna pasta "Downloads", é atribuído permissão ao Bash ao invés do Portugol Studio, e todos os programas em Bash herdam essa mesma permissão, podendo representar um risco a segurança).

Com a nova abordagem, o script bash (/Applications/Portugol\ Studio/Contents/MacOS/Portugol Studio) foi substituído por um stub compilado do Automator que executa o AppleScript compilado em Portugol\ Studio.app/Contents/Resources/Scripts/main.scpt, e ao atribuir permissões de acesso a pasta "Downloads", por exemplo, somente esse Stub (ou seja, o Portugol Studio) recebe permissões de acesso à essa pasta.

A desvantagem, porém, é que o AppleScript como stub é uma linguagem compilada e, portanto, para editar o conteúdo do script, deve ser executado o seguinte comando em um sistema macOS:

open -b com.apple.ScriptEditor2 /Users/mac/Documents/GitHub/Portugol-Studio/installer/arquivos/osx/Portugol\ Studio.app

Também é possível visualizar o código-fonte descompilando o arquivo main.scpt através do osadecompile:

osadecompile /Users/mac/Documents/GitHub/Portugol-Studio/installer/arquivos/osx/Portugol\ Studio.app/Contents/Resources/Scripts/main.scpt

Ao editar o script dessa forma, somente o conteúdo do arquivo Contents/Resources/Scripts/main.scpt é modificado. Caso você queira gerar um novo Stub (não é necessário se você deseja modificar apenas o conteúdo do arquivo main.scpt), será necessário selecionar o menu Arquivo > Exportar para... e exportá-lo como um aplicativo.

image

O Stub desse commit foi gerado com a caixa "Startup Screen" desmarcada, se não o macOS exibe uma mensagem "Clique em Executar para executar esse script ou clique em Cancelar para cancelar o script". O código foi salvo sem assinatura. Não é possível editar o script diretamente com o aplicativo salvo em /Applications/Portugol\ Studio.app devido a problemas de permissão. Também tem que tomar cuidado porque ao exportar como aplicativo todo o conteúdo do diretório Resources é excluído, portanto, o arquivo a ser modificado deve ser o arquivo desse repositório e não o arquivo Portugol\ Studio.app final.

Caso você não possua um sistema macOS, anexei abaixo o conteúdo descompilado do arquivo main.applescript para averiguação.

main.applescript.txt


Aprimoramentos ao executar-studio-mac.command:

O script executar-studio-mac.command originalmente não aceita argumentos. Isso significa que é possível iniciar a interface gráfica do Portugol Studio através do Terminal, porém, não é possível abrir um arquivo *.por através dela. Eu modifiquei o script executar-studio-mac.command de forma que o script aceite argumentos e seja possível abrir arquivos *.por através do Terminal.

Eu também adicionei & ao final de sh -c "comando" (última linha do script executar-studio-mac.command) de forma que seja possível abrir outros arquivos na mesma IDE caso o Portugol Studio já esteja aberto. Por exemplo, se você está com o arquivo "1.por" aberto no Portugol Studio, ao abrir o arquivo 2.por ele é carregado em uma segunda aba na mesma IDE (antes o Portugol Studio simplesmente não abria o arquivo 2.por enquanto o Portugol Studio não fosse fechado, ou seja, não era possível abrir arquivos na mesma IDE).


Opcionalmente, se você quiser, você pode associar o Portugol Studio aos comandos "portugol-studio" e "portugol-console" (já que aparentemente essas são as funções originais dos scripts executar-studio-mac.command e executar-console-mac.command). Aparentemente, o atalho para execução desses comandos através do Terminal não está sendo registrado pelo instalador (testado na versão 2.7.5). Adicionei os respectivos comandos a fórmula do instalador para o macOS.


Aparentemente, o script executar-console-mac.command utiliza a versão detectada do Java do sistema operacional ao invés de usar a versão empacotada com o Portugol Studio. Mesmo alterando a variável caminho_java para o Java 8 do Portugol Studio, a mensagem de erro Class has been compiled by a more recent version of the Java Environment (class file version 63.0), this version of the Java Runtime only recognizes class file versions up to 52.0. era exibida ao compilar um arquivo *.por. Para forçar a execução do comando com a versão Java 8 empacotada do Portugol Studio, você precisará alterar a variável caminho_java e explicitar a variável JAVA_HOME apontando ambas para o diretório do Java 8 do Portugol Studio. Eu também adicionei o parâmetro -Djava.awt.headless=true a variável comando do shell script executar-console-mac.command para evitar que ele crie um ícone na Dock, já que a saída é realizada dentro do próprio Terminal.

Para facilitar esse processo de modificação do arquivo executar-console-mac.command, o arquivo com as variáveis substituídas estão em anexo na íntegra. Basta copiar e substituir todo o conteúdo do arquivo executar-console-mac.command.


Detalhes sobre a execução do Portugol Studio no macOS:

A associação do Portugol Studio com arquivos *.por é definida através do arquivo /Applications/Portugol Studio.app/Contents/Info.plist. Quando o Portugol Studio é executado através de duplo-clique no ícone do aplicativo, o atalho inicia o script em /Applications/Portugol Studio.app/Contents/MacOS/Portugol\ Studio (nome do programa) (parâmetro CFBundleExecutable do arquivo Info.plist).

Também notei que o arquivo Info.plist ainda cita a versão 2.7.2 do Portugol Studio, acredito que os desenvolvedores não estejam atualizando a versão do arquivo, já que o Portugol Studio atualmente encontra-se na versão 2.7.5.

@eduardomozart eduardomozart changed the title Aumenta a compatibilidade do Portugol-Studio com o macOS Aumentar a compatibilidade do Portugol-Studio com o macOS Apr 10, 2023
Não suprimir a saída do comando ao executar o comando "portugol-studio" (executar-studio-mac.command) no Terminal, ao invés disso, suprimi-la no AppleScript (ou seja, suprimir a saída apenas se o usuário executar o aplicativo através de duplo clique no ícone do aplicativo - a saída será suprimida apenas quando o usuário executar o Portugol Studio através da interface gráfica)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant