PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB` /*container for widgets*/ widget_display = gw_new_container(); widget_display.on_event = function(evt) { if(!widget_display.children.length) return false; return widget_display.children[widget_display.children.length-1].on_event(evt); } widget_tool_size = 18; widget_min_size = 5*widget_tool_size; widget_default_size = 100; function check_widget_display(width, height) { var count = WidgetManager.num_widgets; for (var i=0; i= width/2) x = width/2 - wid.width/2; if (y + wid.height/2 >= height/2) y = height/2 - wid.height/2; else if (y - wid.height/2 <= - height/2) y = -height/2 + wid.height/2; if (wid.widget_control) wid.widget_control.move(x, y); } } function scan_directory(dir) { var i, j, count, list, new_wid, uri; list = gpac.enum_directory(dir, '.xml;.wgt;.mgt', 0); for (i=0; i0) { gw_new_text(info_dlg.area, txt.substring(0, idx), 'text'); txt = txt.substring(idx+1, txt.length); } else { gw_new_text(info_dlg.area, txt, 'text'); break; } } info.last_idx = info_dlg.area.get_children().length; info.on_click(); if (wid.num_interfaces) { info = collapsable_list(info_dlg, 'MPEG-U Interfaces', 'button'); var spacer = gw_new_text(info_dlg.area, '', 'text'); spacer.hide(); info.first_idx = info_dlg.area.get_children().length; for (j=0; j200) ? 200 : width, 20); } else { children[i].set_size(width, 16); } } } info_dlg.on_event = function(evt) { if (this.area && this.area.on_event(evt)) return true; return false; } info_dlg.set_size(320, 240); gpacui_show_window(info_dlg); } //widget close function function widget_close(widget, force_remove) { var is_comp = widget.is_component; if (widget.visible) { widget.visible = false; WidgetManager.corein_message(widget, 'hide'); WidgetManager.corein_message(widget, 'deactivate'); widget.deactivate(); /*force disconnect of main resource - we do this because we are not sure when the widget_control will be destroyed due to JS GC*/ if (widget.widget_control) { widget.widget_control.set_url(''); widget.widget_control.close(); } } if (!is_comp && (!widget.permanent || force_remove)) { WidgetManager.unload(widget, force_remove ? true : false); } } //widget remove function (close and unregister) function widget_remove(wid) { if (typeof(wid.icon_dock) != 'undefined') { wid.icon_dock.close(); wid.icon_dock = null; } widget_close(wid, 1); } function new_migrate_callback(widget) { return function(renderer) { WidgetManager.migrate_widget(renderer, widget); widget_close(widget, 0); } } function on_widget_load() { WidgetManager.corein_message(this, 'activate'); WidgetManager.corein_message(this, 'show'); WidgetManager.corein_message(this, 'setSize', 'width', this.width, 'height', this.height, 'dpi', screen_dpi); } mpegu_targets = null; function select_mpegu_target(callback) { if (mpegu_targets) return; mpegu_targets = gw_new_file_open(); mpegu_targets.set_label('Select Remote Display'); mpegu_targets.callback = callback; mpegu_targets.on_close = function() { mpegu_targets = null; } /*override browse function*/ mpegu_targets._on_mpegu_click = function() { var target = (this.render_idx<0) ? null : WidgetManager.get_mpegu_service_providers(this.render_idx); mpegu_targets.callback(target); mpegu_targets.callback = null; mpegu_targets.close(); mpegu_targets = null; } mpegu_targets._browse = function(dir, up) { var w, h, i, y; this.area.reset_children(); for (i=0; ; i++) { var target = WidgetManager.get_mpegu_service_providers(i); if (!target) break; var icon = 'icons/applications-internet.svg'; var item = gw_new_icon_button(this.area, icon, target.Name); item.set_size(item.width, item.height); item.render_idx = i; item.on_click = this._on_mpegu_click; } this.layout(this.width, this.height); } mpegu_targets.browse(''); mpegu_targets.go_up.hide(); mpegu_targets.set_size(display_width, display_height); gpacui_show_window(mpegu_targets); } function new_widget_control(widget) { var ctrl; var inline = gw_new_subscene(null); ctrl = gw_new_window_full(widget_display, true, null, 'offscreen', inline); ctrl.set_size(widget.width, widget.height); ctrl.inline = inline; ctrl.tools.spread_h = true; ctrl.component_bound = false; ctrl.widget = widget; widget.widget_control = ctrl; widget.visible = true; ctrl.on_close = function() { this.inline.url[0] = ''; this.widget.widget_control = null; if (this.widget.discardable) widget_remove(this.widget); else widget_close(this.widget, 0); this.widget = null; } ctrl.tools.hide(); gw_object_set_dragable(ctrl); gw_object_set_hitable(ctrl); ctrl.controls_visible = false; this.maximized = false; ctrl.on_double_click = function() { if (this.maximized) { this.maximized = false; this.move(this.widget.x, this.widget.y); this.set_size(this.prev_width, this.prev_height); } else { this.maximized = true; this.prev_width = this.widget.width; this.prev_height = this.widget.height; this.move(0, 0); this.set_size(display_width, display_height); } this.controls_visible = false; this.tools.hide(); } ctrl.on_click = function() { this.controls_visible = ! this.controls_visible; if (this.controls_visible) this.tools.show(); else this.tools.hide(); } /*push on top*/ ctrl.on_down = function(value) { if (value) return; if (this.widget==null) return; //widget is a component, do not push on top but hide some controls if (this.widget.is_component) { if (this.component_bound) { var chldren = this.tools.get_children(); children[0].hide(); //close children[1].hide(); //remove children[4].hide(); //resize } return; } //otherwise push widget on top widget_display.push_to_top(this); //and push components comps = this.widget.components; for (i=0; i display_width/2) widget.x = 0; if (widget.y < -display_height/2) widget.y = 0; else if (widget.y > display_height/2) widget.y = 0; ctrl.move(widget.x, widget.y); /*this will setup the scene graph for the widget in order to filter input and output communication pins*/ widget.activate(ctrl.inline); ctrl.set_url(widget.main); /*send notifications once the widget scene is loaded*/ widget.on_load = on_widget_load; ctrl.show(); return ctrl; } function flash_window(wnd) { wnd.time = gw_new_timer(true); wnd.time.set_timeout(0.25, true); wnd.time.ctrl = wnd; wnd.time.on_fraction = function(val) { var scale = (val<0.5) ? 1+val/2 : 1.5-val/2; this.ctrl.scale.x = this.ctrl.scale.y = scale; } wnd.time.on_active = function (val) { if (!val) { this.ctrl.time = null; this.ctrl = null; } } wnd.time.stop(1); wnd.time.start(0); } //widget launcher function function widget_launch(wid) { var widg_ctrl; //assign default size to the widget if (wid.width == undefined) { wid.width = wid.defaultWidth; if (wid.width == 0) wid.width = widget_default_size; } if (wid.height == undefined) { wid.height = wid.defaultHeight; if (wid.height == 0) wid.height = widget_default_size; } if (wid.x== undefined) wid.x = 0; if (wid.y== undefined) wid.y = 0; widg_ctrl = new_widget_control(wid); } //starts a widget function on_widget_launch() { if (this.widget.visible) { var awid; if (!this.widget.multipleInstances) return; awid = WidgetManager.open(this.widget.manifest, null); widget_launch(awid); } else { widget_launch(this.widget); } show_dock(false); } function widget_get_icon(widget) { var icon = 'icons/image-missing.svg'; var preferredIconType = '.svg'; for (var i = 0; i < widget.icons.length; i++) { icon = widget.icons[i].relocated_src; if (widget.icons[i].relocated_src.indexOf(preferredIconType) > 0) { break; } } return icon; } function widget_insert(widget) { /*insert the widget icon*/ if (widget.permanent && !widget.is_component) widget_insert_icon(widget); /*and load the widget - comment this line to disable auto load of widget*/ widget_launch(widget); } function __get_int(arg) { return (typeof arg == 'string') ? parseInt(arg) : arg; } function widget_request_size(widget, args) { if (args.length==2) { w = __get_int(args[0]); h = __get_int(args[1]); widget.widget_control.set_size(w, h); } } function widget_request_show(widget, args) { widget.widget_control.show(); } function widget_request_hide(widget, args) { widget.widget_control.hide(); } function widget_request_activate(widget, args) { if (!widget.visible) widget_launch(widget); } function widget_request_deactivate(widget, args) { if (widget.visible) widget_close(widget, 0); } function widget_request_attention(widget, args) { if (widget.visible) { widget_display.push_to_top(widget.widget_control); flash_window(widget.widget_control); } } function widget_request_notification(widget, args) { var notif = gw_new_message(null, ''+widget.name+' Alert!', args[0]); // widget_display.push_to_top(notif); gpacui_show_window(notif); notif.set_size(240, 120); } function widget_refresh_components_layout(ctrl, send_resize, comp_target) { var i; var x, y, w, h, scale_x, scale_y; var comps; /*local to subscene transformation not known*/ if (!ctrl.sub_w) return; if (!ctrl.sub_h) return; comps = ctrl.widget.components; for (i=0; i 1 && args[1] != null) { alert('Migrating component to ' + UPnP.GetMediaRenderer(parseInt(args[1])).Name); WidgetManager.migrate_widget(UPnP.GetMediaRenderer(parseInt(args[1])), comp); widget_close(comp); } else { var dlg = select_mpegu_target(new_migrate_callback(comp) ); } if (ifce != null) { wmjs_core_out_invoke_reply(coreOut.migrateComponentMessage, ifce.get_message("migrateComponent"), wid, 1); // send return code 1 = success } } function widget_migration_targets(wid, args) { var count = UPnP.MediaRenderersCount, codes = new Array(), names = new Array(), descriptions = new Array(), i, i; for (i = 0; i < count; i++) { var render = UPnP.GetMediaRenderer(i); codes.push(""+i); names.push(render.Name); descriptions.push(render.HostName +" "+ render.UUID); } i = null; var ifce_count = wid.num_interfaces, j; for (j = 0; j < ifce_count; j++) { var ifce = wid.get_interface(j); if (ifce.type == "urn:mpeg:mpegu:schema:widgets:core:out:2010") { i = ifce; break; } } if (i != null) { wmjs_core_out_invoke_reply(coreOut.requestMigrationTargetsMessage, i.get_message("requestMigrationTargets"), wid, codes, names, descriptions); } } // // implementation of core:out activate temporary widget // function widget_activate_temporary_widget(wid, args) { var w = WidgetManager.open(args[0], null); if (w != null) widget_launch(w); var ifce = getInterfaceByType(wid, "urn:mpeg:mpegu:schema:widgets:core:out:2010"); if (ifce != null) { wmjs_core_out_invoke_reply(coreOut.activateTemporaryWidgetMessage, ifce.get_message("activateTemporaryWidget"), wid, (w != null ? 1 : 0)); // send return code 1 = success } } function setup_extension(extension) { var count, i; /*WidgetManager module not present*/ if (typeof(WidgetManager) == 'undefined') return 0; /*load MPEG-U*/ Browser.loadScript('mpegu-core.js', true); widget_manager_init(); extension.icon = 'applications-system.svg'; extension.label = 'Widget Manager'; extension.desc = 'Configure Widgets'; extension.launch = open_widget_manager; extension.initialize = function(extension) { WidgetManager.on_widget_remove = widget_remove; WidgetManager.on_widget_add = widget_insert; WidgetManager.coreOutSetSize = widget_request_size; WidgetManager.coreOutShow = widget_request_show; WidgetManager.coreOutHide = widget_request_hide; WidgetManager.coreOutRequestActivate = widget_request_activate; WidgetManager.coreOutRequestDeactivate = widget_request_deactivate; WidgetManager.coreOutShowNotification = widget_request_notification; WidgetManager.coreOutPlaceComponent = widget_place_component; WidgetManager.coreOutGetAttention = widget_request_attention; WidgetManager.coreOutInstallWidget = widget_request_install; WidgetManager.coreOutMigrateComponent = widget_migrate_component; WidgetManager.coreOutRequestMigrationTargets = widget_migration_targets; WidgetManager.coreOutActivateTemporaryWidget = widget_activate_temporary_widget; gpacui_show_window(widget_display); /*restore our widgets*/ count = WidgetManager.num_widgets; for (i=0; i