PrawnOS-nonfree/resources/InstallResources/extensions/remove-dropdown-arrows@mpdeimos.com/extension.js
gdallasdye 93192fa511
Revived Gnome Support (#162)
* Add gnome, stable and unstable mesa packages,

* Install unstable mesa and stable gnome packages
2020-05-26 16:43:15 -07:00

163 lines
3.6 KiB
JavaScript

/* jshint esnext:true */
const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib;
const Main = imports.ui.main;
const Mainloop = imports.mainloop;
const MAX_RECURSE_DEPTH = 3;
let signalConnections = [];
let dropdowns = [];
/**
* Try hide a single dropdown actor.
*
* Return true on success.
*/
function _apply(actor)
{
if (!actor.has_style_class_name || !actor.has_style_class_name('popup-menu-arrow'))
{
return false;
}
actor.hide();
if (dropdowns.indexOf(actor) < 0)
{
let connection = {
object: actor,
id: actor.connect('destroy', function()
{
let index;
index = signalConnections.indexOf(connection);
if (index >= 0)
{
signalConnections.splice(index, 1);
}
index = dropdowns.indexOf(actor);
if (index >= 0)
{
dropdowns.splice(index, 1);
}
})
};
signalConnections.push(connection);
dropdowns.push(actor);
}
return true;
}
/**
* Similar function to _recursiveApply(), but intended for containers.
*/
function _recursiveApplyInternal(actor, depth)
{
if (typeof actor.get_children === 'undefined')
{
return false;
}
let children = actor.get_children();
// If there are no children then it's possible that actor hasn't been fully initialized yet.
// Shedule to check later.
if (children.length == 0)
{
_scheduleApply(actor);
return false;
}
// Check actor immediate children before using recursion
if (children.map(child => _apply(child)).indexOf(true) >= 0)
{
return true;
}
// Check children recursively
if (depth < MAX_RECURSE_DEPTH)
{
if (children.map(child => _recursiveApplyInternal(child, depth +1)).indexOf(true) >= 0)
{
return true;
}
}
return false;
}
function _scheduleApply(actor)
{
let actorAddedId, destroyId, timeoutId;
actorAddedId = actor.connect('actor-added', function(child)
{
if (_recursiveApply(child))
{
actor.disconnect(actorAddedId);
actor.disconnect(destroyId);
Mainloop.source_remove(timeoutId);
actorAddedId = destroyId = timeoutId = 0;
}
});
destroyId = actor.connect('destroy', function()
{
if (timeoutId != 0) {
Mainloop.source_remove(timeoutId);
timeoutId = 0;
}
});
timeoutId = Mainloop.idle_add(function()
{
actor.disconnect(actorAddedId);
actor.disconnect(destroyId);
actorAddedId = destroyId = timeoutId = 0;
return GLib.SOURCE_REMOVE;
});
}
function _recursiveApply(actor)
{
return _apply(actor) || _recursiveApplyInternal(actor, 0);
}
function init()
{
// no initialization required
}
function enable()
{
let panelActor = Main.panel instanceof Clutter.Actor ? Main.panel : Main.panel.actor;
panelActor.get_children().forEach(
function(actor)
{
signalConnections.push({
object: actor,
id: actor.connect('actor-added', _recursiveApply)
});
actor.get_children().forEach(_recursiveApply);
});
}
function disable()
{
while (signalConnections.length > 0)
{
let connection = signalConnections.pop();
connection.object.disconnect(connection.id);
}
while (dropdowns.length > 0)
{
let actor = dropdowns.pop();
actor.show();
}
}