wails/v3/examples/gin-example
Lea Anthony 41ba4e7d11
feat(linux): generate .desktop file during build (#4575) (#4780)
* ## Summary

I've implemented the fix for issue #4575. Here's what was changed:

### Changes Made

**File: `v3/internal/commands/build_assets/linux/Taskfile.yml`**

1. Added `generate:dotdesktop` as a dependency to `build:native` task (line 45)
2. Added `generate:dotdesktop` as a dependency to `build:docker` task (line 63)

This ensures that the `.desktop` file is generated during every Linux build (both native and Docker-based), not just during packaging operations.

### How it works

- When running `wails build` or `wails dev` on Linux, the build process now automatically generates a `.desktop` file at `build/linux/<app-name>.desktop`
- The `.desktop` file contains:
  - Application name
  - Executable path
  - Icon reference
  - Categories (defaulting to "Development")
- This allows Linux desktop environments to properly display the application icon and metadata even during development

### Testing

To test the changes:
1. Create a new Wails v3 project: `wails3 init -n testapp`
2. Build it: `cd testapp && wails3 build`
3. Verify the `.desktop` file exists: `cat build/linux/testapp.desktop`

Would you like me to run a test or make any additional changes?

* feat(linux): generate .desktop file during build (#4575)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-12-13 12:22:59 +11:00
..
static Update docs + examples. 2025-03-11 08:50:03 +11:00
go.mod feat(linux): generate .desktop file during build (#4575) (#4780) 2025-12-13 12:22:59 +11:00
go.sum feat(linux): generate .desktop file during build (#4575) (#4780) 2025-12-13 12:22:59 +11:00
main.go Refactor Manager API to use singular naming convention (#4367) 2025-06-22 12:19:14 +10:00
README.md Add gin example 2025-03-09 14:38:46 +11:00

Gin Example

This example demonstrates how to use the Gin web framework with Wails.

Overview

This example shows how to:

  • Set up Gin as the asset handler for a Wails application
  • Create a middleware that routes requests between Wails and Gin
  • Define API endpoints with Gin
  • Communicate between the Gin-served frontend and Wails backend
  • Implement custom Gin middleware

Running the Example

cd v3/examples/gin-example
go mod tidy
go run .

How It Works

The example uses Gin's HTTP router to serve the frontend content whilst still allowing Wails to handle its internal routes. This is achieved through:

  1. Creating a Gin router with routes for the frontend
  2. Implementing a middleware function that decides whether to pass requests to Gin or let Wails handle them
  3. Configuring the Wails application to use both the Gin router as the asset handler and the custom middleware

Wails-Gin Integration

The key part of the integration is the middleware function:

func GinMiddleware(ginEngine *gin.Engine) application.Middleware {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            // Let Wails handle its internal routes
            if r.URL.Path == "/wails/runtime.js" || r.URL.Path == "/wails/ipc" {
                next.ServeHTTP(w, r)
                return
            }

            // Let Gin handle everything else
            ginEngine.ServeHTTP(w, r)
        })
    }
}

This allows you to leverage Gin's powerful routing and middleware capabilities whilst still maintaining full access to Wails features.

Custom Gin Middleware

The example also demonstrates how to create custom Gin middleware:

func LoggingMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        // Start timer
        startTime := time.Now()

        // Process request
        c.Next()

        // Calculate latency
        latency := time.Since(startTime)

        // Log request details
        log.Printf("[GIN] %s | %s | %s | %d | %s",
            c.Request.Method,
            c.Request.URL.Path,
            c.ClientIP(),
            c.Writer.Status(),
            latency,
        )
    }
}

This middleware is applied to all Gin routes and logs details about each request.

Application Configuration

The Wails application is configured to use Gin as follows:

app := application.New(application.Options{
    Name:        "Gin Example",
    Description: "A demo of using Gin with Wails",
    Mac: application.MacOptions{
        ApplicationShouldTerminateAfterLastWindowClosed: true,
    },
    Assets: application.AssetOptions{
        Handler:    ginEngine,
        Middleware: GinMiddleware(ginEngine),
    },
})

This configuration tells Wails to:

  1. Use the Gin engine as the primary handler for HTTP requests
  2. Use our custom middleware to route requests between Wails and Gin