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 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
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
blog game officialstupid

FREE TIME – tinkering – Tiny Match game generator.

Categories
blog officialstupid threejs

Pebble: Getting Back Into Three.js Monkey Business

https://officialstupid.me/workshop/pebble

Water physics. Trying to master water! ๐Ÿ˜ฅ

Categories
Linux officialstupid

Switching from Mac to Linux Mint? How to Swap Command and Ctrl Keys

It’s been a decade since I touched Linux, so here I come with Mint flavor! My fingers are in pain because they only know the Mac keyboard layout. I keep trying to copy, paste, and do everything using the Super button, so I need to change this layout ASAP.

Future Me, Read This If Your Fingers Hurt Again!

For Newer Linux Mint Versions (Mint 22.3+)

  1. Open the Mint Menu and click System Settings.
  2. Click on Keyboard (located in the Hardware section).
  3. Click the XKB Options tab at the top.
  4. Click the + (plus) button at the bottom of the window.
  5. Expand the Ctrl position section, check Swap Left Win with Left Ctrl, and click Add.
Categories
officialstupid

world

Real-Time World v23
0m
00:00:00
SYNCING REAL-WORLD TIME...

Categories
blog mero.live officialstupid

talk.mero.live 24 hours

found more interesting things about Go lang, so ๐Ÿ˜ƒ why not start boiling my brain hard.

Same loop โ€” tiny CMS practice with an open tiny community style.

“Stay hungry, stay foolishโ€ย – Steve Jobs

Categories
blog mero.live officialstupid

mero.live Day 4 – done part!!!

Success Log

  • Grid refined the layout so the wall 1000 to 50 now.
  • Hardened Gestures wipe-to-camera logic for a much smoother
  • Fix Time-Stamping
  • Added new security layers to protect user videos and prevent unauthorized saving.
  • Locked the UI zoom and added custom brand icons for a professional, finished look.

Todo

  • still not happy with video quality and size.
  • camera overlay
  • more beter Gestures
Categories
madenp officialstupid

Protected: madenp.com WP

This content is password-protected. To view it, please enter the password below.