mirror of
https://github.com/HeyPuter/puter.git
synced 2026-05-04 16:40:41 +00:00
725cbf2e20
Calling `puter.ui.launchApp()` now treats the new app as a child of the one that launched it. A child app is given a `puter.parent_instance_id` URL param, containing its parent's instance ID. Previously, `launchApp()` would resolve as soon as the app was launched. This commit changes that, so that it is notified after the child app sends its READY event to Puter. This means that as soon as `launchApp()` has completed, the child app is ready to receive messages. The downside is that launching an app that does not include Puter.js will now not cause a notification, so `await puter.ui.launchApp()` will not resolve in that case.
230 lines
7.6 KiB
JavaScript
230 lines
7.6 KiB
JavaScript
/**
|
|
* Copyright (C) 2024 Puter Technologies Inc.
|
|
*
|
|
* This file is part of Puter.
|
|
*
|
|
* Puter is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published
|
|
* by the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
window.clipboard_op = '';
|
|
window.clipboard = [];
|
|
window.actions_history = [];
|
|
window.window_nav_history = {};
|
|
window.window_nav_history_current_position = {};
|
|
window.progress_tracker = [];
|
|
window.upload_item_global_id = 0;
|
|
|
|
window.download_progress = [];
|
|
window.download_item_global_id = 0;
|
|
|
|
window.TRUNCATE_LENGTH = 20;
|
|
|
|
// This is the minimum width of the window for the sidebar to be shown
|
|
window.window_width_threshold_for_sidebar = 500;
|
|
|
|
// the window over which mouse is hovering
|
|
window.mouseover_window = null;
|
|
|
|
// an active itewm container is the one where keyboard events should work (arrow keys, ...)
|
|
window.active_item_container = null;
|
|
|
|
window.mouseX = 0;
|
|
window.mouseY = 0;
|
|
|
|
// get all logged-in users
|
|
try{
|
|
window.logged_in_users = JSON.parse(localStorage.getItem("logged_in_users"));
|
|
}catch(e){
|
|
window.logged_in_users = [];
|
|
}
|
|
if(window.logged_in_users === null)
|
|
window.logged_in_users = [];
|
|
|
|
// this sessions's user
|
|
window.auth_token = localStorage.getItem("auth_token");
|
|
try{
|
|
window.user = JSON.parse(localStorage.getItem("user"));
|
|
}catch(e){
|
|
window.user = null;
|
|
}
|
|
|
|
// in case this is the first time user is visiting multi-user feature
|
|
if(window.logged_in_users.length === 0 && window.user !== null){
|
|
let tuser = window.user;
|
|
tuser.auth_token = window.auth_token
|
|
window.logged_in_users.push(tuser);
|
|
localStorage.setItem("logged_in_users", window.logged_in_users);
|
|
}
|
|
|
|
window.last_window_zindex = 1;
|
|
|
|
// first visit tracker
|
|
window.first_visit_ever = localStorage.getItem("has_visited_before") === null ? true : false;
|
|
localStorage.setItem("has_visited_before", true);
|
|
|
|
// system paths
|
|
if(window.user !== undefined && window.user !== null){
|
|
window.desktop_path = '/' + window.user.username + '/Desktop';
|
|
window.trash_path = '/' + window.user.username + '/Trash';
|
|
window.appdata_path = '/' + window.user.username + '/AppData';
|
|
window.documents_path = '/' + window.user.username + '/Documents';
|
|
window.pictures_path = '/' + window.user.username + '/Photos';
|
|
window.videos_path = '/' + window.user.username + '/Videos';
|
|
window.audio_path = '/' + window.user.username + '/Audio';
|
|
window.home_path = '/' + window.user.username;
|
|
}
|
|
window.root_dirname = 'Puter';
|
|
|
|
// user preferences, persisted across sessions, cached in localStorage
|
|
try {
|
|
window.user_preferences = JSON.parse(localStorage.getItem('user_preferences'))
|
|
}catch(e){
|
|
window.user_preferences = null;
|
|
}
|
|
// default values
|
|
if (window.user_preferences === null) {
|
|
window.user_preferences = {
|
|
show_hidden_files: false,
|
|
language: navigator.language.split("-")[0] || navigator.userLanguage || 'en',
|
|
clock_visible: 'auto',
|
|
}
|
|
}
|
|
|
|
window.window_stack = []
|
|
window.toolbar_height = 30;
|
|
window.default_taskbar_height = 50;
|
|
window.taskbar_height = window.default_taskbar_height;
|
|
window.upload_progress_hide_delay = 500;
|
|
window.active_uploads = {};
|
|
window.copy_progress_hide_delay = 1000;
|
|
window.busy_indicator_hide_delay = 600;
|
|
window.global_element_id = 0;
|
|
window.operation_id = 0;
|
|
window.operation_cancelled = [];
|
|
window.last_enter_pressed_to_rename_ts = 0;
|
|
window.window_counter = 0;
|
|
window.keypress_item_seach_term = '';
|
|
window.keypress_item_seach_buffer_timeout = undefined;
|
|
window.first_visit_animation = false;
|
|
window.show_twitter_link = true;
|
|
window.animate_window_opening = true;
|
|
window.animate_window_closing = true;
|
|
window.desktop_loading_fade_delay = (window.first_visit_ever && first_visit_animation ? 6000 : 1000);
|
|
window.watchItems = [];
|
|
window.appdata_signatures = {};
|
|
window.appCallbackFunctions = [];
|
|
|
|
// 'Launch' apps
|
|
window.launch_apps = [];
|
|
window.launch_apps.recent = []
|
|
window.launch_apps.recommended = []
|
|
|
|
// Map of { child_instance_id -> { parent_instance_id, launch_msg_id } }
|
|
window.child_launch_callbacks = {};
|
|
|
|
// Is puter being loaded inside an iframe?
|
|
if (window.location !== window.parent.location) {
|
|
window.is_embedded = true;
|
|
// taskbar is not needed in embedded mode
|
|
window.taskbar_height = 0;
|
|
} else {
|
|
window.is_embedded = false;
|
|
}
|
|
|
|
// calculate desktop height and width
|
|
window.desktop_height = window.innerHeight - window.toolbar_height - window.taskbar_height;
|
|
window.desktop_width = window.innerWidth;
|
|
|
|
// {id: {left: 0, top: 0}}
|
|
window.original_window_position = {};
|
|
|
|
// recalculate desktop height and width on window resize
|
|
$( window ).on( "resize", function() {
|
|
const new_desktop_height = window.innerHeight - window.toolbar_height - window.taskbar_height;
|
|
const new_desktop_width = window.innerWidth;
|
|
|
|
$('.window').each((_, el) => {
|
|
const pos = $(el).position();
|
|
const id = $(el).attr('id');
|
|
|
|
if(!window.original_window_position[id]){
|
|
window.original_window_position[id] = {
|
|
left: pos.left,
|
|
top: pos.top
|
|
}
|
|
}
|
|
|
|
const leftRadio = pos.left / window.desktop_width;
|
|
const topRadio = pos.top / window.desktop_height;
|
|
|
|
let left = new_desktop_width * leftRadio;
|
|
let top = new_desktop_height * topRadio;
|
|
|
|
const maxLeft = new_desktop_width - $(el).width();
|
|
const maxTop = new_desktop_height - $(el).height();
|
|
|
|
// first move the window to the original position
|
|
const originalLeft = window.original_window_position[id].left;
|
|
const originalTop = window.original_window_position[id].top;
|
|
|
|
if(left < 0) left = 0;
|
|
else if(left > maxLeft || originalLeft > maxLeft) left = maxLeft;
|
|
|
|
if(top < window.toolbar_height) top = window.toolbar_height;
|
|
else if(top > maxTop || originalTop > maxTop) top = maxTop + window.toolbar_height;
|
|
|
|
$(el).css({
|
|
left,
|
|
top
|
|
})
|
|
})
|
|
|
|
window.desktop_height = new_desktop_height;
|
|
window.desktop_width = new_desktop_width;
|
|
});
|
|
|
|
// for now `active_element` is basically the last element that was clicked,
|
|
// later on though (todo) `active_element` will also be set by keyboard movements
|
|
// such as arrow keys, tab key, ... and when creating new windows...
|
|
window.active_element = null;
|
|
|
|
// The number of recent apps to show in the launch menu
|
|
window.launch_recent_apps_count = 10;
|
|
|
|
// indicated if the mouse is in one of the window snap zones or not
|
|
// if yes, which one?
|
|
window.current_active_snap_zone = undefined;
|
|
|
|
//
|
|
window.is_fullpage_mode = false;
|
|
|
|
window.window_border_radius = 4;
|
|
|
|
window.sites = [];
|
|
|
|
window.feature_flags = {
|
|
// if true, the user will be able to create shortcuts to files and directories
|
|
create_shortcut: true,
|
|
// if true, the user will be asked to confirm before navigating away from Puter only if there is at least one window open
|
|
prompt_user_when_navigation_away_from_puter: false,
|
|
// if true, the user will be able to zip and download directories
|
|
download_directory: true,
|
|
}
|
|
|
|
window.is_auto_arrange_enabled = true;
|
|
window.desktop_item_positions = {};
|
|
window.reset_item_positions = true; // The variable decides if the item positions should be reset when the user enabled auto arrange
|
|
|
|
// default language
|
|
window.locale = 'en'; |