Нажмите "Enter" для перехода к содержанию

Dock

<?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();});

	}
}

Ваш комментарий будет первым

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *