Categories
blog Linux officialstupid

Pin a Folder – GNOME Dash to Dock

If you use Debian, Ubuntu, or any Linux distribution featuring the GNOME desktop environment, you probably love the Dash to Dock extension. It brings the convenience of a modern application dock right to your screen.

However, you have likely run into a frustrating limitation: GNOME does not let you drag and drop regular folders directly onto the dock.

Because the GNOME dash handles dock favorites strictly as application shortcuts (.desktop files), the trick to pinning a folder is creating a mini-launcher that commands your file manager (Nautilus) to open that exact path.

In this quick guide, we will look at how to pin a specific folderβ€”like a dedicated Documents/kids folderβ€”to your dock in under two minutes.


Step 1: Generate the Folder Launcher via Terminal

Instead of manually navigating hidden system directories, we can use a quick terminal command to generate a custom application shortcut.

Open your terminal and paste the following block of code:

bash

cat << 'EOF' > ~/.local/share/applications/dock-folder-kids.desktop
[Desktop Entry]
Name=Kids Documents
Comment=Open Kids folder directly from the dock
Exec=nautilus /home/sumnima/Documents/kids
Icon=folder-documents
Terminal=false
Type=Application
Categories=GNOME;Utility;
EOF

chmod +x ~/.local/share/applications/dock-folder-kids.desktop

Use code with caution.

How It Works:

  • Name= This is the display title that appears when you search your system.
  • Exec= This tells your system to launch Nautilus and automatically target your designated folder path (/home/sumnima/Documents/kids).
  • Icon= Assigns a clean system folder icon to the shortcut.
  • chmod +x Makes the file executable so GNOME recognizes it as an active system app launcher.

Step 2: Search and Pin It to the Dock

Now that your system recognizes the folder path as an application, pinning it takes just a few clicks:

  1. Press the Super key (the Windows or Command key) to pull up the GNOME Activities Overview.
  2. Type “Kids Documents” into the search bar.
  3. Right-click on the folder icon that appears in your search results.
  4. Click Add to Favorites (or Pin to Dash depending on your GNOME version).

Your custom folder will instantly appear on your Dash to Dock, giving you single-click access to your files from anywhere!


Pro-Tip: Give Your Folder a Custom Visual Style 🎨

If you pin multiple folders, having them all use the generic blue or grey system icon can get confusing. You can easily change the shortcut’s appearance to a distinct style.

Open the shortcut file with a terminal text editor:

bash

nano ~/.local/share/applications/dock-folder-kids.desktop

Use code with caution.

Locate the Icon=folder-documents line and change it to an alternative icon built into your system’s icon theme:

  • emblem-favorite – Adds a heart or star emblem style.
  • folder-pictures – A folder displaying a photograph graphic.
  • applications-games – Perfect if the folder contains kids’ games or entertainment.

Press Ctrl+O followed by Enter to save your changes, and Ctrl+X to exit. Your dock icon will update immediately!

Categories
blog magento

archive 2008

the best-selling themes for Magento version 1.4.1.1.

https://web.archive.org/web/20110209023950/http://wizardslicing.com

01
02
03
04
05
06
07
Categories
blog game officialstupid

push – online multiplayer game

https://push.officialstupid.me

Categories
.glb blog officialstupid threejs

2D glb mix

new cooking… tiny achievement – https://mero.live/build/battle/

mixing GLB #mixamo#three.js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Battle</title>
    <style>
        body { margin: 0; overflow: hidden; background-color: #000; font-family: 'Arial Black', sans-serif; }
        #ui {
            position: absolute;
            top: 20px;
            left: 20px;
            color: #fff; 
            padding: 15px; 
            text-transform: uppercase;
            z-index: 10; 
            font-size: 12px;
        }
        .key-bind { color: #ffeb3b; font-weight: bold; }
    </style>
</head>
<body>

    <div id="ui">
        <h2 style="margin:0 0 10px 0">Battle</h2>
        <div><span class="key-bind">A / D :</span> Walk</div>
        <div><span class="key-bind">Shift + A/D :</span> Run</div>
        <div><span class="key-bind">A :</span> Light Slash</div>
        <div><span class="key-bind">J :</span> Downward Hit</div>
        <div><span class="key-bind">K :</span> Combo Attack</div>
        <div><span class="key-bind">L :</span> Jump Attack</div>
        <div><span class="key-bind">N :</span> Block</div>
        <div><span class="key-bind">M :</span> Crouch (Hold)</div>
        <div><span class="key-bind">, :</span> Roll</div>
        <div><span class="key-bind">. :</span> Side Kick</div>
        <div><span class="key-bind">; :</span> Backflip Uppercut</div>
    </div>

    <script type="importmap">
        {
            "imports": {
                "three": "https://unpkg.com/three@0.160.0/build/three.module.js",
                "three/addons/": "https://unpkg.com/three@0.160.0/examples/jsm/"
            }
        }
    </script>

    <script type="module">
        import * as THREE from 'three';
        import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
        import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';

        const ANIMATIONS_MAP = {
            idle: 'Idle-main_compressed.glb', 
            walk: 'unarmed_walk_compressed.glb', 
            run: 'run_compressed.glb',
            block: 'sword_block_compressed.glb',
            crouch: 'sword_crouch_compressed.glb',
            roll: 'run_roll_compressed.glb',
            attack1: 'sword_slash_compressed.glb',
            attack2: 'sword_down_compressed.glb',
            attack3: 'sword_combo_compressed.glb',
            attack4: 'sword_jump_compressed.glb',
            kick: 'Side Kick_compressed.glb',
            uppercut: 'Back Flip To Uppercut_compressed.glb'
        };

        // --- ADJUST THIS VALUE TO FIX THE FLOATING ---
        // If character is still floating, make this more negative (e.g., -0.8)
        // If character is inside the floor, make it closer to 0 (e.g., -0.2)
        const CROUCH_Y_OFFSET = -0.5; 

        let scene, camera, renderer, clock, mixer;
        let characterGroup, model;
        let actions = {}; 
        let activeAction;
        let isActionLocked = false; 
        let keys = {};
        let facingDirection = 1;

        init();

        async function init() {
            scene = new THREE.Scene();
            scene.background = new THREE.Color(0x111111);
            clock = new THREE.Clock();

            camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 1000);
            camera.position.set(0, 1.5, 4); 
            camera.lookAt(0, 1, 0);

            renderer = new THREE.WebGLRenderer({ antialias: true });
            renderer.setSize(window.innerWidth, window.innerHeight);
            renderer.shadowMap.enabled = true;
            document.body.appendChild(renderer.domElement);

            scene.add(new THREE.HemisphereLight(0xffffff, 0x444444, 3));
            const dirLight = new THREE.DirectionalLight(0xffffff, 2);
            dirLight.position.set(5, 10, 5);
            dirLight.castShadow = true;
            scene.add(dirLight);

            const floor = new THREE.Mesh(new THREE.PlaneGeometry(100, 50), new THREE.MeshPhongMaterial({ color: 0x222222 }));
            floor.rotation.x = -Math.PI / 2;
            floor.receiveShadow = true;
            scene.add(floor);

            characterGroup = new THREE.Group(); 
            scene.add(characterGroup);

            const dracoLoader = new DRACOLoader();
            dracoLoader.setDecoderPath('https://www.gstatic.com/draco/versioned/decoders/');

            const loader = new GLTFLoader();
            loader.setDRACOLoader(dracoLoader);

            try {
                const gltf = await loader.loadAsync(ANIMATIONS_MAP.walk);
                model = gltf.scene;
                model.scale.set(1, 1, 1); 
                model.rotation.y = Math.PI / 2; 
                characterGroup.add(model);
                
                mixer = new THREE.AnimationMixer(model);

                for (const [key, file] of Object.entries(ANIMATIONS_MAP)) {
                    const gltfAnim = await loader.loadAsync(file);
                    let clip = gltfAnim.animations[0];
                    
                    // Remove root position to prevent popping
                    clip.tracks = clip.tracks.filter(track => !track.name.includes('.position'));

                    const action = mixer.clipAction(clip);
                    if (key.startsWith('attack') || key === 'roll' || key === 'kick' || key === 'uppercut' || key === 'crouch' || key === 'block') {
                        action.setLoop(THREE.LoopOnce);
                        action.clampWhenFinished = true;
                    } else {
                        action.setLoop(THREE.LoopRepeat);
                    }
                    actions[key] = action;
                }
                snapToAction('idle');
            } catch (e) { console.error("Loading error:", e); }

            window.addEventListener('keydown', (e) => {
                const k = e.key.toLowerCase();
                keys[k] = true;
                handleCombat(k);
            });
            window.addEventListener('keyup', (e) => {
                keys[e.key.toLowerCase()] = false;
            });

            animate();
        }

        function handleCombat(key) {
            if (isActionLocked) return;
            if (key === 'j') playOneShot('attack2');
            else if (key === 'k') playOneShot('attack3');
            else if (key === 'l') playOneShot('attack4');
            else if (key === 'n') snapToAction('block');
            else if (key === 'm') snapToAction('crouch'); 
            else if (key === ',') playOneShot('roll');
            else if (key === '.') playOneShot('kick');
            else if (key === ';') playOneShot('uppercut');
            else if (key === 'a' && !keys['d']) playOneShot('attack1');
        }

        function playOneShot(name) {
            isActionLocked = true; 
            const action = actions[name];
            if(activeAction) activeAction.stop();
            action.reset().play();
            activeAction = action;

            const onFinished = (e) => {
                if (e.action === action) {
                    isActionLocked = false; 
                    if (keys['m']) snapToAction('crouch');
                    else if (keys['n']) snapToAction('block');
                    else snapToAction('idle');
                    mixer.removeEventListener('finished', onFinished);
                }
            };
            mixer.addEventListener('finished', onFinished);
        }

        function snapToAction(name) {
            if (isActionLocked && name !== 'idle') return; 
            const action = actions[name];
            if (activeAction !== action) {
                if (activeAction && !isActionLocked) activeAction.fadeOut(0.1);
                action.reset().setEffectiveWeight(1).fadeIn(0.1).play();
                activeAction = action;
            }
        }

        function updateMovement(delta) {
            if (!characterGroup) return;

            // FORCE GROUND POSITION
            characterGroup.position.y = 0;

            // DYNAMIC OFFSET FIX: 
            // If the current active animation is 'crouch', we physically push 
            // the model down relative to the group to compensate for the floating pose.
            if (activeAction === actions['crouch']) {
                model.position.y = CROUCH_Y_OFFSET;
            } else {
                model.position.y = 0;
            }

            if (!isActionLocked) {
                const walkSpeed = 1.8; 
                const runSpeed = 4.0; 
                const currentSpeed = keys['shift'] ? runSpeed : walkSpeed;
                const currentAnim = keys['shift'] ? 'run' : 'walk';

                if (keys['d']) { 
                    facingDirection = 1;
                    characterGroup.rotation.y = 0; 
                    characterGroup.position.x += currentSpeed * delta;
                    snapToAction(currentAnim);
                } else if (keys['a']) { 
                    facingDirection = -1;
                    characterGroup.rotation.y = Math.PI; 
                    characterGroup.position.x -= currentSpeed * delta;
                    snapToAction(currentAnim);
                } 
                else if (!keys['m'] && !keys['n']) {
                    snapToAction('idle');
                } 
                else if (keys['m']) {
                    snapToAction('crouch');
                }
                else {
                    snapToAction('block');
                }
            }

            characterGroup.position.x = Math.max(-10, Math.min(10, characterGroup.position.x));
        }

        function animate() {
            requestAnimationFrame(animate);
            const delta = clock.getDelta();
            if (mixer) mixer.update(delta);
            updateMovement(delta);
            renderer.render(scene, camera);
        }

        window.addEventListener('resize', () => {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        });
    </script>
</body>
</html>
Categories
.glb blog threejs world

world – new glb

Categories
blog Linux officialstupid

macOS User Trying Linuxing for a Few Months – self-joke

Not trying to leave macOS forever. πŸ˜„

I’m just trying to use and adapt to Linux for a few months. But after years of using macOS, muscle memory is a real problem.

My hands keep wanting to:

  • use Command instead of Ctrl
  • have the window buttons on the right side
  • have Finder and the browser feel familiar
  • basically make Linux behave like the Mac I’m already used to πŸ˜‚

So I’m using Debian and tweaking a few things to make the transition easier.

First, I mapped Ctrl to the Windows/Super key so my muscle memory doesn’t fight me every five seconds.

For the look, I’m using Orchis Theme with the macOS-style window buttons and dock.

For Firefox, I’m using WhiteSur Firefox Theme by Vince Liuice.

So far, it’s actually getting pretty close.

But there’s one tiny thing in Firefox that still bothers me a lot.

You know that feeling when everything is almost right, but one little UI element is sitting in the wrong place? πŸ˜…

Yep.

Let’s fix it with userChrome.css.

Categories
.glb blog

https://mesh2motion.org/

I was trying to build the same stuff all morning.

Categories
blog game officialstupid

FREE TIME – tinkering – Tiny Match game generator.

Categories
blog Linux

One month. One nail. Nailed it!

Untitled

OS lifecycle: macOS 14 β†’ Mint β†’ SUSE β†’ elementary β†’ Debian within 1 month!! Poor dude!

Categories
blog WooCommerce wordpress

You ‘re in Welcome to the Woo Marketplace

You re in Welcome to the Woo Marketplace bigmadness com gmail com Gmail

Joke of the whole week: I haven’t been able to log in, and the backup keys aren’t working either.

Categories
blog ecommerce WooCommerce

finally decided to be woo

Screenshot 2026 08 06 at 14.38.36