terça-feira, 16 de dezembro de 2025

Patch para sincronizar a mensagem de término de cópia de dispositivos externos no Debian com Nemo/Cinnamon



 Esse script resolve o problema da mensagem de cópia de dispositivos externos ( pendrives, SDs e HDs externos, etc) do Nemo/Cinnamon que não ficava até o final causando dados corrompidos, pois o usuário não sabia quando o processo de cópia tinha terminado e removia o dispositivo externo.

Com esse script a mensagem fica até o final do processo evitando corrompimento de dados, depois é só ejetar o dispositivo externo.
 
O processo é totalmente automático bastando testar depois copiando um arquivo grande de um pendrive para o sistema ou vice-versa.

Verá que a mensagem "Copiando arquivo numero_tal de numero_tal em..." fica até o final, bastando depois ejetar o dispositivo externo (pendrive, SD, HD, etc) antes de retirá-lo.

Foi testado no Debian 13 com Nemo-6.4.5, mas deve funcionar em outras versões bastando modificar as versões das bibliotecas nas dependências.

Utilize este script para aplicar o patch no Nemo:


#!/bin/bash

set -e

# Script para compilar Nemo com patch de notificação de cópia para dispositivos removíveis

# Totalmente automático para Debian/Ubuntu

PACKAGE="nemo"

PATCH_NAME="0001-progress-ui-handler-removable-sync.patch"


# 1️⃣ Instalar dependências de build

sudo apt update

sudo apt install -y build-essential devscripts debhelper dh-autoreconf \

                    libgtk-4-dev libglib2.0-dev libgirepository1.0-dev \

                    libsqlite3-dev libnotify-dev libx11-dev git quilt


# 2️⃣ Criar diretório de build

BUILD_DIR="$HOME/nemo-build"

mkdir -p "$BUILD_DIR"

cd "$BUILD_DIR"


# 3️⃣ Baixar source package do Nemo

apt-get source "$PACKAGE"

sudo apt build-dep -y "$PACKAGE"


# 4️⃣ Entrar no source

SRC_DIR=$(find . -maxdepth 1 -type d -name "$PACKAGE*")

cd "$SRC_DIR"


# 5️⃣ Criar patch completo automaticamente

PATCH_FILE="debian/patches/$PATCH_NAME"


mkdir -p debian/patches


cat > "$PATCH_FILE" << 'EOF'

*** a/src/nemo-progress-ui-handler.c

*** b/src/nemo-progress-ui-handler.c

@@

-  /* Operação finalizada, encerrar notificação */

-  nemo_progress_ui_handler_remove(info);

+  /* Operação finalizada */

+  gboolean is_removable = FALSE;

+  GFile *dest_file = info->dest_file; /* destino da cópia */

+

+  if (dest_file)

+  {

+      GError *error = NULL;

+      GFileInfo *fs_info = g_file_query_filesystem_info(

+          dest_file,

+          "filesystem::removable",

+          NULL,

+          &error);

+

+      if (fs_info)

+      {

+          is_removable = g_file_info_get_attribute_boolean(fs_info, "filesystem::removable");

+          g_object_unref(fs_info);

+      }

+      if (error)

+          g_error_free(error);

+  }

+

+  if (is_removable)

+  {

+      nemo_progress_ui_handler_update_message(info, _("Sincronizando dados no dispositivo..."));

+      g_file_sync_async(dest_file,

+                        G_FILE_QUERY_INFO_NONE,

+                        G_PRIORITY_DEFAULT,

+                        NULL,

+                        (GAsyncReadyCallback)nemo_progress_ui_handler_remove_on_sync,

+                        info);

+  }

+  else

+  {

+      nemo_progress_ui_handler_remove(info);

+  }

+

+static void

+nemo_progress_ui_handler_remove_on_sync (GObject      *source_object,

+                                        GAsyncResult *res,

+                                        gpointer      user_data)

+{

+    NemoProgressInfo *info = user_data;

+    GFile *file = G_FILE(source_object);

+    GError *error = NULL;

+

+    g_file_sync_finish(file, res, &error);

+    if (error)

+    {

+        g_warning("Erro ao sincronizar arquivo %s: %s",

+                  g_file_get_path(file), error->message);

+        g_error_free(error);

+    }

+

+    nemo_progress_ui_handler_remove(info);

+}

EOF


# 6️⃣ Inicializar quilt e registrar patch

export QUILT_PATCHES=debian/patches

export QUILT_SERIES=debian/patches/series


if ! grep -q "$PATCH_NAME" "$QUILT_SERIES" 2>/dev/null; then

  echo "$PATCH_NAME" >> debian/patches/series

fi


# 7️⃣ Aplicar todos os patches

quilt push -a


# 8️⃣ Construir o pacote sem assinar

dpkg-buildpackage -us -uc


# 9️⃣ Instalar o pacote gerado

cd ..

sudo dpkg -i ${PACKAGE}_*.deb

echo "Nemo compilado e instalado com patch aplicado automaticamente!"

echo "Teste copiando arquivos para um pendrive e observe a notificação."



Salve de preferência em /opt como build-nemo.sh e dê permissão de execução:

$ cd /opt

$ sudo vim build-nemo.sh
Copie e cole dentro o conteúdo.
Salve e saia.

$ sudo chmod +x build-nemo.sh

E execute:

$ ./build-nemo.sh

O processo é totalmente automático bastando testar depois copiando um arquivo grande de um pendrive para o sistema ou vice-versa.
Verá que a mensagem "Copiando arquivo numero_tal de numero_tal em..." fica até o final, bastando depois ejetar o dispositivo externo antes de retirá-lo.
Agradecimentos ao meu parceirão Chat "Jarvis" GPT!

Nenhum comentário:

Postar um comentário