drop files
There is no browser build of this example yet.
Is it the same as C?
- Desktop:verified The Zig version renders a final frame that is byte-identical to the C example.
- Browser:not checked yet The browser comparison does not cover this example yet.
//! raylib [core] example - drop files
//!
//! Zig-API translation of examples/core/core_drop_files.c (raylib 6.2).
//! NOTE: This example only works on platforms that support drag & drop (Windows, Linux, OSX, Html5?)
//! Example licensed under an unmodified zlib/libpng license.
//! Copyright (c) 2015-2025 Ramon Santamaria (@raysan5)
const std = @import("std");
const rl = @import("raylib");
const max_filepath_recorded = 4096;
const max_filepath_size = 2048;
pub fn main(init: std.process.Init) !void {
// Initialization
const screen_width = 800;
const screen_height = 450;
rl.initWindow(screen_width, screen_height, "raylib [core] example - drop files");
defer rl.closeWindow(); // Close window and OpenGL context
// Allocate space for the required file paths: we will register a maximum of filepaths
const file_paths = try init.gpa.alloc([max_filepath_size:0]u8, max_filepath_recorded);
defer init.gpa.free(file_paths);
var file_path_counter: usize = 0;
rl.setTargetFPS(60); // Set our game to run at 60 frames-per-second
// Main game loop
while (!rl.windowShouldClose()) { // Detect window close button or ESC key
// Update
if (rl.isFileDropped()) {
const dropped_files = rl.loadDroppedFiles();
defer rl.unloadDroppedFiles(dropped_files); // Unload filepaths from memory
for (dropped_files.slice()) |path| {
if (file_path_counter >= max_filepath_recorded - 1) break;
_ = rl.textCopy(&file_paths[file_path_counter], std.mem.span(path));
file_path_counter += 1;
}
}
// Draw
rl.beginDrawing();
defer rl.endDrawing();
rl.clearBackground(.ray_white);
if (file_path_counter == 0) {
rl.drawText("Drop your files to this window!", 100, 40, 20, .dark_gray);
} else {
rl.drawText("Dropped files:", 100, 40, 20, .dark_gray);
for (file_paths[0..file_path_counter], 0..) |*path, i| {
const y: i32 = @intCast(40 * i);
const alpha: f32 = if (i % 2 == 0) 0.5 else 0.3;
rl.drawRectangle(0, 85 + y, screen_width, 40, rl.fade(.light_gray, alpha));
rl.drawText(std.mem.sliceTo(path, 0), 120, 100 + y, 10, .gray);
}
rl.drawText("Drop new files...", 100, 110 + 40 * @as(i32, @intCast(file_path_counter)), 20, .dark_gray);
}
}
}/*******************************************************************************************
*
* raylib [core] example - drop files
*
* Example complexity rating: [★★☆☆] 2/4
*
* NOTE: This example only works on platforms that support drag & drop (Windows, Linux, OSX, Html5?)
*
* Example originally created with raylib 1.3, last time updated with raylib 4.2
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2015-2025 Ramon Santamaria (@raysan5)
*
********************************************************************************************/
#include "raylib.h"
#include <stdlib.h> // Required for: calloc(), free()
#define MAX_FILEPATH_RECORDED 4096
#define MAX_FILEPATH_SIZE 2048
//------------------------------------------------------------------------------------
// Program main entry point
//------------------------------------------------------------------------------------
int main(void)
{
// Initialization
//--------------------------------------------------------------------------------------
const int screenWidth = 800;
const int screenHeight = 450;
InitWindow(screenWidth, screenHeight, "raylib [core] example - drop files");
int filePathCounter = 0;
char *filePaths[MAX_FILEPATH_RECORDED] = { 0 }; // We will register a maximum of filepaths
// Allocate space for the required file paths
for (int i = 0; i < MAX_FILEPATH_RECORDED; i++)
{
filePaths[i] = (char *)RL_CALLOC(MAX_FILEPATH_SIZE, 1);
}
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
// Main game loop
while (!WindowShouldClose()) // Detect window close button or ESC key
{
// Update
//----------------------------------------------------------------------------------
if (IsFileDropped())
{
FilePathList droppedFiles = LoadDroppedFiles();
for (int i = 0, offset = filePathCounter; i < (int)droppedFiles.count; i++)
{
if (filePathCounter < (MAX_FILEPATH_RECORDED - 1))
{
TextCopy(filePaths[offset + i], droppedFiles.paths[i]);
filePathCounter++;
}
}
UnloadDroppedFiles(droppedFiles); // Unload filepaths from memory
}
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
BeginDrawing();
ClearBackground(RAYWHITE);
if (filePathCounter == 0) DrawText("Drop your files to this window!", 100, 40, 20, DARKGRAY);
else
{
DrawText("Dropped files:", 100, 40, 20, DARKGRAY);
for (int i = 0; i < filePathCounter; i++)
{
if (i%2 == 0) DrawRectangle(0, 85 + 40*i, screenWidth, 40, Fade(LIGHTGRAY, 0.5f));
else DrawRectangle(0, 85 + 40*i, screenWidth, 40, Fade(LIGHTGRAY, 0.3f));
DrawText(filePaths[i], 120, 100 + 40*i, 10, GRAY);
}
DrawText("Drop new files...", 100, 110 + 40*filePathCounter, 20, DARKGRAY);
}
EndDrawing();
//----------------------------------------------------------------------------------
}
// De-Initialization
//--------------------------------------------------------------------------------------
for (int i = 0; i < MAX_FILEPATH_RECORDED; i++)
{
RL_FREE(filePaths[i]); // Free allocated memory for all filepaths
}
CloseWindow(); // Close window and OpenGL context
//--------------------------------------------------------------------------------------
return 0;
}From raylib 6.2. The original on GitHub.