--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="WizardSettings">
+ <option name="children">
+ <map>
+ <entry key="imageWizard">
+ <value>
+ <PersistentState />
+ </value>
+ </entry>
+ </map>
+ </option>
+ </component>
+</project>
\ No newline at end of file
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
- <Objective-C-extensions>
- <file>
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
- </file>
- <class>
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
- </class>
- <extensions>
- <pair source="cpp" header="h" fileNamingConvention="NONE" />
- <pair source="c" header="h" fileNamingConvention="NONE" />
- </extensions>
- </Objective-C-extensions>
+ <codeStyleSettings language="XML">
+ <arrangement>
+ <rules>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>xmlns:android</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
+ </AND>
+ </match>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>xmlns:.*</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
+ </AND>
+ </match>
+ <order>BY_NAME</order>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>.*:id</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+ </AND>
+ </match>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>.*:name</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+ </AND>
+ </match>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>name</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
+ </AND>
+ </match>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>style</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
+ </AND>
+ </match>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>.*</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
+ </AND>
+ </match>
+ <order>BY_NAME</order>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>.*</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+ </AND>
+ </match>
+ <order>ANDROID_ATTRIBUTE_ORDER</order>
+ </rule>
+ </section>
+ <section>
+ <rule>
+ <match>
+ <AND>
+ <NAME>.*</NAME>
+ <XML_ATTRIBUTE />
+ <XML_NAMESPACE>.*</XML_NAMESPACE>
+ </AND>
+ </match>
+ <order>BY_NAME</order>
+ </rule>
+ </section>
+ </rules>
+ </arrangement>
+ </codeStyleSettings>
</code_scheme>
</component>
\ No newline at end of file
--- /dev/null
+<component name="ProjectDictionaryState">
+ <dictionary name="root">
+ <words>
+ <w>volup</w>
+ </words>
+ </dictionary>
+</component>
\ No newline at end of file
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
+ <compositeConfiguration>
+ <compositeBuild compositeDefinitionSource="SCRIPT" />
+ </compositeConfiguration>
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
+ <option name="testRunner" value="PLATFORM" />
</GradleProjectSettings>
</option>
</component>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="VcsDirectoryMappings">
+ <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+ </component>
+</project>
\ No newline at end of file
-[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
\ No newline at end of file
img.setOnClickListener(this);
img = (ImageButton)findViewById(R.id.buttonF);
img.setOnClickListener(this);
- img = (ImageButton)findViewById(R.id.button_dot);
+ img = (ImageButton)findViewById(R.id.buttonDOT);
+ img.setOnClickListener(this);
+ img = (ImageButton)findViewById(R.id.buttonTV);
+ img.setOnClickListener(this);
+ img = (ImageButton)findViewById(R.id.quit);
img.setOnClickListener(this);
img = (ImageButton)findViewById(R.id.fast_lt);
img.setOnClickListener(this);
img.setOnClickListener(this);
img = (ImageButton)findViewById(R.id.rplay);
img.setOnClickListener(this);
+ img = (ImageButton)findViewById(R.id.vol_dn);
+ img.setOnClickListener(this);
+ img = (ImageButton)findViewById(R.id.vol_up);
+ img.setOnClickListener(this);
+ img = (ImageButton)findViewById(R.id.mute);
+ img.setOnClickListener(this);
+ img = (ImageButton)findViewById(R.id.ch_up);
+ img.setOnClickListener(this);
+ img = (ImageButton)findViewById(R.id.ch_dn);
+ img.setOnClickListener(this);
img = (ImageButton)findViewById(R.id.suspend);
img.setOnClickListener(this);
img = (ImageButton)findViewById(R.id.config);
img.setOnClickListener(this);
- img = (ImageButton)findViewById(R.id.exit);
+ img = (ImageButton)findViewById(R.id.buttonCC);
img.setOnClickListener(this);
img = (ImageButton)findViewById(R.id.power);
img.setOnClickListener(this);
public void onClick(View v) {
if (v instanceof ImageButton) {
int id = ((ImageButton)v).getId();
- if (id == R.id.stop) { send("stop"); }
- else if (id == R.id.play) { send("play"); }
- else if (id == R.id.rplay) { send("rplay"); }
+ if (id == R.id.menu) { send("menu"); }
else if (id == R.id.button0) { send("key 0"); }
else if (id == R.id.button1) { send("key 1"); }
else if (id == R.id.button2) { send("key 2"); }
else if (id == R.id.buttonC) { send("key C"); }
else if (id == R.id.buttonD) { send("key D"); }
else if (id == R.id.buttonE) { send("key E"); }
- else if (id == R.id.buttonF) { send("key F"); }
- else if (id == R.id.fast_lt) { send("fast_lt"); }
- else if (id == R.id.media_up) { send("media_up"); }
- else if (id == R.id.fast_rt) { send("fast_rt"); }
- else if (id == R.id.menu) { send("menu"); }
+ else if (id == R.id.buttonF) { send("book"); }
+ else if (id == R.id.rplay) { send("rplay"); }
+ else if (id == R.id.stop) { send("stop"); }
+ else if (id == R.id.play) { send("play"); }
else if (id == R.id.media_lt) { send("media_lt"); }
- else if (id == R.id.pause) { send("pause"); }
else if (id == R.id.media_rt) { send("media_rt"); }
- else if (id == R.id.slow_lt) { send("slow_lt"); }
+ else if (id == R.id.media_up) { send("media_up"); }
else if (id == R.id.media_dn) { send("media_dn"); }
+ else if (id == R.id.pause) { send("pause"); }
+ else if (id == R.id.slow_lt) { send("slow_lt"); }
else if (id == R.id.slow_rt) { send("slow_rt"); }
- else if (id == R.id.full_scr) { send("key F"); }
+ else if (id == R.id.fast_lt) { send("fast_lt"); }
+ else if (id == R.id.fast_rt) { send("fast_rt"); }
+ else if (id == R.id.full_scr) { send("fscrn"); }
+ else if (id == R.id.mute) { send("mute"); }
+ else if (id == R.id.vol_up) { send("vol_up"); }
+ else if (id == R.id.vol_dn) { send("vol_dn"); }
+ else if (id == R.id.ch_up) { send("ch_up"); }
+ else if (id == R.id.ch_dn) { send("ch_dn"); }
+ else if (id == R.id.buttonDOT) { send("key dot"); }
+ else if (id == R.id.buttonCC) { send("key cc"); }
+ else if (id == R.id.buttonTV) { send("key tv"); }
else {
save_defaults();
if (id == R.id.config) {
it.putExtra("PORT", dport);
startActivity(it);
}
- else if (id == R.id.suspend)
- send("suspend");
- else if (id == R.id.power)
- send("power");
- else if (id != R.id.exit)
+ else if (id == R.id.quit) send("hand");
+ else if (id == R.id.suspend) send("suspend");
+ else if (id == R.id.power) send("power");
+ else {
+ Toast.makeText(this, "unknown msg",Toast.LENGTH_SHORT).show();
return;
+ }
finish();
}
}
+++ /dev/null
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt"
- android:width="108dp"
- android:height="108dp"
- android:viewportWidth="108"
- android:viewportHeight="108">
- <path
- android:fillType="evenOdd"
- android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
- android:strokeWidth="1"
- android:strokeColor="#00000000">
- <aapt:attr name="android:fillColor">
- <gradient
- android:endX="78.5885"
- android:endY="90.9159"
- android:startX="48.7653"
- android:startY="61.0927"
- android:type="linear">
- <item
- android:color="#44000000"
- android:offset="0.0" />
- <item
- android:color="#00000000"
- android:offset="1.0" />
- </gradient>
- </aapt:attr>
- </path>
- <path
- android:fillColor="#FFFFFF"
- android:fillType="nonZero"
- android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
- android:strokeWidth="1"
- android:strokeColor="#00000000" />
-</vector>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="108dp"
- android:height="108dp"
- android:viewportWidth="108"
- android:viewportHeight="108">
- <path
- android:fillColor="#008577"
- android:pathData="M0,0h108v108h-108z" />
- <path
- android:fillColor="#00000000"
- android:pathData="M9,0L9,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,0L19,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M29,0L29,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M39,0L39,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M49,0L49,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M59,0L59,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M69,0L69,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M79,0L79,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M89,0L89,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M99,0L99,108"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,9L108,9"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,19L108,19"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,29L108,29"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,39L108,39"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,49L108,49"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,59L108,59"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,69L108,69"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,79L108,79"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,89L108,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M0,99L108,99"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,29L89,29"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,39L89,39"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,49L89,49"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,59L89,59"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,69L89,69"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M19,79L89,79"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M29,19L29,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M39,19L39,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M49,19L49,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M59,19L59,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M69,19L69,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
- <path
- android:fillColor="#00000000"
- android:pathData="M79,19L79,89"
- android:strokeWidth="0.8"
- android:strokeColor="#33FFFFFF" />
-</vector>
<?xml version="1.0" encoding="utf-8"?>
-<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<android.support.design.widget.CoordinatorLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:clickable="true">
<LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="6sp"
+ android:orientation="vertical">
<LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
- <ImageButton
- android:id="@+id/button0"
+ <LinearLayout
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfig0" />
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
- <ImageButton
- android:id="@+id/button1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfig1" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/menu"
+ android:src="@mipmap/menu" />
- <ImageButton
- android:id="@+id/button2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfig2" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/config"
+ android:src="@mipmap/config" />
+ </LinearLayout>
- <ImageButton
- android:id="@+id/button3"
+ <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfig3" />
+ android:orientation="vertical">
- <ImageButton
- android:id="@+id/button4"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfig4" />
- </LinearLayout>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ <ImageButton style="@style/btn"
+ android:id="@+id/media_up"
+ android:src="@mipmap/media_up" />
+ </LinearLayout>
- <ImageButton
- android:id="@+id/button5"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfig5" />
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal">
- <ImageButton
- android:id="@+id/button6"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfig6" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/media_lt"
+ android:src="@mipmap/media_lt" />
- <ImageButton
- android:id="@+id/button7"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfig7" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/pause"
+ android:src="@mipmap/pause" />
- <ImageButton
- android:id="@+id/button8"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfig8" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/media_rt"
+ android:src="@mipmap/media_rt" />
+ </LinearLayout>
- <ImageButton
- android:id="@+id/button9"
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal">
+
+ <ImageButton style="@style/btn"
+ android:id="@+id/media_dn"
+ android:src="@mipmap/media_dn" />
+
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfig9" />
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
+
+ <ImageButton style="@style/btn"
+ android:id="@+id/power"
+ android:src="@mipmap/power" />
+
+ <ImageButton style="@style/btn"
+ android:id="@+id/suspend"
+ android:src="@mipmap/suspend" />
+ </LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingTop="20sp"
+ android:gravity="center_vertical">
- <ImageButton
- android:id="@+id/buttonA"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfiga" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/fast_lt"
+ android:src="@mipmap/fast_lt" />
- <ImageButton
- android:id="@+id/buttonB"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfigb" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/rplay"
+ android:src="@mipmap/rev" />
- <ImageButton
- android:id="@+id/buttonC"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfigc" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/stop"
+ android:src="@mipmap/stop" />
- <ImageButton
- android:id="@+id/buttonD"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfigd" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/play"
+ android:src="@mipmap/play" />
- <ImageButton
- android:id="@+id/buttonE"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfige" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/fast_rt"
+ android:src="@mipmap/fast_rt" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal">
- <ImageButton
- android:id="@+id/buttonF"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfigf" />
-
- <ImageButton
- android:id="@+id/button_dot"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/zfigdot" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/buttonTV"
+ android:src="@mipmap/ztv" />
+
+ <ImageButton style="@style/btn"
+ android:id="@+id/slow_lt"
+ android:src="@mipmap/slow_lt" />
- <ImageButton
+ <ImageButton style="@style/btn"
android:id="@+id/full_scr"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
android:src="@mipmap/full_scr" />
- <ImageButton
- android:id="@+id/power"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/power" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/slow_rt"
+ android:src="@mipmap/slow_rt" />
- <ImageButton
- android:id="@+id/exit"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/exit" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/quit"
+ android:src="@mipmap/zquit" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:gravity="center_horizontal">
-
- <ImageButton
- android:id="@+id/fast_lt"
+ android:orientation="horizontal"
+ android:paddingBottom="12sp"
+ android:gravity="top">
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingBottom="12sp">
+ <ImageButton style="@style/btn"
+ android:id="@+id/vol_up"
+ android:src="@mipmap/zvolup" />
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_vertical"
+ android:paddingTop="8sp">
+ <ImageButton style="@style/btn"
+ android:id="@+id/vol_dn"
+ android:src="@mipmap/zvoldn" />
+ </LinearLayout>
+ <LinearLayout
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/fast_lt" />
-
- <ImageButton
- android:id="@+id/media_up"
+ android:layout_height="match_parent"
+ android:paddingTop="12sp">
+ <ImageButton style="@style/btn"
+ android:id="@+id/mute"
+ android:src="@mipmap/zmute" />
+ </LinearLayout>
+ <LinearLayout
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/media_up" />
-
- <ImageButton
- android:id="@+id/fast_rt"
+ android:layout_height="match_parent"
+ android:paddingTop="8sp">
+ <ImageButton style="@style/btn"
+ android:id="@+id/ch_up"
+ android:src="@mipmap/zch_up" />
+ </LinearLayout>
+ <LinearLayout
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/fast_rt" />
+ android:layout_height="match_parent"
+ android:paddingBottom="12sp">
- <ImageButton
- android:id="@+id/menu"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/menu" />
+ <ImageButton style="@style/btn"
+ android:layout_gravity="top"
+ android:id="@+id/ch_dn"
+ android:src="@mipmap/zch_dn" />
+ </LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:orientation="horizontal"
android:gravity="center_horizontal">
- <ImageButton
- android:id="@+id/media_lt"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/media_lt" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/buttonA"
+ android:src="@mipmap/zfiga" />
- <ImageButton
- android:id="@+id/pause"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/pause" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/button1"
+ android:src="@mipmap/zfig1" />
- <ImageButton
- android:id="@+id/media_rt"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/media_rt" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/button2"
+ android:src="@mipmap/zfig2" />
- <ImageButton
- android:id="@+id/suspend"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/suspend" />
- </LinearLayout>
+ <ImageButton style="@style/btn"
+ android:id="@+id/button3"
+ android:src="@mipmap/zfig3" />
+
+ <ImageButton style="@style/btn"
+ android:id="@+id/buttonD"
+ android:src="@mipmap/zfigd" />
+ </LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:orientation="horizontal"
android:gravity="center_horizontal">
- <ImageButton
- android:id="@+id/slow_lt"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/slow_lt" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/buttonB"
+ android:src="@mipmap/zfigb" />
- <ImageButton
- android:id="@+id/media_dn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/media_dn" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/button4"
+ android:src="@mipmap/zfig4" />
- <ImageButton
- android:id="@+id/slow_rt"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/slow_rt" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/button5"
+ android:src="@mipmap/zfig5" />
- <ImageButton
- android:id="@+id/config"
- android:layout_width="wrap_content"
+ <ImageButton style="@style/btn"
+ android:id="@+id/button6"
+ android:src="@mipmap/zfig6" />
+
+ <ImageButton style="@style/btn"
+ android:id="@+id/buttonE"
+ android:src="@mipmap/zfige" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/config" />
+ android:orientation="horizontal"
+ android:gravity="center_horizontal">
+
+ <ImageButton style="@style/btn"
+ android:id="@+id/buttonC"
+ android:src="@mipmap/zfigc" />
+
+ <ImageButton style="@style/btn"
+ android:id="@+id/button7"
+ android:src="@mipmap/zfig7" />
+
+ <ImageButton style="@style/btn"
+ android:id="@+id/button8"
+ android:src="@mipmap/zfig8" />
+
+ <ImageButton style="@style/btn"
+ android:id="@+id/button9"
+ android:src="@mipmap/zfig9" />
+
+ <ImageButton style="@style/btn"
+ android:id="@+id/buttonF"
+ android:src="@mipmap/zfigf" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:orientation="horizontal"
android:gravity="center_horizontal">
- <ImageButton
- android:id="@+id/rplay"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/rev" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/buttonDOT"
+ android:src="@mipmap/zfigdot" />
- <ImageButton
- android:id="@+id/stop"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/stop" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/button0"
+ android:src="@mipmap/zfig0" />
- <ImageButton
- android:id="@+id/play"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:cropToPadding="false"
- android:scaleType="fitXY"
- android:src="@mipmap/play" />
+ <ImageButton style="@style/btn"
+ android:id="@+id/buttonCC"
+ android:src="@mipmap/zfigcc" />
</LinearLayout>
</LinearLayout>
-
+q
</FrameLayout>
<item
android:id="@+id/menu_exit"
android:orderInCategory="100"
- android:showAsAction="never"
+ app:showAsAction="never"
android:title="@string/menu_exit"/>
</menu>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@drawable/ic_launcher_background" />
- <foreground android:drawable="@drawable/ic_launcher_foreground" />
-</adaptive-icon>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@drawable/ic_launcher_background" />
- <foreground android:drawable="@drawable/ic_launcher_foreground" />
-</adaptive-icon>
\ No newline at end of file
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
-
+ <style name="btn">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:borderlessButtonStyle">@style/Widget.AppCompat.Button.Borderless</item>
+ <item name="android:padding">0px</item>
+ <item name="android:layout_margin">2sp</item>
+ </style>
+
</resources>
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.2.1'
+ classpath 'com.android.tools.build:gradle:3.5.3'
// NOTE: Do not place your application dependencies here; they belong
+#Wed Jan 08 17:24:50 MST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
$(OBJDIR)/wavecache.o \
$(OBJDIR)/wintv.o \
$(OBJDIR)/wwindow.o \
+ $(OBJDIR)/x10tv.o \
$(OBJDIR)/zoombar.o \
$(OBJDIR)/zoompanel.o \
$(OBJDIR)/zwindow.o \
void AndroidControl::press(int key)
{
// printf("press 0x%04x\n",key);
+ if( key == KPMENU && mwindow_gui->keyev_grab_remote() )
+ printf("android grab remote\n");
if( mwindow_gui->key_listener(key) ) return;
mwindow_gui->remote_control->remote_key(key);
}
if( !len || !msg_len || *pin != *msg ) continue;
++msg; --msg_len;
if( msg_len <= 0 ) continue;
- if( is_msg("stop") ) press(KPSTOP);
- else if( is_msg("play") ) press(KPPLAY);
- else if( is_msg("rplay") ) press(KPREV);
- else if( is_msg("pause") ) press(' ');
- else if( is_msg("fast_lt") ) press(KPBACK);
- else if( is_msg("media_up") ) press(UP);
- else if( is_msg("fast_rt") ) press(KPFWRD);
- else if( is_msg("menu") ) press(KPMENU);
- else if( is_msg("media_lt") ) press(LEFT);
- else if( is_msg("media_rt") ) press(RIGHT);
- else if( is_msg("slow_lt") ) press(KPRECD);
- else if( is_msg("media_dn") ) press(DOWN);
- else if( is_msg("slow_rt") ) press(KPAUSE);
+ if( is_msg("menu") ) press(KPMENU);
else if( is_msg("key 0") ) press('0');
else if( is_msg("key 1") ) press('1');
else if( is_msg("key 2") ) press('2');
else if( is_msg("key C") ) press('c');
else if( is_msg("key D") ) press('d');
else if( is_msg("key E") ) press('e');
- else if( is_msg("key F") ) press('f');
+ else if( is_msg("book") ) press(KPBOOK);
+ else if( is_msg("rplay") ) press(KPREV);
+ else if( is_msg("stop") ) press(KPSTOP);
+ else if( is_msg("play") ) press(KPPLAY);
+ else if( is_msg("media_lt") ) press(LEFT);
+ else if( is_msg("media_rt") ) press(RIGHT);
+ else if( is_msg("media_up") ) press(UP);
+ else if( is_msg("media_dn") ) press(DOWN);
+ else if( is_msg("pause") ) press(' ');
+ else if( is_msg("slow_lt") ) press(KPRECD);
+ else if( is_msg("slow_rt") ) press(KPAUSE);
+ else if( is_msg("fast_lt") ) press(KPBACK);
+ else if( is_msg("fast_rt") ) press(KPFWRD);
+ else if( is_msg("fscrn") ) press(KPFSCRN);
+ else if( is_msg("mute") ) press(KPMUTE);
+ else if( is_msg("vol_up") ) press(KPVOLUP);
+ else if( is_msg("vol_dn") ) press(KPVOLDN);
+ else if( is_msg("ch_up") ) press(KPCHUP);
+ else if( is_msg("ch_dn") ) press(KPCHDN);
+ else if( is_msg("key dot") ) press('.');
+ else if( is_msg("key cc") ) press(KPCC);
+ else if( is_msg("key tv") ) press(KPTV);
+ else if( is_msg("hand") ) press(KPHAND);
else if( is_msg("suspend") ) {
system("sync; sleep 1; acpitool -s");
}
#include "trackcanvas.h"
#include "tracks.h"
#include "transportque.h"
-#include "wintv.h"
#include <unistd.h>
refresh_frame(change_type, mwindow->edl, dir);
}
-CWindowRemoteHandler::
-CWindowRemoteHandler(RemoteControl *remote_control)
+CWindowKeyEvHandler::
+CWindowKeyEvHandler(RemoteControl *remote_control)
: RemoteHandler(remote_control->gui, RED)
{
this->remote_control = remote_control;
key = -1;
}
-CWindowRemoteHandler::
-~CWindowRemoteHandler()
+CWindowKeyEvHandler::
+~CWindowKeyEvHandler()
{
}
-int CWindowRemoteHandler::process_key(int key)
+int CWindowKeyEvHandler::remote_key(int key)
{
return remote_process_key(remote_control, key);
}
-int CWindowRemoteHandler::remote_process_key(RemoteControl *remote_control, int key)
+int CWindowKeyEvHandler::remote_process_key(RemoteControl *remote_control, int key)
{
EDL *edl = mwindow->edl;
if( !edl ) return 0;
case 'a': remote_control->gui->tile_windows(0); return 1;
case 'b': remote_control->gui->tile_windows(1); return 1;
case 'c': remote_control->gui->tile_windows(2); return 1;
-#ifdef HAVE_DVB
- case 'd':
- mwindow->gui->channel_info->toggle_scan();
- return 1;
-#endif
- case 'e':
- break;
+ case KPFSCRN:
case 'f': {
CWindowCanvas *canvas = mwindow->cwindow->gui->canvas;
int on = canvas->get_fullscreen() ? 0 : 1;
CPlayback *playback_engine;
};
-class CWindowRemoteHandler : public RemoteHandler
+class CWindowKeyEvHandler : public RemoteHandler
{
public:
- CWindowRemoteHandler(RemoteControl *remote_control);
- ~CWindowRemoteHandler();
- int process_key(int key);
+ CWindowKeyEvHandler(RemoteControl *remote_control);
+ ~CWindowKeyEvHandler();
+ int remote_key(int key);
int remote_process_key(RemoteControl *remote_control, int key);
+ int is_keytv() { return 1; }
int key, last_key;
RemoteControl *remote_control;
#define CWINDOW_INC
class CWindow;
-class CWindowRemoteHandler;
+class KeyEvCWindowHandler;
#endif
#include "wavecache.h"
#include "wintv.h"
#include "wwindow.h"
+#include "x10tv.h"
#include "zoombar.h"
#include "zwindow.h"
#include "zwindowgui.h"
beeper = 0;
shuttle = 0;
wintv = 0;
+ x10tv = 0;
mixers_align = 0;
}
delete shuttle; shuttle = 0;
#ifdef HAVE_WINTV
delete wintv; wintv = 0;
+#endif
+#ifdef HAVE_X10TV
+ delete x10tv; x10tv = 0;
#endif
delete batch_render; batch_render = 0;
delete convert_render; convert_render = 0;
wintv->start();
#endif
}
+void MWindow::init_x10tv()
+{
+#ifdef HAVE_X10TV
+ x10tv = X10TV::probe(this);
+ if( x10tv )
+ x10tv->start();
+#endif
+}
void MWindow::init_brender()
strcat(string, "/" FONT_SEARCHPATH);
BC_Resources::init_fontconfig(string);
if(debug) PRINT_TRACE
- init_wintv();
+// use if plugged
+ init_x10tv();
+ if( !x10tv )
+ init_wintv();
// Default project created here
init_edl();
#include "wwindow.inc"
#include "wavecache.inc"
#include "wintv.inc"
+#include "x10tv.inc"
#define FONT_SEARCHPATH "fonts"
void init_signals();
void init_shuttle();
void init_wintv();
+ void init_x10tv();
void init_theme();
void init_compositor();
void init_levelwindow();
int in_destructor;
Shuttle *shuttle;
WinTV *wintv;
+ X10TV *x10tv;
};
#endif
#include "vwindowgui.h"
#include "vwindow.h"
#include "wintv.h"
+#include "x10tv.h"
#include "zoombar.h"
#define PANE_DRAG_MARGIN MAX(mwindow->theme->pane_w, mwindow->theme->pane_h)
if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
set_icon(mwindow->theme->get_image("mwindow_icon"));
remote_control = new RemoteControl(this);
+ cwindow_remote_handler = 0;
+ record_remote_handler = 0;
+#ifdef HAVE_X10TV
+// should be first, use if plugged
+ if( !cwindow_remote_handler && mwindow->x10tv ) {
+ cwindow_remote_handler = (RemoteHandler*)
+ new X10TVCWindowHandler(mwindow->x10tv, remote_control);
+ record_remote_handler = (RemoteHandler*)
+ new X10TVRecordHandler(mwindow->x10tv, remote_control);
+ }
+#endif
#ifdef HAVE_WINTV
- WinTV *wintv = mwindow->wintv;
- if( wintv ) {
+ if( !cwindow_remote_handler && mwindow->wintv ) {
cwindow_remote_handler = (RemoteHandler*)
- new WinTVCWindowHandler(wintv, remote_control);
+ new WinTVCWindowHandler(mwindow->wintv, remote_control);
record_remote_handler = (RemoteHandler*)
- new WinTVRecordHandler(wintv, remote_control);
+ new WinTVRecordHandler(mwindow->wintv, remote_control);
}
#endif
- if( !cwindow_remote_handler ) cwindow_remote_handler =
- (RemoteHandler*)new CWindowRemoteHandler(remote_control);
- if( !record_remote_handler ) record_remote_handler =
- (RemoteHandler*)new RecordRemoteHandler(remote_control);
mwindow->reset_android_remote();
-
if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
int x1 = get_w() - MainShBtns::calculate_w(-1, 0, -1) - xS(5);
if( android_control ) return;
android_control = new AndroidControl(this);
}
+int MWindowGUI::keyev_grab_remote()
+{
+ if( cwindow_remote_handler && cwindow_remote_handler->is_keytv() &&
+ record_remote_handler && record_remote_handler->is_keytv() )
+ return 0;
+ delete cwindow_remote_handler;
+ delete record_remote_handler;
+ cwindow_remote_handler = (RemoteHandler*)
+ new CWindowKeyEvHandler(mwindow->gui->remote_control);
+ record_remote_handler = (RemoteHandler*)
+ new RecordKeyEvHandler(mwindow->gui->remote_control);
+ return 1;
+}
int MWindowGUI::close_event()
{
#include "trackscroll.inc"
#include "transitionpopup.inc"
#include "wintv.inc"
+#include "x10tv.inc"
#include "zoombar.inc"
int keyboard_listener(BC_WindowBase *wp);
int key_listener(int key);
void use_android_remote(int on);
+ int keyev_grab_remote();
int close_event();
int quit();
void stop_drawing();
AndroidControl *android_control;
RemoteControl *remote_control;
WinTV *wintv;
+ X10TV *x10tv;
RemoteHandler *cwindow_remote_handler;
RemoteHandler *record_remote_handler;
};
#include "videoconfig.h"
#include "videodevice.h"
#include "wintv.h"
+#include "x10tv.h"
#include <string.h>
#include <sys/types.h>
record_gui->show_window();
record_gui->flush();
- if( mwindow->gui->remote_control->deactivate() )
+ if( mwindow->gui->remote_control->deactivate() &&
+ mwindow->gui->record_remote_handler )
mwindow->gui->record_remote_handler->activate();
if( video_window_open ) {
stop(0);
edl->Garbage::remove_user();
- if( mwindow->gui->remote_control->deactivate() )
+ if( mwindow->gui->remote_control->deactivate() &&
+ mwindow->gui->cwindow_remote_handler )
mwindow->gui->cwindow_remote_handler->activate();
// Save everything again
void Record::update_skimming(int v) {}
#endif
-RecordRemoteHandler::RecordRemoteHandler(RemoteControl *remote_control)
+RecordKeyEvHandler::RecordKeyEvHandler(RemoteControl *remote_control)
: RemoteHandler(remote_control->gui, GREEN)
{
this->remote_control = remote_control;
}
-RecordRemoteHandler::~RecordRemoteHandler()
+RecordKeyEvHandler::~RecordKeyEvHandler()
{
}
+int RecordKeyEvHandler::remote_key(int key)
+{
+ Record *record = remote_control->mwindow_gui->record;
+ return record->record_process_key(remote_control, key);
+}
+
void Record::
display_video_text(int x, int y, const char *text, int font,
int bg_color, int color, int alpha, double secs, double scale)
BIGFONT, WHITE, BLACK, 0, 3., 2.);
}
-int RecordRemoteHandler::process_key(int key)
-{
- Record *record = remote_control->mwindow_gui->record;
- return record->record_process_key(remote_control, key);
-}
-
int Record::record_process_key(RemoteControl *remote_control, int key)
{
int ch = key;
switch( key ) {
case KPENTER:
- if( last_key == KPENTER ) {
- set_channel_name(keybfr);
- clear_keybfr();
- break;
- }
- ch = '.'; // fall through
- case '0': if( last_key == '0' && ch == '0' ) {
+ if( last_key != KPENTER ) break;
+ case KPCC:
+ set_channel_name(keybfr);
clear_keybfr();
break;
- }
- case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
+ case '0':
+ if( last_key == '0' && ch == '0' ) {
+ clear_keybfr();
+ break;
+ } // fall thru
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+ case '.':
add_key(ch);
break;
- //case UP: case DOWN: case LEFT: case RIGHT:
- //case KPPLAY: case KPBACK: case KPFORW:
+ //case UP: case DOWN:
+ //case LEFT: case RIGHT:
+ //case KPPLAY: case KPFWRD:
+ case KPMUTE:
+ case 'a': // toggle mute audio
+ if( !monitor_audio ) { set_mute_gain(1); set_play_gain(1); }
+ set_audio_monitoring(monitor_audio ? 0 : 1);
+ break;
+ case KPBACK: case 'm': // toggle metering audio
+ set_audio_metering(metering_audio ? 0 : 1);
+ break;
+ case 'd': case KPSLASH:
+ display_channel_info();
+ break;
+ case 'e': case KPSTAR:
+ display_channel_schedule();
+ break;
+ case KPCHUP: case KPPLUS:
+ channel_up();
+ break;
+ case KPCHDN: case KPMINUS:
+ channel_down();
+ break;
+ case KPVOLUP: {
+ set_play_gain(play_gain * 1.25);
+ break; }
+ case KPVOLDN: {
+ set_play_gain(play_gain * 0.75);
+ break; }
+ case KPFSCRN:
+ case 'f': {
+ RecordMonitorCanvas *canvas = record_monitor->window->canvas;
+ int on = canvas->get_fullscreen() ? 0 : 1;
+ canvas->Canvas::set_fullscreen(on, 0);
+ break; }
#ifdef HAVE_COMMERCIAL
case KPRECD: case 'c': // start capture, mark endpoint
if( !deletions ) {
}
display_cut_icon(10,20);
break;
- case KPSTOP: case 'd': // end capture, start cutting
+ case KPSTOP: case 's': // end capture, start cutting
remote_control->set_color(YELLOW);
stop_commercial_capture(1);
break;
case KPAUSE: case 'x': // ignore current commercial
mark_commercial_capture(DEL_SKIP);
break;
-#endif
- case KPBACK: case 'a': // toggle mute audio
- if( !monitor_audio ) { set_mute_gain(1); set_play_gain(1); }
- set_audio_monitoring(monitor_audio ? 0 : 1);
- break;
- case 'm': // toggle metering audio
- set_audio_metering(metering_audio ? 0 : 1);
- break;
-#ifdef HAVE_COMMERCIAL
- case KPPLAY: case 's': // ignore previous endpoint
+ case KPPLAY: case 'z': // ignore previous endpoint
mark_commercial_capture(DEL_OOPS);
break;
#endif
- case KPFWRD: case KPSLASH:
- display_channel_info();
- break;
- case KPMAXW: case KPSTAR:
- display_channel_schedule();
- break;
- case KPCHUP: case KPPLUS:
- channel_up();
- break;
- case KPCHDN: case KPMINUS:
- channel_down();
- break;
- case 'f': {
- RecordMonitorCanvas *canvas = record_monitor->window->canvas;
- int on = canvas->get_fullscreen() ? 0 : 1;
- canvas->Canvas::set_fullscreen(on, 0);
- break; }
default:
return -1;
}
int Record::wintv_process_code(int code)
{
#ifdef HAVE_WINTV
- WinTV *wintv = (WinTV *)mwindow->gui->cwindow_remote_handler;
switch( code ) {
case WTV_OK: break;
case WTV_LT: break;
set_audio_metering(metering_audio ? 0 : 1);
break;
case WTV_VOLUP: {
- double gain = adevice->get_play_gain() * 1.25;
- set_play_gain(gain);
+ set_play_gain(play_gain * 1.125);
break; }
case WTV_VOLDN: {
- double gain = adevice->get_play_gain() * 0.75;
- set_play_gain(gain);
+ set_play_gain(play_gain * 0.875);
break; }
case WTV_CH_UP:
channel_up();
case WTV_CH_DN:
channel_down();
break;
- case WTV_0:
- if( wintv->last_code == WTV_0 ) {
+ case WTV_0: {
+ WinTVRecordHandler *wintv_remote = (WinTVRecordHandler *)
+ mwindow->gui->remote_control->handler;
+ WinTV *wintv = !wintv_remote ? 0 : wintv_remote->wintv;
+ if( !wintv || wintv->last_code == WTV_0 ) {
clear_keybfr();
break;
- } // fall thru
+ } } // fall thru
case WTV_1: case WTV_2: case WTV_3: case WTV_4:
case WTV_5: case WTV_6: case WTV_7: case WTV_8:
case WTV_9: {
return 0;
}
+int Record::x10tv_process_code(int code)
+{
+#ifdef HAVE_X10TV
+ switch( code ) {
+ case X10_A: // toggle metering audio
+ set_audio_metering(metering_audio ? 0 : 1);
+ break;
+ case X10_B: break;
+ case X10_POWER: break;
+ case X10_TV: break;
+ case X10_DVD: break;
+ case X10_WWW: break;
+ case X10_BOOK: break;
+ case X10_EDIT: break;
+ case X10_VOLUP: {
+ set_play_gain(play_gain * 1.125);
+ break; }
+ case X10_VOLDN: {
+ set_play_gain(play_gain * 0.875);
+ break; }
+ case X10_MUTE: // toggle mute audio
+ if( !monitor_audio ) {
+ set_mute_gain(1);
+ set_play_gain(play_gain);
+ }
+ set_audio_monitoring(monitor_audio ? 0 : 1);
+ break;
+ case X10_CH_UP:
+ channel_up();
+ break;
+ case X10_CH_DN:
+ channel_down();
+ break;
+ case X10_0: {
+ X10TVRecordHandler *x10tv_remote = (X10TVRecordHandler *)
+ mwindow->gui->remote_control->handler;
+ X10TV *x10tv = !x10tv_remote ? 0 : x10tv_remote->x10tv;
+ if( x10tv->last_code == X10_0 ) {
+ clear_keybfr();
+ break;
+ } } // fall thru
+ case X10_1: case X10_2: case X10_3: case X10_4:
+ case X10_5: case X10_6: case X10_7: case X10_8:
+ case X10_9: {
+ int ch = code - X10_0 + '0';
+ add_key(ch);
+ break; }
+ case X10_MENU: // add decimal point
+ add_key('.');
+ break;
+ case X10_SETUP: // change channel
+ set_channel_name(keybfr);
+ clear_keybfr();
+ break;
+ case X10_C:
+ display_channel_schedule();
+ break;
+ case X10_UP: break;
+ case X10_D:
+ display_channel_info();
+ break;
+ case X10_PROPS: break;
+ case X10_LT: break;
+ case X10_OK: break;
+ case X10_RT: break;
+ case X10_SCRN: {
+ RecordMonitorCanvas *canvas = record_monitor->window->canvas;
+ int on = canvas->get_fullscreen() ? 0 : 1;
+ canvas->Canvas::set_fullscreen(on, 0);
+ break; }
+ case X10_E: break;
+ case X10_DN: break;
+ case X10_F: break;
+ case X10_REW: break;
+ case X10_PLAY: break;
+ case X10_FWD: break;
+ case X10_REC: break;
+ case X10_STOP: break;
+ case X10_PAUSE: break;
+
+ default:
+ printf("x10tv record: unknown code: %04x\n", code);
+ break;
+ }
+#endif
+ return 0;
+}
+
#ifdef HAVE_COMMERCIAL
int Record::start_commercial_capture()
{
void add_key(int ch);
int record_process_key(RemoteControl *remote_control, int key);
int wintv_process_code(int code);
+ int x10tv_process_code(int code);
int spawn(const char *fmt, ...);
void display_video_text(int x, int y, const char *text, int font,
int bg_color, int color, int alpha, double secs, double scale);
~RecordSchedule() { remove_all_objects(); }
};
-class RecordRemoteHandler : public RemoteHandler
+class RecordKeyEvHandler : public RemoteHandler
{
public:
- int process_key(int key);
+ int remote_key(int key);
int spawn(const char *fmt, ...);
- RecordRemoteHandler(RemoteControl *remote_control);
- ~RecordRemoteHandler();
+ RecordKeyEvHandler(RemoteControl *remote_control);
+ ~RecordKeyEvHandler();
+ int is_keytv() { return 1; }
RemoteControl *remote_control;
};
class RecordMenuItem;
class Record;
-class RecordRemoteHandler;
+class KeyEvRecordHandler;
class RecordCutAdsStatus;
class RecordBlinkStatus;
int RemoteControl::activate(RemoteHandler *handler)
{
int result = 0;
- active_lock->lock("RemoteControl::activate");
- if( !is_active() ) {
- if( !handler ) handler = !mwindow_gui->record->running() ?
+ deactivate();
+ if( !handler )
+ handler = !mwindow_gui->record->running() ?
(RemoteHandler *)mwindow_gui->cwindow_remote_handler :
(RemoteHandler *)mwindow_gui->record_remote_handler ;
+ active_lock->lock("RemoteControl::activate");
+ if( handler ) {
gui->lock_window("RemoteControl::activate");
gui->set_active(handler);
gui->set_color(handler->color);
int RemoteControl::deactivate()
{
int result = 0;
- active_lock->lock("RemoteControl::deactivate");
if( is_active() ) {
- gui->set_inactive();
- result = 1;
+ active_lock->lock("RemoteControl::deactivate");
+ if( is_active() ) {
+ gui->set_inactive();
+ result = 1;
+ }
+ active_lock->unlock();
}
- active_lock->unlock();
return result;
}
int RemoteControl::remote_key(int key)
{
if( !is_active() ) return 0;
- return handler->process_key(key);
+ return handler->remote_key(key);
}
void RemoteControl::set_color(int color)
{
}
+int RemoteHandler::remote_key(int key)
+{
+ gui->set_inactive();
+ return -1;
+}
+
+int RemoteHandler::process_key(int key)
+{
+ return -1;
+}
int color;
void activate() { gui->set_active(this); }
- virtual int process_key(int key) { return -1; }
+ virtual int remote_key(int key);
+ virtual int process_key(int key);
+
+ virtual int is_keytv() { return 0; }
+ virtual int is_wintv() { return 0; }
+ virtual int is_x10tv() { return 0; }
RemoteHandler(RemoteGUI *gui, int color);
virtual ~RemoteHandler();
char path[PATH_MAX]; struct stat st;
snprintf(path, PATH_MAX, "%s/%s", dev_input, fn);
if( stat(path, &st) < 0 ) continue;
- if( S_ISDIR(st.st_mode) ) continue;
+ if( !S_ISCHR(st.st_mode) ) continue;
int fd = open(path, O_RDONLY);
if( fd < 0 ) continue;
if( !ioctl(fd, EVIOCGID, &dev_id) ) {
break;
case WTV_TV: {
Record *record = mwindow->gui->record;
- if( !record->running() )
- record->start();
- else
- record->record_gui->interrupt_thread->start(0);
- break; }
+ if( !record->running() )
+ record->start();
+ else
+ record->record_gui->interrupt_thread->start(0);
+ break; }
case WTV_MENU:
#ifdef HAVE_DVB
mwindow->gui->channel_info->toggle_scan();
case WTV_RED: {
RemoteControl *remote_control = mwindow->gui->remote_control;
if( !remote_control->deactivate() )
- remote_control->activate();
+ remote_control->activate();
break; }
default:
result = 0;
int WinTVCWindowHandler::wintv_process_code(int code)
{
- MWindow *mwindow = wintv->mwindow;
- EDL *edl = mwindow->edl;
- if( !edl ) return 0;
- PlayTransport *transport = mwindow->gui->mbuttons->transport;
- if( !transport->get_edl() ) return 0;
- PlaybackEngine *engine = transport->engine;
- double position = engine->get_tracking_position();
- double length = edl->tracks->total_length();
- int next_command = -1;
+ MWindow *mwindow = wintv->mwindow;
+ EDL *edl = mwindow->edl;
+ if( !edl ) return 0;
+ PlayTransport *transport = mwindow->gui->mbuttons->transport;
+ if( !transport->get_edl() ) return 0;
+ PlaybackEngine *engine = transport->engine;
+ double position = engine->get_tracking_position();
+ double length = edl->tracks->total_length();
+ int next_command = -1;
switch( code ) {
case WTV_OK:
case WTV_DN: position -= 60.0; break;
case WTV_BACK: return 1;
case WTV_HOME: {
- CWindowCanvas *canvas = mwindow->cwindow->gui->canvas;
- int on = canvas->get_fullscreen() ? 0 : 1;
- canvas->Canvas::set_fullscreen(on, 0);
- return 1; }
+ CWindowCanvas *canvas = mwindow->cwindow->gui->canvas;
+ int on = canvas->get_fullscreen() ? 0 : 1;
+ canvas->Canvas::set_fullscreen(on, 0);
+ return 1; }
case WTV_VOLUP: return 1;
case WTV_VOLDN: return 1;
case WTV_CH_UP: return 1;
if( next_command < 0 ) {
if( position < 0 ) position = 0;
transport->change_position(position);
- }
+ }
else
transport->handle_transport(next_command);
return 0;
WinTVCWindowHandler(WinTV *wintv, RemoteControl *remote_control);
int wintv_process_code(int code);
int process_key(int key);
+ int is_wintv() { return 1; }
WinTV *wintv;
};
WinTVRecordHandler(WinTV *wintv, RemoteControl *remote_control);
int wintv_process_code(int code);
int process_key(int key);
+ int is_wintv() { return 1; }
WinTV *wintv;
};
--- /dev/null
+#ifdef HAVE_X10TV
+
+#include "channelinfo.h"
+#include "cwindow.h"
+#include "cwindowgui.h"
+#include "edl.h"
+#include "mbuttons.h"
+#include "mwindow.h"
+#include "mwindowgui.h"
+#include "language.h"
+#include "playbackengine.h"
+#include "playtransport.h"
+#include "record.h"
+#include "recordgui.h"
+#include "recordmonitor.h"
+#include "remotecontrol.h"
+#include "tracks.h"
+#include "x10tv.h"
+
+#include <dirent.h>
+#include <linux/input.h>
+
+X10TV::X10TV(MWindow *mwindow, int *fds, int nfds)
+{
+ this->mwindow = mwindow;
+ this->ifds = new int[nfds];
+ this->nfds = nfds;
+ for( int i=0; i<nfds; ++i ) this->ifds[i] = fds[i];
+
+ ev = new input_event;
+ memset(ev, 0, sizeof(*ev));
+ ev->code = -1;
+ done = -1;
+ last_code = -1;
+ code = -1;
+ FD_ZERO(&rfds);
+ mfd = -1;
+}
+
+X10TV::~X10TV()
+{
+ stop();
+ delete ev;
+}
+
+void X10TV::stop()
+{
+ done = 1;
+ for( int i=nfds; --i>=0; ) {
+ ioctl(ifds[i], EVIOCGRAB, 0);
+ close(ifds[i]);
+ }
+ nfds = 0;
+ if( running() ) {
+ cancel();
+ join();
+ }
+}
+
+void X10TV::start()
+{
+ FD_ZERO(&rfds);
+ mfd = -1;
+ for( int i=nfds; --i>=0; ) {
+ int fd = ifds[i];
+ ioctl(fd, EVIOCGRAB, 1);
+ if( fd >= mfd ) mfd = fd+1;
+ FD_SET(fd, &rfds);
+ }
+ done = 0;
+ Thread::start();
+}
+
+int X10TV::open_usb_inputs(int vendor, int product, int &version,
+ int *ifds, int mxfds)
+{
+ int ret = -1;
+ const char *dev_input = "/dev/input";
+ DIR *dir = opendir(dev_input);
+ if( !dir ) return ret;
+
+ struct dirent64 *dp;
+ struct input_id dev_id;
+ int nfds = 0;
+ while( nfds < mxfds && (dp = readdir64(dir)) != 0 ) {
+ char *fn = dp->d_name;
+ if( !strcmp(fn, ".") || !strcmp(fn, "..") ) continue;
+ char path[PATH_MAX]; struct stat st;
+ snprintf(path, PATH_MAX, "%s/%s", dev_input, fn);
+ if( stat(path, &st) < 0 ) continue;
+ if( !S_ISCHR(st.st_mode) ) continue;
+ int fd = open(path, O_RDONLY);
+ if( fd < 0 ) continue;
+ if( !ioctl(fd, EVIOCGID, &dev_id) ) {
+ if( dev_id.bustype == BUS_USB &&
+ dev_id.vendor == vendor &&
+ dev_id.product == product ) {
+ unsigned props = 0;
+ // quirk, reports pointing_stick for keys
+ unsigned mptrs =
+ (1<<INPUT_PROP_POINTING_STICK);
+ int ret = ioctl(fd, EVIOCGPROP(sizeof(props)), &props);
+ if( ret == sizeof(props) && (props & mptrs) ) {
+ version = dev_id.version;
+ ifds[nfds++] = fd;
+ continue;
+ }
+ }
+ }
+ close(fd);
+ }
+ closedir(dir);
+ return nfds;
+}
+
+
+X10TV *X10TV::probe(MWindow *mwindow)
+{
+ int ver = -1, ifds[16];
+ int nfds = open_usb_inputs(0x0bc7, 0x0004, ver, ifds, 16);
+ if( !nfds ) return 0;
+ printf("detected ATI X10 remote, ver=0x%04x\n", ver);
+ return new X10TV(mwindow, ifds, nfds);
+}
+
+void X10TV::run()
+{
+ enable_cancel();
+ while( !done ) {
+ fd_set rds = rfds;
+ int ret = select(mfd, &rds, 0, 0, 0);
+ if( ret < 0 ) break;
+ int fd = -1, k = ret > 0 ? nfds : 0;
+ while( --k >= 0 ) {
+ int ifd = ifds[k];
+ if( FD_ISSET(ifd, &rds) ) {
+ fd = ifd; break;
+ }
+ }
+ if( fd < 0 ) {
+ printf("select failed\n");
+ usleep(100000); continue;
+ }
+ ret = read(fd, ev, sizeof(*ev));
+ if( done ) break;
+ if( ret != sizeof(*ev) ) {
+ if( ret < 0 ) { perror("read event"); break; }
+ fprintf(stderr, "bad read: %d\n", ret);
+ break;
+ }
+ handle_event(fd);
+ }
+}
+
+int X10TV::check_menu_keys(int code)
+{
+ int result = 1;
+ switch( code ) {
+ case X10_POWER:
+ mwindow->quit();
+ break;
+ case X10_TV: {
+ Record *record = mwindow->gui->record;
+ if( !record->running() )
+ record->start();
+ else
+ record->record_gui->interrupt_thread->start(0);
+ break; }
+ case X10_BOOK:
+#ifdef HAVE_DVB
+ mwindow->gui->channel_info->toggle_scan();
+#endif
+ break;
+ case X10_EDIT: {
+ RemoteControl *remote_control = mwindow->gui->remote_control;
+ if( !remote_control->deactivate() )
+ remote_control->activate();
+ break; }
+ default:
+ result = 0;
+ }
+ return result;
+}
+
+void X10TV::handle_event(int fd)
+{
+ switch(ev->type) {
+ case EV_KEY: {
+ if( !ev->value ) break;
+ this->last_code = this->code;
+ this->code = ev->code;
+ if( check_menu_keys(code) ) break;
+ RemoteHandler *handler = mwindow->gui->remote_control->handler;
+ if( handler )
+ handler->process_key(ev->code);
+ break; }
+ case EV_SYN:
+ case EV_MSC:
+ break;
+ default: {
+ time_t t = ev->time.tv_sec;
+ struct tm *tp = localtime(&t);
+ printf("x10tv event %d: %4d/%02d/%02d %02d:%02d:%02d.%03d = (%d, %d, 0x%x)\n",
+ fd, tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday,
+ tp->tm_hour, tp->tm_min, tp->tm_sec,
+ (int)ev->time.tv_usec/1000, ev->type, ev->code, ev->value);
+ break; }
+ }
+}
+
+
+int X10TVCWindowHandler::x10tv_process_code(int code)
+{
+ MWindow *mwindow = x10tv->mwindow;
+ EDL *edl = mwindow->edl;
+ if( !edl ) return 0;
+ PlayTransport *transport = mwindow->gui->mbuttons->transport;
+ if( !transport->get_edl() ) return 0;
+ PlaybackEngine *engine = transport->engine;
+ double position = engine->get_tracking_position();
+ double length = edl->tracks->total_length();
+ int next_command = -1;
+
+ switch( code ) {
+ case X10_A: break;
+ case X10_B: break;
+ case X10_POWER: break;
+ case X10_TV: break;
+ case X10_DVD: break;
+ case X10_WWW: break;
+ case X10_BOOK: break;
+ case X10_EDIT: break;
+ case X10_VOLDN: return 1;
+ case X10_VOLUP: return 1;
+ case X10_MUTE: break;
+ case X10_CH_DN: break;
+ case X10_CH_UP: break;
+// select window tile config = BACK 1,2,3
+ case X10_1: case X10_2: case X10_3:
+ if( mwindow->x10tv->last_code == X10_MENU ) {
+ RemoteGUI *rgui = mwindow->gui->cwindow_remote_handler->gui;
+ rgui->tile_windows(code - X10_1);
+ return 1;
+ } // fall thru
+// select asset program config = TEXT 1,2,3,4,5,6
+ case X10_4: case X10_5: case X10_6:
+ if( mwindow->x10tv->last_code == X10_SETUP ) {
+ mwindow->select_asset(code - X10_1, 1);
+ break;
+ } // fall thru
+ case X10_7: case X10_8: case X10_9:
+ case X10_0:
+// select position in 10 percent units
+ position = length * (code - X10_0)/10.0;
+ break;
+ case X10_MENU: return 0;
+ case X10_SETUP: return 0;
+ case X10_C: return 1;
+ case X10_UP: position += 60.0; break;
+ case X10_D: return 1;
+ case X10_PROPS: return 1;
+ case X10_LT: position -= 10.0; break;
+ case X10_OK: return 1;
+ case X10_RT: position += 10.0; break;
+ case X10_SCRN: {
+ CWindowCanvas *canvas = mwindow->cwindow->gui->canvas;
+ int on = canvas->get_fullscreen() ? 0 : 1;
+ canvas->Canvas::set_fullscreen(on, 0);
+ return 1; }
+ case X10_E: return 1;
+ case X10_DN: position -= 60.0; break;
+ case X10_F: return 1;
+ case X10_REW: next_command = FAST_REWIND; break;
+ case X10_PLAY: next_command = NORMAL_FWD; break;
+ case X10_FWD: next_command = FAST_FWD; break;
+ case X10_REC: next_command = SLOW_REWIND; break;
+ case X10_STOP: next_command = STOP; break;
+ case X10_PAUSE: next_command = SLOW_FWD; break;
+
+ default:
+ printf("x10tv cwindow: unknown code: %04x\n", code);
+ return -1;
+ }
+
+ if( next_command < 0 ) {
+ if( position < 0 ) position = 0;
+ transport->change_position(position);
+ }
+ else
+ transport->handle_transport(next_command);
+ return 0;
+}
+
+int X10TVCWindowHandler::process_key(int key)
+{
+ return x10tv_process_code(key);
+}
+
+int X10TVRecordHandler::process_key(int key)
+{
+ Record *record = x10tv->mwindow->gui->record;
+ return record->x10tv_process_code(key);
+}
+
+
+X10TVRecordHandler::X10TVRecordHandler(X10TV *x10tv, RemoteControl *remote_control)
+ : RemoteHandler(remote_control->gui, GREEN)
+{
+ this->x10tv = x10tv;
+}
+
+X10TVCWindowHandler::X10TVCWindowHandler(X10TV *x10tv, RemoteControl *remote_control)
+ : RemoteHandler(remote_control->gui, BLUE)
+{
+ this->x10tv = x10tv;
+}
+
+// HAVE_X10TV
+#endif
--- /dev/null
+#ifndef __X10TV_H__
+#define __X10TV_H__
+#ifdef HAVE_X10TV
+
+#include "remotecontrol.h"
+#include "thread.h"
+
+#define X10_A 0x001e
+#define X10_B 0x0030
+#define X10_POWER 0x0074
+#define X10_TV 0x0179
+#define X10_DVD 0x0185
+#define X10_WWW 0x0096
+#define X10_BOOK 0x009c
+#define X10_EDIT 0x00b0
+#define X10_VOLDN 0x0072
+#define X10_VOLUP 0x0073
+#define X10_MUTE 0x0071
+#define X10_CH_DN 0x0193
+#define X10_CH_UP 0x0192
+#define X10_1 0x0201
+#define X10_2 0x0202
+#define X10_3 0x0203
+#define X10_4 0x0204
+#define X10_5 0x0205
+#define X10_6 0x0206
+#define X10_7 0x0207
+#define X10_8 0x0208
+#define X10_9 0x0209
+#define X10_MENU 0x008b
+#define X10_0 0x0200
+#define X10_SETUP 0x008d
+#define X10_C 0x002e
+#define X10_UP 0x0067
+#define X10_D 0x0020
+#define X10_PROPS 0x0082
+#define X10_LT 0x0069
+#define X10_OK 0x0160
+#define X10_RT 0x006a
+#define X10_SCRN 0x0177
+#define X10_E 0x0012
+#define X10_DN 0x006c
+#define X10_F 0x0021
+#define X10_REW 0x00a8
+#define X10_PLAY 0x00cf
+#define X10_FWD 0x00d0
+#define X10_REC 0x00a7
+#define X10_STOP 0x00a6
+#define X10_PAUSE 0x0077
+
+// unknown keysyms
+//#define X10_NEXT 0x0000
+//#define X10_PREV 0x0000
+//#define X10_INFO 0x0000
+//#define X10_HOME 0x0000
+//#define X10_END 0x0000
+//#define X10_SELECT 0x0000
+
+struct input_event;
+
+class X10TV : public Thread
+{
+public:
+ X10TV(MWindow *mwindow, int *ifd, int nfds);
+ ~X10TV();
+
+ void stop();
+ void start();
+ static int open_usb_inputs(int vendor, int product, int &version,
+ int *ifds, int nfds);
+ static X10TV *probe(MWindow *mwindow);
+ void run();
+ void handle_event(int fd);
+ int check_menu_keys(int code);
+ virtual int process_code() { return 1; }
+
+ MWindow *mwindow;
+ input_event *ev;
+ int done;
+ int *ifds, nfds;
+ int last_code, code;
+ fd_set rfds;
+ int mfd;
+};
+
+class X10TVCWindowHandler : public RemoteHandler
+{
+public:
+ X10TVCWindowHandler(X10TV *wintv, RemoteControl *remote_control);
+ int x10tv_process_code(int code);
+ int process_key(int key);
+ int is_x10tv() { return 1; }
+
+ X10TV *x10tv;
+};
+
+class X10TVRecordHandler : public RemoteHandler
+{
+public:
+ X10TVRecordHandler(X10TV *wintv, RemoteControl *remote_control);
+ int wintv_process_code(int code);
+ int process_key(int key);
+ int is_x10tv() { return 1; }
+
+ X10TV *x10tv;
+};
+
+#endif
+#endif
--- /dev/null
+#ifndef __X10TV_INC__
+#define __X10TV_INC__
+
+class X10TV;
+class X10TVRemote;
+class X10TVCWindowHandler;
+class X10TVRecordHandler;
+
+#endif
CHECK_WITH([thirdparty],[use thirdparty build],[CIN_3RDPARTY],[yes])
CHECK_WITH([shuttle],[shuttle device],[SHUTTLE],[yes])
CHECK_WITH([wintv],[usb 2040:826d wintv device],[WINTV],[yes])
+CHECK_WITH([x10tv],[usb 0bc7:0004 X10 remote device],[X10TV],[yes])
CHECK_WITH([vaapi],[video acceleration api],[VAAPI],[yes])
CHECK_WITH([vdpau],[video decode+presentation api for unix],[VDPAU],[yes])
CHECK_WITH([nv],[nvenc/nvdec ffnvcodec api],[NV],[yes])
for v in GL XFT XXF86VM OSS ALSA FIREWIRE DV DVB \
VIDEO4LINUX2 ESOUND PACTL OPENEXR LV2 \
COMMERCIAL LIBZMPEG SHUTTLE SHUTTLE_USB \
- VAAPI VDPAU CUDA NV WINTV; do
+ VAAPI VDPAU CUDA NV WINTV X10TV; do
eval vv="\$WANT_$v"
if test "x$vv" != "xno"; then
CFG_CFLAGS+=" -DHAVE_$v"
case XK_F10: key_pressed = KEY_F10; break;
case XK_F11: key_pressed = KEY_F11; break;
case XK_F12: key_pressed = KEY_F12; break;
-
+// activates remote
case XK_Menu: key_pressed = KPMENU; break; /* menu */
-// remote control
-// above case XK_KP_Enter: key_pressed = KPENTER; break; /* check */
- case XF86XK_MenuKB: key_pressed = KPMENU; break; /* menu */
-// intercepted case XF86XK_PowerDown: key_pressed = KPPOWER; break; /* Power */
- case XF86XK_Launch1: key_pressed = KPTV; break; /* TV */
- case XF86XK_Launch2: key_pressed = KPDVD; break; /* DVD */
-// intercepted case XF86XK_WWW: key_pressed = KPWWEB; break; /* WEB */
- case XF86XK_Launch3: key_pressed = KPBOOK; break; /* book */
- case XF86XK_Launch4: key_pressed = KPHAND; break; /* hand */
- case XF86XK_Reply: key_pressed = KPTMR; break; /* timer */
- case SunXK_Front: key_pressed = KPMAXW; break; /* max */
-// above case XK_Left: key_pressed = LEFT; break; /* left */
-// above case XK_Right: key_pressed = RIGHT; break; /* right */
-// above case XK_Down: key_pressed = DOWN; break; /* down */
-// above case XK_Up: key_pressed = UP; break; /* up */
-// above case XK_SPACE: key_pressed = KPSPACE; break; /* ok */
-// intercepted case XF86XK_AudioRaiseVolume: key_pressed = KPVOLU; break; /* VOL + */
-// intercepted case XF86XK_AudioMute: key_pressed = KPMUTE; break; /* MUTE */
-// intercepted case XF86XK_AudioLowerVolume: key_pressed = KPVOLD; break; /* VOL - */
- case XF86XK_ScrollUp: key_pressed = KPCHUP; break; /* CH + */
- case XF86XK_ScrollDown: key_pressed = KPCHDN; break; /* CH - */
- case XF86XK_AudioRecord: key_pressed = KPRECD; break; /* ( o) red */
- case XF86XK_Forward: key_pressed = KPPLAY; break; /* ( >) */
- case XK_Redo: key_pressed = KPFWRD; break; /* (>>) */
- case XF86XK_Back: key_pressed = KPBACK; break; /* (<<) */
- case XK_Cancel: key_pressed = KPSTOP; break; /* ([]) */
- case XK_Pause: key_pressed = KPAUSE; break; /* ('') */
default:
key_pressed = keysym & 0xff;
#define LEFTTAB 283
#define DELETE 284
-// ati_remote key bindings
-// requires some substitions in kernel module
-// due to deficiencies in X evdev et al. examples:
-// need to know which dev created the event (duh)
-// keycodes > 255 are dropped
-// keycoodes are offset by 8 before xkb mapping
-// a bunch of keycodes are intercepted by windowmanger
-// KEY_OK = KEY_SPACE
-// KEY_CHANNELUP = KEY_SCROLLUP
-// KEY_CHANNELDOWN = KEY_SCROLLDOWN
-// KEY_PLAY = KEY_FORWARD
-// KEY_REWIND = KEY_BACK
-// KEY_FORWARD = KEY_AGAIN
-// - ati_remote.c, mapped in rc-ati-x10.c
-#if 0
- { 0x18, KEY_KPENTER }, /* "check" */
- { 0x16, KEY_MENU }, /* "menu" */
- { 0x02, KEY_POWER }, /* Power */
- { 0x03, KEY_PROG1 }, /* TV */ /* was KEY_TV */
- { 0x04, KEY_PROG2 }, /* DVD */ /* was KEY_DVD */
- { 0x05, KEY_WWW }, /* WEB */
- { 0x06, KEY_PROG3 }, /* "book" */ /* was KEY_BOOKMARKS */
- { 0x07, KEY_PROG4 }, /* "hand" */ /* was KEY_EDIT */
- { 0x1c, KEY_REPLY }, /* "timer" */ /* was KEY_COFFEE */
- { 0x20, KEY_FRONT }, /* "max" */
- { 0x1d, KEY_LEFT }, /* left */
- { 0x1f, KEY_RIGHT }, /* right */
- { 0x22, KEY_DOWN }, /* down */
- { 0x1a, KEY_UP }, /* up */
- { 0x1e, KEY_SPACE }, /* "OK" */ /* was KEY_OK */
- { 0x09, KEY_VOLUMEDOWN }, /* VOL + */
- { 0x08, KEY_VOLUMEUP }, /* VOL - */
- { 0x0a, KEY_MUTE }, /* MUTE */
- { 0x0b, KEY_SCROLLUP }, /* CH + */ /* was KEY_CHANNELUP */
- { 0x0c, KEY_SCROLLDOWN }, /* CH - */ /* was KEY_CHANNELDOWN */
- { 0x27, KEY_RECORD }, /* ( o) red */
- { 0x25, KEY_FORWARD }, /* ( >) */ /* was KEY_PLAY */
- { 0x24, KEY_BACK }, /* (<<) */ /* was KEY_REWIND */
- { 0x26, KEY_AGAIN }, /* (>>) */ /* was KEY_FORWARD */
- { 0x28, KEY_STOP }, /* ([]) */
- { 0x29, KEY_PAUSE }, /* ('') */
-#endif
-#define KPREV 284
#define KPMENU 285
#define KPTV 286
-#define KPDVD 287
+#define KPREV 287
#define KPBOOK 288
#define KPHAND 289
-#define KPTMR 290
-#define KPMAXW 291
+#define KPMUTE 290
+#define KPFSCRN 291
#define KPCHUP 292
#define KPCHDN 293
#define KPBACK 294
#define KPRECD 297
#define KPSTOP 298
#define KPAUSE 299
+
// function keys
#define KEY_F1 301
#define KEY_F2 302
#define KEY_F10 310
#define KEY_F11 311
#define KEY_F12 312
+#define KPVOLUP 313
+#define KPVOLDN 314
+#define KPCC 315
#define RETURN 13
#define NEWLINE 13