diff --git a/C/imageViewer/README.md b/C/imageViewer/README.md index ecff20f..ab3a29b 100644 --- a/C/imageViewer/README.md +++ b/C/imageViewer/README.md @@ -36,7 +36,28 @@ sudo pacman -S sdl2 sdl2_image brew install sdl2 sdl2_image ``` -## Building +## Installation + +### Arch Linux (Automated) +For Arch Linux users, there's an automated installation script that handles everything: + +```bash +./install_arch.sh +``` + +This script will: +- Install SDL2 dependencies via pacman +- Build the imageviewer from source +- Install the binary to `/usr/local/bin` +- Create a desktop entry for GUI access +- Set up file associations + +To uninstall: +```bash +./uninstall_arch.sh +``` + +### Manual Building 1. Install dependencies (see above) 2. Build the project: diff --git a/C/imageViewer/install_arch.sh b/C/imageViewer/install_arch.sh new file mode 100755 index 0000000..c3649aa --- /dev/null +++ b/C/imageViewer/install_arch.sh @@ -0,0 +1,315 @@ +#!/bin/bash + +# ImageViewer Installation Script for Arch Linux +# This script installs dependencies, builds, and installs the imageviewer + +set -e # Exit on any error + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Configuration +INSTALL_DIR="/usr/local/bin" +DESKTOP_FILE_DIR="/usr/local/share/applications" +ICON_DIR="/usr/local/share/pixmaps" + +print_step() { + echo -e "${BLUE}==>${NC} ${1}" +} + +print_success() { + echo -e "${GREEN}✓${NC} ${1}" +} + +print_warning() { + echo -e "${YELLOW}⚠${NC} ${1}" +} + +print_error() { + echo -e "${RED}✗${NC} ${1}" +} + +check_arch() { + if [[ ! -f /etc/arch-release ]]; then + print_error "This script is designed for Arch Linux only." + exit 1 + fi + print_success "Arch Linux detected" +} + +check_permissions() { + if [[ $EUID -eq 0 ]]; then + print_warning "Running as root. This script should be run as a regular user." + print_warning "It will prompt for sudo when needed." + fi +} + +install_dependencies() { + print_step "Checking dependencies..." + + # Check if pacman is available + if ! command -v pacman &> /dev/null; then + print_error "pacman not found. Are you sure this is Arch Linux?" + exit 1 + fi + + # Check if required packages are already installed + local packages=("sdl2" "sdl2_image" "gcc" "make" "pkg-config" "xdg-utils") + local missing_packages=() + + for package in "${packages[@]}"; do + if ! pacman -Q "$package" &> /dev/null; then + missing_packages+=("$package") + fi + done + + if [ ${#missing_packages[@]} -eq 0 ]; then + print_success "All dependencies are already installed" + return 0 + fi + + print_step "Installing missing dependencies: ${missing_packages[*]}" + + # Update package database + print_step "Updating package database..." + sudo pacman -Sy + + # Install required packages + print_step "Installing SDL2 libraries..." + sudo pacman -S --needed "${missing_packages[@]}" + + print_success "Dependencies installed successfully" +} + +build_imageviewer() { + print_step "Building imageviewer..." + + # Check if we're in the right directory + if [[ ! -f "main.c" ]] || [[ ! -f "Makefile" ]]; then + print_error "main.c or Makefile not found. Please run this script from the imageViewer directory." + exit 1 + fi + + # Clean any previous builds + make clean 2>/dev/null || true + + # Build the project + if make; then + print_success "Build completed successfully" + else + print_error "Build failed" + exit 1 + fi + + # Verify the binary was created + if [[ ! -f "imageviewer" ]]; then + print_error "imageviewer binary not found after build" + exit 1 + fi + + print_success "imageviewer binary created" +} + +install_binary() { + print_step "Installing imageviewer to ${INSTALL_DIR}..." + + # Create install directory if it doesn't exist + sudo mkdir -p "${INSTALL_DIR}" + + # Copy the binary + sudo cp imageviewer "${INSTALL_DIR}/" + sudo chmod +x "${INSTALL_DIR}/imageviewer" + + print_success "imageviewer installed to ${INSTALL_DIR}/imageviewer" +} + +create_desktop_entry() { + print_step "Creating desktop entry..." + + # Create applications directory if it doesn't exist + sudo mkdir -p "${DESKTOP_FILE_DIR}" + + # Create desktop file + sudo tee "${DESKTOP_FILE_DIR}/imageviewer.desktop" > /dev/null << EOF +[Desktop Entry] +Version=1.0 +Type=Application +Name=Image Viewer +Comment=Simple SDL2-based image viewer +Exec=imageviewer %f +Icon=imageviewer +Terminal=false +MimeType=image/jpeg;image/jpg;image/png;image/bmp;image/gif;image/tiff;image/tif;image/webp; +Categories=Graphics;Photography;Viewer; +StartupNotify=true +NoDisplay=false +EOF + + print_success "Desktop entry created" +} + +create_simple_icon() { + print_step "Creating application icon..." + + # Create icon directory if it doesn't exist + sudo mkdir -p "${ICON_DIR}" + + # Create a simple text-based icon (SVG) + sudo tee "${ICON_DIR}/imageviewer.svg" > /dev/null << 'EOF' + + + + + + + + + +EOF + + print_success "Application icon created" +} + +update_desktop_database() { + print_step "Updating desktop database..." + + if command -v update-desktop-database &> /dev/null; then + sudo update-desktop-database "${DESKTOP_FILE_DIR}" 2>/dev/null || true + print_success "Desktop database updated" + else + print_warning "update-desktop-database not found, skipping..." + fi +} + +set_default_image_viewer() { + print_step "Setting imageviewer as default image viewer..." + + # List of MIME types for images + local mime_types=( + "image/jpeg" + "image/jpg" + "image/png" + "image/bmp" + "image/gif" + "image/tiff" + "image/tif" + "image/webp" + ) + + # Set default application for each MIME type + for mime_type in "${mime_types[@]}"; do + if command -v xdg-mime &> /dev/null; then + xdg-mime default imageviewer.desktop "$mime_type" 2>/dev/null || true + fi + done + + # Also update MIME database if available + if command -v update-mime-database &> /dev/null; then + sudo update-mime-database /usr/share/mime 2>/dev/null || true + fi + + print_success "imageviewer set as default image viewer" +} + +test_installation() { + print_step "Testing installation..." + + # Check if binary is in PATH + if command -v imageviewer &> /dev/null; then + print_success "imageviewer is available in PATH" + + # Show version/help + echo -e "${BLUE}Running imageviewer --help equivalent:${NC}" + echo "Usage: imageviewer " + echo "Supported formats: JPG, JPEG, PNG, BMP, GIF, TIF" + + # Test default application association + if command -v xdg-mime &> /dev/null; then + local default_app=$(xdg-mime query default image/jpeg 2>/dev/null) + if [[ "$default_app" == "imageviewer.desktop" ]]; then + print_success "imageviewer is set as default image viewer" + else + print_warning "Default image viewer association may not have been set correctly" + fi + fi + + else + print_error "imageviewer not found in PATH. Installation may have failed." + exit 1 + fi +} + +cleanup() { + print_step "Cleaning up build files..." + make clean 2>/dev/null || true + print_success "Cleanup completed" +} + +show_usage_info() { + echo + echo -e "${GREEN}Installation completed successfully!${NC}" + echo + echo -e "${BLUE}Usage:${NC}" + echo " imageviewer " + echo " Or simply double-click on image files (now set as default viewer)" + echo + echo -e "${BLUE}Examples:${NC}" + echo " imageviewer photo.jpg" + echo " imageviewer /path/to/image/directory" + echo + echo -e "${BLUE}Controls:${NC}" + echo " Mouse wheel / +/- : Zoom in/out" + echo " Mouse drag : Pan image" + echo " Left/Right Arrow : Navigate between images" + echo " Hold Left/Right : Auto-navigate" + echo " R : Reset zoom and position" + echo " F : Fit image to window" + echo " H : Show help" + echo " ESC/Q : Quit" + echo + echo -e "${BLUE}Default Image Viewer:${NC}" + echo " imageviewer is now set as the default application for:" + echo " JPG, JPEG, PNG, BMP, GIF, TIFF, TIF, WEBP files" + echo + echo -e "${BLUE}Uninstall:${NC}" + echo " To remove imageviewer, run:" + echo " sudo rm ${INSTALL_DIR}/imageviewer" + echo " sudo rm ${DESKTOP_FILE_DIR}/imageviewer.desktop" + echo " sudo rm ${ICON_DIR}/imageviewer.svg" +} + +main() { + echo -e "${BLUE}ImageViewer Installation Script for Arch Linux${NC}" + echo "==============================================" + echo + + check_arch + check_permissions + + # Show what the script will do + echo -e "${YELLOW}This script will:${NC}" + echo " 1. Install SDL2 dependencies via pacman" + echo " 2. Build the imageviewer from source" + echo " 3. Install the binary to ${INSTALL_DIR}" + echo " 4. Create a desktop entry" + echo " 5. Set imageviewer as default image viewer" + echo + + install_dependencies + build_imageviewer + install_binary + create_desktop_entry + create_simple_icon + update_desktop_database + set_default_image_viewer + test_installation + cleanup + show_usage_info +} + +# Run main function +main "$@" diff --git a/C/imageViewer/uninstall_arch.sh b/C/imageViewer/uninstall_arch.sh new file mode 100755 index 0000000..e993cfc --- /dev/null +++ b/C/imageViewer/uninstall_arch.sh @@ -0,0 +1,133 @@ +#!/bin/bash + +# ImageViewer Uninstallation Script for Arch Linux + +set -e # Exit on any error + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Configuration +INSTALL_DIR="/usr/local/bin" +DESKTOP_FILE_DIR="/usr/local/share/applications" +ICON_DIR="/usr/local/share/pixmaps" + +print_step() { + echo -e "${BLUE}==>${NC} ${1}" +} + +print_success() { + echo -e "${GREEN}✓${NC} ${1}" +} + +print_warning() { + echo -e "${YELLOW}⚠${NC} ${1}" +} + +print_error() { + echo -e "${RED}✗${NC} ${1}" +} + +remove_files() { + print_step "Removing imageviewer files..." + + # Remove binary + if [[ -f "${INSTALL_DIR}/imageviewer" ]]; then + sudo rm "${INSTALL_DIR}/imageviewer" + print_success "Removed ${INSTALL_DIR}/imageviewer" + else + print_warning "Binary not found at ${INSTALL_DIR}/imageviewer" + fi + + # Remove desktop entry + if [[ -f "${DESKTOP_FILE_DIR}/imageviewer.desktop" ]]; then + sudo rm "${DESKTOP_FILE_DIR}/imageviewer.desktop" + print_success "Removed desktop entry" + else + print_warning "Desktop entry not found" + fi + + # Remove icon + if [[ -f "${ICON_DIR}/imageviewer.svg" ]]; then + sudo rm "${ICON_DIR}/imageviewer.svg" + print_success "Removed application icon" + else + print_warning "Application icon not found" + fi +} + +reset_default_associations() { + print_step "Resetting default image viewer associations..." + + # List of MIME types for images + local mime_types=( + "image/jpeg" + "image/jpg" + "image/png" + "image/bmp" + "image/gif" + "image/tiff" + "image/tif" + "image/webp" + ) + + # Reset default application for each MIME type + for mime_type in "${mime_types[@]}"; do + if command -v xdg-mime &> /dev/null; then + # Check if imageviewer was the default + local current_default=$(xdg-mime query default "$mime_type" 2>/dev/null) + if [[ "$current_default" == "imageviewer.desktop" ]]; then + # Remove the association (this will fall back to system defaults) + local mimeapps_file="$HOME/.config/mimeapps.list" + if [[ -f "$mimeapps_file" ]]; then + sed -i "/^${mime_type}=imageviewer.desktop$/d" "$mimeapps_file" 2>/dev/null || true + fi + fi + fi + done + + print_success "Default image viewer associations reset" +} + +update_desktop_database() { + print_step "Updating desktop database..." + + if command -v update-desktop-database &> /dev/null; then + sudo update-desktop-database "${DESKTOP_FILE_DIR}" 2>/dev/null || true + print_success "Desktop database updated" + else + print_warning "update-desktop-database not found, skipping..." + fi +} + +main() { + echo -e "${BLUE}ImageViewer Uninstallation Script${NC}" + echo "=================================" + echo + + # Show what will be removed + echo -e "${YELLOW}This script will remove:${NC}" + echo " - ${INSTALL_DIR}/imageviewer" + echo " - ${DESKTOP_FILE_DIR}/imageviewer.desktop" + echo " - ${ICON_DIR}/imageviewer.svg" + echo + echo -e "${YELLOW}Note: Dependencies (SDL2 libraries) will NOT be removed.${NC}" + echo + + remove_files + reset_default_associations + update_desktop_database + + echo + echo -e "${GREEN}ImageViewer has been successfully uninstalled!${NC}" + echo + echo -e "${BLUE}To remove dependencies (if no longer needed):${NC}" + echo " sudo pacman -R sdl2 sdl2_image" +} + +# Run main function +main "$@"