@gjsify/adwaita-core 0.64.0 → 0.64.1-next.241
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../_virtual/_rolldown/runtime.js";const e=[`registerClass`,`field-form`,`ParamSpec`,`Signals`,`instance API`,`type_ensure`,`vfunc`,`binding engine`,`template`];function attempt(e){try{return e(),null}catch(e){return e instanceof Error?e.message:String(e)}}function count(e,t){let n={n:0};return e.connect(t,()=>{n.n++}),n}function boxTemplate(e,t=`onClicked`){return{className:e,tree:{tag:`GtkBox`,children:[{tag:`GtkSwitch`,id:`sw`,bindings:{active:{source:`template`,property:`enabled`,flags:[`bidirectional`]}}},{tag:`GtkButton`,id:`btn`,signals:[{name:`clicked`,handler:t}]}]},xml:`<interface><template class="${e}" parent="GtkBox"><child><object class="GtkSwitch" id="sw"><property name="active" bind-source="${e}" bind-property="enabled" bind-flags="bidirectional|sync-create"/></object></child><child><object class="GtkButton" id="btn"><signal name="clicked" handler="${t}"/></object></child></template></interface>`}}const t=[{row:`ParamSpec`,rule:`a generated accessor notifies once per change and not on an equal value (_generateAccessors)`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=new(t.registerClass({GTypeName:`GoVecNotify`,Properties:{code:n.string(`code`,``,``,r.READWRITE,``)}},class extends t.Object{})),a=count(i,`notify::code`),o=[];return i.code=`x`,o.push(a.n),i.code=`x`,o.push(a.n),i.code=`y`,o.push(a.n),o},shows:[1,1,2]},{row:`ParamSpec`,rule:`a property reads as its ParamSpec default until it is set, for all five kinds`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=new(t.registerClass({GTypeName:`GoVecDefaults`,Properties:{s:n.string(`s`,``,``,r.READWRITE,``),b:n.boolean(`b`,``,``,r.READWRITE,!0),n:n.int(`n`,``,``,r.READWRITE,0,10,3),d:n.double(`d`,``,``,r.READWRITE,0,1,.5),u:n.uint(`u`,``,``,r.READWRITE,0,10,2)}},class extends t.Object{}));return{s:i.s,b:i.b,n:i.n,d:i.d,u:i.u}},shows:{s:``,b:!0,n:3,d:.5,u:2}},{row:`ParamSpec`,rule:`an accessor the class defines is kept: its setter runs per assignment and decides when to notify`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=0,a=new(t.registerClass({GTypeName:`GoVecOwnAccessor`,Properties:{label:n.string(`label`,``,``,r.READWRITE,``)}},class extends t.Object{constructor(...e){super(...e),this.stored=`initial`}get label(){return this.stored}set label(e){i++,this.stored=e,this.notify(`label`)}})),o=count(a,`notify::label`);return a.label=`a`,a.label=`a`,{setterCalls:i,notifies:o.n,value:a.label}},shows:{setterCalls:2,notifies:2,value:`a`}},{row:`ParamSpec`,rule:`a dashed name is reachable as dash-name, dash_name and dashName, and one notify::dash-name serves all three`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=new(t.registerClass({GTypeName:`GoVecAliases`,Properties:{"dash-name":n.string(`dash-name`,``,``,r.READWRITE,`d`)}},class extends t.Object{})),a=[i[`dash-name`],i.dash_name,i.dashName],o=count(i,`notify::dash-name`);return i.dashName=`q`,i.dash_name=`q`,{read:a,notifies:o.n,value:i[`dash-name`]}},shows:{read:[`d`,`d`,`d`],notifies:1,value:`q`}},{row:`ParamSpec`,rule:`a CONSTRUCT_ONLY property gets no accessor on the class and keeps the value it was built with`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecConstructOnly`,Properties:{co:n.int(`co`,``,``,r.READWRITE|r.CONSTRUCT_ONLY,0,10,3)}},class extends t.Object{});return{given:new i({co:7}).co,dflt:new i().co,onPrototype:Object.getOwnPropertyDescriptor(i.prototype,`co`)!==void 0}},shows:{given:7,dflt:3,onPrototype:!1}},{row:`Signals`,rule:`emit reaches a handler as (emitter, ...params); disconnect stops it; an undeclared name or wrong arity throws`,holds:`oracle`,observe(e){let{GObject:t}=e,n=new(t.registerClass({GTypeName:`GoVecSignals`,Signals:{changed:{param_types:[t.TYPE_STRING,t.TYPE_INT]}}},class extends t.Object{})),r=[],i=0,a=n.connect(`changed`,(...e)=>{i++,r=e});n.emit(`changed`,`s`,3);let o={argc:r.length,emitter:r[0]===n,s:r[1],n:r[2]};return n.disconnect(a),n.emit(`changed`,`t`,4),{...o,callsAfterDisconnect:i,undeclaredThrows:attempt(()=>n.emit(`nope`))!==null,shortThrows:attempt(()=>n.emit(`changed`,`s`))!==null}},shows:{argc:3,emitter:!0,s:`s`,n:3,callsAfterDisconnect:1,undeclaredThrows:!0,shortThrows:!0}},{row:`instance API`,rule:`signal_stop_emission_by_name stops the emission in progress: later handlers do not run, the next emission runs all`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=new(t.registerClass({GTypeName:`GoVecStopEmission`,Properties:{code:n.string(`code`,``,``,r.READWRITE,``)},Signals:{ping:{param_types:[]}}},class extends t.Object{})),a=[],o=!0;i.connect(`ping`,()=>{a.push(`a`),o&&t.signal_stop_emission_by_name(i,`ping`)}),i.connect(`ping`,()=>a.push(`b`)),i.emit(`ping`);let s=a.join(``);a.length=0,o=!1,i.emit(`ping`);let c=a.join(``),l=[];return i.connect(`notify::code`,()=>{l.push(`a`),t.signal_stop_emission_by_name(i,`notify::code`)}),i.connect(`notify::code`,()=>l.push(`b`)),i.code=`x`,{stopped:s,next:c,notified:l.join(``)}},shows:{stopped:`a`,next:`ab`,notified:`a`}},{row:`instance API`,rule:`signal_stop_emission_by_name stops only the innermost emission of ITS signal; with none in progress it does nothing and leaves nothing behind`,holds:`oracle`,observe(e){let{GObject:t}=e,n=new(t.registerClass({GTypeName:`GoVecStopNested`,Signals:{ping:{param_types:[]},pong:{param_types:[]}}},class extends t.Object{})),r=attempt(()=>t.signal_stop_emission_by_name(n,`ping`)),i=[],a=0;n.connect(`ping`,()=>{i.push(`a${a}`),a===0?(a=1,n.emit(`ping`),a=0):t.signal_stop_emission_by_name(n,`ping`)}),n.connect(`ping`,()=>i.push(`b${a}`)),n.emit(`ping`);let o=i.join(`,`);return i.length=0,n.connect(`pong`,()=>{i.push(`p`),t.signal_stop_emission_by_name(n,`ping`)}),n.connect(`pong`,()=>i.push(`q`)),n.emit(`pong`),{idleThrows:r!==null,nested:o,otherSignal:i.join(``)}},shows:{idleThrows:!1,nested:`a0,a1,b0`,otherSignal:`pq`}},{row:`field-form`,rule:`meta given as static symbol fields registers like the meta object (GJS only copies the object onto them)`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t;class Field extends t.Object{}Object.assign(Field,{[t.GTypeName]:`GoVecFieldForm`,[t.properties]:{code:n.string(`code`,``,``,r.READWRITE,``)},[t.signals]:{ping:{param_types:[]}}});let i=t.registerClass(Field),a=new i,o=count(a,`notify::code`),s=count(a,`ping`);return a.code=`x`,a.emit(`ping`),{typeName:i.$gtype.name,notifies:o.n,pings:s.n}},shows:{typeName:`GoVecFieldForm`,notifies:1,pings:1}},{row:`type_ensure`,rule:`$gtype is a token and type_ensure accepts it`,holds:`oracle`,observe(e){let{GObject:t}=e,n=t.registerClass({GTypeName:`GoVecToken`},class extends t.Object{}).$gtype;return{hasGtype:n!==void 0,ensured:attempt(()=>t.type_ensure(n))===null}},shows:{hasGtype:!0,ensured:!0}},{row:`binding engine`,rule:`SYNC_CREATE transfers once at bind time; without it the target keeps its own value`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecBindSync`,Properties:{on:n.boolean(`on`,``,``,r.READWRITE,!1)}},class extends t.Object{}),[a,o,s,c]=[new i,new i,new i,new i];return a.on=!0,s.on=!0,e.bind(a,`on`,o,`on`,[`sync-create`]),e.bind(s,`on`,c,`on`,[]),{withSync:o.on,withoutSync:c.on}},shows:{withSync:!0,withoutSync:!1}},{row:`binding engine`,rule:`the target follows every change of the source`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecBindFollow`,Properties:{on:n.boolean(`on`,``,``,r.READWRITE,!1)}},class extends t.Object{}),[a,o]=[new i,new i];e.bind(a,`on`,o,`on`,[`sync-create`]),a.on=!0;let s=o.on;return a.on=!1,{afterOn:s,afterOff:o.on}},shows:{afterOn:!0,afterOff:!1}},{row:`binding engine`,rule:`BIDIRECTIONAL makes the source follow the target back, without echoing`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecBindBoth`,Properties:{on:n.boolean(`on`,``,``,r.READWRITE,!1)}},class extends t.Object{}),[a,o]=[new i,new i];e.bind(a,`on`,o,`on`,[`bidirectional`,`sync-create`]),o.on=!0;let s=a.on;return a.on=!1,{back:s,forward:o.on}},shows:{back:!0,forward:!1}},{row:`binding engine`,rule:`INVERT_BOOLEAN negates what crosses, at creation and after`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecBindInvert`,Properties:{on:n.boolean(`on`,``,``,r.READWRITE,!1),off:n.boolean(`off`,``,``,r.READWRITE,!0)}},class extends t.Object{}),[a,o]=[new i,new i];a.on=!0,e.bind(a,`on`,o,`off`,[`sync-create`,`invert-boolean`]);let s=o.off;return a.on=!1,{created:s,after:o.off}},shows:{created:!1,after:!0}},{row:`template`,rule:`construction order: the template is built, construct properties are set (this._x is undefined inside a setter), then this._x is installed`,holds:`oracle`,widget:!0,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=[],a=new(t.registerClass({GTypeName:`GoVecOrder`,Template:e.template(boxTemplate(`GoVecOrder`)),InternalChildren:[`sw`,`btn`],Properties:{code:n.string(`code`,``,``,r.READWRITE,``),enabled:n.boolean(`enabled`,``,``,r.READWRITE,!1)}},class extends e.Widget{get code(){return this.stored}set code(e){i.push(`setter:${typeof this._sw}`),this.stored=e}onClicked(){}constructor(e){super(e),i.push(`after super:${typeof this._sw}`)}}))({code:`k`});return{log:i,code:a.code,child:typeof a._btn}},shows:{log:[`setter:undefined`,`after super:object`],code:`k`,child:`object`}},{row:`template`,rule:"a `bind template.x bidirectional` follows both ways between the template instance and its child",holds:`oracle`,widget:!0,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=new(t.registerClass({GTypeName:`GoVecTemplateBind`,Template:e.template(boxTemplate(`GoVecTemplateBind`)),InternalChildren:[`sw`,`btn`],Properties:{enabled:n.boolean(`enabled`,``,``,r.READWRITE,!1)}},class extends e.Widget{onClicked(){}})),a=i._sw.active;i.enabled=!0;let o=i._sw.active;return i._sw.active=!1,{initial:a,toChild:o,back:i.enabled}},shows:{initial:!1,toChild:!0,back:!1}},{row:`template`,rule:`a handler on the template instance runs bound to that instance and receives the emitter`,holds:`oracle`,widget:!0,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=[],a,o=new(t.registerClass({GTypeName:`GoVecHandler`,Template:e.template(boxTemplate(`GoVecHandler`)),InternalChildren:[`sw`,`btn`],Properties:{enabled:n.boolean(`enabled`,``,``,r.READWRITE,!1)}},class extends e.Widget{onClicked(e){i.push([this===a,e===this._btn])}}));return a=o,o._btn.emit(`clicked`),i},shows:[[!0,!0]]},{row:`template`,rule:"a handler the instance does not have throws `A handler called <name> was not defined` (GJS logs it as a Gtk-CRITICAL instead)",holds:`subset`,widget:!0,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecNoHandler`,Template:e.template(boxTemplate(`GoVecNoHandler`,`nope`)),InternalChildren:[`sw`,`btn`],Properties:{enabled:n.boolean(`enabled`,``,``,r.READWRITE,!1)}},class extends e.Widget{});return(attempt(()=>new i)??``).includes(`A handler called nope was not defined`)},shows:!0},...[`Children`,`Implements`,`Requires`,`GTypeFlags`].map(e=>({row:`registerClass`,rule:`the meta key ${e} is refused at registration, by name`,holds:`subset`,observe(t){let{GObject:n}=t;return(attempt(()=>n.registerClass({GTypeName:`GoVecRefuse${e}`,[e]:[]},class extends n.Object{}))??``).includes(e)},shows:!0})),{row:`vfunc`,rule:`a vfunc_* method is refused at registration, naming the method`,holds:`subset`,observe(e){let{GObject:t}=e;return(attempt(()=>t.registerClass({GTypeName:`GoVecVfunc`},class extends t.Object{vfunc_constructed(){}}))??``).includes(`vfunc_constructed`)},shows:!0},{row:`Signals`,rule:`a param type outside STRING, BOOLEAN, INT, UINT and DOUBLE is refused at registration, naming the signal`,holds:`subset`,observe(e){let{GObject:t}=e,n={name:`gint64`};return(attempt(()=>t.registerClass({GTypeName:`GoVecWideSignal`,Signals:{wide:{param_types:[n]}}},class extends t.Object{}))??``).includes(`Signals.wide.param_types`)},shows:!0}];async function driveGObjectVectors(e,n,r=t){let{describe:i,it:a,expect:o}=n;await i(`${e.name}: GObject subset (ADR 0096)`,async()=>{for(let t of r)t.holds===`subset`&&e.isOracle||t.widget&&e.Widget===void 0||await a(`${t.row}: ${t.rule}`,()=>{o(JSON.stringify(t.observe(e))).toBe(JSON.stringify(t.shows))})})}export{e as GOBJECT_ROWS,t as GOBJECT_VECTORS,driveGObjectVectors};
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";const e=[`registerClass`,`field-form`,`ParamSpec`,`Signals`,`instance API`,`type_ensure`,`vfunc`,`binding engine`,`template`];function attempt(e){try{return e(),null}catch(e){return e instanceof Error?e.message:String(e)}}function count(e,t){let n={n:0};return e.connect(t,()=>{n.n++}),n}function boxTemplate(e,t=`onClicked`){return{className:e,tree:{tag:`GtkBox`,children:[{tag:`GtkSwitch`,id:`sw`,bindings:{active:{source:`template`,property:`enabled`,flags:[`bidirectional`]}}},{tag:`GtkButton`,id:`btn`,signals:[{name:`clicked`,handler:t}]}]},xml:`<interface><template class="${e}" parent="GtkBox"><child><object class="GtkSwitch" id="sw"><property name="active" bind-source="${e}" bind-property="enabled" bind-flags="bidirectional|sync-create"/></object></child><child><object class="GtkButton" id="btn"><signal name="clicked" handler="${t}"/></object></child></template></interface>`}}const t=[{row:`ParamSpec`,rule:`a generated accessor notifies once per change and not on an equal value (_generateAccessors)`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=new(t.registerClass({GTypeName:`GoVecNotify`,Properties:{code:n.string(`code`,``,``,r.READWRITE,``)}},class extends t.Object{})),a=count(i,`notify::code`),o=[];return i.code=`x`,o.push(a.n),i.code=`x`,o.push(a.n),i.code=`y`,o.push(a.n),o},shows:[1,1,2]},{row:`ParamSpec`,rule:`a property reads as its ParamSpec default until it is set, for all five kinds`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=new(t.registerClass({GTypeName:`GoVecDefaults`,Properties:{s:n.string(`s`,``,``,r.READWRITE,``),b:n.boolean(`b`,``,``,r.READWRITE,!0),n:n.int(`n`,``,``,r.READWRITE,0,10,3),d:n.double(`d`,``,``,r.READWRITE,0,1,.5),u:n.uint(`u`,``,``,r.READWRITE,0,10,2)}},class extends t.Object{}));return{s:i.s,b:i.b,n:i.n,d:i.d,u:i.u}},shows:{s:``,b:!0,n:3,d:.5,u:2}},{row:`ParamSpec`,rule:`an accessor the class defines is kept: its setter runs per assignment and decides when to notify`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=0,a=new(t.registerClass({GTypeName:`GoVecOwnAccessor`,Properties:{label:n.string(`label`,``,``,r.READWRITE,``)}},class extends t.Object{constructor(...e){super(...e),this.stored=`initial`}get label(){return this.stored}set label(e){i++,this.stored=e,this.notify(`label`)}})),o=count(a,`notify::label`);return a.label=`a`,a.label=`a`,{setterCalls:i,notifies:o.n,value:a.label}},shows:{setterCalls:2,notifies:2,value:`a`}},{row:`ParamSpec`,rule:`a dashed name is reachable as dash-name, dash_name and dashName, and one notify::dash-name serves all three`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=new(t.registerClass({GTypeName:`GoVecAliases`,Properties:{"dash-name":n.string(`dash-name`,``,``,r.READWRITE,`d`)}},class extends t.Object{})),a=[i[`dash-name`],i.dash_name,i.dashName],o=count(i,`notify::dash-name`);return i.dashName=`q`,i.dash_name=`q`,{read:a,notifies:o.n,value:i[`dash-name`]}},shows:{read:[`d`,`d`,`d`],notifies:1,value:`q`}},{row:`ParamSpec`,rule:`a CONSTRUCT_ONLY property gets no accessor on the class and keeps the value it was built with`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecConstructOnly`,Properties:{co:n.int(`co`,``,``,r.READWRITE|r.CONSTRUCT_ONLY,0,10,3)}},class extends t.Object{});return{given:new i({co:7}).co,dflt:new i().co,onPrototype:Object.getOwnPropertyDescriptor(i.prototype,`co`)!==void 0}},shows:{given:7,dflt:3,onPrototype:!1}},{row:`ParamSpec`,rule:`a CONSTRUCT property runs its own setter once at construction: with the default, or the given value`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=[],a=t.registerClass({GTypeName:`GoVecConstructSetter`,Properties:{size:n.int(`size`,``,``,r.READWRITE|r.CONSTRUCT,0,100,32)}},class extends t.Object{get size(){return this._size}set size(e){i.push(e),this._size=e,this.notify(`size`)}}),o=new a,s=i.splice(0),c=new a({size:5});return{dfltCalls:s,givenCalls:i,read:[o.size,c.size]}},shows:{dfltCalls:[32],givenCalls:[5],read:[32,5]}},{row:`ParamSpec`,rule:`construction sets a CONSTRUCT property, so writing its default afterwards is no change and notifies nothing`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecConstructDefault`,Properties:{c:n.int(`c`,``,``,r.READWRITE|r.CONSTRUCT,0,10,7),p:n.int(`p`,``,``,r.READWRITE,0,10,4)}},class extends t.Object{}),a=new i,o=[];return a.connect(`notify::c`,()=>o.push(`c`)),a.connect(`notify::p`,()=>o.push(`p`)),a.c=7,a.p=4,{read:[a.c,new i({c:3}).c],notified:o}},shows:{read:[7,3],notified:[`p`]}},{row:`Signals`,rule:`emit reaches a handler as (emitter, ...params); disconnect stops it; an undeclared name or wrong arity throws`,holds:`oracle`,observe(e){let{GObject:t}=e,n=new(t.registerClass({GTypeName:`GoVecSignals`,Signals:{changed:{param_types:[t.TYPE_STRING,t.TYPE_INT]}}},class extends t.Object{})),r=[],i=0,a=n.connect(`changed`,(...e)=>{i++,r=e});n.emit(`changed`,`s`,3);let o={argc:r.length,emitter:r[0]===n,s:r[1],n:r[2]};return n.disconnect(a),n.emit(`changed`,`t`,4),{...o,callsAfterDisconnect:i,undeclaredThrows:attempt(()=>n.emit(`nope`))!==null,shortThrows:attempt(()=>n.emit(`changed`,`s`))!==null}},shows:{argc:3,emitter:!0,s:`s`,n:3,callsAfterDisconnect:1,undeclaredThrows:!0,shortThrows:!0}},{row:`instance API`,rule:`signal_stop_emission_by_name stops the emission in progress: later handlers do not run, the next emission runs all`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=new(t.registerClass({GTypeName:`GoVecStopEmission`,Properties:{code:n.string(`code`,``,``,r.READWRITE,``)},Signals:{ping:{param_types:[]}}},class extends t.Object{})),a=[],o=!0;i.connect(`ping`,()=>{a.push(`a`),o&&t.signal_stop_emission_by_name(i,`ping`)}),i.connect(`ping`,()=>a.push(`b`)),i.emit(`ping`);let s=a.join(``);a.length=0,o=!1,i.emit(`ping`);let c=a.join(``),l=[];return i.connect(`notify::code`,()=>{l.push(`a`),t.signal_stop_emission_by_name(i,`notify::code`)}),i.connect(`notify::code`,()=>l.push(`b`)),i.code=`x`,{stopped:s,next:c,notified:l.join(``)}},shows:{stopped:`a`,next:`ab`,notified:`a`}},{row:`instance API`,rule:`signal_stop_emission_by_name stops only the innermost emission of ITS signal; with none in progress it does nothing and leaves nothing behind`,holds:`oracle`,observe(e){let{GObject:t}=e,n=new(t.registerClass({GTypeName:`GoVecStopNested`,Signals:{ping:{param_types:[]},pong:{param_types:[]}}},class extends t.Object{})),r=attempt(()=>t.signal_stop_emission_by_name(n,`ping`)),i=[],a=0;n.connect(`ping`,()=>{i.push(`a${a}`),a===0?(a=1,n.emit(`ping`),a=0):t.signal_stop_emission_by_name(n,`ping`)}),n.connect(`ping`,()=>i.push(`b${a}`)),n.emit(`ping`);let o=i.join(`,`);return i.length=0,n.connect(`pong`,()=>{i.push(`p`),t.signal_stop_emission_by_name(n,`ping`)}),n.connect(`pong`,()=>i.push(`q`)),n.emit(`pong`),{idleThrows:r!==null,nested:o,otherSignal:i.join(``)}},shows:{idleThrows:!1,nested:`a0,a1,b0`,otherSignal:`pq`}},{row:`field-form`,rule:`meta given as static symbol fields registers like the meta object (GJS only copies the object onto them)`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t;class Field extends t.Object{}Object.assign(Field,{[t.GTypeName]:`GoVecFieldForm`,[t.properties]:{code:n.string(`code`,``,``,r.READWRITE,``)},[t.signals]:{ping:{param_types:[]}}});let i=t.registerClass(Field),a=new i,o=count(a,`notify::code`),s=count(a,`ping`);return a.code=`x`,a.emit(`ping`),{typeName:i.$gtype.name,notifies:o.n,pings:s.n}},shows:{typeName:`GoVecFieldForm`,notifies:1,pings:1}},{row:`type_ensure`,rule:`$gtype is a token and type_ensure accepts it`,holds:`oracle`,observe(e){let{GObject:t}=e,n=t.registerClass({GTypeName:`GoVecToken`},class extends t.Object{}).$gtype;return{hasGtype:n!==void 0,ensured:attempt(()=>t.type_ensure(n))===null}},shows:{hasGtype:!0,ensured:!0}},{row:`binding engine`,rule:`SYNC_CREATE transfers once at bind time; without it the target keeps its own value`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecBindSync`,Properties:{on:n.boolean(`on`,``,``,r.READWRITE,!1)}},class extends t.Object{}),[a,o,s,c]=[new i,new i,new i,new i];return a.on=!0,s.on=!0,e.bind(a,`on`,o,`on`,[`sync-create`]),e.bind(s,`on`,c,`on`,[]),{withSync:o.on,withoutSync:c.on}},shows:{withSync:!0,withoutSync:!1}},{row:`binding engine`,rule:`the target follows every change of the source`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecBindFollow`,Properties:{on:n.boolean(`on`,``,``,r.READWRITE,!1)}},class extends t.Object{}),[a,o]=[new i,new i];e.bind(a,`on`,o,`on`,[`sync-create`]),a.on=!0;let s=o.on;return a.on=!1,{afterOn:s,afterOff:o.on}},shows:{afterOn:!0,afterOff:!1}},{row:`binding engine`,rule:`BIDIRECTIONAL makes the source follow the target back, without echoing`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecBindBoth`,Properties:{on:n.boolean(`on`,``,``,r.READWRITE,!1)}},class extends t.Object{}),[a,o]=[new i,new i];e.bind(a,`on`,o,`on`,[`bidirectional`,`sync-create`]),o.on=!0;let s=a.on;return a.on=!1,{back:s,forward:o.on}},shows:{back:!0,forward:!1}},{row:`binding engine`,rule:`INVERT_BOOLEAN negates what crosses, at creation and after`,holds:`oracle`,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecBindInvert`,Properties:{on:n.boolean(`on`,``,``,r.READWRITE,!1),off:n.boolean(`off`,``,``,r.READWRITE,!0)}},class extends t.Object{}),[a,o]=[new i,new i];a.on=!0,e.bind(a,`on`,o,`off`,[`sync-create`,`invert-boolean`]);let s=o.off;return a.on=!1,{created:s,after:o.off}},shows:{created:!1,after:!0}},{row:`template`,rule:`construction order: the template is built, construct properties are set (this._x is undefined inside a setter), then this._x is installed`,holds:`oracle`,widget:!0,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=[],a=new(t.registerClass({GTypeName:`GoVecOrder`,Template:e.template(boxTemplate(`GoVecOrder`)),InternalChildren:[`sw`,`btn`],Properties:{code:n.string(`code`,``,``,r.READWRITE,``),enabled:n.boolean(`enabled`,``,``,r.READWRITE,!1)}},class extends e.Widget{get code(){return this.stored}set code(e){i.push(`setter:${typeof this._sw}`),this.stored=e}onClicked(){}constructor(e){super(e),i.push(`after super:${typeof this._sw}`)}}))({code:`k`});return{log:i,code:a.code,child:typeof a._btn}},shows:{log:[`setter:undefined`,`after super:object`],code:`k`,child:`object`}},{row:`template`,rule:"a `bind template.x bidirectional` follows both ways between the template instance and its child",holds:`oracle`,widget:!0,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=new(t.registerClass({GTypeName:`GoVecTemplateBind`,Template:e.template(boxTemplate(`GoVecTemplateBind`)),InternalChildren:[`sw`,`btn`],Properties:{enabled:n.boolean(`enabled`,``,``,r.READWRITE,!1)}},class extends e.Widget{onClicked(){}})),a=i._sw.active;i.enabled=!0;let o=i._sw.active;return i._sw.active=!1,{initial:a,toChild:o,back:i.enabled}},shows:{initial:!1,toChild:!0,back:!1}},{row:`template`,rule:`a handler on the template instance runs bound to that instance and receives the emitter`,holds:`oracle`,widget:!0,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=[],a,o=new(t.registerClass({GTypeName:`GoVecHandler`,Template:e.template(boxTemplate(`GoVecHandler`)),InternalChildren:[`sw`,`btn`],Properties:{enabled:n.boolean(`enabled`,``,``,r.READWRITE,!1)}},class extends e.Widget{onClicked(e){i.push([this===a,e===this._btn])}}));return a=o,o._btn.emit(`clicked`),i},shows:[[!0,!0]]},{row:`template`,rule:"a handler the instance does not have throws `A handler called <name> was not defined` (GJS logs it as a Gtk-CRITICAL instead)",holds:`subset`,widget:!0,observe(e){let{GObject:t}=e,{ParamSpec:n,ParamFlags:r}=t,i=t.registerClass({GTypeName:`GoVecNoHandler`,Template:e.template(boxTemplate(`GoVecNoHandler`,`nope`)),InternalChildren:[`sw`,`btn`],Properties:{enabled:n.boolean(`enabled`,``,``,r.READWRITE,!1)}},class extends e.Widget{});return(attempt(()=>new i)??``).includes(`A handler called nope was not defined`)},shows:!0},...[`Children`,`Implements`,`Requires`,`GTypeFlags`].map(e=>({row:`registerClass`,rule:`the meta key ${e} is refused at registration, by name`,holds:`subset`,observe(t){let{GObject:n}=t;return(attempt(()=>n.registerClass({GTypeName:`GoVecRefuse${e}`,[e]:[]},class extends n.Object{}))??``).includes(e)},shows:!0})),{row:`vfunc`,rule:`a vfunc_* method is refused at registration, naming the method`,holds:`subset`,observe(e){let{GObject:t}=e;return(attempt(()=>t.registerClass({GTypeName:`GoVecVfunc`},class extends t.Object{vfunc_constructed(){}}))??``).includes(`vfunc_constructed`)},shows:!0},{row:`Signals`,rule:`a param type outside STRING, BOOLEAN, INT, UINT and DOUBLE is refused at registration, naming the signal`,holds:`subset`,observe(e){let{GObject:t}=e,n={name:`gint64`};return(attempt(()=>t.registerClass({GTypeName:`GoVecWideSignal`,Signals:{wide:{param_types:[n]}}},class extends t.Object{}))??``).includes(`Signals.wide.param_types`)},shows:!0}];async function driveGObjectVectors(e,n,r=t){let{describe:i,it:a,expect:o}=n;await i(`${e.name}: GObject subset (ADR 0096)`,async()=>{for(let t of r)t.holds===`subset`&&e.isOracle||t.widget&&e.Widget===void 0||await a(`${t.row}: ${t.rule}`,()=>{o(JSON.stringify(t.observe(e))).toBe(JSON.stringify(t.shows))})})}export{e as GOBJECT_ROWS,t as GOBJECT_VECTORS,driveGObjectVectors};
|
package/lib/esm/gobject.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./_virtual/_rolldown/runtime.js";import{registeredEngine as e}from"./engine.js";var UnsupportedGObjectError=class extends Error{constructor(e,t){super(t),this.name=`UnsupportedGObjectError`,this.feature=e}};const t=new WeakSet;function makeType(e){let n=Object.freeze({name:e});return t.add(n),n}const n=makeType(`gchararray`),r=makeType(`gboolean`),i=makeType(`gint`),a=makeType(`guint`),o=makeType(`gdouble`),s=new WeakMap;var Value=class{init(e){if(e!==n)throw new UnsupportedGObjectError(`GObject.Value of ${describeType(e)}`,`GObject.Value holds only TYPE_STRING in this subset (ADR 0096 Amendment 2); '${describeType(e)}' is not supported`);return s.set(this,{type:e,string:null}),this}set_string(e){let t=s.get(this);if(e!==null&&typeof e!=`string`)throw TypeError(`Expected type string for argument 'v_string' but got type ${typeof e}`);t&&(t.string=e)}get_string(){return s.get(this)?.string??null}};function readValue(e){let t=typeof e==`object`&&e?s.get(e):void 0;return t?{...t}:null}const c=[n,r,i,a,o],l={READABLE:1,WRITABLE:2,READWRITE:3,CONSTRUCT:4,CONSTRUCT_ONLY:8};var u=class ParamSpec{constructor(e,t,n,r,i,a,o,s){this.kind=e,this.name=t,this.nick=n,this.blurb=r,this.flags=i,this.defaultValue=a,this.minimum=o,this.maximum=s}static boolean(e,t,n,r,i){return new ParamSpec(`boolean`,e,t,n,r,i)}static string(e,t,n,r,i){return new ParamSpec(`string`,e,t,n,r,i)}static int(e,t,n,r,i,a,o){return new ParamSpec(`int`,e,t,n,r,o,i,a)}static uint(e,t,n,r,i,a,o){return new ParamSpec(`uint`,e,t,n,r,o,i,a)}static double(e,t,n,r,i,a,o){return new ParamSpec(`double`,e,t,n,r,o,i,a)}get_default_value(){return this.defaultValue}};const d={GTypeName:Symbol(`GType name`),GTypeFlags:Symbol(`GType flags`),interfaces:Symbol(`GType interfaces`),properties:Symbol(`GObject properties`),signals:Symbol(`GObject signals`),requires:Symbol(`GObject interface requires`),template:Symbol(`GTK widget template`),cssName:Symbol(`GTK widget CSS name`),children:Symbol(`GTK widget template children`),internalChildren:Symbol(`GTK widget template internal children`)},f={GTypeName:d.GTypeName,Template:d.template,InternalChildren:d.internalChildren,Properties:d.properties,Signals:d.signals,CssName:d.cssName},p={Children:d.children,Implements:d.interfaces,Requires:d.requires,GTypeFlags:d.GTypeFlags},m=new WeakMap;function registeredClassOf(e){return m.get(e)}function chainOf(e){let t=[];for(let n=e;typeof n==`function`;n=Object.getPrototypeOf(n)){let e=m.get(n);e&&t.push(e)}return t}function chainOfInstance(e){return chainOf(e.constructor)}function typeNameOf(e,t){return t[0]?.typeName??e.constructor.name}function aliasesOf(e){return[e,e.replace(/-/g,`_`),e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())]}function findProperty(e,t){for(let n of e)for(let e of n.properties)if(aliasesOf(e.name).includes(t))return e}function findSignal(e,t){for(let n of e)if(Object.prototype.hasOwnProperty.call(n.signals,t))return n.signals[t]}function parseSignal(e){let t=e.indexOf(`::`);return t===-1?{name:e}:{name:e.slice(0,t),detail:e.slice(t+2)}}const h=new WeakMap;function stateOf(e){let t=h.get(e);return t||(t={values:new Map,handlers:new Map,connections:new Map,emissions:[]},h.set(e,t)),t}function runHandlers(e,t,n){let r=stateOf(e),i={key:t,stopped:!1};r.emissions.push(i);try{for(let{id:a,handler:o}of(r.handlers.get(t)??[]).slice()){if(i.stopped)break;r.connections.has(a)&&o(e,...n)}}finally{r.emissions.pop()}}const g={name:`pure-js`,register(){},getValue(e,t){let{values:n}=stateOf(e);return n.has(t.name)||n.set(t.name,t.get_default_value()),n.get(t.name)},setValue(e,t,n){let{values:r}=stateOf(e),i=n!==r.get(t.name);return r.set(t.name,n),i},addHandler(e,t,n,r){let i=stateOf(e),a=i.handlers.get(n)??[];a.push({id:t,handler:r}),i.handlers.set(n,a),i.connections.set(t,()=>{a.splice(a.findIndex(e=>e.id===t),1)})},removeHandler(e,t){let n=stateOf(e),r=n.connections.get(t);return r?(n.connections.delete(t),r(),!0):!1},emit(e,t,n){runHandlers(e,t,n)},notify(e,t){runHandlers(e,`notify::${t.name}`,[t])},stopEmission(e,t){let{emissions:n}=stateOf(e);for(let e=n.length-1;e>=0;e--){let r=n[e];if(r.key===t&&!r.stopped)return r.stopped=!0,!0}return!1},bind(e,t,n,r,i){return bindProperties(e,t,n,r,i)}},_=new WeakMap;function engineOf(e){let t=_.get(e);return t||(t=chainOfInstance(e)[0]?.engine??g,_.set(e,t)),t}let v=0;const y=new WeakMap,b=Symbol.for(`@gjsify/adwaita-core/stop-emission`);function isStoppable(e){return typeof e[b]==`function`}function stopEmissionByName(e,t){if(typeof e!=`object`||!e)throw TypeError(`GObject.signal_stop_emission_by_name: not a GObject instance`);if(isStoppable(e)){e[b](t);return}let n=chainOfInstance(e),r=typeNameOf(e,n),{name:i,detail:a}=parseSignal(t),o;if(i===`notify`&&a!==void 0){let e=findProperty(n,a);e&&(o=`notify::${e.name}`)}else a===void 0&&findSignal(n,i)&&(o=i);if(o===void 0){if(!n[0])throw new UnsupportedGObjectError(`signal_stop_emission_by_name`,`'${t}' on '${r}' is not a signal of a registered class; only those can be stopped.`);console.warn(`signal '${t}' is invalid for instance of type '${r}'`);return}engineOf(e).stopEmission(e,o)||console.warn(`no emission of signal "${t}" to stop for instance of type '${r}'`)}function connectInstance(e,t,n){let r=chainOfInstance(e),i=typeNameOf(e,r),{name:a,detail:o}=parseSignal(t),own=t=>{let r=++v;return engineOf(e).addHandler(e,r,t,n),r},foreign=()=>{let a=r[0]?.door;if(!a)throw Error(`No signal '${t}' on object '${i}'`);let o=++v,s=a.listen(e,t,n),c=y.get(e);return c||y.set(e,c=new Map),c.set(o,s),o};if(a===`notify`){if(o===void 0)throw new UnsupportedGObjectError(`connect("notify")`,`connect('notify') without a property is outside the GObject subset; connect 'notify::<property>' on '${i}'.`);let e=findProperty(r,o);return e?own(`notify::${e.name}`):foreign()}if(findSignal(r,a)){if(o!==void 0)throw Error(`Signal '${a}' on object '${i}' has no detail`);return own(a)}return foreign()}function disconnectInstance(e,t){let n=y.get(e)?.get(t);if(n){y.get(e).delete(t),n();return}if(!engineOf(e).removeHandler(e,t))throw Error(`No handler with id ${t} is connected to ${String(e)}`)}function emitInstance(e,t,...n){let r=chainOfInstance(e),i=typeNameOf(e,r),a=findSignal(r,t);if(a){if(n.length!==a.length)throw Error(`Signal '${t}' on ${i} requires ${a.length} args got ${n.length}`);engineOf(e).emit(e,t,n);return}let o=r[0]?.door;if(!o)throw Error(`No signal '${t}' on object '${i}'`);o.dispatch(e,t,n)}function notifyInstance(e,t){let n=chainOfInstance(e),r=findProperty(n,t);if(r){engineOf(e).notify(e,r);return}let i=n[0]?.door;if(!i)throw Error(`No property ${t} on ${typeNameOf(e,n)}`);i.dispatch(e,`notify::${t}`,[])}function generateAccessors(e,t){let{name:n,flags:r}=e,i=r&l.READABLE,a=r&l.WRITABLE,o=t??{configurable:!0,enumerable:!0};return i&&a?!o.get&&!o.set?(o.get=function(){return engineOf(this).getValue(this,e)},o.set=function(t){engineOf(this).setValue(this,e,t)&&this.notify(n)}):o.get?o.set||=function(){throw Error(`getter defined without setter for property ${n}`)}:o.get=function(){throw Error(`setter defined without getter for property ${n}`)}:i&&!o.get?o.get=function(){throw Error(`missing getter for read-only property ${n}`)}:a&&!o.set&&(o.set=function(){throw Error(`missing setter for write-only property ${n}`)}),o}function checkAccessors(e,t){let{name:n,flags:r}=t;if(r&l.CONSTRUCT_ONLY)return;let[,i,a]=aliasesOf(n),own=t=>Object.getOwnPropertyDescriptor(e,t),o=own(n),s=o,c=n.includes(`-`),u,d;c&&(u=own(i),d=own(a),o??=u,o??=d);let f=r&l.READABLE,p=r&l.WRITABLE;(!o||f&&!o.get||p&&!o.set)&&(o=generateAccessors(t,o)),s||Object.defineProperty(e,n,o),c&&(u||Object.defineProperty(e,i,o),d||Object.defineProperty(e,a,o))}function defineConstructOnly(e,t,n){let r=engineOf(e);r.setValue(e,t,n);for(let n of new Set(aliasesOf(t.name)))Object.defineProperty(e,n,{get:()=>r.getValue(e,t),enumerable:!0,configurable:!0})}function bindProperties(e,t,n,r,i=[]){let a=i.includes(`invert-boolean`),o=!1,transfer=(e,t,n,r)=>()=>{if(!o){o=!0;try{let i=e[t];n[r]=a?!i:i}finally{o=!1}}},s=transfer(e,t,n,r),c=[[e,e.connect(`notify::${t}`,s)]];if(i.includes(`bidirectional`)){let i=transfer(n,r,e,t);c.push([n,n.connect(`notify::${r}`,i)])}return i.includes(`sync-create`)&&s(),{unbind(){for(let[e,t]of c.splice(0))e.disconnect(t)}}}function createClosure(e,t,n,r){let i=r??e;if(n)throw new UnsupportedGObjectError(`swapped`,`Unsupported template signal flag "swapped"`);let a=e[t];if(a===void 0)throw Error(`A handler called ${t} was not defined on ${String(e)}`);return a.bind(i)}function scopeOf(e){let t=engineOf(e);return{instance:e,handler:(t,n)=>createClosure(e,t,n?.flags?.includes(`swapped`)??!1,n?.object),bind:(e,n,r,i,a)=>t.bind(e,n,r,i,a??[])}}function constructRegistered(e,t={}){let n=chainOfInstance(e),r={},i=new Map;for(let[e,a]of Object.entries(t)){let t=findProperty(n,e);t?i.set(t,a):r[e]=a}let a=[];for(let t of[...n].reverse())t.template&&a.push([t,t.door.createFromTree(t.template,scopeOf(e),e)]);for(let t of n)for(let n of t.properties)n.flags&l.CONSTRUCT_ONLY&&defineConstructOnly(e,n,i.has(n)?i.get(n):n.get_default_value());for(let[t,n]of i)t.flags&l.CONSTRUCT_ONLY||(e[t.name]=n);for(let[t,n]of a){for(let r of t.internalChildren){let i=n.objects[r];if(i===void 0)throw Error(`Template of ${t.typeName} has no child object '${r}' for InternalChildren`);e[`_${r.replace(/-/g,`_`)}`]=i}t.door.attach(e,n)}return r}const own=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),x=Symbol(`GIR type`),S={"Gio.Application":[`vfunc_startup`,`vfunc_activate`],"GtkSource.GutterRenderer":[`vfunc_query_data`]};function unlockedVfuncsOf(e){let t=new Set;for(let n=e;typeof n==`function`;n=Object.getPrototypeOf(n)){let e=own(n,x)?n[x]:void 0;if(typeof e==`string`)for(let n of S[e]??[])t.add(n)}return t}function refusal(e,t,n=``){return new UnsupportedGObjectError(t,`GObject.registerClass: ${e} uses '${t}'${n}, which is outside the GObject subset (ADR 0096 § 2).`)}function describeType(e){return e?.name?.toString()??String(e)}let C=0;function registerWith(e,t,n){let r=n.length===2?n[1]:n[0];if(typeof r!=`function`)throw TypeError(`GObject.registerClass() needs a class`);let i=r,a=i.name||`anonymous class`;if(n.length===2){let e=n[0];for(let t of Object.keys(e))if(!own(f,t))throw refusal(a,t);for(let[t,n]of Object.entries(f))t in e&&(i[n]=e[t])}for(let[e,t]of Object.entries(p))if(own(i,t))throw refusal(a,e);let o=unlockedVfuncsOf(i);for(let e of[i,i.prototype])for(let t of Object.getOwnPropertyNames(e))if(t.startsWith(`vfunc_`)&&typeof Object.getOwnPropertyDescriptor(e,t)?.value==`function`&&!o.has(t))throw refusal(a,t,` (a virtual function override that UNLOCKED_VFUNCS does not list, ADR 0098 § 1a)`);let declared=e=>own(i,e)?i[e]:void 0,s=declared(d.GTypeName),l=String(s??`Gjs_${i.name||`anonymous_${++C}`}`).replace(/[^a-z0-9+_-]/gi,`_`),h=Object.values(declared(d.properties)??{}).map(e=>{if(!(e instanceof u))throw TypeError(`GObject.registerClass: ${a} declares a property that is not a ParamSpec`);return e}),g={};for(let[e,t]of Object.entries(declared(d.signals)??{})){for(let n of Object.keys(t))if(n!==`param_types`)throw refusal(a,`Signals.${e}.${n}`);let n=t.param_types??[];for(let t of n)if(!c.includes(t))throw refusal(a,`Signals.${e}.param_types`,` with the type '${describeType(t)}' (only TYPE_STRING, TYPE_BOOLEAN, TYPE_INT, TYPE_UINT and TYPE_DOUBLE)`);g[e]=n}let _=declared(d.template);if(_!==void 0&&(typeof _!=`object`||!_))throw new UnsupportedGObjectError(`Template`,`GObject.registerClass: ${a} has a Template that is not a '?template' value; a string, URI or bytes stay GJS-only (ADR 0096 § 4).`);let v=makeType(l),y={klass:i,typeName:l,gtype:v,properties:h,signals:g,template:_,internalChildren:declared(d.internalChildren)??[],cssName:declared(d.cssName),door:e,engine:t};Object.defineProperty(i,"$gtype",{get:()=>v,enumerable:!1,configurable:!1});for(let e of h)checkAccessors(i.prototype,e);return installInstanceApi(i.prototype),m.set(i,y),t.register(y),e.register(y.klass,y),y.klass}function registerBaseClass(e,t,n,r=[],i=g){let missing=e=>{throw Error(`No signal '${e}' on object '${t}'`)},a=makeType(t);Object.defineProperty(e,"$gtype",{get:()=>a,enumerable:!1,configurable:!1});for(let t of r)checkAccessors(e.prototype,t);let o={klass:e,typeName:t,gtype:a,properties:r,signals:n,internalChildren:[],engine:i,door:{name:t,dispatch:(e,t)=>missing(t),listen:(e,t)=>missing(t),createFromTree:()=>missing(`template`),attach(){},register(){}}};m.set(e,o),i.register(o)}var GObjectObject=class{constructor(e){let t=constructRegistered(this,e),n=Object.keys(t)[0];if(n!==void 0)throw Error(`No property ${n} on ${typeNameOf(this,chainOfInstance(this))}`)}notify(e){notifyInstance(this,e)}connect(e,t){return connectInstance(this,e,t)}disconnect(e){disconnectInstance(this,e)}emit(e,...t){emitInstance(this,e,...t)}};function installInstanceApi(e){for(let t of[`notify`,`connect`,`disconnect`,`emit`])typeof e[t]!=`function`&&Object.defineProperty(e,t,{value:GObjectObject.prototype[t],writable:!0,configurable:!0,enumerable:!1})}function createGObject(e,s=g){return{engineName:s.name,Object:GObjectObject,registerClass:((...t)=>registerWith(e,s,t)),ParamSpec:u,ParamFlags:l,Value,TYPE_STRING:n,TYPE_BOOLEAN:r,TYPE_INT:i,TYPE_UINT:a,TYPE_DOUBLE:o,GTypeName:d.GTypeName,GTypeFlags:d.GTypeFlags,interfaces:d.interfaces,properties:d.properties,signals:d.signals,requires:d.requires,__gtkTemplate__:d.template,__gtkCssName__:d.cssName,__gtkChildren__:d.children,__gtkInternalChildren__:d.internalChildren,type_ensure(e){if(!t.has(e))throw TypeError(`GObject.type_ensure: not a GType of this GObject`)},signal_stop_emission_by_name:stopEmissionByName}}function gobjectEngineName(){return e()?.name??g.name}export{x as GIR_TYPE,GObjectObject,d as META_SYMBOLS,g as PURE_JS_ENGINE,l as ParamFlags,u as ParamSpec,b as STOP_EMISSION,r as TYPE_BOOLEAN,o as TYPE_DOUBLE,i as TYPE_INT,n as TYPE_STRING,a as TYPE_UINT,S as UNLOCKED_VFUNCS,UnsupportedGObjectError,Value,bindProperties,connectInstance,constructRegistered,createClosure,createGObject,disconnectInstance,emitInstance,gobjectEngineName,notifyInstance,readValue,registerBaseClass,registeredClassOf,stopEmissionByName};
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{registeredEngine as e}from"./engine.js";var UnsupportedGObjectError=class extends Error{constructor(e,t){super(t),this.name=`UnsupportedGObjectError`,this.feature=e}};const t=new WeakSet;function makeType(e){let n=Object.freeze({name:e});return t.add(n),n}const n=makeType(`gchararray`),r=makeType(`gboolean`),i=makeType(`gint`),a=makeType(`guint`),o=makeType(`gdouble`),s=new WeakMap;var Value=class{init(e){if(e!==n)throw new UnsupportedGObjectError(`GObject.Value of ${describeType(e)}`,`GObject.Value holds only TYPE_STRING in this subset (ADR 0096 Amendment 2); '${describeType(e)}' is not supported`);return s.set(this,{type:e,string:null}),this}set_string(e){let t=s.get(this);if(e!==null&&typeof e!=`string`)throw TypeError(`Expected type string for argument 'v_string' but got type ${typeof e}`);t&&(t.string=e)}get_string(){return s.get(this)?.string??null}};function readValue(e){let t=typeof e==`object`&&e?s.get(e):void 0;return t?{...t}:null}const c=[n,r,i,a,o],l={READABLE:1,WRITABLE:2,READWRITE:3,CONSTRUCT:4,CONSTRUCT_ONLY:8};var u=class ParamSpec{constructor(e,t,n,r,i,a,o,s){this.kind=e,this.name=t,this.nick=n,this.blurb=r,this.flags=i,this.defaultValue=a,this.minimum=o,this.maximum=s}static boolean(e,t,n,r,i){return new ParamSpec(`boolean`,e,t,n,r,i)}static string(e,t,n,r,i){return new ParamSpec(`string`,e,t,n,r,i)}static int(e,t,n,r,i,a,o){return new ParamSpec(`int`,e,t,n,r,o,i,a)}static uint(e,t,n,r,i,a,o){return new ParamSpec(`uint`,e,t,n,r,o,i,a)}static double(e,t,n,r,i,a,o){return new ParamSpec(`double`,e,t,n,r,o,i,a)}get_default_value(){return this.defaultValue}};const d={GTypeName:Symbol(`GType name`),GTypeFlags:Symbol(`GType flags`),interfaces:Symbol(`GType interfaces`),properties:Symbol(`GObject properties`),signals:Symbol(`GObject signals`),requires:Symbol(`GObject interface requires`),template:Symbol(`GTK widget template`),cssName:Symbol(`GTK widget CSS name`),children:Symbol(`GTK widget template children`),internalChildren:Symbol(`GTK widget template internal children`)},f={GTypeName:d.GTypeName,Template:d.template,InternalChildren:d.internalChildren,Properties:d.properties,Signals:d.signals,CssName:d.cssName},p={Children:d.children,Implements:d.interfaces,Requires:d.requires,GTypeFlags:d.GTypeFlags},m=new WeakMap;function registeredClassOf(e){return m.get(e)}function chainOf(e){let t=[];for(let n=e;typeof n==`function`;n=Object.getPrototypeOf(n)){let e=m.get(n);e&&t.push(e)}return t}function chainOfInstance(e){return chainOf(e.constructor)}function typeNameOf(e,t){return t[0]?.typeName??e.constructor.name}function aliasesOf(e){return[e,e.replace(/-/g,`_`),e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())]}function findProperty(e,t){for(let n of e)for(let e of n.properties)if(aliasesOf(e.name).includes(t))return e}function findSignal(e,t){for(let n of e)if(Object.prototype.hasOwnProperty.call(n.signals,t))return n.signals[t]}function parseSignal(e){let t=e.indexOf(`::`);return t===-1?{name:e}:{name:e.slice(0,t),detail:e.slice(t+2)}}const h=new WeakMap;function stateOf(e){let t=h.get(e);return t||(t={values:new Map,handlers:new Map,connections:new Map,emissions:[]},h.set(e,t)),t}function runHandlers(e,t,n){let r=stateOf(e),i={key:t,stopped:!1};r.emissions.push(i);try{for(let{id:a,handler:o}of(r.handlers.get(t)??[]).slice()){if(i.stopped)break;r.connections.has(a)&&o(e,...n)}}finally{r.emissions.pop()}}const g={name:`pure-js`,register(){},getValue(e,t){let{values:n}=stateOf(e);return n.has(t.name)||n.set(t.name,t.get_default_value()),n.get(t.name)},setValue(e,t,n){let{values:r}=stateOf(e),i=n!==r.get(t.name);return r.set(t.name,n),i},addHandler(e,t,n,r){let i=stateOf(e),a=i.handlers.get(n)??[];a.push({id:t,handler:r}),i.handlers.set(n,a),i.connections.set(t,()=>{a.splice(a.findIndex(e=>e.id===t),1)})},removeHandler(e,t){let n=stateOf(e),r=n.connections.get(t);return r?(n.connections.delete(t),r(),!0):!1},emit(e,t,n){runHandlers(e,t,n)},notify(e,t){runHandlers(e,`notify::${t.name}`,[t])},stopEmission(e,t){let{emissions:n}=stateOf(e);for(let e=n.length-1;e>=0;e--){let r=n[e];if(r.key===t&&!r.stopped)return r.stopped=!0,!0}return!1},bind(e,t,n,r,i){return bindProperties(e,t,n,r,i)}},_=new WeakMap;function engineOf(e){let t=_.get(e);return t||(t=chainOfInstance(e)[0]?.engine??g,_.set(e,t)),t}let v=0;const y=new WeakMap,b=Symbol.for(`@gjsify/adwaita-core/stop-emission`);function isStoppable(e){return typeof e[b]==`function`}function stopEmissionByName(e,t){if(typeof e!=`object`||!e)throw TypeError(`GObject.signal_stop_emission_by_name: not a GObject instance`);if(isStoppable(e)){e[b](t);return}let n=chainOfInstance(e),r=typeNameOf(e,n),{name:i,detail:a}=parseSignal(t),o;if(i===`notify`&&a!==void 0){let e=findProperty(n,a);e&&(o=`notify::${e.name}`)}else a===void 0&&findSignal(n,i)&&(o=i);if(o===void 0){if(!n[0])throw new UnsupportedGObjectError(`signal_stop_emission_by_name`,`'${t}' on '${r}' is not a signal of a registered class; only those can be stopped.`);console.warn(`signal '${t}' is invalid for instance of type '${r}'`);return}engineOf(e).stopEmission(e,o)||console.warn(`no emission of signal "${t}" to stop for instance of type '${r}'`)}function connectInstance(e,t,n){let r=chainOfInstance(e),i=typeNameOf(e,r),{name:a,detail:o}=parseSignal(t),own=t=>{let r=++v;return engineOf(e).addHandler(e,r,t,n),r},foreign=()=>{let a=r[0]?.door;if(!a)throw Error(`No signal '${t}' on object '${i}'`);let o=++v,s=a.listen(e,t,n),c=y.get(e);return c||y.set(e,c=new Map),c.set(o,s),o};if(a===`notify`){if(o===void 0)throw new UnsupportedGObjectError(`connect("notify")`,`connect('notify') without a property is outside the GObject subset; connect 'notify::<property>' on '${i}'.`);let e=findProperty(r,o);return e?own(`notify::${e.name}`):foreign()}if(findSignal(r,a)){if(o!==void 0)throw Error(`Signal '${a}' on object '${i}' has no detail`);return own(a)}return foreign()}function disconnectInstance(e,t){let n=y.get(e)?.get(t);if(n){y.get(e).delete(t),n();return}if(!engineOf(e).removeHandler(e,t))throw Error(`No handler with id ${t} is connected to ${String(e)}`)}function emitInstance(e,t,...n){let r=chainOfInstance(e),i=typeNameOf(e,r),a=findSignal(r,t);if(a){if(n.length!==a.length)throw Error(`Signal '${t}' on ${i} requires ${a.length} args got ${n.length}`);engineOf(e).emit(e,t,n);return}let o=r[0]?.door;if(!o)throw Error(`No signal '${t}' on object '${i}'`);o.dispatch(e,t,n)}function notifyInstance(e,t){let n=chainOfInstance(e),r=findProperty(n,t);if(r){engineOf(e).notify(e,r);return}let i=n[0]?.door;if(!i)throw Error(`No property ${t} on ${typeNameOf(e,n)}`);i.dispatch(e,`notify::${t}`,[])}function generateAccessors(e,t){let{name:n,flags:r}=e,i=r&l.READABLE,a=r&l.WRITABLE,o=t??{configurable:!0,enumerable:!0};return i&&a?!o.get&&!o.set?(o.get=function(){return engineOf(this).getValue(this,e)},o.set=function(t){engineOf(this).setValue(this,e,t)&&this.notify(n)}):o.get?o.set||=function(){throw Error(`getter defined without setter for property ${n}`)}:o.get=function(){throw Error(`setter defined without getter for property ${n}`)}:i&&!o.get?o.get=function(){throw Error(`missing getter for read-only property ${n}`)}:a&&!o.set&&(o.set=function(){throw Error(`missing setter for write-only property ${n}`)}),o}function checkAccessors(e,t){let{name:n,flags:r}=t;if(r&l.CONSTRUCT_ONLY)return;let[,i,a]=aliasesOf(n),own=t=>Object.getOwnPropertyDescriptor(e,t),o=own(n),s=o,c=n.includes(`-`),u,d;c&&(u=own(i),d=own(a),o??=u,o??=d);let f=r&l.READABLE,p=r&l.WRITABLE;(!o||f&&!o.get||p&&!o.set)&&(o=generateAccessors(t,o)),s||Object.defineProperty(e,n,o),c&&(u||Object.defineProperty(e,i,o),d||Object.defineProperty(e,a,o))}function defineConstructOnly(e,t,n){let r=engineOf(e);r.setValue(e,t,n);for(let n of new Set(aliasesOf(t.name)))Object.defineProperty(e,n,{get:()=>r.getValue(e,t),enumerable:!0,configurable:!0})}function bindProperties(e,t,n,r,i=[]){let a=i.includes(`invert-boolean`),o=!1,transfer=(e,t,n,r)=>()=>{if(!o){o=!0;try{let i=e[t];n[r]=a?!i:i}finally{o=!1}}},s=transfer(e,t,n,r),c=[[e,e.connect(`notify::${t}`,s)]];if(i.includes(`bidirectional`)){let i=transfer(n,r,e,t);c.push([n,n.connect(`notify::${r}`,i)])}return i.includes(`sync-create`)&&s(),{unbind(){for(let[e,t]of c.splice(0))e.disconnect(t)}}}function createClosure(e,t,n,r){let i=r??e;if(n)throw new UnsupportedGObjectError(`swapped`,`Unsupported template signal flag "swapped"`);let a=e[t];if(a===void 0)throw Error(`A handler called ${t} was not defined on ${String(e)}`);return a.bind(i)}function scopeOf(e){let t=engineOf(e);return{instance:e,handler:(t,n)=>createClosure(e,t,n?.flags?.includes(`swapped`)??!1,n?.object),bind:(e,n,r,i,a)=>t.bind(e,n,r,i,a??[])}}function constructRegistered(e,t={}){let n=chainOfInstance(e),r={},i=new Map;for(let[e,a]of Object.entries(t)){let t=findProperty(n,e);t?i.set(t,a):r[e]=a}let a=[];for(let t of[...n].reverse())t.template&&a.push([t,t.door.createFromTree(t.template,scopeOf(e),e)]);for(let t of n)for(let n of t.properties)n.flags&l.CONSTRUCT_ONLY&&defineConstructOnly(e,n,i.has(n)?i.get(n):n.get_default_value());for(let t of[...n].reverse())for(let n of t.properties)n.flags&l.CONSTRUCT&&!(n.flags&l.CONSTRUCT_ONLY)&&(e[n.name]=i.has(n)?i.get(n):n.get_default_value());for(let[t,n]of i)t.flags&(l.CONSTRUCT|l.CONSTRUCT_ONLY)||(e[t.name]=n);for(let[t,n]of a){for(let r of t.internalChildren){let i=n.objects[r];if(i===void 0)throw Error(`Template of ${t.typeName} has no child object '${r}' for InternalChildren`);e[`_${r.replace(/-/g,`_`)}`]=i}t.door.attach(e,n)}return r}const own=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),x=Symbol(`GIR type`),S={"Gio.Application":[`vfunc_startup`,`vfunc_activate`],"GtkSource.GutterRenderer":[`vfunc_query_data`]};function unlockedVfuncsOf(e){let t=new Set;for(let n=e;typeof n==`function`;n=Object.getPrototypeOf(n)){let e=own(n,x)?n[x]:void 0;if(typeof e==`string`)for(let n of S[e]??[])t.add(n)}return t}function refusal(e,t,n=``){return new UnsupportedGObjectError(t,`GObject.registerClass: ${e} uses '${t}'${n}, which is outside the GObject subset (ADR 0096 § 2).`)}function describeType(e){return e?.name?.toString()??String(e)}let C=0;function registerWith(e,t,n){let r=n.length===2?n[1]:n[0];if(typeof r!=`function`)throw TypeError(`GObject.registerClass() needs a class`);let i=r,a=i.name||`anonymous class`;if(n.length===2){let e=n[0];for(let t of Object.keys(e))if(!own(f,t))throw refusal(a,t);for(let[t,n]of Object.entries(f))t in e&&(i[n]=e[t])}for(let[e,t]of Object.entries(p))if(own(i,t))throw refusal(a,e);let o=unlockedVfuncsOf(i);for(let e of[i,i.prototype])for(let t of Object.getOwnPropertyNames(e))if(t.startsWith(`vfunc_`)&&typeof Object.getOwnPropertyDescriptor(e,t)?.value==`function`&&!o.has(t))throw refusal(a,t,` (a virtual function override that UNLOCKED_VFUNCS does not list, ADR 0098 § 1a)`);let declared=e=>own(i,e)?i[e]:void 0,s=declared(d.GTypeName),l=String(s??`Gjs_${i.name||`anonymous_${++C}`}`).replace(/[^a-z0-9+_-]/gi,`_`),h=Object.values(declared(d.properties)??{}).map(e=>{if(!(e instanceof u))throw TypeError(`GObject.registerClass: ${a} declares a property that is not a ParamSpec`);return e}),g={};for(let[e,t]of Object.entries(declared(d.signals)??{})){for(let n of Object.keys(t))if(n!==`param_types`)throw refusal(a,`Signals.${e}.${n}`);let n=t.param_types??[];for(let t of n)if(!c.includes(t))throw refusal(a,`Signals.${e}.param_types`,` with the type '${describeType(t)}' (only TYPE_STRING, TYPE_BOOLEAN, TYPE_INT, TYPE_UINT and TYPE_DOUBLE)`);g[e]=n}let _=declared(d.template);if(_!==void 0&&(typeof _!=`object`||!_))throw new UnsupportedGObjectError(`Template`,`GObject.registerClass: ${a} has a Template that is not a '?template' value; a string, URI or bytes stay GJS-only (ADR 0096 § 4).`);let v=makeType(l),y={klass:i,typeName:l,gtype:v,properties:h,signals:g,template:_,internalChildren:declared(d.internalChildren)??[],cssName:declared(d.cssName),door:e,engine:t};Object.defineProperty(i,"$gtype",{get:()=>v,enumerable:!1,configurable:!1});for(let e of h)checkAccessors(i.prototype,e);return installInstanceApi(i.prototype),m.set(i,y),t.register(y),e.register(y.klass,y),y.klass}function registerBaseClass(e,t,n,r=[],i=g){let missing=e=>{throw Error(`No signal '${e}' on object '${t}'`)},a=makeType(t);Object.defineProperty(e,"$gtype",{get:()=>a,enumerable:!1,configurable:!1});for(let t of r)checkAccessors(e.prototype,t);let o={klass:e,typeName:t,gtype:a,properties:r,signals:n,internalChildren:[],engine:i,door:{name:t,dispatch:(e,t)=>missing(t),listen:(e,t)=>missing(t),createFromTree:()=>missing(`template`),attach(){},register(){}}};m.set(e,o),i.register(o)}var GObjectObject=class{constructor(e){let t=constructRegistered(this,e),n=Object.keys(t)[0];if(n!==void 0)throw Error(`No property ${n} on ${typeNameOf(this,chainOfInstance(this))}`)}notify(e){notifyInstance(this,e)}connect(e,t){return connectInstance(this,e,t)}disconnect(e){disconnectInstance(this,e)}emit(e,...t){emitInstance(this,e,...t)}};function installInstanceApi(e){for(let t of[`notify`,`connect`,`disconnect`,`emit`])typeof e[t]!=`function`&&Object.defineProperty(e,t,{value:GObjectObject.prototype[t],writable:!0,configurable:!0,enumerable:!1})}function createGObject(e,s=g){return{engineName:s.name,Object:GObjectObject,registerClass:((...t)=>registerWith(e,s,t)),ParamSpec:u,ParamFlags:l,Value,TYPE_STRING:n,TYPE_BOOLEAN:r,TYPE_INT:i,TYPE_UINT:a,TYPE_DOUBLE:o,GTypeName:d.GTypeName,GTypeFlags:d.GTypeFlags,interfaces:d.interfaces,properties:d.properties,signals:d.signals,requires:d.requires,__gtkTemplate__:d.template,__gtkCssName__:d.cssName,__gtkChildren__:d.children,__gtkInternalChildren__:d.internalChildren,type_ensure(e){if(!t.has(e))throw TypeError(`GObject.type_ensure: not a GType of this GObject`)},signal_stop_emission_by_name:stopEmissionByName}}function gobjectEngineName(){return e()?.name??g.name}export{x as GIR_TYPE,GObjectObject,d as META_SYMBOLS,g as PURE_JS_ENGINE,l as ParamFlags,u as ParamSpec,b as STOP_EMISSION,r as TYPE_BOOLEAN,o as TYPE_DOUBLE,i as TYPE_INT,n as TYPE_STRING,a as TYPE_UINT,S as UNLOCKED_VFUNCS,UnsupportedGObjectError,Value,bindProperties,connectInstance,constructRegistered,createClosure,createGObject,disconnectInstance,emitInstance,gobjectEngineName,notifyInstance,readValue,registerBaseClass,registeredClassOf,stopEmissionByName};
|
package/lib/types/gobject.d.ts
CHANGED
|
@@ -163,7 +163,7 @@ export declare function bindProperties(source: GObjectInstance, sourceProperty:
|
|
|
163
163
|
export declare function createClosure(thisArg: object, handlerName: string, swapped: boolean, connectObject?: object): (...args: unknown[]) => unknown;
|
|
164
164
|
/**
|
|
165
165
|
* Runs ADR 0096 § 3 steps 4–5 for a registered instance, in GJS's order: every template of the
|
|
166
|
-
* class chain is built first (base first), then the
|
|
166
|
+
* class chain is built first (base first), then the properties are set, and only then
|
|
167
167
|
* is each `InternalChildren` id installed as `this._<id>`. So `this._x` is `undefined` inside a
|
|
168
168
|
* property setter that runs during construction and defined once `super(params)` returns.
|
|
169
169
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gjsify/adwaita-core",
|
|
3
|
-
"version": "0.64.
|
|
3
|
+
"version": "0.64.1-next.241",
|
|
4
4
|
"description": "Headless Adwaita widget behavior (breakpoint condition grammar + apply/unapply state machine, color-scheme observable, avatar derivation) shared by the web and NativeScript Adwaita renderers — pure TS, no platform imports",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "lib/esm/index.js",
|
|
@@ -60,9 +60,9 @@
|
|
|
60
60
|
"headless"
|
|
61
61
|
],
|
|
62
62
|
"devDependencies": {
|
|
63
|
-
"@gjsify/cli": "
|
|
63
|
+
"@gjsify/cli": "0.64.1-next.241",
|
|
64
64
|
"@gjsify/node-gi": "file:../../../packages/node-gi/node-gi",
|
|
65
|
-
"@gjsify/unit": "
|
|
65
|
+
"@gjsify/unit": "0.64.1-next.241",
|
|
66
66
|
"@types/node": "^25.9.2",
|
|
67
67
|
"typescript": "^6.0.3"
|
|
68
68
|
},
|
|
@@ -85,5 +85,6 @@
|
|
|
85
85
|
"bugs": {
|
|
86
86
|
"url": "https://github.com/gjsify/gjsify/issues"
|
|
87
87
|
},
|
|
88
|
-
"homepage": "https://github.com/gjsify/gjsify/tree/main/packages/web/adwaita-core#readme"
|
|
88
|
+
"homepage": "https://github.com/gjsify/gjsify/tree/main/packages/web/adwaita-core#readme",
|
|
89
|
+
"gitHead": "9937e8d27d18d159e35471b6669bdca6dff0cd05"
|
|
89
90
|
}
|