/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.motorola.studio.android.nativeos.linux.gtk; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.Arrays; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; import org.eclipse.swt.graphics.Point; import org.osgi.framework.Bundle; import com.motorola.studio.android.AndroidPlugin; import com.motorola.studio.android.common.log.StudioLogger; public class GtkBridge { private static final String EXEC = getExecCommad(); private static final String DISPLAY = getDisplayNum(); public static String getDisplayNum() { String display = System.getenv("DISPLAY"); return display; } public static String getExecCommad() { String absoluteFile = ""; try { Bundle bundle = AndroidPlugin.getDefault().getBundle(); URL locationUrl = FileLocator.find(bundle, new Path("gtk_bridge_app"), null); URL fileUrl = FileLocator.toFileURL(locationUrl); File file = new File(fileUrl.getFile()); absoluteFile = file.getAbsolutePath(); StudioLogger.info(GtkBridge.class, "Using gtk bridge app at: " + absoluteFile); checkExecutionPermission(absoluteFile); } catch (Exception e) { StudioLogger.error(GtkBridge.class, "Failed to retrieve gtk bridge app", e); } return absoluteFile; } private static void checkExecutionPermission(String executable) throws IOException { String[] command = new String[] { "chmod", "+x", executable }; Runtime.getRuntime().exec(command); } public static synchronized String exec(String[] command) { String lastline = ""; Process p = null; BufferedReader reader = null; try { p = Runtime.getRuntime().exec(command); reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String returnedValue = ""; do { returnedValue = reader.readLine(); if (returnedValue != null) { lastline = returnedValue; } } while (returnedValue != null); int exitCode = p.waitFor(); if (exitCode != 0) { StudioLogger.debug(GtkBridge.class, "Command " + Arrays.toString(command) + " finished with error code:" + exitCode); } } catch (Exception e) { StudioLogger.error(GtkBridge.class, "Failed to execute command :" + Arrays.toString(command), e); } finally { if (p != null) { try { p.getInputStream().close(); } catch (IOException e) { //Do Nothing. } try { p.getOutputStream().close(); } catch (IOException e) { //Do Nothing. } try { p.getErrorStream().close(); } catch (IOException e) { //Do Nothing. } } if (reader != null) { try { reader.close(); } catch (IOException e) { //Do Nothing. } } } return lastline; } private static long exec_toLong(String[] command) { long response = 0; try { String returnedValue = exec(command); if (!"".equals(command)) { response = Long.parseLong(returnedValue); } } catch (Exception e) { StudioLogger.error(GtkBridge.class, "Failed to execute command", e); } return response; } public static long getWindowHandle(String windowName) { StudioLogger.debug(GtkBridge.class, "getWindowHandle " + windowName); String[] command = { EXEC, "getWindowHandler", DISPLAY, windowName }; long handle = exec_toLong(command); StudioLogger.debug(GtkBridge.class, "getWindowHandle handle=" + handle); return handle; } public static long embedNativeWindow(long parentHandle, long windowHandle) { StudioLogger.debug(GtkBridge.class, "embedNativeWindow parent=" + parentHandle + " window=" + windowHandle); String[] arguments = { EXEC, "embedWindow", DISPLAY, Long.toString(parentHandle), Long.toString(windowHandle) }; long handle = exec_toLong(arguments); return handle; } public static void unembedNativeWindow(long parentHandle, long formerParentHandle) { StudioLogger.debug(GtkBridge.class, "unembedNativeWindow " + parentHandle); String[] arguments = { EXEC, "unembedWindow", DISPLAY, Long.toString(parentHandle), Long.toString(formerParentHandle) }; exec(arguments); } public static Point getWindowSize(long handle) { String[] arguments = { EXEC, "getWindowSize", DISPLAY, Long.toString(handle) }; String size = exec(arguments); Point point; try { String[] pointStr = size.split(","); int x = Integer.parseInt(pointStr[0]); int y = Integer.parseInt(pointStr[1]); point = new Point(x, y); } catch (Exception e) { point = new Point(0, 0); } return point; } public static void pressKey(long windowHandle, int key) { String[] arguments = { EXEC, "pressKey", DISPLAY, Long.toString(windowHandle), Integer.toString(key) }; exec(arguments); } public static void releaseKey(long windowHandle, int key) { String[] arguments = { EXEC, "releaseKey", DISPLAY, Long.toString(windowHandle), Integer.toString(key) }; exec(arguments); } public static void showWindow(long windowHandle) { StudioLogger.debug(GtkBridge.class, "showWindow " + windowHandle); String[] arguments = { EXEC, "showWindow", DISPLAY, Long.toString(windowHandle) }; exec(arguments); } public static void hideWindow(long windowHandle) { StudioLogger.debug(GtkBridge.class, "hideWindow " + windowHandle); String[] arguments = { EXEC, "hideWindow", DISPLAY, Long.toString(windowHandle) }; exec(arguments); } public static void restoreWindow(long windowHandle) { StudioLogger.debug(GtkBridge.class, "restoreWindow " + windowHandle); String[] arguments = { EXEC, "restoreWindow", DISPLAY, Long.toString(windowHandle) }; exec(arguments); } }