<?php
class dock extends Plugin {
public $location = "taskbar";
public $width = 128;
private $supreme;
private $conf_dock, $DOCKBOX, $css_provider, $style_context, $icon_theme;
private $INSTALLED_APPS;
private $ITEMS;
private $ITEM;
private $MENU;
private $old_windows_state, $new_windows_state;
private $temp;
private $sleep;
private $CONF_MTIME, $DOCK_MTIME;
private $TEMP_NAMES;
private $css_dock = "
#item1 {background: none; padding: 0px;background: none; border: 2px solid alpha(@selected_bg_color, 0);opacity: 0.9;}
#item1:hover {background: none; padding: 0px;background: none; border-bottom: 2px solid alpha(@selected_bg_color, 255);opacity: 0.9;}
#item:hover{background: none; border-bottom: 2px solid alpha(@selected_bg_color, 1); opacity: 1;}
#dialog_entry: {margin-bottom: 5px;}
";
private function d2s($src) {
if (substr_count($src, "%u") > 0) {
$src = str_replace("%u", '', $src);
}
if (substr_count($src, "%U") > 0) {
$src = str_replace("%U", '', $src);
}
if (substr_count($src, "%f") > 0) {
$src = str_replace("%f", '', $src);
}
if (substr_count($src, "%F") > 0) {
$src = str_replace("%F", '', $src);
}
return $src;
}
private function compare_arrays(array $array1, array $array2): array
{
$changes = [];
// Поиск измененных и удаленных элементов
foreach ($array1 as $key => $value) {
if (!isset($array2[$key])) {
$changes['deleted'][$key] = $value; // Элемент удален
} elseif ($array1[$key] != $array2[$key]) {
$changes['changed'][$key] = [
'old' => $value,
'new' => $array2[$key],
]; // Элемент изменен
}
}
// Поиск добавленных элементов
foreach ($array2 as $key => $value) {
if (!isset($array1[$key])) {
$changes['added'][$key] = $value; // Элемент добавлен
}
}
return $changes;
}
private function click_process($button, $event) {
$key = $button->get_data("key");
// print_r($this->ITEMS["$key"]);
if ($event->button->button == 3) { // Обработчик правой кнопки
$this->MENU = new GtkMenu();
$menu_item=GtkMenuItem::new_with_label($this->ITEMS[$key]["display_name"]);
$menu_item->set_sensitive(false);
$this->MENU->append($menu_item);
if (isset($this->ITEMS["$key"]["desktop_file"])) {// Сначала если есть - отображаем специфичные фишки запуска из .desktop-файла
$ini=pif($this->ITEMS["$key"]["desktop_file"], array("Desktop Entry"));
//$menu_item=GtkMenuItem::new_with_label($ini["Desktop Entry"]["Name"]);
if (isset($ini["Desktop Entry"]["Actions"])) {
$tmp = explode(';', $ini["Desktop Entry"]["Actions"]);
for ($i = 0; $i <= count($tmp)-1; $i++) {
if ($tmp[$i]!="") {
$ini=pif($this->ITEMS["$key"]["desktop_file"], array("Desktop Action $tmp[$i]"));
$action[$i]["Name"] = $ini["Desktop Action ".$tmp[$i]]["Name"];
$action[$i]["Exec"] = $ini["Desktop Action ".$tmp[$i]]["Exec"];
if (isset($action[$i]["Name"])) {
$this->MENU->append($menu_item=GtkMenuItem::new_with_label($action[$i]["Name"]));
$menu_item->set_name($action[$i]["Exec"]);
$this->temp = str_replace("%U", "~", $action[$i]["Exec"]);
$menu_item->set_data("exec", $action[$i]["Exec"]);
$menu_item->connect("activate", function($widget) { // connect menu to event activate
$exec = $widget->get_data("exec");
execute($exec);
});
}
}
}
$this->MENU->append(new GtkSeparatorMenuItem());
}
} // Конец отображения специфичных фишек запуска из .desktop-файла
if ($this->ITEMS["$key"]["docked"]=="1") { // Добавление в док или изьятие из дока
$this->MENU->append($menu_item=GtkMenuItem::new_with_label("Remove from dock items"));
$menu_item->set_data("key", $key);
$menu_item->connect("activate", function($widget) {
$key = $widget->get_data("key");
// echo "KEY: $key \n";
$this->remove_from_dock($widget->get_data("key"));
});
$this->MENU->append($menu_item=GtkMenuItem::new_with_label("Dock item properties"));
$menu_item->set_data("key", $key);
$menu_item->connect("activate", function($widget) {
$key = $widget->get_data("key");
execute("/usr/local/supreme/panel/plugins/dock/item_property.php ".$this->ITEMS["$key"]["dockfile"]);
});
} else {
if ($this->ITEMS["$key"]["docked"]=="0") {
$this->MENU->append($menu_item=GtkMenuItem::new_with_label("Add to dock items"));
$menu_item->set_data("key", $key);
$menu_item->connect("activate", function($widget) {
$key = $widget->get_data("key");
// echo "KEY: $key \n";
$this->add_to_dock($widget->get_data("key"));
});
}
}
if (isset($this->ITEMS["$key"]["xid"])) { // Отображаем меню для запущенных программ
$this->MENU->append(new GtkSeparatorMenuItem());
if ($this->conf_dock["dockbar_use_extended_menu"]==1) {
$this->MENU->append($menu_item=GtkMenuItem::new_with_label("Process details"));
$menu_item->set_data("pid", $this->ITEMS["$key"]["pid"]);
$menu_item->connect("activate", function($widget) {
$pid = $widget->get_data("pid");
$this->supreme->execute("/system/php/bin/php /usr/local/supreme/utils/pidinfo.php $pid");
echo ":)";
});
$this->MENU->append($menu_item=GtkMenuItem::new_with_label("Set temporary name"));
$menu_item->set_data("key", $key);
$menu_item->connect("activate", function($widget) {
$key = $widget->get_data("key");
//$exec = $this->d2s($this->INSTALLED_APPS["$key"]["exec"]);
//$this->supreme->execute($exec);
$dialog = new GtkDialog();
$entry = new GtkEntry();
$area = $dialog->get_content_area();
$area->add($entry);
$entry->show_all();
$dialog->add_button("Apply",1);
$dialog->add_button("Close",2);
$dialog->set_default_response(1);
$dialog->set_vexpand(true);
$dialog->set_size_request(-1,100);
$entry->set_name("dialog_entry");
$entry->connect("activate", function($widget) {
$parent = $widget->get_parent()->get_parent();
$parent->response(1);
});
$dialog->set_title("New temporary name");
$responce = $dialog->run();
if ($responce==1) {
$name = $entry->get_text();
if ($name!="") {
$this->TEMP_NAMES["$key"] = $name;
} else {
unset($this->TEMP_NAMES["$key"]);
}
touch("/home/".$_SERVER["USER"]."/.config/dock");
$dialog->destroy();
}
if ($responce==2) {
$dialog->destroy();
}
});
$this->MENU->append($menu_item=GtkMenuItem::new_with_label("Run another instance"));
$menu_item->set_data("key", $key);
$menu_item->connect("activate", function($widget) {
$key = $widget->get_data("key");
$exec = $this->d2s($this->INSTALLED_APPS["$key"]["exec"]);
$this->supreme->execute($exec);
});
$this->MENU->append($menu_item=GtkMenuItem::new_with_label("Forced close"));
$menu_item->set_data("pid", $this->ITEMS["$key"]["pid"]);
$menu_item->connect("activate", function($widget) { // connect menu to event activate
$pid = $widget->get_data("pid");
exec("kill -9 $pid");
});
}
$this->MENU->append($menu_item=GtkMenuItem::new_with_label("Close"));
$menu_item->set_data("xid", $this->ITEMS["$key"]["xid"]);
$menu_item->connect("activate", function($widget) { // connect menu to event activate
$this->supreme->toggleWindowFromDock($widget->get_data("xid"));
$this->supreme->closeWindow($widget->get_data("xid"));
});
}
$this->MENU->connect("deactivate", function($widget) {
unset($this->MENU);
// echo gc_collect_cycles() . " циклов мусора было собрано.\n";
});
$this->MENU->show_all();
$this->MENU->popup_at_pointer();
}// Закрытие обработчика правой кнопки
if ($event->button->button == 1) { // Обработчик левой кнопки
if (isset($this->ITEMS[$key]["xid"])) { // Если это запущенное приложение, имеющее xid, то активируем его
$this->supreme->toggleWindowFromDock($this->ITEMS[$key]["xid"]);
} else { // Иначе запускаем
$exec = $this->d2s($this->ITEMS[$key]["exec"]); // Потенциально эти if'ы потом можно будет объединить на этапе формирования массива
echo "Exec = $exec \n";
execute($exec);
}
} // Закрытие обработчика левой кнопки
}
private function add_to_dock($key) {
//print_r($this->ITEMS[$key]);
// print_r($this->ITEMS[$key]);
$icon = $this->ITEMS[$key]["icon"];
$name = $this->ITEMS[$key]["canonical_name"];
$desktop = $this->ITEMS[$key]["desktop_file"];
if (isset($this->ITEMS[$key]["desktop_file"])) {
//$exec = $ini["Desktop Entry"]["Exec"];
$exec = $cmd = readlink("/proc/".$this->ITEMS[$key]["pid"]."/exe");
$ini=pif($this->ITEMS[$key]["desktop_file"], array("Desktop Entry"));
if (isset($ini["Desktop Entry"]["StartupWMClass"])) {
$id = strtolower(basename($ini["Desktop Entry"]["StartupWMClass"]));
} elseif (isset($ini["Desktop Entry"]["Exec"])) {
$id = $this->d2s(strtolower(basename($ini["Desktop Entry"]["Exec"])));
}
} else {
$id = strtolower($name);
$exec = $cmd = readlink("/proc/".$this->ITEMS[$key]["pid"]."/exe");
}
$id = trim($id);
$file = "[Item]\n";
$file .= "Launcher=$desktop\n";
$file .= "Icon=$icon\n";
$file .= "Name=$name\n";
$file .= "Exec=$exec\n";
file_put_contents("/home/".$_SERVER["USER"]."/.config/dock/$id.desktop", $file);
}
private function remove_from_dock($key) {
$dock_file = $this->ITEMS[$key]["dockfile"];
unlink($dock_file);
}
private function get_installed_apps_by_group() {
$this->INSTALLED_APPS = [];
$scan = scandir("/usr/share/applications/");
foreach ($scan as $file) {
$ini=pif("/usr/share/applications/$file", array("Desktop Entry"));
if (isset($ini["Desktop Entry"]["Exec"])) {
if (isset($ini["Desktop Entry"]["StartupWMClass"])) {
$cmd = trim(strtolower($ini["Desktop Entry"]["StartupWMClass"]));
} else {
$cmd = trim($this->d2s(strtolower(basename($ini["Desktop Entry"]["Exec"]))));
}
$this->INSTALLED_APPS[$cmd]['exec'] = $ini["Desktop Entry"]["Exec"];
$this->INSTALLED_APPS[$cmd]['icon'] = $ini["Desktop Entry"]["Icon"];
$this->INSTALLED_APPS[$cmd]['name'] = $ini["Desktop Entry"]["Name"];
$this->INSTALLED_APPS[$cmd]['desktop_file'] = "/usr/share/applications/$file";
}
}
}
private function get_running_windows () {
$array = [];
$windows = $this->supreme->ListActiveWindows();
// print_r($windows);
if (!is_array($windows)) {return null;}
for ($i = 1; $i <= count($windows["xid"]); $i++) {
$id = strtolower($windows["class_group_name"][$i]);
if (isset($array[$id])) {$id = $id.$windows['xid'][$i];}
$array[$id]["window_name"] = $windows['window_name'][$i];
$array[$id]["display_name"] = $windows['application_name'][$i];
$array[$id]["application_name"] = $windows['application_name'][$i];
$array[$id]["window_class"] = $windows['class_group_name'][$i];
$array[$id]["canonical_name"] = $windows['class_group_name'][$i];
$array[$id]["icon_from_window"] = strtolower($windows['class_group_name'][$i]);
$array[$id]["running"] = 1;
$array[$id]["docked"] = 0;
if (isset($this->INSTALLED_APPS[strtolower($windows['class_group_name'][$i])]["desktop_file"])) {
$array[$id]["desktop_file"] = $this->INSTALLED_APPS[strtolower($windows['class_group_name'][$i])]["desktop_file"];
$array[$id]["icon_from_desktop"] = $this->INSTALLED_APPS[strtolower($windows['class_group_name'][$i])]["icon"];
} else {
$array[$id]["desktop_file"] = $this->INSTALLED_APPS[strtolower($windows['class_name'][$i])]["desktop_file"];
$array[$id]["icon_from_desktop"] = $this->INSTALLED_APPS[strtolower($windows['class_name'][$i])]["icon"];
}
$array[$id]["xid"] = $windows['xid'][$i];
$array[$id]["pid"] = $windows['pid'][$i];
$array[$id]["state"] = $windows['state'][$i];
$array[$id]["active"] = $windows['active'][$i];
$array[$id]["urgent"] = $windows['urgent'][$i];
$array[$id]["pixbuf"] = $windows['pixbuf'][$i];
}
$scan = scandir("/home/".$_SERVER["USER"]."/.config/dock/");
foreach ($scan as $file) {
if (($file==".") or ($file=="..")) {continue;}
$id = explode(".desktop",$file)[0];
$ini=pif("/home/".$_SERVER["USER"]."/.config/dock/".$file, array("Item"));
if (is_array($array[$id])) {
$array[$id]["docked"] = 1;
$array[$id]["dockfile"] = "/home/".$_SERVER["USER"]."/.config/dock/".$file;
$array[$id]["icon_from_dock"] = $ini["Item"]["Icon"]; // Перезаписываем иконку согласно настроек .desktop-файла дока
} else {
// echo "Docked element $id is NOT running now \n";
$array[$id]["docked"] = 1;
$array[$id]["running"] = 0;
$array[$id]["icon_from_dock"] = $ini["Item"]["Icon"];
$array[$id]["icon_from_window"] = strtolower($ini["Item"]["Name"]);
$array[$id]["desktop_file"] = $ini["Item"]["Launcher"];
$array[$id]["display_name"] = $ini["Item"]["Name"];
$array[$id]["dockfile"] = "/home/".$_SERVER["USER"]."/.config/dock/".$file;
//$array[$id]["exec"] = $array[$id]["exec"] = $ini["Item"]["Exec"];
if (isset($ini["Item"]["Exec"])) {$array[$id]["exec"] = $ini["Item"]["Exec"];} else {
$array[$id]["exec"] = $this->INSTALLED_APPS[$id]["exec"];
}
/*
if (isset($this->INSTALLED_APPS[$id]["exec"])) {
$array[$id]["exec"] = $this->INSTALLED_APPS[$id]["exec"];
} else {
$array[$id]["exec"] = $array[$id]["exec"] = $ini["Item"]["Exec"];
}
*/
}
}
$this->ITEMS = $array;
if (is_array($this->ITEMS)) {ksort($this->ITEMS);}
return $array;
}
private function get_id_by_xid($xid) {
foreach ($this->ITEMS as $key => $value) {
if ($this->ITEMS[$key]["xid"] == "$xid") {
return $key;
}
}
return false;
}
private function remove_icon($key) {
if (isset($this->ITEM[$key])) {$this->ITEM[$key]->destroy();}
unset($this->ITEM[$key]);
}
private function draw_icon($key) {
$name = $this->ITEMS[$key]["display_name"];
//$icon = "inode-symlink";
unset($gd);
// определяем, какая из иконок существует
if ($this->icon_theme->has_icon($this->ITEMS[$key]["icon_from_window"])) {$icon = $this->ITEMS[$key]["icon_from_window"];} // Иконка по имени приложения - дефолтна
if ($this->icon_theme->has_icon($this->ITEMS[$key]["icon_from_desktop"])) {$icon = $this->ITEMS[$key]["icon_from_desktop"];} // Иконка из десктопного файла - вторична
if ($this->icon_theme->has_icon($this->ITEMS[$key]["icon_from_dock"])) {$icon = $this->ITEMS[$key]["icon_from_dock"];} // Но если установлена иконка в доке - используем ее
if ((!isset($icon)) and ($this->ITEMS[$key]["pixbuf"]!="")) { // Если иконка не установлена, но pixbuf иконки окна найден - используем pixbuf окна
$gd = imagecreatefromstring(base64_decode($this->ITEMS[$key]["pixbuf"]));
}
if ((!isset($icon)) and ($this->ITEMS[$key]["pixbuf"]=="")) { // Если нет иконки, и нет pixbuf'а окна - используем fallback-иконку
$gd = gdk_pixbuf_to_gd(GdkPixbuf::new_from_icon_theme("inode-symlink",32));
}
if ((isset($icon)) and ($this->conf_dock["dockbar_use_native_icons"]=="1")) { // Если иконка установлена, но в настройках стоит использование нативных иконок - используем pixbuf
$gd = imagecreatefromstring(base64_decode($this->ITEMS[$key]["pixbuf"]));
}
if ((isset($icon)) and ($this->conf_dock["dockbar_use_native_icons"]!="1")) { // Если иконка установлена, и в настройках не стоит использование нативных иконок - используем иконку приложения
$gd = gdk_pixbuf_to_gd(GdkPixbuf::new_from_icon_theme($icon,32));
}
echo "ICON: $icon \n";
// Теперь смотрим, чтоб $gd был PHP-GD
// if (!is_object($gd)) {$gd = gdk_pixbuf_to_gd(GdkPixbuf::new_from_icon_theme($this->ITEMS[$key]["icon_from_window"],32));}
if (!is_object($gd)) {
print_r($this->ITEMS[$key]);
$gd = gdk_pixbuf_to_gd(GdkPixbuf::new_from_icon_theme("inode-symlink",32));
}
$x = imagesx($gd);
$y = imagesx($gd);
$pid = $this->ITEMS[$key]["pid"];
if ($this->ITEMS[$key]["running"]==1) {
if (($this->ITEMS[$key]["active"]==0) and ($this->ITEMS[$key]["urgent"]==0)) { // Если окошко неактивное, и неважное - тогда рисуем бирюзовый кружочек
imagefilledellipse($gd, $x/2+1, $y-4+1, 6, 6, imagecolorallocatealpha($gd, 0, 0, 0, 0));
pcntl_setpriority(10,$pid);
for ($i = 6; $i >= 1; $i--) {
imagefilledellipse($gd, $x/2, $y-4, $i, $i, imagecolorallocatealpha($gd, $i*20, 150+$i*17, 150+$i*17, 0));
}
}
if (($this->ITEMS[$key]["active"]==1) and ($this->ITEMS[$key]["urgent"]==0)) { // Если окошко активное, и неважное - тогда рисуем бирюзовый эллипс
imagefilledellipse($gd, $x/2+1, $y-4+1, 12, 6, imagecolorallocatealpha($gd, 0, 0, 0, 0));
pcntl_setpriority(-10,$pid);
for ($i = 6; $i >= 1; $i--) {
imagefilledellipse($gd, $x/2, $y-4, $i*2, $i, imagecolorallocatealpha($gd, $i*20, 150+$i*17, 150+$i*17, 0));
}
}
if ($this->ITEMS[$key]["urgent"]==1) { // Если окошко важное - тогда рисуем красный кружочек
imagefilledellipse($gd, $x/2+1, $y-4+1, 6, 6, imagecolorallocatealpha($gd, 0, 0, 0, 0));
for ($i = 6; $i >= 1; $i--) {
imagefilledellipse($gd, $x/2, $y-4, $i, $i, imagecolorallocatealpha($gd, 150+$i*17, $i*20, $i*20, 0));
}
}
} else {
imagefilledellipse($gd, $x/2+1, $y-4+1, 6, 6, imagecolorallocatealpha($gd, 0, 0, 0, 0));
for ($i = 6; $i >= 1; $i--) {
imagefilledellipse($gd, $x/2, $y-4, $i, $i, imagecolorallocatealpha($gd, 150+$i*17, 150+$i*17, 150+$i*17, 0));
}
}
if ((isset($this->TEMP_NAMES[$key])) and ($this->TEMP_NAMES[$key]!="")) {
$temp_name = $this->TEMP_NAMES[$key];
echo "==== setting $temp_name ===== \n";
imagettftext($gd, 8, 0, 1, 9, imagecolorallocatealpha($gd, 0, 0, 0, 0), "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", "$temp_name");
imagettftext($gd, 8, 0, 0, 8, imagecolorallocatealpha($gd, 255, 255, 255, 0), "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", "$temp_name");
}
if ($gd) {
imagesavealpha($gd,true);
$img = GtkImage::new_from_pixbuf(gd_to_pixbuf($gd));
} else {$img = GtkImage::new_from_icon_theme("folder", 32);}
if (!isset($this->ITEM[$key])) {$new = true;} else {$new = false;}
if ($new) {$this->ITEM[$key] = new GtkButton($img);
$this->ITEM[$key]->set_relief(GtkReliefStyle::NONE);
}
$this->ITEM[$key]->set_image($img);
// $img->show();
$this->ITEM[$key]->set_has_tooltip(true);
$this->ITEM[$key]->set_tooltip_text($this->ITEMS[$key]["display_name"]);
if ($new) {
$this->ITEM[$key]->set_name("item1");
$this->ITEM[$key]->drag_dest_set("text/uri-list", 0, 0);
$this->ITEM[$key]->connect("button-release-event",function($button, $event) {global $R; $this->click_process($button, $event, $R);return false;});
$this->ITEM[$key]->set_data("xid", $this->ITEMS[$key]['xid']);
$this->ITEM[$key]->set_data("key", $key);
$r = rand(1,100000);
$this->ITEM[$key]->set_data("uid", "$r");
$old_signal = $this->ITEM[$key]->get_data("signal");
if ($old_signal=="") {
$signal = $this->ITEM[$key]->connect("drag-motion",function($button, $event) { // Если на кнопку навели что-нибудь драг-н-дроппное
$xid = $button->get_data("xid");
if ($xid!=$this->drag_xid) {
$this->supreme->toggleWindowFromDock($xid); // Разворачиваем окно под этой кнопкой
$this->drag_xid = $xid;
}
return false;
});
$this->ITEM[$key]->set_data("signal", "$signal");
}
}
if ($new) {$this->DOCKBOX->add($this->ITEM[$key]);} else {$this->ITEM[$key]->show_all();}
}
private function draw_elements_on_dock($redraw = false) {
if ($redraw) {
foreach ($this->ITEMS as $key => $value) {
$this->remove_icon($key);
// unset($this->ITEM[$key]);
// unset($this->ITEMS[$key]);
}
// unset($this->ITEM);
// unset($this->ITEMS);
}
$this->icon_theme = GtkIconTheme::get_default();
if (is_array($this->ITEMS)) {ksort($this->ITEMS);}
foreach ($this->ITEMS as $key => $value) {
$this->draw_icon($key);
}
$this->DOCKBOX->show_all();
}
private function watch_dock() {
$this->old_windows_state = $this->new_windows_state;
$this->new_windows_state = [];
$this->new_windows_state = $this->supreme->ListActiveWindows();
if (!is_array($this->old_windows_state)) {$this->old_windows_state = $this->new_windows_state;}
if ($this->old_windows_state!=$this->new_windows_state) { // Если ситуация с окнами изменилась
$this->ITEMS = [];
$apps = $this->get_running_windows();
for ($i = 1; $i <= count($this->new_windows_state["xid"]); $i++) { // Перебираем в поисках новых окон
$xid = $this->new_windows_state["xid"][$i];
for ($ii = 1; $ii <= count($this->old_windows_state["xid"]); $ii++) {
if ($this->old_windows_state["xid"][$ii] == $this->new_windows_state["xid"][$i]) {unset($xid);break;}
}
if (isset($xid)) {
$this->draw_elements_on_dock(true);
return true;
}
}
for ($i = 1; $i <= count($this->old_windows_state["xid"]); $i++) { // Перебираем в поисках удаленных окон
$xid = $this->old_windows_state["xid"][$i];
for ($ii = 1; $ii <= count($this->new_windows_state["xid"]); $ii++) {
if ($this->new_windows_state["xid"][$ii] == $this->old_windows_state["xid"][$i]) {unset($xid);break;}
}
if (isset($xid)) {
$x = $this->DOCKBOX->get_children();
if (is_array($x)) {
foreach ($x as &$value) {
$key = $value->get_name();
$value->destroy();
}
}
foreach ($this->ITEM as $key => $value) {
$this->ITEM[$key]->destroy();
unset($this->ITEM[$key]);
}
$this->draw_elements_on_dock(true);
return true;
}
}
for ($i = 1; $i <= count($this->new_windows_state["xid"]); $i++) { // Перебираем в поисках измененных окон
unset($xid);
if ($this->new_windows_state["window_name"][$i]!=$this->old_windows_state["window_name"][$i]) {$xid = $this->new_windows_state["xid"][$i];}
if ($this->new_windows_state["pixbuf"][$i]!=$this->old_windows_state["pixbuf"][$i]) {$xid = $this->new_windows_state["xid"][$i];}
if ($this->new_windows_state["urgent"][$i]!=$this->old_windows_state["urgent"][$i]) {$xid = $this->new_windows_state["xid"][$i];}
if ($this->new_windows_state["active"][$i]!=$this->old_windows_state["active"][$i]) {$xid = $this->new_windows_state["xid"][$i];}
if (isset($xid)) {
$this->draw_icon($this->get_id_by_xid($xid));
} // of $xid
}
}
// Читаем изменения конфиг-файла
clearstatcache();
if ($this->CONF_MTIME!=filemtime("/home/".$_SERVER["USER"]."/.config/supreme.conf")) {
$this->CONF_MTIME = filemtime("/home/".$_SERVER["USER"]."/.config/supreme.conf");
$this->conf_dock = read_config_to_array("/home/" . $_SERVER["USER"] . "/.config/supreme.conf");
$tick = 150;
if ($this->conf_dock["performance_level"]==1) {$tick = 500;}
if ($this->conf_dock["performance_level"]==0) {$tick = 1000;}
Gtk::timeout_add($tick, function () {return $this->watch_dock();});
return false;
}
if ($this->DOCK_MTIME!=filemtime("/home/".$_SERVER["USER"]."/.config/dock/")) {
$this->DOCK_MTIME = filemtime("/home/".$_SERVER["USER"]."/.config/dock/");
$apps = $this->get_running_windows();
$x = $this->DOCKBOX->get_children();
if (is_array($x)) {
foreach ($x as &$value) {
$key = $value->get_name();
$value->destroy();
}
}
foreach ($this->ITEM as $key => $value) {
$this->ITEM[$key]->destroy();
unset($this->ITEM[$key]);
}
$this->draw_elements_on_dock(true);
return true;
}
return true;
}
public function dock($box) {
$this->supreme = new Supreme();
$this->conf_dock = read_config_to_array("/home/" . $_SERVER["USER"] . "/.config/supreme.conf");
$this->DOCKBOX = new GtkBox(GtkOrientation::HORIZONTAL,0);
$this->DOCKBOX->drag_dest_set("text/uri-list", 0, 0);
$this->DOCKBOX->connect("drag-motion",function($button, $event) {
// print_r($event);
});
$this->DOCKBOX->connect_after("drag-drop", function ($widget, $context, $event) {
echo "DRAG received \n";
print_r($context);
// exit();
});
$this->css_provider = new GtkCssProvider();
$this->css_provider->load_from_data($this->css_dock);
$this->style_context = new GtkStyleContext();
$this->style_context->add_provider_for_screen($this->css_provider, 600);
$box->add($this->DOCKBOX);
$tick = 150;
$this->DOCK_MTIME = filemtime("/home/".$_SERVER["USER"]."/.config/dock/");
$this->get_installed_apps_by_group();
$apps = $this->get_running_windows();
// $docks = $this->get_docked_items();
// $result = $this->perform_array($apps,$docks);
$this->draw_elements_on_dock();
$tick = 150;
if ($this->conf_dock["performance_level"]==1) {$tick = 500;}
if ($this->conf_dock["performance_level"]==0) {$tick = 1000;}
Gtk::timeout_add($tick, function () {return $this->watch_dock();});
}
}
Ваш комментарий будет первым