Skip to content

Commit 82fa2d0

Browse files
committed
close #169
1 parent ad3d318 commit 82fa2d0

File tree

3 files changed

+124
-13
lines changed

3 files changed

+124
-13
lines changed

src/dev-center/css/style.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ label, input[type="text"] {
278278
text-decoration: underline;
279279
}
280280

281-
input[type="text"], textarea {
281+
input[type="text"], textarea, input[type="number"] {
282282
display: block;
283283
width: 100%;
284284
height: 34px;

src/dev-center/js/dev-center.js

+76-6
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,8 @@ function generate_edit_app_section(app) {
435435
if(app.result)
436436
app = app.result;
437437

438+
let maximize_on_start = app.maximize_on_start ? 'checked' : '';
439+
438440
let h = ``;
439441
h += `
440442
<div class="edit-app-navbar">
@@ -485,11 +487,6 @@ function generate_edit_app_section(app) {
485487
<label for="edit-app-app-id">App ID</label>
486488
<input type="text" style="width: 362px;" class="app-uid" value="${html_encode(app.uid)}" readonly>
487489
488-
<div>
489-
<input type="checkbox" id="edit-app-maximize-on-start" name="edit-app-maximize-on-start" value="true" style="margin-top:30px;" ${app.maximize_on_start ? 'checked' : ''}>
490-
<label for="edit-app-maximize-on-start" style="display: inline;">Maximize window on start</label>
491-
</div>
492-
493490
<div>
494491
<input type="checkbox" id="edit-app-background" name="edit-app-background" value="true" style="margin-top:30px;" ${app.background ? 'checked' : ''}>
495492
<label for="edit-app-background" style="display: inline;">Run as a background process.</label>
@@ -500,6 +497,35 @@ function generate_edit_app_section(app) {
500497
<label for="edit-app-fullpage-on-landing" style="display: inline;">Load in full-page mode when a user lands directly on this app.</label>
501498
</div>
502499
500+
<div>
501+
<input type="checkbox" id="edit-app-maximize-on-start" name="edit-app-maximize-on-start" value="true" style="margin-top:30px;" ${maximize_on_start ? 'checked' : ''}>
502+
<label for="edit-app-maximize-on-start" style="display: inline;">Maximize window on start</label>
503+
</div>
504+
505+
<div>
506+
<label for="edit-app-window-width">Window Width</label>
507+
<input type="number" id="edit-app-window-width" placeholder="800" value="${html_encode(app.metadata?.window_size?.width ?? 800)}" style="width:200px;" ${maximize_on_start ? 'disabled' : ''}>
508+
<label for="edit-app-window-height">Window Height</label>
509+
<input type="number" id="edit-app-window-height" placeholder="600" value="${html_encode(app.metadata?.window_size?.height ?? 600)}" style="width:200px;" ${maximize_on_start ? 'disabled' : ''}>
510+
</div>
511+
512+
<div style="margin-top:30px;">
513+
<label for="edit-app-window-top">Window Top</label>
514+
<input type="number" id="edit-app-window-top" placeholder="100" value="${app.metadata?.window_position?.top ? html_encode(app.metadata.window_position.top) : ''}" style="width:200px;" ${maximize_on_start ? 'disabled' : ''}>
515+
<label for="edit-app-window-left">Window Left</label>
516+
<input type="number" id="edit-app-window-left" placeholder="100" value="${app.metadata?.window_position?.left ? html_encode(app.metadata.window_position.left) : ''}" style="width:200px;" ${maximize_on_start ? 'disabled' : ''}>
517+
</div>
518+
519+
<div style="margin-top:30px;">
520+
<input type="checkbox" id="edit-app-window-resizable" name="edit-app-window-resizable" value="true" ${app.metadata?.window_resizable ? 'checked' : ''}>
521+
<label for="edit-app-window-resizable" style="display: inline;">Window Resizable</label>
522+
</div>
523+
524+
<div style="margin-top:30px;">
525+
<input type="checkbox" id="edit-app-hide-titlebar" name="edit-app-hide-titlebar" value="true" ${app.metadata?.hide_titlebar ? 'checked' : ''}>
526+
<label for="edit-app-hide-titlebar" style="display: inline;">Hide Titlebar</label>
527+
</div>
528+
503529
<label for="edit-app-icon">Icon</label>
504530
<div id="edit-app-icon" style="background-image:url(${!app.icon ? './img/app.svg' : html_encode(app.icon)});" ${app.icon ? 'data-url="' + html_encode(app.icon) + '"' : ''}>
505531
<div id="change-app-icon">Change App Icon</div>
@@ -804,6 +830,11 @@ $(document).on('click', '.edit-app-save-btn', async function (e) {
804830
const index_url = $('#edit-app-index-url').val();
805831
const description = $('#edit-app-description').val();
806832
const uid = $('#edit-app-uid').val();
833+
const height = $('#edit-app-window-height').val();
834+
const width = $('#edit-app-window-width').val();
835+
const top = $('#edit-app-window-top').val();
836+
const left = $('#edit-app-window-left').val();
837+
807838
let filetype_associations = $('#edit-app-filetype-associations').val();
808839

809840
let icon;
@@ -827,6 +858,24 @@ $(document).on('click', '.edit-app-save-btn', async function (e) {
827858
error = `<strong>Index URL</strong> must be a valid url.`;
828859
else if (!index_url.toLowerCase().startsWith('https://') && !index_url.toLowerCase().startsWith('http://'))
829860
error = `<strong>Index URL</strong> must start with 'https://' or 'http://'.`;
861+
// height must be a number
862+
else if (isNaN(height))
863+
error = `<strong>Window Height</strong> must be a number.`;
864+
// height must be greater than 0
865+
else if (height <= 0)
866+
error = `<strong>Window Height</strong> must be greater than 0.`;
867+
// width must be a number
868+
else if (isNaN(width))
869+
error = `<strong>Window Width</strong> must be a number.`;
870+
// width must be greater than 0
871+
else if (width <= 0)
872+
error = `<strong>Window Width</strong> must be greater than 0.`;
873+
// top must be a number
874+
else if (top && isNaN(top))
875+
error = `<strong>Window Top</strong> must be a number.`;
876+
// left must be a number
877+
else if (left && isNaN(left))
878+
error = `<strong>Window Left</strong> must be a number.`;
830879

831880
// download icon from URL
832881
else {
@@ -871,6 +920,16 @@ $(document).on('click', '.edit-app-save-btn', async function (e) {
871920
background: $('#edit-app-background').is(":checked"),
872921
metadata: {
873922
fullpage_on_landing: $('#edit-app-fullpage-on-landing').is(":checked"),
923+
window_size: {
924+
width: width ?? 800,
925+
height: height ?? 600,
926+
},
927+
window_position: {
928+
top: top,
929+
left: left,
930+
},
931+
window_resizable: $('#edit-app-window-resizable').is(":checked"),
932+
hide_titlebar: $('#edit-app-hide-titlebar').is(":checked"),
874933
},
875934
filetypeAssociations: filetype_associations,
876935
}).then(async (app) => {
@@ -2013,4 +2072,15 @@ function getMimeType(extension) {
20132072

20142073
// Return the MIME type if found, otherwise return 'application/octet-stream'
20152074
return mimeTypes[cleanExtension] || 'application/octet-stream';
2016-
}
2075+
}
2076+
2077+
// if edit-app-maximize-on-start is checked, disable window size and position fields
2078+
$(document).on('change', '#edit-app-maximize-on-start', function (e) {
2079+
if ($(this).is(':checked')) {
2080+
$('#edit-app-window-width, #edit-app-window-height').prop('disabled', true);
2081+
$('#edit-app-window-top, #edit-app-window-left').prop('disabled', true);
2082+
} else {
2083+
$('#edit-app-window-width, #edit-app-window-height').prop('disabled', false);
2084+
$('#edit-app-window-top, #edit-app-window-left').prop('disabled', false);
2085+
}
2086+
})

src/gui/src/helpers/launch_app.js

+47-6
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const launch_app = async (options)=>{
3636
}
3737

3838
// If the app object is not provided, get it from the server
39-
let app_info = options.app_obj ?? await window.get_apps(options.name);
39+
let app_info = options.app_obj ?? await puter.apps.get(options.name);
4040

4141
// For backward compatibility reasons we need to make sure that both `uuid` and `uid` are set
4242
app_info.uuid = app_info.uuid ?? app_info.uid;
@@ -68,7 +68,7 @@ const launch_app = async (options)=>{
6868
//-----------------------------------
6969
// maximize on start
7070
//-----------------------------------
71-
if(app_info.maximize_on_start && app_info.maximize_on_start === 1)
71+
if(app_info.maximize_on_start)
7272
options.maximized = 1;
7373

7474
//-----------------------------------
@@ -254,6 +254,44 @@ const launch_app = async (options)=>{
254254
// register app_instance_uid
255255
window.app_instance_ids.add(uuid);
256256

257+
// width
258+
let window_width;
259+
if(app_info.metadata?.window_size?.width !== undefined)
260+
window_width = parseFloat(app_info.metadata.window_size.width);
261+
if(options.maximized)
262+
window_width = '100%';
263+
264+
// height
265+
let window_height;
266+
if(app_info.metadata?.window_size?.height !== undefined){
267+
window_height = parseFloat(app_info.metadata.window_size.height);
268+
}if(options.maximized)
269+
window_height = `calc(100% - ${window.taskbar_height + window.toolbar_height + 1}px)`;
270+
271+
// top
272+
let top;
273+
if(app_info.metadata?.window_position?.top !== undefined)
274+
top = parseFloat(app_info.metadata.window_position.top) + window.toolbar_height + 1;
275+
if(options.maximized)
276+
top = 0;
277+
278+
// left
279+
let left;
280+
if(app_info.metadata?.window_position?.left !== undefined)
281+
left = parseFloat(app_info.metadata.window_position.left);
282+
if(options.maximized)
283+
left = 0;
284+
285+
// window_resizable
286+
let window_resizable = true;
287+
if(app_info.metadata?.window_resizable !== undefined && typeof app_info.metadata.window_resizable === 'boolean')
288+
window_resizable = app_info.metadata.window_resizable;
289+
290+
// hide_titlebar
291+
let hide_titlebar = false;
292+
if(app_info.metadata?.hide_titlebar !== undefined && typeof app_info.metadata.hide_titlebar === 'boolean')
293+
hide_titlebar = app_info.metadata.hide_titlebar;
294+
257295
// open window
258296
el_win = UIWindow({
259297
element_uuid: uuid,
@@ -264,18 +302,21 @@ const launch_app = async (options)=>{
264302
window_class: 'window-app',
265303
update_window_url: true,
266304
app_uuid: app_info.uuid ?? app_info.uid,
267-
top: options.maximized ? 0 : undefined,
268-
left: options.maximized ? 0 : undefined,
269-
height: options.maximized ? `calc(100% - ${window.taskbar_height + window.toolbar_height + 1}px)` : undefined,
270-
width: options.maximized ? `100%` : undefined,
305+
top: top,
306+
left: left,
307+
height: window_height,
308+
width: window_width,
271309
app: options.name,
272310
is_visible: ! app_info.background,
273311
is_maximized: options.maximized,
274312
is_fullpage: options.is_fullpage,
275313
...window_options,
314+
is_resizable: window_resizable,
315+
has_head: ! hide_titlebar,
276316
show_in_taskbar: app_info.background ? false : window_options?.show_in_taskbar,
277317
});
278318

319+
// If the app is not in the background, show the window
279320
if ( ! app_info.background ) {
280321
$(el_win).show();
281322
}

0 commit comments

Comments
 (0)