summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Morley <chrisinnanaimo@hotmail.com>2013-03-19 17:31:25 -0700
committerChris Morley <chrisinnanaimo@hotmail.com>2013-03-20 20:26:45 -0700
commit4385710e80ab060012fa18bc9c2fac6a175d3161 (patch)
treecb617552402eedb00d4044b486cfe3636e430438
parent24f213d401637f542396449b3d0812b5b56cc8b6 (diff)
downloadlinuxcnc-4385710e80ab060012fa18bc9c2fac6a175d3161.tar.gz
linuxcnc-4385710e80ab060012fa18bc9c2fac6a175d3161.zip
Gmoccapy -add a new Gscreen based control screen
This is very different look build by Norbert Schechner. It was inspired by Mocca a outside source screen programed in Pascal This uses Gscreen's framework but highly modified with a handler file.
-rw-r--r--configs/sim/gmoccapy/README15
l---------configs/sim/gmoccapy/axis_manualtoolchange.hal1
l---------configs/sim/gmoccapy/core_sim.hal1
-rw-r--r--configs/sim/gmoccapy/dro.glade278
-rw-r--r--configs/sim/gmoccapy/gmoccapy.glade5101
-rw-r--r--configs/sim/gmoccapy/gmoccapy.ini200
-rw-r--r--configs/sim/gmoccapy/gmoccapy_handler.py1594
-rw-r--r--configs/sim/gmoccapy/gmoccapy_hw_btn_postgui.hal36
-rw-r--r--configs/sim/gmoccapy/gmoccapy_left_panel.ini201
-rw-r--r--configs/sim/gmoccapy/gmoccapy_postgui.hal36
-rw-r--r--configs/sim/gmoccapy/gmoccapy_right_panel.ini200
-rw-r--r--configs/sim/gmoccapy/gmoccapy_with_simulated_hardware_buttons.ini200
-rw-r--r--configs/sim/gmoccapy/gmoccapy_with_user_tabs.ini201
-rw-r--r--configs/sim/gmoccapy/h_buttonlist.glade169
-rw-r--r--configs/sim/gmoccapy/icon/Auto.gifbin0 -> 780 bytes
-rw-r--r--configs/sim/gmoccapy/icon/E-Stop.gifbin0 -> 2181 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/Logo.pngbin0 -> 500 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/clear.pngbin0 -> 2088 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/configure-2.pngbin0 -> 5145 bytes
-rw-r--r--configs/sim/gmoccapy/icon/coolant_off.pngbin0 -> 1159 bytes
-rw-r--r--configs/sim/gmoccapy/icon/coolant_on.gifbin0 -> 1669 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/dimensions.pngbin0 -> 2802 bytes
-rw-r--r--configs/sim/gmoccapy/icon/editor.pngbin0 -> 2535 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/enter.pngbin0 -> 1230 bytes
-rw-r--r--configs/sim/gmoccapy/icon/estopred.pngbin0 -> 3509 bytes
-rw-r--r--configs/sim/gmoccapy/icon/exit.pngbin0 -> 3998 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/exit_application.pngbin0 -> 2989 bytes
-rw-r--r--configs/sim/gmoccapy/icon/forward.pngbin0 -> 1098 bytes
-rw-r--r--configs/sim/gmoccapy/icon/forward_on.gifbin0 -> 1634 bytes
-rw-r--r--configs/sim/gmoccapy/icon/from where are the icons.txt73
-rw-r--r--configs/sim/gmoccapy/icon/index_tool.svg83
-rw-r--r--configs/sim/gmoccapy/icon/jog.pngbin0 -> 1317 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/keyboard.pngbin0 -> 4136 bytes
-rw-r--r--configs/sim/gmoccapy/icon/machineonoff.pngbin0 -> 896 bytes
-rw-r--r--configs/sim/gmoccapy/icon/mdi.pngbin0 -> 1394 bytes
-rw-r--r--configs/sim/gmoccapy/icon/mist_off.pngbin0 -> 1341 bytes
-rw-r--r--configs/sim/gmoccapy/icon/mist_on.gifbin0 -> 1743 bytes
-rw-r--r--configs/sim/gmoccapy/icon/pause.pngbin0 -> 1391 bytes
-rw-r--r--configs/sim/gmoccapy/icon/refall.pngbin0 -> 1858 bytes
-rw-r--r--configs/sim/gmoccapy/icon/refx.pngbin0 -> 1850 bytes
-rw-r--r--configs/sim/gmoccapy/icon/refy.pngbin0 -> 1742 bytes
-rw-r--r--configs/sim/gmoccapy/icon/refz.pngbin0 -> 1732 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/reload.pngbin0 -> 4065 bytes
-rw-r--r--configs/sim/gmoccapy/icon/reverse.pngbin0 -> 1098 bytes
-rw-r--r--configs/sim/gmoccapy/icon/reverse_on.gifbin0 -> 1656 bytes
-rw-r--r--configs/sim/gmoccapy/icon/run.pngbin0 -> 1091 bytes
-rw-r--r--configs/sim/gmoccapy/icon/runfrom.pngbin0 -> 1245 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/save-as.pngbin0 -> 4233 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/save.pngbin0 -> 3886 bytes
-rw-r--r--configs/sim/gmoccapy/icon/start.pngbin0 -> 2276 bytes
-rw-r--r--configs/sim/gmoccapy/icon/step.pngbin0 -> 1171 bytes
-rw-r--r--configs/sim/gmoccapy/icon/stop.gifbin0 -> 1325 bytes
-rw-r--r--configs/sim/gmoccapy/icon/stop.pngbin0 -> 3200 bytes
-rw-r--r--configs/sim/gmoccapy/icon/stop_on.gifbin0 -> 1301 bytes
-rw-r--r--configs/sim/gmoccapy/icon/tool_blockdelete.gifbin0 -> 350 bytes
-rw-r--r--configs/sim/gmoccapy/icon/tool_rotate.gifbin0 -> 1285 bytes
-rw-r--r--configs/sim/gmoccapy/icon/toolaxisp.pngbin0 -> 990 bytes
-rw-r--r--configs/sim/gmoccapy/icon/toolaxisx.pngbin0 -> 511 bytes
-rw-r--r--configs/sim/gmoccapy/icon/toolaxisy.pngbin0 -> 423 bytes
-rw-r--r--configs/sim/gmoccapy/icon/toolaxisz.pngbin0 -> 499 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/toolchange.pngbin0 -> 2937 bytes
-rw-r--r--configs/sim/gmoccapy/icon/toolpath.pngbin0 -> 971 bytes
-rw-r--r--configs/sim/gmoccapy/icon/tools.pngbin0 -> 1905 bytes
-rw-r--r--configs/sim/gmoccapy/icon/touchoffwz.pngbin0 -> 3207 bytes
-rw-r--r--configs/sim/gmoccapy/icon/touchoffx.pngbin0 -> 3224 bytes
-rw-r--r--configs/sim/gmoccapy/icon/touchoffx_value.pngbin0 -> 2570 bytes
-rw-r--r--configs/sim/gmoccapy/icon/touchoffy.pngbin0 -> 2961 bytes
-rw-r--r--configs/sim/gmoccapy/icon/touchoffy_value.pngbin0 -> 2474 bytes
-rw-r--r--configs/sim/gmoccapy/icon/touchoffz.pngbin0 -> 2969 bytes
-rw-r--r--configs/sim/gmoccapy/icon/touchoffz_value.pngbin0 -> 2476 bytes
-rw-r--r--configs/sim/gmoccapy/icon/unhome.pngbin0 -> 1871 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/zoom-in.pngbin0 -> 2879 bytes
-rwxr-xr-xconfigs/sim/gmoccapy/icon/zoom-out.pngbin0 -> 2783 bytes
-rw-r--r--configs/sim/gmoccapy/nc_files/Gmoccapy_2_tools_with compensation.ngc95
-rw-r--r--configs/sim/gmoccapy/nc_files/diferent speeds.ngc36
-rw-r--r--configs/sim/gmoccapy/nc_files/subroutines/go_to_position.ngc24
-rw-r--r--configs/sim/gmoccapy/nc_files/subroutines/halo_world.ngc26
-rw-r--r--configs/sim/gmoccapy/nc_files/subroutines/i_am_lost.ngc24
-rw-r--r--configs/sim/gmoccapy/nc_files/subroutines/increment.ngc22
-rw-r--r--configs/sim/gmoccapy/nc_files/subroutines/jog_around.ngc29
-rw-r--r--configs/sim/gmoccapy/nc_files/subroutines/macro_Instructions.txt44
-rwxr-xr-xconfigs/sim/gmoccapy/release_notes.txt228
l---------configs/sim/gmoccapy/sim_spindle_encoder.hal1
l---------configs/sim/gmoccapy/simulated_home.hal1
-rwxr-xr-xconfigs/sim/gmoccapy/tool.tbl24
-rw-r--r--configs/sim/gmoccapy/v_buttonlist.glade122
-rw-r--r--configs/sim/gmoccapy/vcp_box.glade69
87 files changed, 9134 insertions, 0 deletions
diff --git a/configs/sim/gmoccapy/README b/configs/sim/gmoccapy/README
new file mode 100644
index 000000000..32773e827
--- /dev/null
+++ b/configs/sim/gmoccapy/README
@@ -0,0 +1,15 @@
+This is a simulation of an XYZ axis mill.
+with metric units
+
+The main purpose of this is to show the posibilities
+offered by gscreen to design custom screens.
+
+This screen is based of the design of mocca, an GUI coded in FreePascal.
+
+gscreen and moccapy is using Python instead.
+
+Feel free to send any comment to
+
+gmoccapy@web.de
+
+
diff --git a/configs/sim/gmoccapy/axis_manualtoolchange.hal b/configs/sim/gmoccapy/axis_manualtoolchange.hal
new file mode 120000
index 000000000..b7c30109b
--- /dev/null
+++ b/configs/sim/gmoccapy/axis_manualtoolchange.hal
@@ -0,0 +1 @@
+../axis_manualtoolchange.hal \ No newline at end of file
diff --git a/configs/sim/gmoccapy/core_sim.hal b/configs/sim/gmoccapy/core_sim.hal
new file mode 120000
index 000000000..ead328270
--- /dev/null
+++ b/configs/sim/gmoccapy/core_sim.hal
@@ -0,0 +1 @@
+../core_sim.hal \ No newline at end of file
diff --git a/configs/sim/gmoccapy/dro.glade b/configs/sim/gmoccapy/dro.glade
new file mode 100644
index 000000000..06d54598e
--- /dev/null
+++ b/configs/sim/gmoccapy/dro.glade
@@ -0,0 +1,278 @@
+<?xml version="1.0"?>
+<interface>
+ <!-- interface-requires gladevcp 0.0 -->
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkWindow" id="window1">
+ <property name="width_request">200</property>
+ <property name="height_request">712</property>
+ <property name="resizable">False</property>
+ <property name="default_width">712</property>
+ <property name="default_height">200</property>
+ <property name="icon">icon/Logo.png</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">4</property>
+ <child>
+ <object class="HAL_DRO" id="hal_dro4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="joint_number">1</property>
+ <property name="display_units_mm">True</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_DRO" id="hal_dro5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="display_units_mm">True</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_DRO" id="hal_dro7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="joint_number">1</property>
+ <property name="display_units_mm">True</property>
+ <property name="reference_type">2</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_DRO" id="hal_dro8">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="display_units_mm">True</property>
+ <property name="reference_type">2</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_DRO" id="hal_dro3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="joint_number">1</property>
+ <property name="display_units_mm">True</property>
+ <property name="reference_type">1</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_DRO" id="hal_dro2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="display_units_mm">True</property>
+ <property name="reference_type">1</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_DRO" id="hal_dro6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="joint_number">2</property>
+ <property name="display_units_mm">True</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_DRO" id="hal_dro1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="joint_number">2</property>
+ <property name="display_units_mm">True</property>
+ <property name="reference_type">1</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_DRO" id="hal_dro9">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="joint_number">2</property>
+ <property name="display_units_mm">True</property>
+ <property name="reference_type">2</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">ABS</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">REL</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">DTG</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">X</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Y</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Z</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/configs/sim/gmoccapy/gmoccapy.glade b/configs/sim/gmoccapy/gmoccapy.glade
new file mode 100644
index 000000000..3acf3850e
--- /dev/null
+++ b/configs/sim/gmoccapy/gmoccapy.glade
@@ -0,0 +1,5101 @@
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-requires gladevcp 0.0 -->
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkWindow" id="window1">
+ <property name="title" translatable="yes">moccapy</property>
+ <property name="icon">icon/Logo.png</property>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="box_left">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="ntb_main">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">False</property>
+ <child>
+ <object class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkVBox" id="vbox14">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkNotebook" id="ntb_preview">
+ <property name="visible">True</property>
+ <property name="show_tabs">False</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkVBox" id="vbox15">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkEventBox" id="eventbox_gremlin">
+ <property name="visible">True</property>
+ <child>
+ <object class="HAL_Gremlin" id="gremlin">
+ <property name="visible">True</property>
+ <property name="double_buffered">False</property>
+ <property name="show_dtg">False</property>
+ <property name="enable_dro">False</property>
+ <property name="use_commanded">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="tbl_gremlin_button">
+ <property name="visible">True</property>
+ <property name="n_columns">9</property>
+ <property name="column_spacing">5</property>
+ <child>
+ <object class="GtkButton" id="btn_delete_view">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">clear plot</property>
+ <signal name="clicked" handler="on_btn_delete_view_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_tool_clear">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/clear.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">8</property>
+ <property name="right_attach">9</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_zoom_in">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">Zoom in</property>
+ <property name="image">img_zoom_in</property>
+ <signal name="clicked" handler="on_btn_zoom_in_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="right_attach">5</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_zoom_out">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">zoom out</property>
+ <property name="image">img_zoom_out</property>
+ <signal name="clicked" handler="on_btn_zoom_out_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="right_attach">6</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_view_P">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_markup">view perspective</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">False</property>
+ <signal name="toggled" handler="on_rbt_view_P_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_view_p">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/toolaxisp.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_view_X">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_markup">view along the X axis from positive to negative</property>
+ <property name="draw_indicator">False</property>
+ <property name="group">rbt_view_P</property>
+ <signal name="toggled" handler="on_rbt_view_X_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_view_x">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/toolaxisx.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_view_Y">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_markup">view along the Y axis from positive to negative</property>
+ <property name="draw_indicator">False</property>
+ <property name="group">rbt_view_P</property>
+ <signal name="toggled" handler="on_rbt_view_Y_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_view_y">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/toolaxisy.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_view_Z">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_markup">view along the Z axis from positive to negative</property>
+ <property name="xalign">0.44999998807907104</property>
+ <property name="draw_indicator">False</property>
+ <property name="group">rbt_view_P</property>
+ <signal name="toggled" handler="on_rbt_view_Z_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_view_z">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/toolaxisz.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_view_tool_path">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="toggled" handler="on_tbtn_view_tool_path_toggled"/>
+ <child>
+ <object class="GtkImage" id="imimg_toll_path">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/toolpath.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">7</property>
+ <property name="right_attach">8</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_view_dimension">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="toggled" handler="on_tbtn_view_dimension_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_dimensions">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/dimensions.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">6</property>
+ <property name="right_attach">7</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_preview">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Preview</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbx_jog">
+ <property name="width_request">360</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkNotebook" id="ntb_jog">
+ <property name="visible">True</property>
+ <property name="show_tabs">False</property>
+ <child>
+ <object class="GtkVBox" id="vbox4">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="hbox3">
+ <property name="height_request">50</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_jog_vel">
+ <property name="width_request">75</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Jog. Vel.</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_HScale" id="hal_scl_jog_vel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_markup">adjust the jogging speed</property>
+ <property name="adjustment">adj_jog_vel</property>
+ <property name="digits">0</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkVBox" id="vbox5">
+ <property name="width_request">240</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkFrame" id="frm_jog_button">
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkTable" id="tbl_jog_button">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">4</property>
+ <property name="column_spacing">3</property>
+ <property name="row_spacing">3</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="HAL_Button" id="hal_btn_X_minus">
+ <property name="label" translatable="yes">X-</property>
+ <property name="width_request">50</property>
+ <property name="height_request">50</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">jog X axis minus</property>
+ <signal name="pressed" handler="on_hal_btn_jog_pressed"/>
+ <signal name="released" handler="on_hal_btn_jog_released"/>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="hal_btn_X_plus">
+ <property name="label" translatable="yes">X+</property>
+ <property name="width_request">50</property>
+ <property name="height_request">50</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">jog X axis plus</property>
+ <signal name="pressed" handler="on_hal_btn_jog_pressed"/>
+ <signal name="released" handler="on_hal_btn_jog_released"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="hal_btn_Y_plus">
+ <property name="label" translatable="yes">Y+</property>
+ <property name="width_request">50</property>
+ <property name="height_request">50</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">jog Y axis plus</property>
+ <signal name="pressed" handler="on_hal_btn_jog_pressed"/>
+ <signal name="released" handler="on_hal_btn_jog_released"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="hal_btn_Y_minus">
+ <property name="label" translatable="yes">Y-</property>
+ <property name="width_request">50</property>
+ <property name="height_request">50</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">jog Y axis minus</property>
+ <signal name="pressed" handler="on_hal_btn_jog_pressed"/>
+ <signal name="released" handler="on_hal_btn_jog_released"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="hal_btn_Z_plus">
+ <property name="label" translatable="yes">Z+</property>
+ <property name="width_request">50</property>
+ <property name="height_request">50</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">jog Z axis plus</property>
+ <signal name="pressed" handler="on_hal_btn_jog_pressed"/>
+ <signal name="released" handler="on_hal_btn_jog_released"/>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="hal_btn_Z_minus">
+ <property name="label" translatable="yes">Z-</property>
+ <property name="width_request">50</property>
+ <property name="height_request">50</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">jog Z axis minus</property>
+ <signal name="pressed" handler="on_hal_btn_jog_pressed"/>
+ <signal name="released" handler="on_hal_btn_jog_released"/>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_jogging">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Jogging&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_ignore_limits">
+ <property name="label" translatable="yes">ignore limits</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_markup">ignore limits / turn on this if you need to move an axis witch is in contact with the end switch</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_ignore_limits_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_steps">
+ <property name="width_request">120</property>
+ <property name="visible">True</property>
+ <property name="tooltip_markup">select jog distance</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkVButtonBox" id="vbuttonbox2">
+ <property name="width_request">50</property>
+ <property name="visible">True</property>
+ <property name="spacing">3</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_steps">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;jog rates&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">3</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Manuell</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="EMC_MDIHistory" id="hal_mdihistory">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">MDI</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="EMC_SourceView" id="hal_sourceview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="left_margin">2</property>
+ <property name="right_margin">2</property>
+ <property name="show_line_numbers">True</property>
+ <property name="show_line_marks">True</property>
+ <property name="tab_width">3</property>
+ <property name="auto_indent">True</property>
+ <property name="insert_spaces_instead_of_tabs">True</property>
+ <property name="highlight_current_line">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Auto</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="tbl_dro">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">3</property>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_dtg">
+ <property name="label" translatable="yes">DTG</property>
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">show distance to go in preview window</property>
+ <property name="xalign">0.43000000715255737</property>
+ <signal name="toggled" handler="on_tbtn_dtg_toggled"/>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="eventbox_X">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_X">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">X</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="eventbox_Y">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_Y">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Y</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="eventbox_Z">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_Z">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Z</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="eventbox_dro_X">
+ <property name="visible">True</property>
+ <child>
+ <object class="HAL_DRO" id="hal_dro_X">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.47999998927116394</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="display_units_mm">True</property>
+ <property name="reference_type">1</property>
+ <property name="actual">False</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="foreground" value="#ffff00000000"/>
+ <attribute name="background" value="#000000000000"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="eventbox_dro_Y">
+ <property name="visible">True</property>
+ <child>
+ <object class="HAL_DRO" id="hal_dro_Y">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="joint_number">1</property>
+ <property name="display_units_mm">True</property>
+ <property name="reference_type">1</property>
+ <property name="actual">False</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="foreground" value="#ffff00000000"/>
+ <attribute name="background" value="#000000000000"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="eventbox_dro_Z">
+ <property name="visible">True</property>
+ <child>
+ <object class="HAL_DRO" id="hal_dro_Z">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="joint_number">2</property>
+ <property name="display_units_mm">True</property>
+ <property name="reference_type">1</property>
+ <property name="actual">False</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="foreground" value="#ffff00000000"/>
+ <attribute name="background" value="#000000000000"/>
+ <attribute name="scale" value="3.000000"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_rel">
+ <property name="label" translatable="yes">Rel.</property>
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">toogle between metric and imperial units</property>
+ <signal name="toggled" handler="on_tbtn_rel_toggled"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_units">
+ <property name="label" translatable="yes">mm</property>
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">toggle between metric and d imperial units</property>
+ <signal name="toggled" handler="on_tbtn_units_toggled"/>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="box_info">
+ <property name="height_request">250</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkNotebook" id="ntb_info">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">False</property>
+ <signal name="switch_page" handler="on_ntb_info_switch_page"/>
+ <child>
+ <object class="GtkHBox" id="hbox7">
+ <property name="height_request">200</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkVBox" id="vbox11">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkFrame" id="frm_tool_info">
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="alignment8">
+ <property name="visible">True</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkVBox" id="vbox12">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="hbox11">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_tool">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">tool no.</property>
+ <property name="width_chars">8</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_diameter">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">diameter</property>
+ <property name="width_chars">8</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_offset_Z">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">offset Z</property>
+ <property name="width_chars">8</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox12">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_tool_no">
+ <property name="visible">True</property>
+ <property name="xpad">6</property>
+ <property name="label" translatable="yes">0 </property>
+ <property name="width_chars">8</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_tool_dia">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">0</property>
+ <property name="width_chars">8</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_tool_offset_Z">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">0</property>
+ <property name="width_chars">8</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_tool_name">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">No tool discription aviable</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_tool_frame">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Tool information&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_gcode">
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="alignment9">
+ <property name="visible">True</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkVBox" id="vbox13">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="hbox5">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="active_mcodes_label">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">active_mcodes_label</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_feed">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">F </property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="active_feed_label">
+ <property name="width_request">50</property>
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">10000</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox10">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="active_gcodes_label">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">active_gcodes_label</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_speed">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="ypad">3</property>
+ <property name="label" translatable="yes">S </property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="active_speed_label">
+ <property name="width_request">50</property>
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="ypad">3</property>
+ <property name="label" translatable="yes">10000</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frame_code">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;G-Code&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_program">
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="alignment10">
+ <property name="visible">True</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkLabel" id="lbl_program">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">No Programm loaded</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frame_program">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;program&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox7">
+ <property name="width_request">200</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkFrame" id="frm_max_vel">
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="alignment6">
+ <property name="visible">True</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkVBox" id="vbox10">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="hbox9">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_vel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Vel.</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.500000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_current_vel">
+ <property name="visible">True</property>
+ <property name="xpad">5</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">10000</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.500000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="scl_max_vel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="adjustment">adj_max_vel</property>
+ <property name="show_fill_level">True</property>
+ <property name="digits">0</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frame_max_speed">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;max. velocity [mm/min]&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_feed_overide">
+ <property name="width_request">200</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkVBox" id="vbox9">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="hbox8">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_feed_act">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">F 275</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.500000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_feed_100">
+ <property name="label" translatable="yes">100%</property>
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_feed_100_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="scl_feed">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="adjustment">adj_feed</property>
+ <property name="lower_stepper_sensitivity">on</property>
+ <property name="upper_stepper_sensitivity">on</property>
+ <property name="show_fill_level">True</property>
+ <property name="restrict_to_fill_level">False</property>
+ <property name="digits">0</property>
+ <signal name="value_changed" handler="on_scl_feed_value_changed"/>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_feed_overide">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;feed overide [%]&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_cooling">
+ <property name="width_request">125</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="xscale">0.5</property>
+ <property name="yscale">0</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkTable" id="tbl_cooling">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="column_spacing">10</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_flood">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image">img_coolant_off</property>
+ <signal name="toggled" handler="on_tbtn_flood_toggled"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="y_padding">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_mist">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image">img_mist_off</property>
+ <signal name="toggled" handler="on_tbtn_mist_toggled"/>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="y_padding">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frame_coolant">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;cooling&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_spindle">
+ <property name="width_request">200</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="top_padding">5</property>
+ <property name="bottom_padding">5</property>
+ <property name="left_padding">5</property>
+ <property name="right_padding">5</property>
+ <child>
+ <object class="GtkVBox" id="vbox8">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkVBox" id="vbox16">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="hbox6">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_spindle_act">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">S 3500</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.500000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_actual_spindle_speed">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_spindle_100">
+ <property name="label" translatable="yes">100%</property>
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_spindle_100_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="scl_spindle">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="adjustment">adj_spindle</property>
+ <property name="digits">0</property>
+ <signal name="value_changed" handler="on_scl_spindle_value_changed"/>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox6">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkTable" id="table5">
+ <property name="visible">True</property>
+ <property name="n_columns">3</property>
+ <child>
+ <object class="GtkRadioButton" id="rbt_reverse">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">False</property>
+ <property name="group">rbt_stop</property>
+ <signal name="clicked" handler="on_rbt_reverse_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_reverse">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/reverse.png</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_forward">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">False</property>
+ <property name="group">rbt_stop</property>
+ <signal name="clicked" handler="on_rbt_forward_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_spindle_forward">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/forward.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_stop">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">False</property>
+ <signal name="clicked" handler="on_rbt_stop_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_spindle_stop">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/stop.gif</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox13">
+ <property name="visible">True</property>
+ <child>
+ <object class="HAL_HBar" id="hal_hbar_spindle_feedback">
+ <property name="visible">True</property>
+ <property name="z1_border">0.80000001192092896</property>
+ <property name="z0_color">#0000ffff0000</property>
+ <property name="max">6000</property>
+ <property name="text_template">%i</property>
+ <property name="target_color">#a0a02020f0f0</property>
+ <property name="bg_color">#bebebebebebe</property>
+ <property name="z1_color">#ffffffff0000</property>
+ <property name="z2_color">#ffff00000000</property>
+ <property name="z0_border">0.40000000596046448</property>
+ <signal name="hal_pin_changed" handler="on_hal_hbar_spindle_feedback_hal_pin_changed"/>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_LED" id="hal_led_spindle_at_speed">
+ <property name="visible">True</property>
+ <property name="on_color">green</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;spindel [rpm]&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_info_info">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">info</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="tbl_keypad">
+ <property name="visible">True</property>
+ <property name="n_rows">5</property>
+ <property name="n_columns">12</property>
+ <property name="column_spacing">5</property>
+ <property name="row_spacing">5</property>
+ <child>
+ <object class="GtkButton" id="btn_spc">
+ <property name="label" translatable="yes">SPC</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">6</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_8">
+ <property name="label" translatable="yes">8</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_8"/>
+ </object>
+ <packing>
+ <property name="left_attach">7</property>
+ <property name="right_attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_9">
+ <property name="label" translatable="yes">9</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_9"/>
+ </object>
+ <packing>
+ <property name="left_attach">8</property>
+ <property name="right_attach">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_7">
+ <property name="label" translatable="yes">7</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_7"/>
+ </object>
+ <packing>
+ <property name="left_attach">6</property>
+ <property name="right_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_6">
+ <property name="label" translatable="yes">6</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_6"/>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="right_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_0">
+ <property name="label" translatable="yes">0</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_0"/>
+ </object>
+ <packing>
+ <property name="left_attach">9</property>
+ <property name="right_attach">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_5">
+ <property name="label" translatable="yes">5</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_5"/>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="right_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_4">
+ <property name="label" translatable="yes">4</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_4"/>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_3">
+ <property name="label" translatable="yes">3</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_3"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_F">
+ <property name="label" translatable="yes">F</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_F"/>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_2">
+ <property name="label" translatable="yes">2</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_2"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_1">
+ <property name="label" translatable="yes">1</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_1"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_Q">
+ <property name="label" translatable="yes">Q</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_S">
+ <property name="label" translatable="yes">S</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_G">
+ <property name="label" translatable="yes">G</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="right_attach">5</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_Z">
+ <property name="label" translatable="yes">Z</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="right_attach">6</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_P">
+ <property name="label" translatable="yes">P</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked" object="btn_P"/>
+ </object>
+ <packing>
+ <property name="left_attach">9</property>
+ <property name="right_attach">10</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_I">
+ <property name="label" translatable="yes">I</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">7</property>
+ <property name="right_attach">8</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_J">
+ <property name="label" translatable="yes">J</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">6</property>
+ <property name="right_attach">7</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_K">
+ <property name="label" translatable="yes">K</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">7</property>
+ <property name="right_attach">8</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_Y">
+ <property name="label" translatable="yes">Y</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_X">
+ <property name="label" translatable="yes">X</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_T">
+ <property name="label" translatable="yes">T</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="right_attach">5</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_M">
+ <property name="label" translatable="yes">M</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">6</property>
+ <property name="right_attach">7</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_W">
+ <property name="label" translatable="yes">W</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_E">
+ <property name="label" translatable="yes">E</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_R">
+ <property name="label" translatable="yes">R</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_U">
+ <property name="label" translatable="yes">U</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">6</property>
+ <property name="right_attach">7</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_O">
+ <property name="label" translatable="yes">O</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">8</property>
+ <property name="right_attach">9</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_A">
+ <property name="label" translatable="yes">A</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_D">
+ <property name="label" translatable="yes">D</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_H">
+ <property name="label" translatable="yes">H</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="right_attach">6</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_L">
+ <property name="label" translatable="yes">L</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">8</property>
+ <property name="right_attach">9</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_C">
+ <property name="label" translatable="yes">C</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_V">
+ <property name="label" translatable="yes">V</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_B">
+ <property name="label" translatable="yes">B</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="right_attach">5</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_N">
+ <property name="label" translatable="yes">N</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="right_attach">6</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_dot">
+ <property name="label" translatable="yes">,</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">7</property>
+ <property name="right_attach">8</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_bs">
+ <property name="label" translatable="yes">&lt;--</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_bs_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">10</property>
+ <property name="right_attach">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_ok">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image">img_mdi_ok</property>
+ <signal name="clicked" handler="on_btn_ok_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">10</property>
+ <property name="right_attach">12</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_raute">
+ <property name="label" translatable="yes">#</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">9</property>
+ <property name="right_attach">10</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_eka">
+ <property name="label" translatable="yes">[</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">6</property>
+ <property name="right_attach">7</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_ekz">
+ <property name="label" translatable="yes">]</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">7</property>
+ <property name="right_attach">8</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_minus">
+ <property name="label" translatable="yes">-</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">8</property>
+ <property name="right_attach">9</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_+">
+ <property name="label" translatable="yes">+</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">9</property>
+ <property name="right_attach">10</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_&lt;">
+ <property name="label" translatable="yes">&lt;</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">8</property>
+ <property name="right_attach">9</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_&gt;">
+ <property name="label" translatable="yes">&gt;</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_MDI_key_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">9</property>
+ <property name="right_attach">10</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_left">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_arrow_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_left">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-back</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">10</property>
+ <property name="right_attach">11</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_right">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_arrow_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_right">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-forward</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">11</property>
+ <property name="right_attach">12</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_up">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_arrow_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_up">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-up</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">10</property>
+ <property name="right_attach">11</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_down">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_arrow_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_down">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-down</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">11</property>
+ <property name="right_attach">12</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_shift">
+ <property name="label" translatable="yes">SHIFT</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="toggled" handler="on_tbtn_shift_toggled"/>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_keyboard">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">keyboard</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_message">
+ <property name="height_request">50</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkStatusbar" id="statusbar1">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <property name="has_resize_grip">False</property>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frame_information">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;messages&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_main_main">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">main</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="ntb_setup">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkScrolledWindow" id="terminal_window">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="shadow_type">out</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_setup_debug">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Debug</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="tbl_setup_page">
+ <property name="visible">True</property>
+ <property name="n_columns">3</property>
+ <child>
+ <object class="GtkTable" id="table9">
+ <property name="visible">True</property>
+ <property name="n_rows">9</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkComboBox" id="theme_choice">
+ <property name="visible">True</property>
+ <property name="model">lstst_themes</property>
+ <signal name="changed" handler="on_theme_choice_changed"/>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Themes</property>
+ </object>
+ <packing>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="rel_colorbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ <signal name="color_set" handler="on_rel_colorbutton_color_set"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Relative Text Color</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label19">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Absolute Text Color</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="abs_colorbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ <signal name="color_set" handler="on_abs_colorbutton_color_set"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkColorButton" id="dtg_colorbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="color">#000000000000</property>
+ <signal name="color_set" handler="on_dtg_colorbutton_color_set"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label21">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">DTG Text Color</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserButton" id="audio_error_chooser">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label25">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Warning Audio</property>
+ </object>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label27">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Alert Audio</property>
+ </object>
+ <packing>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserButton" id="audio_alert_chooser">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Grid Size</property>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="grid_size">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="adjustment">adj_grid_size</property>
+ <property name="digits">3</property>
+ <signal name="value_changed" handler="on_grid_size_value_changed"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label29">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Starting RPM</property>
+ </object>
+ <packing>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="sbtn_spindle_start_rpm">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_markup">this is to set the spindle startup velocity in rpm</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="activates_default">True</property>
+ <property name="xalign">1</property>
+ <property name="shadow_type">etched-in</property>
+ <property name="adjustment">adj_start_spindle_RPM</property>
+ <property name="climb_rate">1</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="tbl_settings_button">
+ <property name="visible">True</property>
+ <property name="n_rows">6</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkToggleButton" id="btn_dro_units">
+ <property name="label" translatable="yes">Metric
+</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_not_implemented_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="btn_use_screen2">
+ <property name="label" translatable="yes"> Display
+Aux Screen</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_not_implemented_clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="btn_fullscreen1">
+ <property name="label" translatable="yes"> Gscreen
+Fullscreen</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="toggled" handler="on_btn_fullscreen1_toggled"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="hide_cursor">
+ <property name="label" translatable="yes">Hide Pointer</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="toggled" handler="on_hide_cursor_toggled"/>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="show_offsets">
+ <property name="label" translatable="yes"> Show
+Offsets</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="toggled" handler="on_show_offsets_toggled"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_shut_down">
+ <property name="label">gtk-quit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_btn_exit_clicked"/>
+ </object>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_show_dtg">
+ <property name="label" translatable="yes">Show
+ DTG</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="toggled" handler="on_tbtn_show_dtg_toggled"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"> </property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"> </property>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"> </property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"> </property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_show_dro">
+ <property name="label" translatable="yes">Gremlin
+ DRO</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="toggled" handler="on_tbtn_show_dro_toggled"/>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="x_options">GTK_EXPAND</property>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_setup_settings">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">settings</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scw_alarm_history">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkTextView" id="alarm_history">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ <property name="cursor_visible">False</property>
+ <property name="buffer">alarm_buffer</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_setup_alarm_history">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Alarm History</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_main_settings">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">settings</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="ToolEdit" id="tooledit1">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_main_tool_edit">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Tool Editor</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="ntb_user_tabs">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkEventBox" id="eventbox1">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_user_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">User Tab 1</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_user_tabs">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">user tabs</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="box_right">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVButtonBox" id="vbtb_main">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="spacing">3</property>
+ <property name="homogeneous">True</property>
+ <property name="layout_style">spread</property>
+ <child>
+ <object class="HAL_ToggleButton" id="hal_tbtn_notaus">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="related_action">hal_toggleaction_estop</property>
+ <property name="active">True</property>
+ <signal name="toggled" handler="on_hal_tbtn_notaus_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_emergency">
+ <property name="visible">True</property>
+ <property name="tooltip_markup">toggle emergency exit</property>
+ <property name="pixbuf">icon/exit.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_ToggleButton" id="hal_tbtn_on">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="related_action">hal_toggleaction_power</property>
+ <signal name="toggled" handler="on_hal_tbtn_on_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_machine_off">
+ <property name="visible">True</property>
+ <property name="tooltip_markup">switch on the machine</property>
+ <property name="pixbuf">icon/machineonoff.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_manual">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">enter manual mode to jog axis by hand or touch off</property>
+ <property name="use_action_appearance">True</property>
+ <property name="image">img_manual</property>
+ <property name="draw_indicator">False</property>
+ <property name="group">rbt_auto</property>
+ <signal name="clicked" handler="on_rbt_manual_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_mdi">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_markup">enter MDI mode to launch g-code commands</property>
+ <property name="image">img_mdi</property>
+ <property name="draw_indicator">False</property>
+ <property name="group">rbt_auto</property>
+ <signal name="clicked" handler="on_rbt_mdi_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_auto">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="image">img_auto</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">False</property>
+ <signal name="clicked" handler="on_rbt_auto_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_setup">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_markup">Enter the setup page to adjust program options</property>
+ <property name="draw_indicator">False</property>
+ <property name="group">rbt_auto</property>
+ <signal name="pressed" handler="on_rbt_setup_pressed"/>
+ <child>
+ <object class="GtkImage" id="img_settings">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/configure-2.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_user_tabs">
+ <property name="label" translatable="yes">tabs</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <signal name="toggled" handler="on_tbtn_user_tabs_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="ntb_button">
+ <property name="visible">True</property>
+ <property name="show_tabs">False</property>
+ <property name="show_border">False</property>
+ <signal name="switch_page" handler="on_ntb_button_switch_page"/>
+ <child>
+ <object class="GtkHButtonBox" id="hbtb_main">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkButton" id="btn_homing">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">open homing button list</property>
+ <property name="image">img_ref</property>
+ <signal name="clicked" handler="on_btn_homing_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_touch">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">open touch off button list</property>
+ <property name="image">img_touch_off</property>
+ <signal name="clicked" handler="on_btn_touch_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_2">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_tool">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">Open the tooleditor page</property>
+ <property name="image_position">top</property>
+ <signal name="clicked" handler="on_btn_tool_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_tools">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/tools.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_21">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_7">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_9">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_fullsize_preview">
+ <property name="label" translatable="yes"> fullsize
+preview</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="toggled" handler="on_tbtn_fullsize_preview_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_3">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_exit">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">Close moccapy / leave the program</property>
+ <property name="image">img_close</property>
+ <signal name="clicked" handler="on_btn_exit_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_button_manuel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">manuel button list</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbtb_MDI">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_show_kbd">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">This button will show or hide the Keyboard</property>
+ <property name="xalign">0.51999998092651367</property>
+ <signal name="clicked" handler="on_btn_show_kbd_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_keyboard">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/keyboard.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">9</property>
+ <property name="secondary">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_button_mdi">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">MDI button list</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbtb_auto">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkButton" id="btn_run">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">run the loaded programm</property>
+ <property name="related_action">hal_action_run</property>
+ <property name="image">img_run</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_stop">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">stop the running program</property>
+ <property name="related_action">hal_action_stop</property>
+ <property name="image">img_stop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_step">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">run the programm step by step</property>
+ <property name="related_action">hal_action_step</property>
+ <property name="image">img_step</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_pause">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="related_action">hal_toggleaction_pause</property>
+ <signal name="toggled" handler="on_tbtn_pause_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_pause">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="tooltip_markup">pause the running program</property>
+ <property name="pixbuf">icon/pause.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_from_line">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">run from line</property>
+ <property name="image">img_run_from</property>
+ <signal name="clicked" handler="on_btn_from_line_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_optional_stops">
+ <property name="label" translatable="yes">M1</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">ignore optional stops? Pushed meen ignore all M1 commands!</property>
+ <property name="tooltip_text" translatable="yes">Ignore or not the optional stopps. A pushed button will result in ignoring all M1 commands. The button will indicate a yellow background.</property>
+ <signal name="toggled" handler="on_tbtn_optional_stops_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_optional_blocks">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">If the button is pushed, optional blocks will not be machined.</property>
+ <property name="tooltip_text" translatable="yes">Machine or not the optional blocks of the program. If the button is pressed, the optional blocks will not be machined. The button will indicate this by a yellow background.</property>
+ <signal name="toggled" handler="on_tbtn_optional_blocks_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_optional_blocks">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/tool_blockdelete.gif</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_reload">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">reload the program, you need to do that after editing</property>
+ <property name="related_action">hal_action_reload</property>
+ <property name="image">img_reload</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_load">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">load a program</property>
+ <property name="related_action">hal_action_open</property>
+ <property name="image">img_open</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_edit">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">edit the program</property>
+ <property name="image">img_editor</property>
+ <signal name="clicked" handler="on_btn_edit_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_button_auto">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Auto button list</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbtb_ref">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_space_8">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_home_all">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">home all axis</property>
+ <signal name="clicked" handler="on_btn_home_all_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_home_all">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refall.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_4">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_home_X">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">home X axis</property>
+ <signal name="clicked" handler="on_btn_home_selected_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_home_x">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refx.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_home_Y">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">home Y axis</property>
+ <signal name="clicked" handler="on_btn_home_selected_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_home_y">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refy.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_home_Z">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">home Z axis</property>
+ <signal name="clicked" handler="on_btn_home_selected_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_home_z">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refz.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_5">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_unhome_all">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">unhome all axis</property>
+ <signal name="clicked" handler="on_btn_unhome_all_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_unhome_all">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/unhome.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_6">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_back_ref">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">go back to main button list</property>
+ <property name="image">img_back_ref</property>
+ <signal name="clicked" handler="on_btn_back_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_btn_homing">
+ <property name="label">homing button</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbtb_touch_off">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_space_11">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_cero_X">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">ttouch off X / set X to 0</property>
+ <signal name="clicked" handler="on_btn_cero_X_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_cero_x">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/touchoffx.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_cero_Y">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">touch off Y / set Y to 0</property>
+ <signal name="clicked" handler="on_btn_cero_Y_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_cero_Y">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/touchoffy.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_cero_Z">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">touch off Z / set to 0</property>
+ <signal name="clicked" handler="on_btn_cero_Z_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_cero_Z">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="tooltip_markup">touch off Z / set Z to 0</property>
+ <property name="pixbuf">icon/touchoffz.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_13">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_set_value_X">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">touch off X / set X to an desired value</property>
+ <signal name="clicked" handler="on_btn_set_value_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_set_value_X">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/touchoffx_value.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_set_value_Y">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">touch off Y / set Y to an desired value</property>
+ <signal name="clicked" handler="on_btn_set_value_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_set_value_Z">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/touchoffy_value.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_set_value_Z">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">touch off Z / set Z to an desired value</property>
+ <signal name="clicked" handler="on_btn_set_value_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_cero_x3">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/touchoffz_value.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_16">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_back_cero">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">go back to main button list</property>
+ <property name="image">img_back_cero</property>
+ <signal name="clicked" handler="on_btn_back_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_btn_touch_off">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">touch_off button</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbtb_setup">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkButton" id="btn_delete">
+ <property name="label" translatable="yes">delete MDI</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">delete MDI history</property>
+ <signal name="clicked" handler="on_btn_delete_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_17">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_1">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_15">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_14">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_hal_scope">
+ <property name="label" translatable="yes">Hal-Scope</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">launch hal scope</property>
+ <signal name="clicked" handler="on_btn_hal_scope_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_status">
+ <property name="label" translatable="yes">Status</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">launch linuxcnc status window</property>
+ <signal name="clicked" handler="on_btn_status_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_hal_meter">
+ <property name="label" translatable="yes">Hal Meter</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">launch hal meter</property>
+ <property name="xalign">0.51999998092651367</property>
+ <signal name="clicked" handler="on_btn_hal_meter_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_calibration">
+ <property name="label" translatable="yes">Calibration</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">launch calibration window</property>
+ <signal name="clicked" handler="on_btn_calibration_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_show_hal">
+ <property name="label" translatable="yes">Halshow</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">opens the show hal tool</property>
+ <signal name="clicked" handler="on_btn_show_hal_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_button_setup">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">setup button list</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbtb_edit">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_space_19">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_save">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">save the file with the original name</property>
+ <property name="related_action">hal_action_save</property>
+ <property name="image_position">right</property>
+ <child>
+ <object class="GtkImage" id="img_save">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="stock">gtk-save</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_save_as">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">save the file with a new name</property>
+ <property name="related_action">hal_action_saveas</property>
+ <child>
+ <object class="GtkImage" id="img_save_as">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="stock">gtk-save-as</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_save_and_run">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">save the programm, reload it and run the program</property>
+ <property name="tooltip_text" translatable="yes"> </property>
+ <signal name="clicked" handler="on_btn_save_and_run_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_save_and_run">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="stock">gtk-media-play</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_23">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_new">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">clear the edit field and make a new file</property>
+ <signal name="clicked" handler="on_btn_new_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_new">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="stock">gtk-new</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_open">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">open a file to edit</property>
+ <property name="related_action">hal_action_open</property>
+ <child>
+ <object class="GtkImage" id="img_open_edit">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="stock">gtk-open</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_close">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_markup">close the editor without saving any changes</property>
+ <signal name="clicked" handler="on_btn_close_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_clos">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="stock">gtk-close</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_keyb">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_show_kbd_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_keyboard2">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/keyboard.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_back_edit">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image">img_back_cero1</property>
+ <signal name="clicked" handler="on_btn_back_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_button_edit">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">edit buttons</property>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkButton" id="btn_delete_tool">
+ <property name="label" translatable="yes">Delete</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_delete_tool_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_add_tool">
+ <property name="label" translatable="yes">Add</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_add_tool_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_reload_tooltable">
+ <property name="label" translatable="yes">Reload</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes"> </property>
+ <signal name="clicked" handler="on_btn_reload_tooltable_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_apply_tool_changes">
+ <property name="label" translatable="yes">Apply</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_apply_tool_changes_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_18">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_index_tool">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_selected_tool_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_index_tool">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/index_tool.svg</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_change_tool">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image">img_toolchange</property>
+ <signal name="clicked" handler="on_btn_selected_tool_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_20">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_space_22">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_back_tool">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image">img_back_tool</property>
+ <signal name="clicked" handler="on_btn_back_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_button_tool">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">tool</property>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkAdjustment" id="adj_jog_vel">
+ <property name="value">1500</property>
+ <property name="upper">10500</property>
+ <property name="step_increment">50</property>
+ <property name="page_increment">500</property>
+ <property name="page_size">500</property>
+ <signal name="value_changed" handler="on_adj_jog_vel_value_changed"/>
+ </object>
+ <object class="GtkActionGroup" id="actiongroup1"/>
+ <object class="GtkImage" id="img_emergency_off">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/E-Stop.gif</property>
+ </object>
+ <object class="GtkAdjustment" id="adj_spindle">
+ <property name="value">100</property>
+ <property name="upper">6000</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">1</property>
+ <property name="page_size">1</property>
+ </object>
+ <object class="GtkAdjustment" id="adj_feed">
+ <property name="value">100</property>
+ <property name="lower">10</property>
+ <property name="upper">160</property>
+ <property name="step_increment">10</property>
+ <property name="page_increment">10</property>
+ <property name="page_size">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adj_max_vel">
+ <property name="value">1800</property>
+ <property name="lower">100</property>
+ <property name="upper">8500</property>
+ <property name="step_increment">100</property>
+ <property name="page_increment">50</property>
+ <property name="page_size">50</property>
+ </object>
+ <object class="GtkImage" id="img_machine_on">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/machineonoff.png</property>
+ </object>
+ <object class="GtkImage" id="img_ref">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refall.png</property>
+ </object>
+ <object class="EMC_ToggleAction_ESTOP" id="hal_toggleaction_estop"/>
+ <object class="EMC_ToggleAction_Power" id="hal_toggleaction_power"/>
+ <object class="EMC_Action_Run" id="hal_action_run"/>
+ <object class="EMC_Action_Step" id="hal_action_step"/>
+ <object class="EMC_Action_Stop" id="hal_action_stop"/>
+ <object class="EMC_ToggleAction_Pause" id="hal_toggleaction_pause"/>
+ <object class="EMC_Action_Open" id="hal_action_open"/>
+ <object class="EMC_Action_Reload" id="hal_action_reload"/>
+ <object class="GtkImage" id="img_unhome">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/unhome.png</property>
+ </object>
+ <object class="GtkImage" id="img_forward">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/forward.png</property>
+ </object>
+ <object class="GtkImage" id="img_forward_on">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/forward_on.gif</property>
+ </object>
+ <object class="GtkImage" id="img_reverse_on">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/reverse_on.gif</property>
+ </object>
+ <object class="GtkImage" id="img_sstop">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/stop_on.gif</property>
+ </object>
+ <object class="GtkImage" id="img_stop_on">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/stop.gif</property>
+ </object>
+ <object class="GtkImage" id="img_close">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/exit_application.png</property>
+ </object>
+ <object class="GtkImage" id="img_run">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/start.png</property>
+ </object>
+ <object class="GtkImage" id="img_stop">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/stop.png</property>
+ </object>
+ <object class="GtkImage" id="img_step">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/step.png</property>
+ </object>
+ <object class="GtkImage" id="img_run_from">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="pixbuf">icon/runfrom.png</property>
+ </object>
+ <object class="GtkImage" id="img_reload">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/reload.png</property>
+ </object>
+ <object class="GtkImage" id="img_open">
+ <property name="visible">True</property>
+ <property name="stock">gtk-open</property>
+ </object>
+ <object class="GtkImage" id="img_editor">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/editor.png</property>
+ </object>
+ <object class="GtkImage" id="img_back_ref">
+ <property name="visible">True</property>
+ <property name="icon_name">edit-undo</property>
+ </object>
+ <object class="GtkImage" id="img_back_cero">
+ <property name="visible">True</property>
+ <property name="icon_name">edit-undo</property>
+ </object>
+ <object class="GtkTextBuffer" id="alarm_buffer"/>
+ <object class="GtkImage" id="img_touch_off">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/touchoffwz.png</property>
+ </object>
+ <object class="GtkListStore" id="lstst_themes">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">test</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">test2</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkAdjustment" id="adj_grid_size">
+ <property name="upper">100</property>
+ <property name="step_increment">0.25</property>
+ </object>
+ <object class="GtkAdjustment" id="adj_start_spindle_RPM">
+ <property name="value">300</property>
+ <property name="lower">50</property>
+ <property name="upper">10000</property>
+ <property name="step_increment">25</property>
+ <signal name="value_changed" handler="on_adj_start_spindle_RPM_value_changed"/>
+ </object>
+ <object class="EMC_Action_Unhome" id="hal_action_unhome_all">
+ <property name="tooltip">This will unhome all axis</property>
+ </object>
+ <object class="EMC_Stat" id="hal_status">
+ <signal name="state_off" handler="on_hal_status_state_off"/>
+ <signal name="interp_run" handler="on_hal_status_interp_run"/>
+ <signal name="state_estop_reset" handler="on_hal_status_state_estop_reset"/>
+ <signal name="mode_auto" handler="on_hal_status_mode_auto"/>
+ <signal name="mode_manual" handler="on_hal_status_mode_manual"/>
+ <signal name="not_all_homed" handler="on_hal_status_not_all_homed"/>
+ <signal name="mode_mdi" handler="on_hal_status_mode_mdi"/>
+ <signal name="state_on" handler="on_hal_status_state_on"/>
+ <signal name="file_loaded" handler="on_hal_status_file_loaded"/>
+ <signal name="all_homed" handler="on_hal_status_all_homed"/>
+ <signal name="interp_idle" handler="on_hal_status_interp_idle"/>
+ <signal name="state_estop" handler="on_hal_status_state_estop"/>
+ </object>
+ <object class="GtkDialog" id="dialog_from_line">
+ <property name="border_width">5</property>
+ <property name="type">popup</property>
+ <property name="title" translatable="yes">Run from line</property>
+ <property name="window_position">center</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">toolbar</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox5">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkVBox" id="vbox17">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="lbl_dialog_from_line">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Highlighting the run-at-line with the
+up / down buttons or entering the line
+directly.</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox14">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkButton" id="line_up">
+ <property name="label" translatable="yes">Line
+ Up</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_line_up_clicked"/>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="line_input">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="adjustment">adj_restart</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="line_down">
+ <property name="label" translatable="yes"> Line
+Down</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_line_down_clicked"/>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area5">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="restart_ok">
+ <property name="label" translatable="yes">Restart</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_restart_ok_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="restart_cancel">
+ <property name="label" translatable="yes">Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_restart_cancel_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">restart_ok</action-widget>
+ <action-widget response="0">restart_cancel</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkAdjustment" id="adj_restart">
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ <property name="page_size">10</property>
+ <signal name="value_changed" handler="on_adj_restart_value_changed"/>
+ </object>
+ <object class="GtkImage" id="img_back_cero1">
+ <property name="visible">True</property>
+ <property name="ypad">3</property>
+ <property name="icon_name">edit-undo</property>
+ </object>
+ <object class="GtkImage" id="img_mdi_ok">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/enter.png</property>
+ </object>
+ <object class="EMC_Action_Save" id="hal_action_save">
+ <property name="stock_id">gtk-save</property>
+ <property name="textview">hal_sourceview</property>
+ </object>
+ <object class="EMC_Action_SaveAs" id="hal_action_saveas">
+ <property name="stock_id">gtk-save-as</property>
+ <property name="icon_name">document-save</property>
+ <property name="textview">hal_sourceview</property>
+ </object>
+ <object class="GtkImage" id="img_coolant_on">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/coolant_on.gif</property>
+ </object>
+ <object class="GtkImage" id="img_mist_on">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/mist_on.gif</property>
+ </object>
+ <object class="GtkImage" id="img_toolchange">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/toolchange.png</property>
+ </object>
+ <object class="GtkImage" id="img_back_tool">
+ <property name="visible">True</property>
+ <property name="icon_name">edit-undo</property>
+ </object>
+ <object class="GtkImage" id="img_coolant_off">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/coolant_off.png</property>
+ </object>
+ <object class="GtkImage" id="img_mist_off">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/mist_off.png</property>
+ </object>
+ <object class="GtkImage" id="img_brake_macro">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/stop.png</property>
+ </object>
+ <object class="GtkImage" id="img_manual">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/jog.png</property>
+ </object>
+ <object class="GtkImage" id="img_mdi">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/mdi.png</property>
+ </object>
+ <object class="GtkImage" id="img_auto">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/run.png</property>
+ </object>
+ <object class="GtkImage" id="img_touch_off1">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/touchoffwz.png</property>
+ </object>
+ <object class="GtkImage" id="img_zoom_in">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/zoom-in.png</property>
+ </object>
+ <object class="GtkImage" id="img_zoom_out">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/zoom-out.png</property>
+ </object>
+</interface>
diff --git a/configs/sim/gmoccapy/gmoccapy.ini b/configs/sim/gmoccapy/gmoccapy.ini
new file mode 100644
index 000000000..ab4b4d80b
--- /dev/null
+++ b/configs/sim/gmoccapy/gmoccapy.ini
@@ -0,0 +1,200 @@
+# EMC controller parameters for a simulated machine.
+# General note: Comments can either be preceded with a # or ; - either is
+# acceptable, although # is in keeping with most linux config files.
+
+# General section -------------------------------------------------------------
+[EMC]
+VERSION = $Revision$
+MACHINE = gmoccapy
+#DEBUG = 0x7FFFFFFF
+DEBUG = 0
+
+# for details see nc_files/subroutines/maco_instructions.txt
+[MACROS]
+MACRO = i_am_lost
+MACRO = halo_world
+MACRO = jog_around
+MACRO = increment xinc yinc
+MACRO = go_to_position X-pos Y-pos Z-pos
+
+# Sections for display options ------------------------------------------------
+[DISPLAY]
+DISPLAY = gscreen -c gmoccapy -d
+PREFERENCE_FILE_PATH = ~/.gmoccapy_preferences
+
+#EMBED_TAB_NAME = right_side_panel
+#EMBED_TAB_LOCATION = box_right
+#EMBED_TAB_COMMAND = gladevcp -x {XID} v_buttonlist.glade
+
+#EMBED_TAB_NAME = camera
+#EMBED_TAB_LOCATION = ntb_user_tabs
+#EMBED_TAB_COMMAND = camview-emc -w {XID}
+
+#EMBED_TAB_NAME = Tab 2
+#EMBED_TAB_LOCATION = ntb_user_tabs
+#EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade
+
+#EMBED_TAB_NAME = left_side_panel
+#EMBED_TAB_LOCATION = box_left
+#EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade
+
+# uncomment the following three lines to show the buttonlist
+# dont forget to uncomment also the button lines in gmoccapy_postgui.hal
+#EMBED_TAB_NAME = h_buttonlist
+#EMBED_TAB_LOCATION = ntb_setup
+#EMBED_TAB_COMMAND = gladevcp h_buttonlist.glade
+
+#EMBED_TAB_NAME = v_buttonlist
+#EMBED_TAB_LOCATION = ntb_setup
+#EMBED_TAB_COMMAND = gladevcp v_buttonlist.glade
+
+# Cycle time, in milliseconds, that display will sleep between polls
+CYCLE_TIME = 100
+
+# Highest value that will be allowed for feed override, 1.0 = 100%
+MAX_FEED_OVERRIDE = 1.5
+MAX_SPINDLE_OVERRIDE = 1.2
+MIN_SPINDLE_OVERRIDE = .5
+
+# Max and default jog speeds in units per second
+MAX_LINEAR_VELOCITY = 166
+DEFAULT_LINEAR_VELOCITY = 5
+MAX_ANGULAR_VELOCITY = 234
+
+# Prefix to be used
+PROGRAM_PREFIX = nc_files/
+
+# Introductory graphic
+INTRO_GRAPHIC = linuxcnc.gif
+INTRO_TIME = 5
+
+# list of selectable jog increments
+INCREMENTS = 1mm, 0.1mm, 0.01mm, 0.001mm, 10mm, 1.2345in
+
+[FILTER]
+PROGRAM_EXTENSION = .png,.gif,.jpg Grayscale Depth Image
+PROGRAM_EXTENSION = .py Python Script
+png = image-to-gcode
+gif = image-to-gcode
+jpg = image-to-gcode
+py = python
+
+# Task controller section -----------------------------------------------------
+[TASK]
+TASK = milltask
+CYCLE_TIME = 0.001
+
+# Part program interpreter section --------------------------------------------
+[RS274NGC]
+RS274NGC_STARTUP_CODE = G17 G21 G40 G43H0 G54 G64P0.005 G80 G90 G94 G97 M5 M9
+PARAMETER_FILE = sim.var
+SUBROUTINE_PATH = nc_files/subroutines
+
+# Motion control section ------------------------------------------------------
+[EMCMOT]
+EMCMOT = motmod
+COMM_TIMEOUT = 1.0
+COMM_WAIT = 0.010
+BASE_PERIOD = 0
+SERVO_PERIOD = 1000000
+
+# Hardware Abstraction Layer section --------------------------------------------------
+[HAL]
+HALFILE = core_sim.hal
+HALFILE = sim_spindle_encoder.hal
+HALFILE = axis_manualtoolchange.hal
+HALFILE = simulated_home.hal
+
+# Single file that is executed after the GUI has started.
+POSTGUI_HALFILE = gmoccapy_postgui.hal
+
+HALUI = halui
+
+# Trajectory planner section --------------------------------------------------
+[TRAJ]
+AXES = 3
+COORDINATES = X Y Z
+HOME = 0 0 0
+LINEAR_UNITS = mm
+ANGULAR_UNITS = degree
+CYCLE_TIME = 0.010
+DEFAULT_VELOCITY = 9.0
+MAX_VELOCITY = 234
+POSITION_FILE = position.txt
+
+# First axis
+[AXIS_0]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 400.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 1
+HOME_IS_SHARED = 1
+
+# Second axis
+[AXIS_1]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 400.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 1
+
+# Third axis
+[AXIS_2]
+TYPE = LINEAR
+HOME = 0.0
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 0.001
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 1.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 0
+HOME_IS_SHARED = 1
+
+# Only needed for gmoccapy to set min and max values for the spindle bar
+[SPINDLE]
+MIN_REV = 0
+MAX_REV = 6000
+
+# section for main IO controller parameters -----------------------------------
+[EMCIO]
+EMCIO = io
+CYCLE_TIME = 0.100
+
+# tool table file
+TOOL_TABLE = tool.tbl
+TOOL_CHANGE_POSITION = 100 100 -10
+TOOL_CHANGE_QUILL_UP = 1
diff --git a/configs/sim/gmoccapy/gmoccapy_handler.py b/configs/sim/gmoccapy/gmoccapy_handler.py
new file mode 100644
index 000000000..d8c54effa
--- /dev/null
+++ b/configs/sim/gmoccapy/gmoccapy_handler.py
@@ -0,0 +1,1594 @@
+#!/usr/bin/env python
+# -*- coding:UTF-8 -*-
+'''
+ A try of a new GUI for LinuxCNC based on gladevcp and Python
+ Based on the design of moccagui from Tom
+ and based on gscreen from Chris Morley
+ and with the help from Michael Haberler
+ and Chris Morley
+
+ Copyright 2011 Norbert Schechner
+ nieson@web.de
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+'''
+import hal
+import hal_glib # needed to make our own hal pins
+import gtk
+import os
+import pango
+import gladevcp.makepins # needed for the dialog's calulator widget
+
+# standard handler call
+def get_handlers(halcomp,builder,useropts,gscreen):
+ return [HandlerClass(halcomp,builder,useropts,gscreen)]
+
+# this is for hiding the pointer when using a touch screen
+pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
+color = gtk.gdk.Color()
+INVISABLE = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)
+
+# constants
+_RELEASE = "0.8.5"
+_MM = 1 # Metric units are used
+_IMPERIAL = 0 # Imperial Units are used
+_MANUAL = 1 # Check for the mode Manual
+_AUTO = 2 # Check for the mode Auto
+_MDI = 3 # Check for the mode MDI
+_RUN = 1 # needed to check if the interpreter is running
+_IDLE = 0 # needed to check if the interpreter is idle
+
+# This is a handler file for using Gscreen's infrastructure
+# to load a completely custom glade screen
+# The only things that really matters is that it's saved as a GTK builder project,
+# the toplevel window is caller window1 (The default name) and you connect a destroy
+# window signal else you can't close down linuxcnc
+class HandlerClass:
+
+ # This will be pretty standard to gain access to everything
+ # emc is for control and status of linuxcnc
+ # data is important data from gscreen and linuxcnc
+ # widgets is all the widgets from the glade files
+ # gscreen is for access to gscreens methods
+ def __init__(self, halcomp,builder,useropts,gscreen):
+ self.emc = gscreen.emc
+ self.data = gscreen.data
+ self.widgets = gscreen.widgets
+ self.gscreen = gscreen
+ self.distance = 0 # This global will hold the jog distance
+ self.tool = 0 # we use this global to check if tool in spindle has changed
+ self.X_homed = 0 # only if this change, we will update the colors
+ self.Y_homed = 0 # only if this change, we will update the colors
+ self.Z_homed = 0 # only if this change, we will update the colors
+ self.interpreter = _IDLE # This hold the interpreter state, so we could check if actios are allowed
+ self.wait_tool_change = False # this is needed to get back to manual mode after a tool change
+ self.macrobuttons =[] # The list of all macrios defined in the INI file
+ self.log = True # Should all button clicks be loged? This will be later be
+ # set through the setings page
+
+ def initialize_preferences(self):
+ self.data.theme_name = 'Follow System Theme'
+ #self.gscreen.init_dro_pref()
+ #self.gscreen.init_theme_pref()
+ self.gscreen.init_window_geometry_pref()
+ self.gscreen.init_general_pref()
+
+ # We don't want Gscreen to initialize it's regular widgets because this custom
+ # screen doesn't have most of them. So we add this function call.
+ # Since this custom screen uses gladeVCP magic for its interaction with linuxcnc
+ # We don't add much to this function, but we do want to be able to change the theme so:
+ # We change the GTK theme to what's in gscreen's preference file.
+ # gscreen.change_theme() is a method in gscreen that changes the GTK theme of window1
+ # gscreen.data.theme_name is the name of the theme from the preference file
+ # To truely be friendly, we should add a way to change the theme directly in the custom screen.
+ # we also set up the statusbar and add a ready-to-home message
+ def initialize_widgets(self):
+ # These are gscreen widgets included in this screen
+ self.gscreen.init_statusbar()
+ self.gscreen.init_tooleditor()
+ self.gscreen.init_gremlin()
+ self.gscreen.init_embeded_terminal()
+# self.data.theme_name = self.gscreen.prefs.getpref('gtk_theme', 'Follow System Theme', str)
+# print(self.data.theme_name)
+ self.gscreen.init_themes()
+ self.gscreen.init_hide_cursor()
+ self.gscreen.init_audio()
+
+ # and now our own ones
+ self.widgets.adj_jog_vel.configure(self.data.jog_rate, 0, self.gscreen.data.jog_rate_max + 1, 1, 1, 1)
+ self.widgets.adj_spindle.configure(100, 0, self.data.spindle_override_max * 100 + 1, 1, 1, 1)
+ self.widgets.adj_feed.configure(100, 0, self.data.feed_override_max * 100 + 1, 1, 1, 1)
+ self.widgets.adj_max_vel.configure(self.data._maxvelocity*60, self.data._maxvelocity * 0.1, self.data._maxvelocity * 60 + 1, 1, 1, 1)
+ self.widgets.window1.set_title("Gscreen-gmoccapy for linuxcnc %s"%_RELEASE)
+ self.min_spindle_rev = self.gscreen.inifile.find("SPINDLE", "MIN_REV")
+ self.max_spindle_rev = self.gscreen.inifile.find("SPINDLE", "MAX_REV")
+ if not self.min_spindle_rev:
+ self.min_spindle_rev = 0
+ print(_("Minimum Spindle Speed not found in INI File\nMin has been set to 0 rpm"))
+ self.gscreen.add_alarm_entry(_("Minimum Spindle Speed not found in INI File\nMin has been set to 0 rpm"))
+ self.widgets.statusbar1.push(1,_("Minimum Spindle Speed not found in INI File\nMin has been set to 0 rpm"))
+ self.widgets.hal_hbar_spindle_feedback.set_property("min",float(self.min_spindle_rev))
+ if not self.max_spindle_rev:
+ self.max_spindle_rev = 6000
+ print(_("Maximum Spindle Speed not found in INI File\nMax has been set to 6000 rpm"))
+ self.gscreen.add_alarm_entry(_("Maximum Spindle Speed not found in INI File\nMax has been set to 6000 rpm"))
+ self.widgets.statusbar1.push(1,_("Maximum Spindle Speed not found in INI File\nMax has been set to 6000 rpm"))
+ self.widgets.hal_hbar_spindle_feedback.set_property("max",float(self.max_spindle_rev))
+
+ # this sets the background colors of several buttons
+ # the colors are different for the states of the button
+ self.widgets.hal_tbtn_on.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FF0000"))
+ self.widgets.hal_tbtn_on.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#00FF00"))
+ self.widgets.hal_tbtn_notaus.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FF0000"))
+ self.widgets.hal_tbtn_notaus.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#00FF00"))
+ self.widgets.lbl_X.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FF0000"))
+ self.widgets.lbl_Y.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FF0000"))
+ self.widgets.lbl_Z.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FF0000"))
+ self.widgets.rbt_manual.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.rbt_mdi.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.rbt_auto.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.rbt_setup.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.rbt_forward.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#00FF00"))
+ self.widgets.rbt_reverse.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#00FF00"))
+ self.widgets.rbt_stop.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.rbt_view_P.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.rbt_view_X.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.rbt_view_Y.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.rbt_view_Z.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.tbtn_flood.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#00FF00"))
+ self.widgets.tbtn_mist.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#00FF00"))
+ self.widgets.tbtn_rel.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.tbtn_dtg.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.tbtn_units.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.tbtn_view_dimension.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.tbtn_view_tool_path.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.tbtn_optional_blocks.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.tbtn_optional_stops.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+
+# ToDo The colors are to heavy, there should be a color choise
+# to distingish the button groups like numbers, axis and others
+# Suggestions welcome
+ self.widgets.btn_bs.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#B5731F"))
+ self.widgets.btn_F.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#B5731F"))
+ self.widgets.btn_G.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#B5731F"))
+ self.widgets.btn_I.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#B5731F"))
+ self.widgets.btn_J.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#B5731F"))
+ self.widgets.btn_K.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#B5731F"))
+ self.widgets.btn_M.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#B5731F"))
+ self.widgets.btn_P.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#B5731F"))
+ self.widgets.btn_Q.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#B5731F"))
+ self.widgets.btn_S.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#B5731F"))
+ self.widgets.btn_T.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#B5731F"))
+ self.widgets.btn_X.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#28D0D9"))
+ self.widgets.btn_Y.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#28D0D9"))
+ self.widgets.btn_Z.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#28D0D9"))
+# Todo End
+
+ # Now we will build the option buttons to select the Jog-rates
+ # We do this dinamecely, because users are able to set them in INI File
+ # because of space on the screen only 10 items are alowed
+ Anzahl = len(self.data.jog_increments)
+ if Anzahl > 10:
+ print(_("To many increments given in INI File for this screen"))
+ print(_("Only the first 10 will be reachable through this screen"))
+ Anzahl = 10
+ # The first radio button is created to get a radio button group
+ # The group is called according the name off the first button
+ # We use the pressed signal, not the toggled, otherwise two signals will be emited
+ # One from the released button and one from the pressed button
+ rbt0 = gtk.RadioButton(None, "Continuous")
+ rbt0.connect("pressed", self.on_increment_changed,"Continuous")
+ self.widgets.vbuttonbox2.pack_start(rbt0,True,True,0)
+ rbt0.set_property("draw_indicator",False)
+ rbt0.show()
+ # the rest of the buttons are now added to the group
+ for increment in range(1,Anzahl):
+ rbt = "rbt%d"%(increment)
+ rbt = gtk.RadioButton(rbt0, self.data.jog_increments[increment])
+ rbt.connect("pressed", self.on_increment_changed,self.data.jog_increments[increment])
+ self.widgets.vbuttonbox2.pack_start(rbt,True,True,0)
+ rbt.set_property("draw_indicator",False)
+ rbt.show()
+
+ self.set_property_dro("reference_type", 1)
+ self.set_property_dro("display_units_mm", True)
+
+ # This is needed only because we connect all the horizontal button
+ # to hal pins, so the user can conect them to hardware buttons
+ self.h_tabs = []
+ tab_main = [(0,"btn_homing"), (1,"btn_touch"),(3,"btn_tool"), (7,"tbtn_fullsize_preview"), (9,"btn_exit")]
+ self.h_tabs.append(tab_main)
+ tab_mdi = [(9,"btn_show_kbd")]
+ self.h_tabs.append(tab_mdi)
+ tab_auto = [(0,"btn_run"),(1,"btn_stop"),(2,"btn_step"),(3,"tbtn_pause"),(4,"btn_from_line"),(5,"tbtn_optional_stops"),(6,"tbtn_optional_blocks"),(7,"btn_reload"),(8,"btn_load"),(9,"btn_edit")]
+ self.h_tabs.append(tab_auto)
+ tab_ref = [(1,"btn_home_all"),(3,"btn_home_X"),(4,"btn_home_Y"),(5,"btn_home_Z"),(7,"btn_unhome_all"),(9,"btn_back_ref")]
+ self.h_tabs.append(tab_ref)
+ tab_touch = [(1,"btn_cero_X"),(2,"btn_cero_Y"),(3,"btn_cero_Z"),(5,"btn_set_value_X"),(6,"btn_set_value_Y"),(7,"btn_set_value_Z"),(9,"btn_back_cero")]
+ self.h_tabs.append(tab_touch)
+ tab_setup = [(0,"btn_delete"),(5,"btn_hal_scope"),(6,"btn_status"),(7,"btn_hal_meter"),(8,"btn_calibration"),(9,"btn_show_hal")]
+ self.h_tabs.append(tab_setup)
+ tab_edit = [(1,"btn_save"),(2,"btn_save_as"),(3,"btn_save_and_run"),(5,"btn_new"),(6,"btn_open_edit"),(7,"btn_close"),(8,"btn_keyb"),(9,"btn_back_edit")]
+ self.h_tabs.append(tab_edit)
+ tab_tool = [(0,"btn_delete_tool"),(1,"btn_add_tool"),(2,"btn_reload_tooltable"),(3,"btn_apply_tool_changes"),(5,"btn_index_tool"),(6,"btn_change_tool"),(9,"btn_back_tool")]
+ self.h_tabs.append(tab_tool)
+
+ self.v_tabs = [(0,"hal_tbtn_notaus"),(1,"hal_tbtn_on"),(2,"rbt_manual"),(3,"rbt_mdi"),(4,"rbt_auto"),(5,"rbt_setup"),(6,"tbtn_user_tabs")]
+
+ # call the function to change the button status
+ # so every think is ready to start
+ widgetlist = ["rbt_manual", "rbt_mdi", "rbt_auto", "btn_homing", "btn_touch", "btn_tool",
+ "ntb_jog", "scl_feed", "btn_feed_100", "rbt_forward", "btn_index_tool",
+ "rbt_reverse", "rbt_stop", "tbtn_flood", "tbtn_mist", "btn_change_tool",
+ "btn_spindle_100", "scl_max_vel", "scl_spindle", "rbt_manual"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,False)
+ self.widgets.rbt_manual.set_active(True)
+ self.widgets.ntb_jog.set_current_page(0)
+ self.widgets.tbtn_optional_blocks.set_active(self.gscreen.prefs.getpref('blockdel', False))
+ self.widgets.tbtn_optional_stops.set_active(not self.gscreen.prefs.getpref('opstop', False))
+ self.widgets.tbtn_show_dro.set_active(self.gscreen.prefs.getpref('enable_dro', False))
+ self.widgets.show_offsets.set_active(self.gscreen.prefs.getpref('show_offsets', False))
+ self.widgets.tbtn_show_dtg.set_active(self.gscreen.prefs.getpref('show_dtg', False))
+ self.unlock_code = self.gscreen.prefs.getpref('unlock_code', '123', str) # get unlock code
+
+ # This is only needed, because otherwise gmoccapy will use the standard DRO colors from
+ # gscreen, witch will not fit well the design from gmoccapy. You could get red text on red background
+ # we set everythink default to black background, after the first change of colors the colors are stored
+ # correctly, because then self.use_standard_dro_colors has been set to true.
+ self.use_standard_dro_colors = self.gscreen.prefs.getpref('use_standard_dro_colors', 'True', bool)
+ if self.use_standard_dro_colors:
+ self.data.abs_textcolor = "#000000000000"
+ self.data.rel_textcolor = "#000000000000"
+ self.data.dtg_textcolor = "#000000000000"
+ self.widgets.abs_colorbutton.set_color(gtk.gdk.color_parse(self.data.abs_textcolor))
+ self.gscreen.set_abs_color()
+ self.widgets.rel_colorbutton.set_color(gtk.gdk.color_parse(self.data.rel_textcolor))
+ self.gscreen.set_rel_color()
+ self.widgets.dtg_colorbutton.set_color(gtk.gdk.color_parse(self.data.dtg_textcolor))
+ self.gscreen.set_dtg_color()
+ self.gscreen.prefs.putpref('use_standard_dro_colors', False, bool)
+ else:
+ self.data.abs_textcolor = self.gscreen.prefs.getpref('abs_textcolor', '#000000000000', str)
+ self.data.rel_textcolor = self.gscreen.prefs.getpref('rel_textcolor', '#000000000000', str)
+ self.data.dtg_textcolor = self.gscreen.prefs.getpref('dtg_textcolor', '#000000000000', str)
+ self.gscreen.init_dro_colors()
+ if self.data.fullscreen1 == True:
+ self.widgets.btn_fullscreen1.set_active(True)
+ self.widgets.adj_start_spindle_RPM.set_value(self.data.spindle_start_rpm)
+ self.widgets.hal_sourceview.set_sensitive(False)
+ self.tooledit_btn_delete_tool = self.widgets.tooledit1.wTree.get_object("delete")
+ self.tooledit_btn_add_tool = self.widgets.tooledit1.wTree.get_object("add")
+ self.tooledit_btn_reload_tool = self.widgets.tooledit1.wTree.get_object("reload")
+ self.tooledit_btn_apply_tool = self.widgets.tooledit1.wTree.get_object("apply")
+ self.widgets.tooledit1.hide_buttonbox(True)
+ for axis in self.data.axis_list:
+ self._update_homed(axis.upper())
+ self.widgets.ntb_user_tabs.remove_page(0)
+ self.add_macro_button()
+ self.widgets.hal_tbtn_notaus.set_active(True)
+ self.units = self.gscreen.inifile.find("TRAJ", "LINEAR_UNITS")
+ if self.units == "inch":
+ self.widgets.tbtn_units.set_active(True)
+ print(self.gscreen.inifile.find("DISPLAY", "EMBED_TAB_COMMAND"))
+ if not self.gscreen.inifile.find("DISPLAY", "EMBED_TAB_COMMAND"):
+ self.widgets.tbtn_user_tabs.set_sensitive(False)
+
+ def add_macro_button(self):
+ macros = self.gscreen.inifile.findall("MACROS", "MACRO")
+ num_macros = len(macros)
+ if num_macros > 9:
+ self.gscreen.add_alarm_entry(_("more than 9 macros not allowed, only the first 9 ones will be used"))
+ print(_("more than 9 macros not allowed, only the first 9 ones will be used"))
+ num_macros = 9
+ for increment in range(0,num_macros):
+ name = macros[increment]
+ if len(name) > 11:
+ lbl = name[0:10]
+ else:
+ lbl = macros[increment]
+ btn = gtk.Button(lbl,None,False)
+ btn.connect("pressed", self.on_btn_macro_pressed,name)
+ btn.position = increment
+ self.macrobuttons.append(btn)
+ self.widgets.hbtb_MDI.pack_start(btn,True,True,0)
+ btn.show()
+ if num_macros < 9:
+ for label_space in range(num_macros,9):
+ lbl = "lbl_sp_%s"%label_space
+ lbl = gtk.Label(lbl)
+ lbl.position = label_space
+ lbl.set_text("")
+ self.widgets.hbtb_MDI.pack_start(lbl,True,True,0)
+ lbl.show()
+ self.widgets.hbtb_MDI.non_homogeneous = False
+
+ def on_btn_macro_pressed(self, widget = None, data = None):
+ o_codes = data.split()
+ command = str("O<" + o_codes[0] + "> call")
+ for code in o_codes[1:]:
+ parameter = self.entry_dialog(data = None, header = _("Enter value:"), label=_("Set parameter %s to:")%code )
+ print(parameter)
+ if parameter == False:
+ print(_("conversion error"))
+ self.gscreen.add_alarm_entry(_("Conversion error because off wrong entry for macro %s")%o_codes[0])
+ self.gscreen.warning_dialog(_("Conversion error !"), True, _("Please enter only numerical values\nValues have not been applied"))
+ return
+ if parameter != False or parameter == 0:
+ self.gscreen.add_alarm_entry(_("macro %s , parameter %s set to %f"%(o_codes[0],code,parameter)))
+ command = command + " [" + str(parameter) + "] "
+ self.gscreen.mdi_control.user_command(command)
+ for btn in self.macrobuttons:
+ btn.set_sensitive(False)
+ # we change the widget_image and use the button to interupt running macros
+ self.widgets.btn_show_kbd.set_image(self.widgets.img_brake_macro)
+ self.widgets.ntb_info.set_current_page(0)
+
+ def on_hide_cursor_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("hide_cursor_toggled")
+ if self.widgets.hide_cursor.get_active():
+ self.gscreen.prefs.putpref('hide_cursor', True)
+ self.data.hide_cursor = True
+ self.widgets.window1.window.set_cursor(INVISABLE)
+ else:
+ self.gscreen.prefs.putpref('hide_cursor', False)
+ self.data.hide_cursor = False
+ self.widgets.window1.window.set_cursor(None)
+
+ # toggle emergency button
+ def on_hal_tbtn_notaus_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("hal_tbtn_notaus_clicked")
+ if self.widgets.hal_tbtn_notaus.get_active():
+ self.widgets.hal_tbtn_notaus.set_image(self.widgets.img_emergency)
+ self.widgets.hal_tbtn_on.set_image(self.widgets.img_machine_off)
+ else:
+ self.widgets.hal_tbtn_notaus.set_image(self.widgets.img_emergency_off)
+
+ # toggle machine on / off button
+ def on_hal_tbtn_on_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("hal_tgbt_on_clicked")
+ if self.widgets.hal_tbtn_on.get_active():
+ self.widgets.hal_tbtn_on.set_image(self.widgets.img_machine_on)
+ # need to do that, because otherwise the tool_index_button will stay unsensitized
+ self._update_homed("X") # The axis to check doesn't matter
+ else:
+ self.widgets.hal_tbtn_on.set_image(self.widgets.img_machine_off)
+
+ # The mode buttons
+ def on_rbt_manual_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_manual_clicked")
+ self.gscreen.emc.set_manual_mode()
+ self.widgets.ntb_main.set_current_page(0)
+ self.widgets.ntb_button.set_current_page(0)
+
+ def on_rbt_mdi_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_mdi_clicked")
+ self.emc.set_mdi_mode()
+ self.widgets.ntb_main.set_current_page(0)
+ self.widgets.ntb_button.set_current_page(1)
+
+ def on_rbt_auto_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_auto_clicked")
+ self.emc.set_auto_mode()
+ self.widgets.ntb_main.set_current_page(0)
+ self.widgets.ntb_button.set_current_page(2)
+
+ def on_rbt_setup_pressed(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_setup_pressed")
+ if self.system_dialog():
+ self.widgets.rbt_setup.set_active(True)
+ self.widgets.ntb_main.set_current_page(1)
+ self.widgets.ntb_setup.set_current_page(1)
+ self.widgets.ntb_button.set_current_page(5)
+ else:
+ self.gscreen.warning_dialog(_("Just to warn you"), True,_("wrong code entered, Access denied"))
+ self.gscreen.add_alarm_entry(_("wrong code entered, Access denied"))
+ self.widgets.statusbar1.push(1,_("wrong code entered, Access denied"))
+ self.widgets.rbt_manual.emit("clicked")
+
+ def on_tbtn_user_tabs_toggled(self, widget, data=None):
+ if self.widgets.tbtn_user_tabs.get_active():
+ self.widgets.ntb_main.set_current_page(3)
+ else:
+ self.widgets.ntb_main.set_current_page(0)
+
+ # This dialog is for unlocking the system tab
+ # The unlock code number is defined at the top of the page
+ def system_dialog(self):
+ dialog = gtk.Dialog(_("Enter System Unlock Code"),
+ self.widgets.window1,
+ gtk.DIALOG_DESTROY_WITH_PARENT,
+ (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
+ gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
+ label = gtk.Label(_("Enter System Unlock Code"))
+ label.modify_font(pango.FontDescription("sans 20"))
+ calc = gladevcp.Calculator()
+ dialog.vbox.pack_start(label)
+ dialog.vbox.add(calc)
+ calc.set_value("")
+ calc.set_property("font","sans 20")
+ dialog.parse_geometry("400x400")
+ dialog.set_decorated(True)
+ dialog.show_all()
+ response = dialog.run()
+ code = calc.get_value()
+ dialog.destroy()
+ if response == gtk.RESPONSE_ACCEPT:
+ if code == int(self.unlock_code):
+ return True
+ return False
+
+ # The homing functions
+ def on_btn_homing_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_homing_clicked")
+ self.widgets.ntb_button.set_current_page(3)
+
+ def _dro_label_color_change(self, widget, bgcolor, fgcolor):
+ attr = pango.AttrList()
+ color = bgcolor
+ bg_color = pango.AttrBackground(color[0],color[1],color[2], 0, -1)
+ attr.insert(bg_color)
+ size = pango.AttrSize(30000, 0, -1)
+ attr.insert(size)
+ weight = pango.AttrWeight(600, 0, -1)
+ attr.insert(weight)
+ color = fgcolor
+ fg_color = pango.AttrForeground(color[0],color[1],color[2], 0, 11)
+ attr.insert(fg_color)
+ self.widgets[widget].set_attributes(attr)
+
+ def _update_homed(self, axis):
+ if self.widgets.tbtn_rel.get_active(): # abs dro requested
+ bg_color = self.data.abs_textcolor
+ bgcolor = self.data.abs_color
+ else: # rel dro requested
+ bg_color = self.data.rel_textcolor
+ bgcolor = self.data.rel_color
+ if self.widgets.tbtn_dtg.get_active(): # dtg dro requested
+ bg_color = self.data.dtg_textcolor
+ bgcolor = self.data.dtg_color
+ if self.data["%s_is_homed"%axis.lower()]:
+ fg_color = "#00FF00"
+ fgcolor = (0,65535,0)
+ else:
+ fg_color = "#FF0000"
+ fgcolor = (65000,0,0)
+ self._dro_label_color_change("hal_dro_%s"%axis.upper(),bgcolor,fgcolor)
+ self._dro_label_color_change("lbl_%s"%axis.upper(),bgcolor,fgcolor)
+
+ widgetname = "eventbox_" + axis.upper()
+ self.widgets[widgetname].modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bg_color))
+ widgetname ="eventbox_dro_" + axis.upper()
+ self.widgets[widgetname].modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bg_color))
+
+ self.gscreen.add_alarm_entry("%s_homed"%axis + " = " + str(self.data["%s_is_homed"%axis.lower()]))
+ if axis == "X":
+ self.X_homed = self.data["%s_is_homed"%axis.lower()]
+ if axis == "Y":
+ self.Y_homed = self.data["%s_is_homed"%axis.lower()]
+ if axis == "Z":
+ self.Z_homed = self.data["%s_is_homed"%axis.lower()]
+ if self.X_homed and self.Y_homed and self.Z_homed:
+ widgetlist = ["rbt_mdi", "rbt_auto", "btn_index_tool", "btn_change_tool"]
+ self.gscreen.sensitize_widgets(widgetlist,True)
+ else:
+ widgetlist = ["rbt_mdi", "rbt_auto", "btn_index_tool", "btn_change_tool"]
+ self.gscreen.sensitize_widgets(widgetlist,False)
+
+ def on_btn_home_all_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("button ref all clicked")
+ self.emc.home_all(1)
+
+ def on_btn_unhome_all_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("button unhome all clicked")
+ self.emc.unhome_all(1)
+
+#ToDo: What happen when there are more axis,
+ # will have to mak ethis dynamecely
+ def on_btn_home_selected_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("button home selected clicked")
+ if widget == self.widgets.btn_home_X:
+ axis = 0
+ elif widget == self.widgets.btn_home_Y:
+ axis = 1
+ elif widget == self.widgets.btn_home_Z:
+ axis = 2
+ self.emc.home_selected(axis)
+# ToDo: End
+
+ def on_chk_ignore_limits_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("chk_ignore_limits_toggled %s"%widget.get_active())
+ self.emc.override_limits(self.widgets.chk_ignore_limits.get_active())
+
+# ToDo: This is not working, and I don't know why
+# The Gremlin DRO is shown, and hideen, but it should not be hideen if
+# on the settings page the button Show DRO is active, in this case
+# self.gscreen.prefs.getpref('enable_dro') should return True.
+# The error I get is "'bool' object has no attribute 'lower'"
+ def on_tbtn_fullsize_preview_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("Fullsize Preview set to %s"%widget.get_active())
+ print(self.gscreen.prefs.getpref('enable_dro',"False"))
+ if widget.get_active():
+ self.widgets.box_info.hide()
+ self.widgets.vbx_jog.hide()
+ self.widgets.gremlin.set_property('metric_units',not self.widgets.tbtn_units.get_active())
+ self.widgets.gremlin.set_property('enable_dro',True)
+ else:
+ self.widgets.box_info.show()
+ self.widgets.vbx_jog.show()
+ if self.gscreen.prefs.getpref('enable_dro', "False") == False:
+ self.widgets.gremlin.set_property('enable_dro',False)
+#ToDo: End
+
+ # If button exit is klickt, press emergency button bevor closing the application
+ def on_btn_exit_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_exit_clicked")
+ self.widgets.hal_tbtn_notaus.set_active(1)
+ self.widgets.window1.destroy()
+
+ # this are hal-tools through gsreen function
+ def on_btn_show_hal_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_show_hal_clicked")
+ self.gscreen.on_halshow(None)
+
+ def on_btn_calibration_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_calibration_clicked")
+ self.gscreen.on_calibration(None)
+
+ def on_btn_hal_meter_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_hal_meter_clicked")
+ self.gscreen.on_halmeter(None)
+
+ def on_btn_status_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("hal_btn_status_clicked")
+ self.gscreen.on_status(None)
+
+ def on_btn_hal_scope_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("hal_btn_hal_scope_clicked")
+ self.gscreen.on_halscope(None)
+
+ # spindle stuff
+ def _set_spindle(self, widget, data=None):
+ rpm = abs(float(self.widgets.active_speed_label.get_text()))
+ if rpm == 0:
+ rpm = self.data.spindle_start_rpm
+ mode = self.gscreen.emcstat.task_mode # get the mode we are, so we can change back,
+ # because the following command sets automaticaly manual mode
+ if widget == self.widgets.rbt_forward:
+ self.emc.spindle_forward(1,rpm)
+ elif widget == self.widgets.rbt_reverse:
+ self.emc.spindle_reverse(1,rpm)
+ elif widget == self.widgets.rbt_stop:
+ self.emc.spindle_off(1)
+ else:
+ self.gscreen.add_alarm_entry(_("Something went wrong, we got an unknow widget"))
+ if mode == _MANUAL: # we are in manual mode
+ self.emc.set_manual_mode()
+ elif mode == _AUTO: # we are in auto mode
+ self.emc.set_auto_mode()
+ elif mode == _MDI: # we are in mdi mode
+ self.emc.set_mdi_mode()
+ else:
+ self.gscreen.add_alarm_entry(_("Something went wrong, we are in non defined mode"))
+ if self.log: self.gscreen.add_alarm_entry("Spindle set to %i rpm, mode is %s"%(rpm,mode))
+
+ def on_rbt_forward_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_forward_clicked")
+ if self.widgets.rbt_forward.get_active():
+ self.widgets.rbt_forward.set_image(self.widgets.img_forward_on)
+ self._set_spindle(widget)
+ else:
+ self.widgets.rbt_forward.set_image(self.widgets.img_forward)
+
+ def on_rbt_reverse_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_reverse_clicked")
+ if self.widgets.rbt_reverse.get_active():
+ self.widgets.rbt_reverse.set_image(self.widgets.img_reverse_on)
+ self.widgets.hal_hbar_spindle_feedback.set_property("min",float(self.min_spindle_rev)*-1)
+ self.widgets.hal_hbar_spindle_feedback.set_property("max",float(self.max_spindle_rev)*-1)
+ self._set_spindle(widget)
+ else:
+ self.widgets.rbt_reverse.set_image(self.widgets.img_reverse)
+ self.widgets.hal_hbar_spindle_feedback.set_property("min",float(self.min_spindle_rev))
+ self.widgets.hal_hbar_spindle_feedback.set_property("max",float(self.max_spindle_rev))
+
+ def on_rbt_stop_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_stop_clicked")
+ if self.widgets.rbt_stop.get_active():
+ self.widgets.rbt_stop.set_image(self.widgets.img_stop_on)
+ self._set_spindle(widget)
+ else:
+ self.widgets.rbt_stop.set_image(self.widgets.img_sstop)
+
+ def on_hal_hbar_spindle_feedback_hal_pin_changed(self, widget, data=None):
+ self.widgets.lbl_spindle_act.set_text("S %s"%int(self.widgets.hal_hbar_spindle_feedback.value))
+
+ def on_btn_spindle_100_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_spindle_100_clicked")
+ self.widgets.adj_spindle.set_value(100)
+
+ def on_scl_spindle_value_changed(self, widget, data = None):
+ spindle_override = self.widgets.scl_spindle.get_value() / 100
+ real_spindle_speed = round(int(self.widgets.active_speed_label.get_text()) * spindle_override)
+ self.widgets.lbl_spindle_act.set_text("S %d" %real_spindle_speed)
+ self.emc.spindle_override(spindle_override)
+
+ def on_adj_start_spindle_RPM_value_changed(self, widget, data = None):
+ if self.log: self.gscreen.add_alarm_entry("sbtn_spindle_start_rpm_clicked")
+ self.data.spindle_start_rpm = widget.get_value()
+ self.gscreen.prefs.putpref('spindle_start_rpm', widget.get_value(),float)
+
+ def _update_spindle_btn(self):
+ if self.gscreen.emcstat.task_mode == _AUTO and self.interpreter == _RUN:
+ return
+ if self.data.spindle_dir > 0:
+ self.widgets.rbt_forward.set_active(True)
+ elif self.data.spindle_dir < 0:
+ self.widgets.rbt_reverse.set_active(True)
+ elif not self.widgets.rbt_stop.get_active():
+ self.widgets.rbt_stop.set_active(True)
+
+ # Coolant an mist coolant button
+ def on_tbtn_flood_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("tbtn_flood_clicked")
+ if self.data.flood and self.widgets.tbtn_flood.get_active():
+ return
+ elif not self.data.flood and not self.widgets.tbtn_flood.get_active():
+ return
+ elif self.widgets.tbtn_flood.get_active():
+ self.widgets.tbtn_flood.set_image(self.widgets.img_coolant_on)
+ self.emc.flood_on(1)
+ else:
+ self.widgets.tbtn_flood.set_image(self.widgets.img_coolant_off)
+ self.emc.flood_off(1)
+
+ def on_tbtn_mist_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("tbtn_mist_clicked")
+ if self.data.mist and self.widgets.tbtn_mist.get_active():
+ return
+ elif not self.data.mist and not self.widgets.tbtn_mist.get_active():
+ return
+ elif self.widgets.tbtn_mist.get_active():
+ self.widgets.tbtn_mist.set_image(self.widgets.img_mist_on)
+ self.emc.mist_on(1)
+ else:
+ self.widgets.tbtn_mist.set_image(self.widgets.img_mist_off)
+ self.emc.mist_off(1)
+
+ def _update_coolant(self):
+ if self.gscreen.emcstat.task_mode == _AUTO and self.interpreter == _RUN:
+ return
+ if self.data.flood:
+ if not self.widgets.tbtn_flood.get_active():
+ self.widgets.tbtn_flood.set_active(True)
+ else:
+ self.widgets.tbtn_flood.set_active(False)
+ if self.data.mist:
+ if not self.widgets.tbtn_mist.get_active():
+ self.widgets.tbtn_mist.set_active(True)
+ else:
+ self.widgets.tbtn_mist.set_active(False)
+
+#ToDo: Make Hal Pins to be able to connect a MPG whell to the scale
+ # feed stuff
+ def on_scl_feed_value_changed(self, widget, data=None):
+ feed_override = self.widgets.scl_feed.get_value() / 100
+ real_feed = round(int(self.widgets.active_feed_label.get_text()) * feed_override)
+ self.widgets.lbl_feed_act.set_text("F %d" %real_feed)
+ self.emc.feed_override(feed_override)
+#ToDo: End
+
+ def on_btn_feed_100_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_feed_100_clicked")
+ self.widgets.adj_feed.set_value(100)
+
+ # Update the velocity label
+ def _update_vel(self):
+ self.widgets.lbl_current_vel.set_text("%d" %self.data.velocity)
+
+ # This is the jogging part
+ def on_increment_changed(self, widget = None, data = None):
+ if self.log: self.gscreen.add_alarm_entry("increment_changed %s"%data)
+ if data != "Continuous":
+ self.distance = self.gscreen.parse_increment(data)
+ else:
+ self.distance = 0
+#ToDo: Make Hal Pins to be able to connect a MPG whell to the scale
+ def on_adj_jog_vel_value_changed(self, widget, data = None):
+ self.emc.continuous_jog_velocity(widget.get_value())
+#ToDo: End
+
+#ToDo: Make this able to reakt to more axis
+ def on_hal_btn_jog_pressed(self, widget, data = None):
+ if widget == self.widgets.hal_btn_X_plus:
+ axis = 0
+ direction = 1
+ elif widget == self.widgets.hal_btn_X_minus:
+ axis = 0
+ direction = -1
+ elif widget == self.widgets.hal_btn_Y_plus:
+ axis = 1
+ direction = 1
+ elif widget == self.widgets.hal_btn_Y_minus:
+ axis = 1
+ direction = -1
+ elif widget == self.widgets.hal_btn_Z_plus:
+ axis = 2
+ direction = 1
+ elif widget == self.widgets.hal_btn_Z_minus:
+ axis = 2
+ direction = -1
+ else:
+ print(_("unknow axis clicked"))
+ self.gscreen.add_alarm_entry("hal_btn_jog_%i_%i"%(axis,direction))
+
+ if self.distance <> 0: # incremental jogging
+ # DOKU : emc.incremental_jog(<axis number>,<direction>,<distance to jog>)
+ self.gscreen.emc.incremental_jog(axis,direction,self.distance)
+ else: # continuous jogging
+ self.gscreen.emc.continuous_jog(axis,direction)
+
+ def on_hal_btn_jog_released(self, widget, data = None):
+ if widget == self.widgets.hal_btn_X_plus:
+ axis = 0
+ elif widget == self.widgets.hal_btn_X_minus:
+ axis = 0
+ elif widget == self.widgets.hal_btn_Y_plus:
+ axis = 1
+ elif widget == self.widgets.hal_btn_Y_minus:
+ axis = 1
+ elif widget == self.widgets.hal_btn_Z_plus:
+ axis = 2
+ elif widget == self.widgets.hal_btn_Z_minus:
+ axis = 2
+ else:
+ print(_("unknow axis clicked"))
+
+ if self.distance <>0:
+ pass
+ else:
+ self.gscreen.emc.continuous_jog(axis,0)
+#ToDo: End
+
+ # this are the MDI thinks we need
+ def on_btn_delete_clicked(self, widget, data=None):
+ message = _("Do you realy want to delete the mdi history?\n")
+ message += _("this will not delete the MDI History file, but will\n")
+ message += _("delete the listbox entries for this session")
+ result = self.yesno_dialog(header=_("Attention!!"), label = message)
+ if result:
+ self.widgets.hal_mdihistory.model.clear()
+ if self.log: self.gscreen.add_alarm_entry("delete_MDI with result %s"%result)
+
+ def yesno_dialog(self, header=_("Question") ,label=_("Please decide:")):
+ dialog = gtk.MessageDialog(self.widgets.window1,
+ gtk.DIALOG_DESTROY_WITH_PARENT,
+ gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO,header)
+ label = gtk.Label(label)
+ dialog.vbox.pack_start(label)
+ dialog.set_decorated(True)
+ dialog.show_all()
+ response = dialog.run()
+ dialog.destroy()
+ if response == gtk.RESPONSE_YES:
+ return True
+ return False
+
+# ToDo
+# Should be deleted when moccapy is finished
+ def on_btn_not_implemented_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("%s_clicked"%widget)
+ message = _("This button has not been implemented jet!")
+ self.gscreen.warning_dialog(_("Just to inform you"), True, message)
+# ToDo end
+
+ # The MDI button section
+ def on_btn_MDI_key_clicked(self, widget, data=None):
+ key = str(widget.get_label())
+ if self.log: self.gscreen.add_alarm_entry("btn_MDI_key_%s_clicked"%key)
+ if key == ",":
+ key = "."
+ if key == "SPC":
+ key = " "
+ if self.widgets.ntb_button.get_current_page() == 6: # edit mode
+ self.widgets.hal_sourceview.buf.insert_at_cursor(key)
+ else:
+ Text = self.widgets.hal_mdihistory.entry.get_text()
+ Text = Text + key
+ self.widgets.hal_mdihistory.entry.set_text(Text)
+
+ def on_btn_bs_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_bs_clicked")
+ if self.widgets.ntb_button.get_current_page() == 6: # edit mode
+ # find the actaual position
+ cursor = self.widgets.hal_sourceview.buf.get_insert()
+ # get the iter from current pos
+ iter = self.widgets.hal_sourceview.buf.get_iter_at_mark(cursor)
+ # delete the caracter left of cursor position
+ # first True = interaktive (caused by user)
+ # second = default editable
+ self.widgets.hal_sourceview.buf.backspace(iter,True,True)
+ else:
+ MDI = self.widgets.hal_mdihistory.entry.get_text()
+ NewLength = int(len(MDI)) - 1
+ MDI = MDI[:NewLength]
+ self.widgets.hal_mdihistory.entry.set_text(MDI)
+
+ def on_tbtn_shift_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_shift_clicked")
+ widgetlist = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S",
+ "T","U","V","W","X","Y","Z"]
+ if widget.get_active():
+ self.widgets.btn_eka.set_label("(")
+ self.widgets.btn_ekz.set_label(")")
+ self.widgets.btn_dot.set_label(";")
+ for letter in widgetlist:
+ self.widgets["btn_%s"%letter].set_label(letter.lower())
+ else:
+ self.widgets.btn_eka.set_label("[")
+ self.widgets.btn_ekz.set_label("]")
+ self.widgets.btn_dot.set_label(",")
+ for letter in widgetlist:
+ self.widgets["btn_%s"%letter].set_label(letter.upper())
+
+ def on_btn_ok_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_ok_clicked")
+ if self.widgets.ntb_button.get_current_page() == 6: # edit mode
+ # in this case we just want a new line
+ self.widgets.hal_sourceview.buf.insert_at_cursor("\n")
+ else:
+ self.widgets.hal_mdihistory.submit()
+ self.widgets.hal_mdihistory.entry.set_text("")
+
+ def on_btn_arrow_clicked(self, widget, data=None):
+ if self.widgets.ntb_button.get_current_page() == 6: # edit mode
+ self.widgets.hal_sourceview.grab_focus() # Otherwise the cursor will desapear
+ # find the actaual position
+ cursor = self.widgets.hal_sourceview.buf.get_insert()
+ # get the iter from current pos
+ iter = self.widgets.hal_sourceview.buf.get_iter_at_mark(cursor)
+ if widget == self.widgets.btn_left:
+ iter.backward_char()
+ elif widget == self.widgets.btn_right:
+ iter.forward_char()
+ elif widget == self.widgets.btn_up:
+ line = iter.get_line()
+ pos_in_line = iter.get_line_offset()
+ iter.backward_line()
+ if iter.get_chars_in_line() != 1:
+ if iter.get_chars_in_line() < pos_in_line:
+ pos_in_line = iter.get_chars_in_line()-1
+ iter.forward_cursor_positions(pos_in_line)
+ elif widget == self.widgets.btn_down:
+ line = iter.get_line()
+ pos_in_line = iter.get_line_offset()
+ iter.forward_line()
+ if iter.get_chars_in_line() != 1:
+ if iter.get_chars_in_line() < pos_in_line:
+ pos_in_line = iter.get_chars_in_line()-1
+ iter.forward_cursor_positions(pos_in_line)
+ else:
+ print(_("Big problem, because you could not get here"))
+ self.widgets.hal_sourceview.buf.place_cursor(iter)
+ self.widgets.hal_sourceview.scroll_to_iter(iter,0,False)
+ else:
+ self.widgets.hal_mdihistory.grab_focus()
+ self.gscreen.audio.set_sound(self.data.alert_sound)
+ selection = self.widgets.hal_mdihistory.tv.get_selection()
+ model, treeiter = selection.get_selected()
+ if widget == self.widgets.btn_left:
+ return
+ elif widget == self.widgets.btn_right:
+ return
+ elif widget == self.widgets.btn_up:
+ pos = int(model.get_string_from_iter(treeiter))
+ first = int(model.get_string_from_iter(model.get_iter_first()))
+ pos = pos - 1
+ if pos < first:
+ pos = first
+ self.gscreen.audio.run()
+ newtreeiter = model.get_iter_from_string(str(pos))
+ elif widget == self.widgets.btn_down:
+ newtreeiter = model.iter_next(treeiter)
+ else:
+ print(_("Big problem, because you could not get here"))
+ try:
+ selection.select_iter(newtreeiter)
+ except:
+ newtreeiter = treeiter
+ self.gscreen.audio.run()
+ self.widgets.hal_mdihistory.entry.set_text(model[newtreeiter][0])
+ path = model.get_path(newtreeiter)
+ self.widgets.hal_mdihistory.tv.scroll_to_cell(path,None,False)
+
+ def on_btn_show_kbd_clicked(self, widget, data=None):
+ # if the image is img_brake macro, we want to interupt the running macro
+ if self.widgets.btn_show_kbd.get_image() == self.widgets.img_brake_macro:
+ if self.log: self.gscreen.add_alarm_entry("btn_brake macro_clicked")
+ self.gscreen.emc.abort()
+ self.widgets.btn_show_kbd.set_image(self.widgets.img_keyboard)
+ if self.widgets.ntb_info.get_current_page() == 1:
+ if self.log: self.gscreen.add_alarm_entry("btn_keyboard_clicked")
+ self.widgets.ntb_info.set_current_page(0)
+ else:
+ self.widgets.ntb_info.set_current_page(1)
+
+ def on_ntb_info_switch_page(self, page, page_num, data=None):
+ self.widgets.btn_left.set_sensitive(not self.widgets.rbt_mdi.get_active())
+ self.widgets.btn_right.set_sensitive(not self.widgets.rbt_mdi.get_active())
+
+ # Three back buttons to be able to leave notebook pages
+ # All use the same callback
+ def on_btn_back_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_back_clicked")
+ if self.widgets.ntb_button.get_current_page() == 6: # edit mode, go back to auto_buttons
+ self.widgets.ntb_button.set_current_page(2)
+ else: # else we go to main button on manual
+ self.widgets.ntb_button.set_current_page(0)
+ self.widgets.ntb_main.set_current_page(0)
+
+ # The offset settings, set to cero
+ def on_btn_touch_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_touch_clicked")
+ self.widgets.ntb_button.set_current_page(4)
+
+#ToDo: what to do when there are more axis?
+ def on_btn_cero_X_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_cero_X_clicked")
+ self.gscreen.emc.set_mdi_mode()
+ self.gscreen.mdi_control.set_axis("X",0)
+ self.widgets.btn_reload.emit("clicked")
+ self.gscreen.emc.set_manual_mode()
+
+ def on_btn_cero_Y_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_cero_Y_clicked")
+ self.gscreen.emc.set_mdi_mode()
+ self.gscreen.mdi_control.set_axis("Y",0)
+ self.widgets.btn_reload.emit("clicked")
+ self.gscreen.emc.set_manual_mode()
+
+ def on_btn_cero_Z_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_cero_Z_clicked")
+ self.gscreen.emc.set_mdi_mode()
+ self.gscreen.mdi_control.set_axis("Z",0)
+ self.widgets.btn_reload.emit("clicked")
+ self.gscreen.emc.set_manual_mode()
+
+ def on_btn_set_value_clicked(self, widget, data=None):
+ if widget == self.widgets.btn_set_value_X:
+ axis = "X"
+ elif widget == self.widgets.btn_set_value_Y:
+ axis = "Y"
+ elif widget == self.widgets.btn_set_value_Z:
+ axis = "Z"
+ else:
+ axis = "Unknown"
+ self.gscreen.add_alarm_entry(_("Offset %s could not be set, because off unnown axis")%axis)
+ return
+ self.gscreen.add_alarm_entry("btn_set_value_%s_clicked"%axis)
+ preset = self.gscreen.prefs.getpref("offset_axis_%s"%axis.lower(), 0, float)
+ offset = self.entry_dialog(data = preset, header = _("Enter value for axis %s")%axis, label=_("Set axis %s to:")%axis )
+ if offset != False or offset == 0:
+ self.gscreen.add_alarm_entry(_("offset %s set to %f")%(axis,offset))
+ self.gscreen.emc.set_mdi_mode()
+ self.gscreen.mdi_control.set_axis(axis,offset)
+ self.widgets.btn_reload.emit("clicked")
+ self.gscreen.emc.set_manual_mode()
+ self.gscreen.prefs.putpref("offset_axis_%s"%axis.lower(), offset, float)
+ else:
+ print(_("conversion error"))
+ self.gscreen.add_alarm_entry(_("Offset conversion errorbecause off wrong entry"))
+ self.gscreen.warning_dialog(_("Conversion error !"), True, _("Please enter only numerical values\nValues have not been applied"))
+#ToDo:End
+
+ def entry_dialog(self, data=None, header=_("Enter value") ,label=_("Enter the value to set")):
+ dialog = gtk.Dialog(header,
+ self.widgets.window1,
+ gtk.DIALOG_DESTROY_WITH_PARENT,
+ (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
+ gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
+ label = gtk.Label(label)
+ label.modify_font(pango.FontDescription("sans 20"))
+ calc = gladevcp.Calculator()
+ dialog.vbox.pack_start(label)
+ dialog.vbox.add(calc)
+ if data != None:
+ calc.set_value(data)
+ else:
+ calc.set_value("")
+ calc.set_property("font","sans 20")
+ dialog.parse_geometry("400x400")
+ dialog.set_decorated(True)
+ dialog.show_all()
+ response = dialog.run()
+ value = calc.get_value()
+ dialog.destroy()
+ if response == gtk.RESPONSE_ACCEPT:
+ if value!= None:
+ return float(value)
+ return False
+
+ # DRO changes and related thinks
+ def on_tbtn_rel_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_rel_toggled")
+ if self.widgets.tbtn_dtg.get_active():
+ self.widgets.tbtn_dtg.set_active(False)
+ if self.widgets.tbtn_rel.get_active():
+ self.widgets.tbtn_rel.set_label("Abs.")
+ self.widgets.gremlin.set_property('use_relative',False)
+ self.set_property_dro("reference_type", 0)
+ else:
+ self.widgets.tbtn_rel.set_label("Rel.")
+ self.widgets.gremlin.set_property('use_relative',True)
+ self.set_property_dro("reference_type", 1)
+ for axis in self.data.axis_list:
+ self._update_homed(axis)
+
+ def on_tbtn_dtg_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("tbtn_dtg_toggled")
+ if self.widgets.tbtn_dtg.get_active():
+ self.widgets.tbtn_dtg.set_label("GTD.")
+ self.widgets.gremlin.set_property('show_dtg',True)
+ self.set_property_dro("reference_type", 2)
+ else:
+ self.widgets.tbtn_dtg.set_label("DTG.")
+ self.widgets.gremlin.set_property('show_dtg',False)
+ if self.widgets.tbtn_rel.get_active():
+ self.set_property_dro("reference_type", 0)
+ else:
+ self.set_property_dro("reference_type", 1)
+ for axis in self.data.axis_list:
+ self._update_homed(axis)
+
+ def on_tbtn_units_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("tbtn_units_toggled")
+ if self.widgets.tbtn_units.get_active():
+ self.widgets.tbtn_units.set_label("Inch")
+ self.set_property_dro("display_units_mm", False)
+ self.widgets.gremlin.set_property('metric_units',False)
+ self.data.dro_units = _IMPERIAL # 0 = _IMPERIAL ; 1 = _MM
+ else:
+ self.widgets.tbtn_units.set_label("mm")
+ self.set_property_dro("display_units_mm", True)
+ self.widgets.gremlin.set_property('metric_units',True)
+ self.data.dro_units = _MM # 0 = _IMPERIAL ; 1 = _MM
+
+ def set_property_dro(self, property, status):
+ for axis in self.data.axis_list:
+ self.widgets["hal_dro_%s"%axis.upper()].set_property(property,status)
+
+ # choose a theme to aply
+ def on_theme_choice_changed(self, widget):
+ if self.log: self.gscreen.add_alarm_entry("theme changed to %s"%widget.get_active_text())
+ self.gscreen.change_theme(widget.get_active_text())
+
+ # True is fullscreen
+ def on_btn_fullscreen1_toggled(self, widget):
+ if self.log: self.gscreen.add_alarm_entry("btn_fullscreen1_toggled")
+ if widget.get_active():
+ self.widgets.window1.fullscreen()
+ self.gscreen.prefs.putpref('fullscreen1', True, bool)
+ else:
+ self.widgets.window1.unfullscreen()
+ self.gscreen.prefs.putpref('fullscreen1', False, bool)
+
+ def on_rel_colorbutton_color_set(self, widget):
+ if self.log: self.gscreen.add_alarm_entry("on_rel_colorbutton_color_set")
+ self.gscreen.set_rel_color()
+ for axis in self.data.axis_list:
+ self._update_homed(axis.upper())
+
+ def on_abs_colorbutton_color_set(self, widget):
+ if self.log: self.gscreen.add_alarm_entry("on_abs_colorbutton_color_set")
+ self.gscreen.set_abs_color()
+ for axis in self.data.axis_list:
+ self._update_homed(axis.upper())
+
+ def on_dtg_colorbutton_color_set(self, widget):
+ if self.log: self.gscreen.add_alarm_entry("on_dtg_colorbutton_color_set")
+ self.gscreen.set_dtg_color()
+ for axis in self.data.axis_list:
+ self._update_homed(axis.upper())
+
+ def on_grid_size_value_changed(self, widget, data=None):
+ self.gscreen.set_grid_size(widget)
+
+ def on_tbtn_show_dro_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("show_gremlin_DRO = %s"%widget.get_active())
+ self.widgets.gremlin.set_property('metric_units',not self.widgets.tbtn_units.get_active())
+ self.widgets.gremlin.set_property('enable_dro',widget.get_active())
+ self.gscreen.prefs.putpref('enable_dro', widget.get_active(), bool)
+
+ def on_tbtn_show_dtg_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("show_gremlin_DTG = %s"%widget.get_active())
+ self.widgets.gremlin.set_property('show_dtg', widget.get_active())
+ self.gscreen.prefs.putpref('show_dtg', widget.get_active(), bool)
+
+ def on_show_offsets_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("show_offset_button_toggled to %s"%widget.get_active())
+ self.gscreen.set_show_offsets(widget.get_active())
+ self.gscreen.prefs.putpref('show_offsets', widget.get_active(), bool)
+
+ # tool stuff
+ def on_btn_tool_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_tool_clicked")
+ self.widgets.ntb_main.set_current_page(2)
+ self.widgets.ntb_button.set_current_page(7)
+
+ def update_toolinfo(self, tool):
+ toolinfo = self.widgets.tooledit1.get_toolinfo(tool)
+ if toolinfo:
+ # Doku
+ # toolinfo[0] = cell toggle
+ # toolinfo[1] = tool number
+ # toolinfo[2] = pocket number
+ # toolinfo[3] = X offset
+ # toolinfo[4] = Y offset
+ # toolinfo[5] = Z offset
+ # toolinfo[6] = A offset
+ # toolinfo[7] = B offset
+ # toolinfo[8] = C offset
+ # toolinfo[9] = U offset
+ # toolinfo[10] = V offset
+ # toolinfo[11] = W offset
+ # toolinfo[12] = tool diameter
+ # toolinfo[13] = frontangle
+ # toolinfo[14] = backangle
+ # toolinfo[15] = tool orientation
+ # toolinfo[16] = tool info
+ self.widgets.lbl_tool_offset_Z.set_text(toolinfo[5])
+ self.widgets.lbl_tool_dia.set_text(toolinfo[12])
+ self.widgets.lbl_tool_name.set_text(toolinfo[16])
+ if tool == 0:
+ self.widgets.lbl_tool_offset_Z.set_text("0")
+ self.widgets.lbl_tool_dia.set_text("0")
+ self.widgets.lbl_tool_name.set_text("No tool in spindle")
+
+ def on_btn_delete_tool_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("on_btn_delete_tool_clicked")
+ self.tooledit_btn_delete_tool.emit("clicked")
+
+ def on_btn_add_tool_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("on_btn_add_tool_clicked")
+ self.tooledit_btn_add_tool.emit("clicked")
+
+ def on_btn_reload_tooltable_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("on_btn_reload_tooltable_clicked")
+ self.tooledit_btn_reload_tool.emit("clicked")
+
+ def on_btn_apply_tool_changes_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("on_btn_apply_tool_changes_clicked")
+ self.tooledit_btn_apply_tool.emit("clicked")
+
+ # set tool with M61 Q? or with T? M6
+ def on_btn_selected_tool_clicked(self, widget, data=None):
+ tool = self._get_selected_tool()
+ if tool == self.gscreen.data.tool_in_spindle:
+ message = _("Selected tool is allready in spindle, no change needed.")
+ self.gscreen.warning_dialog(_("Important Warning!"), True, message)
+ self.gscreen.add_alarm_entry(message)
+ return
+ if self.log: self.gscreen.add_alarm_entry("set_tool_with M61 Q%s"%tool)
+ if tool:
+ tool = int(tool)
+ self.emc.set_mdi_mode()
+ if widget == self.widgets.btn_change_tool:
+ self.gscreen.mdi_control.user_command("T%s M6"%tool)
+ else:
+ self.gscreen.mdi_control.user_command("M61 Q%s"%tool)
+ self.update_toolinfo(tool)
+ self.widgets.ntb_main.set_current_page(0)
+ self.widgets.ntb_button.set_current_page(0)
+ self.wait_tool_change = True
+ else:
+ self.widgets.statusbar1.push(1,_("Could not understand entered tool number. Will not change anything"))
+
+ def _get_selected_tool(self):
+ if self.log: self.gscreen.add_alarm_entry("get_selected reached")
+ liststore = self.widgets.tooledit1.model
+ def match_value_cb(model, path, iter, pathlist):
+ if model.get_value(iter, 0) == 1 :
+ pathlist.append(path)
+ return False # keep the foreach going
+ pathlist = []
+ liststore.foreach(match_value_cb, pathlist)
+ # foreach works in a depth first fashion
+ if len(pathlist) > 1:
+ message = _("you selected more than one tool, to change a tool, the toolnumber must be unic")
+ self.gscreen.warning_dialog(_("Important Warning!"), True, message)
+ self.gscreen.add_alarm_entry(message)
+ return None
+ elif len(pathlist) == 0:
+ message = _("you must select the tool to be changed\nWill not change anything")
+ self.gscreen.warning_dialog(_("Important Warning!"), True, message)
+ self.gscreen.add_alarm_entry(message)
+ return None
+ else:
+ return(liststore.get_value(liststore.get_iter(pathlist[0]),1))
+
+ # gremlin relevant calls
+ def on_rbt_view_P_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_view_P_toggled")
+ if self.widgets.rbt_view_P.get_active():
+ self.widgets.gremlin.set_property('view','p')
+
+ def on_rbt_view_X_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_view_X_toggled")
+ if self.widgets.rbt_view_X.get_active():
+ self.widgets.gremlin.set_property('view','x')
+
+ def on_rbt_view_Y_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_view_Y_toggled")
+ if self.widgets.rbt_view_Y.get_active():
+ self.widgets.gremlin.set_property('view','y')
+
+ def on_rbt_view_Z_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_view_Z_toggled")
+ if self.widgets.rbt_view_Z.get_active():
+ self.widgets.gremlin.set_property('view','z')
+
+ def on_btn_zoom_in_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_zoom_in_clicked")
+ self.widgets.gremlin.zoom_in()
+
+ def on_btn_zoom_out_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_zoom_out_clicked")
+ self.widgets.gremlin.zoom_out()
+
+ def on_btn_delete_view_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_delete_view_clicked")
+ self.widgets.gremlin.clear_live_plotter()
+
+ def on_tbtn_view_dimension_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_view_dimensions_clicked")
+ self.widgets.gremlin.set_property('show_extents_option', widget.get_active())
+
+ def on_tbtn_view_tool_path_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_view_tool_path_clicked")
+ self.widgets.gremlin.set_property('show_live_plot', widget.get_active())
+
+ # edit a program or make a new one
+ def on_btn_edit_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_edit_clicked")
+ self.widgets.ntb_button.set_current_page(6)
+ self.widgets.ntb_preview.hide()
+ self.widgets.tbl_dro.hide()
+ w1 , h1 = self.widgets.window1.get_size_request()
+ w2 , h2 = self.widgets.vbtb_main.get_size_request()
+ self.widgets.vbx_jog.set_size_request(w1 - w2 , -1)
+ self.widgets.hal_sourceview.set_sensitive(1)
+
+ # if we leave the edit mode, we will have to show all widgets again
+ def on_ntb_button_switch_page(self, *args):
+ if self.log: self.gscreen.add_alarm_entry("ntb_button_page changed to %s"%self.widgets.ntb_button.get_current_page())
+ if self.widgets.ntb_button.get_current_page() == 6:
+ self.widgets.ntb_preview.show()
+ self.widgets.tbl_dro.show()
+ self.widgets.vbx_jog.set_size_request(360 , -1)
+ self.widgets.hal_sourceview.set_sensitive(0)
+ self.widgets.btn_save.set_sensitive(True)
+ self.widgets.btn_reload.emit("clicked")
+ self.widgets.ntb_info.set_current_page(0)
+
+ # Save all changes and run the program
+ def on_btn_save_and_run_clicked(self, widget, data=None):
+ if self.widgets.lbl_program.get_label() == "":
+ self.widgets.btn_save_as.emit("clicked")
+ else:
+ self.widgets.btn_save.emit("clicked")
+ self.widgets.btn_reload.emit("clicked")
+ self.widgets.ntb_button.set_current_page(2)
+ self.widgets.btn_run.emit("clicked")
+
+# ToDo find out how to make a nes file
+ # make a new file
+ def on_btn_new_clicked(self, widget, data=None):
+ self.widgets.btn_save.set_sensitive(False)
+ self.widgets.hal_sourceview.buf.set_text("")
+ self.widgets.lbl_program.set_label("")
+# ToDo end
+
+ # just go back to auto button and discharge all changes made
+ def on_btn_close_clicked(self, widget, data=None):
+ self.on_ntb_button_switch_page()
+ self.widgets.ntb_button.set_current_page(2)
+ self.widgets.btn_reload.emit("clicked")
+
+ def on_tbtn_optional_blocks_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("on_tbtn_optional_blocks_toggled " + str(self.widgets.tbtn_optional_blocks.get_active()))
+ self.emc.blockdel(widget.get_active())
+ self.gscreen.prefs.putpref('blockdel', widget.get_active())
+ self.widgets.btn_reload.emit("clicked")
+
+ def on_tbtn_optional_stops_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("on_tbtn_optional_stops_toggled " + str(self.widgets.tbtn_optional_stops.get_active()))
+ self.emc.opstop(not widget.get_active())
+ self.gscreen.prefs.putpref('opstop', not widget.get_active())
+
+ # use the hal_status widget to control buttons and
+ # actions allowed by the user and sensitive widgets
+ def on_hal_status_all_homed(self,widget):
+ self.gscreen.add_alarm_entry("all_homed")
+ self.widgets.statusbar1.push(1,"")
+ self.widgets.ntb_button.set_current_page(0)
+ widgetlist = ["rbt_mdi", "rbt_auto", "btn_index_tool", "btn_change_tool"]
+ self.gscreen.sensitize_widgets(widgetlist,True)
+
+ def on_hal_status_file_loaded(self, widget, data=None):
+ self.gscreen.add_alarm_entry("file_loaded_%s"%data)
+ if len(data) > 50:
+ data = data[0:10] + "..." + data[len(data)-39:len(data)]
+ self.widgets.lbl_program.set_text(data)
+
+ def on_hal_status_not_all_homed(self,*args):
+ self.gscreen.add_alarm_entry("not_all_homed")
+ widgetlist = ["rbt_mdi", "rbt_auto", "btn_index_tool", "btn_change_tool"]
+ self.gscreen.sensitize_widgets(widgetlist,False)
+
+ def on_hal_status_interp_idle(self,widget):
+ self.gscreen.add_alarm_entry("idle")
+ widgetlist = ["rbt_manual", "rbt_mdi", "rbt_auto", "rbt_setup", "btn_step",
+ "ntb_jog", "btn_from_line", "btn_reload", "tbtn_flood", "tbtn_mist",
+ "rbt_forward", "rbt_reverse", "rbt_stop", "btn_load", "btn_edit","tbtn_optional_blocks"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,1)
+ for btn in self.macrobuttons:
+ btn.set_sensitive(True)
+ self.widgets.btn_show_kbd.set_image(self.widgets.img_keyboard)
+ self.widgets.btn_run.set_sensitive(True)
+ self._update_homed("X")
+ if self.wait_tool_change == True:
+ self.emc.set_manual_mode()
+ self.wait_tool_change = False
+ self.interpreter = _IDLE
+
+ # this can not be done with the status widget,
+ # because it will not emit a RESUME signal
+ def on_tbtn_pause_toggled(self, widget, data=None):
+ self.gscreen.add_alarm_entry("pause_toggled")
+ widgetlist = ["btn_step", "tbtn_flood", "tbtn_mist",
+ "rbt_forward", "rbt_reverse", "rbt_stop"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,widget.get_active())
+
+ def on_hal_status_interp_run(self,widget):
+ self.gscreen.add_alarm_entry("run")
+ widgetlist = ["rbt_manual", "rbt_mdi", "rbt_auto", "rbt_setup", "btn_step",
+ "ntb_jog", "btn_from_line", "btn_reload", "tbtn_flood", "tbtn_mist",
+ "rbt_forward", "rbt_reverse", "rbt_stop", "btn_load", "btn_edit", "tbtn_optional_blocks"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,0)
+ self.widgets.btn_run.set_sensitive(False)
+ self.interpreter = _RUN
+
+# ToDo
+# This should go easier for the user,
+# hope to find a better solution
+ def on_btn_from_line_clicked(self, widget, data=None):
+ self.gscreen.add_alarm_entry("Restart program from line clicked")
+ self.widgets.dialog_from_line.show()
+
+ def on_line_down_clicked(self, widget, data=None):
+ self.widgets.adj_restart.set_value(self.widgets.adj_restart.get_value()-1)
+
+ def on_line_up_clicked(self, widget, data=None):
+ self.widgets.adj_restart.set_value(self.widgets.adj_restart.get_value()+1)
+
+ def on_adj_restart_value_changed(self, widget, data=None):
+ self.widgets.hal_sourceview.set_line_number(self.widgets.adj_restart.get_value())
+
+ def on_restart_ok_clicked(self, widget, data=None):
+ self.emc.re_start(self.widgets.adj_restart.get_value())
+ self.gscreen.add_alarm_entry("Restart program from line %d"%self.widgets.adj_restart.get_value())
+ self.widgets.dialog_from_line.destroy()
+
+ def on_restart_cancel_clicked(self, widget, data=None):
+ self.widgets.dialog_from_line.destroy()
+# ToDo end
+
+ def on_hal_status_mode_auto(self,widget):
+ self.gscreen.add_alarm_entry("mode_auto")
+ self.widgets.ntb_main.set_current_page(0)
+ self.widgets.ntb_jog.set_current_page(2)
+ self.widgets.ntb_button.set_current_page(2)
+ self.widgets.ntb_preview.set_current_page(0)
+ self.widgets.ntb_info.set_current_page(0)
+
+ def on_hal_status_mode_manual(self,widget):
+ self.gscreen.add_alarm_entry("mode_manual")
+ self.widgets.ntb_main.set_current_page(0)
+ self.widgets.ntb_jog.set_current_page(0)
+ self.widgets.ntb_button.set_current_page(0)
+ self.widgets.ntb_preview.set_current_page(0)
+ self.widgets.ntb_info.set_current_page(0)
+
+ def on_hal_status_mode_mdi(self,widget):
+ self.gscreen.add_alarm_entry("mode_mdi")
+ self.widgets.ntb_main.set_current_page(0)
+ self.widgets.ntb_jog.set_current_page(1)
+ self.widgets.ntb_button.set_current_page(1)
+ self.widgets.ntb_info.set_current_page(1)
+
+ def on_hal_status_state_estop(self,widget):
+ self.gscreen.add_alarm_entry("estop")
+ widgetlist = ["rbt_manual", "rbt_mdi", "rbt_auto", "btn_homing", "btn_touch", "btn_tool",
+ "ntb_jog", "scl_feed", "btn_feed_100", "rbt_forward", "btn_index_tool",
+ "rbt_reverse", "rbt_stop", "tbtn_flood", "tbtn_mist", "btn_change_tool",
+ "btn_spindle_100", "scl_max_vel", "scl_spindle", "rbt_manual"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,False)
+ self.widgets.rbt_manual.set_active(1)
+
+ def on_hal_status_state_estop_reset(self,widget):
+ self.gscreen.add_alarm_entry("estop_reset")
+ self.widgets.hal_tbtn_on.set_sensitive(True)
+
+ def on_hal_status_state_off(self,widget):
+ self.gscreen.add_alarm_entry("state_off")
+ widgetlist = ["rbt_manual", "rbt_mdi", "rbt_auto", "btn_homing", "btn_touch", "btn_tool",
+ "ntb_jog", "scl_feed", "btn_feed_100", "rbt_forward", "btn_index_tool",
+ "rbt_reverse", "rbt_stop", "tbtn_flood", "tbtn_mist", "btn_change_tool",
+ "btn_spindle_100", "scl_max_vel", "scl_spindle"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,False)
+ self.widgets.rbt_manual.set_active(True)
+
+ def on_hal_status_state_on(self,widget):
+ self.gscreen.add_alarm_entry("state_on")
+ widgetlist = ["rbt_manual", "btn_homing", "btn_touch", "btn_tool",
+ "ntb_jog", "scl_feed", "btn_feed_100", "rbt_forward",
+ "rbt_reverse", "rbt_stop", "tbtn_flood", "tbtn_mist",
+ "btn_spindle_100", "scl_max_vel", "scl_spindle"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,True)
+ self.widgets.rbt_manual.set_active(True)
+ self._update_homed("X")
+
+ def change_sound(self,widget,sound):
+ file = widget.get_filename()
+ if file:
+ self.data[sound+"_sound"] = file
+ temp = "audio_"+ sound
+ self.gscreen.prefs.putpref(temp, file, str)
+
+ # This connects siganals without using glade's autoconnect method
+ # in this case to destroy the window
+ # it calls the method in gscreen: gscreen.on_window_destroy()
+ # and run-at-line dialog
+ def connect_signals(self,handlers):
+ signal_list = [ ["window1","destroy", "on_window1_destroy"],
+ ["audio_error_chooser","selection_changed","change_sound","error"],
+ ["audio_alert_chooser","selection_changed","change_sound","alert"],
+ ]
+ for i in signal_list:
+ if len(i) == 3:
+ self.gscreen.widgets[i[0]].connect(i[1], self.gscreen[i[2]])
+ elif len(i) == 4:
+ self.gscreen.widgets[i[0]].connect(i[1], self.gscreen[i[2]],i[3])
+
+ # every 100 milli seconds this gets called
+ # add pass so gscreen doesn't try to update it's regular widgets or
+ # add the individual function names that you would like to call.
+ # In this case we wish to call Gscreen's default function for units button update
+ def periodic(self):
+ self.gscreen.update_active_gcodes()
+ self.gscreen.update_active_mcodes()
+ self._update_vel()
+ self._update_coolant()
+ self._update_spindle_btn()
+ self.widgets.active_feed_label.set_label(self.gscreen.data.active_feed_command)
+ self.widgets.active_speed_label.set_label(self.gscreen.data.active_spindle_command)
+ self.on_scl_feed_value_changed(self.gscreen.data.active_feed_command)
+ if self.tool != self.gscreen.data.tool_in_spindle:
+ self.tool = self.gscreen.data.tool_in_spindle
+ self.widgets.lbl_tool_no.set_label(str(self.tool))
+ self.update_toolinfo(self.tool)
+ if self.X_homed != self.data.x_is_homed:
+ self._update_homed("X")
+ if self.Y_homed != self.data.y_is_homed:
+ self._update_homed("Y")
+ if self.Z_homed != self.data.z_is_homed:
+ self._update_homed("Z")
+
+ # If we need extra HAL pins here is where we do it.
+ # Note you must import hal at the top of this script to do it.
+ # For gaxis there is no extra pins but since we don't want gscreen to
+ # add it's default pins we added this function
+ # we make pins for the hardware buttons witch can be placed around the
+ # screen to activate the coresponding buttons on the GUI
+ def initialize_pins(self):
+ for h_button in range(0,10):
+ signal = str("h_button_%s"%h_button)
+ self.signal = hal_glib.GPin(self.gscreen.halcomp.newpin("h_button_%s"%h_button, hal.HAL_BIT, hal.HAL_IN))
+ self.signal.connect("value_changed", self._on_h_button_changed)
+
+ for v_button in range(0,7):
+ signal = str("v_button_%s"%v_button)
+ self.signal = hal_glib.GPin(self.gscreen.halcomp.newpin("v_button_%s"%v_button, hal.HAL_BIT, hal.HAL_IN))
+ self.signal.connect("value_changed", self._on_v_button_changed)
+
+ # The actions of the buttons
+ def _on_h_button_changed(self,pin):
+ self.gscreen.add_alarm_entry("got h_button_signal %s"%pin.name)
+ # we check if the button is pressed ore release,
+ # otehrwise a signal will be emitted, wenn the button is released and
+ # the signal drob down to cero
+ if not pin.get():
+ return
+ # lets see on witch button_box we are
+ page = self.widgets.ntb_button.get_current_page()
+ # witch button has been pressed
+ btn = str(pin.name)
+ # from the list we declared under __init__ we get the button number
+ nr = int(btn[-1])
+ tab = self.h_tabs[page] # see in the __init__ section for the declaration of self.tabs
+ button = None
+ # we check if there is a buuton or the user pressed a hardware button under
+ # a non existing software button
+ for index in tab:
+ if int(index[0]) == nr:
+ # this is the name of the button
+ button = index[1]
+ if button:
+ print("Button ",button," is ",self.widgets[button].get_sensitive())
+ # only emit a signal if the button is sensitive, otherwise
+ # running actions may be interupted
+ if self.widgets[button].get_sensitive() == False:
+ print("%s not_sensitive"%button)
+ self.gscreen.add_alarm_entry("%s not_sensitive"%button)
+ return
+ self.widgets[button].emit("clicked")
+ else:
+ # as we are generating the macro buttons dynamecely, we can't use the same
+ # method as above, here is how we do it
+ if page == 1: # macro page
+ # does the user press a valid hardware button?
+ if nr < len(self.macrobuttons):
+ button = self.macrobuttons[nr] # This list is generated in add_macros_buttons(self)
+ # is the button sensitive?
+ if button.get_sensitive() == False:
+ print("%s not_sensitive"%button)
+ return
+ button.emit("pressed")
+ else:
+ print("No function on this button")
+ self.gscreen.add_alarm_entry("%s not_sensitive"%button)
+ else:
+ print("No function on this button")
+
+ def _on_v_button_changed(self,pin):
+ self.gscreen.add_alarm_entry("got v_button_signal %s"%pin.name)
+ if not pin.get():
+ return
+ btn = str(pin.name)
+ nr = int(btn[-1])
+ tab = self.v_tabs # see in the __init__ section for the declaration of self.tabs
+ button = None
+ for index in tab:
+ if int(index[0]) == nr:
+ # this is the name of the button
+ button = index[1]
+ if button:
+ # only emit a signal if the button is sensitive, otherwise
+ # running actions may be interupted
+ if self.widgets[button].get_sensitive() == False:
+ print("%s not_sensitive"%button)
+ self.gscreen.add_alarm_entry("%s not_sensitive"%button)
+ return
+ self.widgets[button].emit("clicked")
+ else:
+ print("No button found in v_tabs from %s"%pin.name)
+ self.gscreen.add_alarm_entry("No button found in v_tabs from %s"%pin.name)
diff --git a/configs/sim/gmoccapy/gmoccapy_hw_btn_postgui.hal b/configs/sim/gmoccapy/gmoccapy_hw_btn_postgui.hal
new file mode 100644
index 000000000..2546ceaf9
--- /dev/null
+++ b/configs/sim/gmoccapy/gmoccapy_hw_btn_postgui.hal
@@ -0,0 +1,36 @@
+###################################################################
+# moccapy_postgui.hal file from Norbert Schechner #
+###################################################################
+
+net spindle-speed-limited gscreen.hal_hbar_spindle_feedback
+net spindle-at-speed gscreen.hal_led_spindle_at_speed
+
+unlinkp iocontrol.0.tool-change
+unlinkp iocontrol.0.tool-changed
+unlinkp hal_manualtoolchange.change
+unlinkp hal_manualtoolchange.changed
+unlinkp hal_manualtoolchange.number
+
+net tool-change gscreen.change-tool iocontrol.0.tool-change
+net tool-changed gscreen.tool-changed iocontrol.0.tool-changed
+net tool-prep-number gscreen.tool-number iocontrol.0.tool-prep-number
+
+net h_hardware_button_0 h_buttonlist.h_button_0 => gscreen.h_button_0
+net h_hardware_button_1 h_buttonlist.h_button_1 => gscreen.h_button_1
+net h_hardware_button_2 h_buttonlist.h_button_2 => gscreen.h_button_2
+net h_hardware_button_3 h_buttonlist.h_button_3 => gscreen.h_button_3
+net h_hardware_button_4 h_buttonlist.h_button_4 => gscreen.h_button_4
+net h_hardware_button_5 h_buttonlist.h_button_5 => gscreen.h_button_5
+net h_hardware_button_6 h_buttonlist.h_button_6 => gscreen.h_button_6
+net h_hardware_button_7 h_buttonlist.h_button_7 => gscreen.h_button_7
+net h_hardware_button_8 h_buttonlist.h_button_8 => gscreen.h_button_8
+net h_hardware_button_9 h_buttonlist.h_button_9 => gscreen.h_button_9
+
+net v_hardware_button_0 v_buttonlist.v_button_0 => gscreen.v_button_0
+net v_hardware_button_1 v_buttonlist.v_button_1 => gscreen.v_button_1
+net v_hardware_button_2 v_buttonlist.v_button_2 => gscreen.v_button_2
+net v_hardware_button_3 v_buttonlist.v_button_3 => gscreen.v_button_3
+net v_hardware_button_4 v_buttonlist.v_button_4 => gscreen.v_button_4
+net v_hardware_button_5 v_buttonlist.v_button_5 => gscreen.v_button_5
+net v_hardware_button_6 v_buttonlist.v_button_6 => gscreen.v_button_6
+
diff --git a/configs/sim/gmoccapy/gmoccapy_left_panel.ini b/configs/sim/gmoccapy/gmoccapy_left_panel.ini
new file mode 100644
index 000000000..1f1877a4b
--- /dev/null
+++ b/configs/sim/gmoccapy/gmoccapy_left_panel.ini
@@ -0,0 +1,201 @@
+# EMC controller parameters for a simulated machine.
+# General note: Comments can either be preceded with a # or ; - either is
+# acceptable, although # is in keeping with most linux config files.
+
+# General section -------------------------------------------------------------
+[EMC]
+VERSION = $Revision$
+MACHINE = gmoccapy
+#DEBUG = 0x7FFFFFFF
+DEBUG = 0
+
+# for details see nc_files/subroutines/maco_instructions.txt
+[MACROS]
+MACRO = i_am_lost
+MACRO = halo_world
+MACRO = jog_around
+MACRO = increment xinc yinc
+MACRO = go_to_position X-pos Y-pos Z-pos
+
+# Sections for display options ------------------------------------------------
+[DISPLAY]
+DISPLAY = gscreen -c gmoccapy -d
+PREFERENCE_FILE_PATH = ~/.gmoccapy_preferences
+
+#EMBED_TAB_NAME = right_side_panel
+#EMBED_TAB_LOCATION = box_right
+#EMBED_TAB_COMMAND = gladevcp -x {XID} v_buttonlist.glade
+
+EMBED_TAB_NAME = left_side_panel
+EMBED_TAB_LOCATION = box_left
+EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade
+
+#EMBED_TAB_NAME = camera
+#EMBED_TAB_LOCATION = ntb_user_tabs
+#EMBED_TAB_COMMAND = camview-emc -w {XID}
+
+#EMBED_TAB_NAME = Tab 2
+#EMBED_TAB_LOCATION = ntb_user_tabs
+#EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade
+
+
+# uncomment the following three lines to show the buttonlist
+# dont forget to uncomment also the button lines in gmoccapy_postgui.hal
+#EMBED_TAB_NAME = h_buttonlist
+#EMBED_TAB_LOCATION = ntb_setup
+#EMBED_TAB_COMMAND = gladevcp h_buttonlist.glade
+
+#EMBED_TAB_NAME = v_buttonlist
+#EMBED_TAB_LOCATION = ntb_setup
+#EMBED_TAB_COMMAND = gladevcp v_buttonlist.glade
+
+# Cycle time, in milliseconds, that display will sleep between polls
+CYCLE_TIME = 100
+
+# Highest value that will be allowed for feed override, 1.0 = 100%
+MAX_FEED_OVERRIDE = 1.5
+MAX_SPINDLE_OVERRIDE = 1.2
+MIN_SPINDLE_OVERRIDE = .5
+
+# Max and default jog speeds in units per second
+MAX_LINEAR_VELOCITY = 166
+DEFAULT_LINEAR_VELOCITY = 5
+MAX_ANGULAR_VELOCITY = 234
+
+# Prefix to be used
+PROGRAM_PREFIX = nc_files/
+
+# Introductory graphic
+INTRO_GRAPHIC = linuxcnc.gif
+INTRO_TIME = 5
+
+# list of selectable jog increments
+INCREMENTS = 1mm, 0.1mm, 0.01mm, 0.001mm, 10mm, 1.2345in
+
+[FILTER]
+PROGRAM_EXTENSION = .png,.gif,.jpg Grayscale Depth Image
+PROGRAM_EXTENSION = .py Python Script
+png = image-to-gcode
+gif = image-to-gcode
+jpg = image-to-gcode
+py = python
+
+# Task controller section -----------------------------------------------------
+[TASK]
+TASK = milltask
+CYCLE_TIME = 0.001
+
+# Part program interpreter section --------------------------------------------
+[RS274NGC]
+RS274NGC_STARTUP_CODE = G17 G21 G40 G43H0 G54 G64P0.005 G80 G90 G94 G97 M5 M9
+PARAMETER_FILE = sim.var
+SUBROUTINE_PATH = nc_files/subroutines
+
+# Motion control section ------------------------------------------------------
+[EMCMOT]
+EMCMOT = motmod
+COMM_TIMEOUT = 1.0
+COMM_WAIT = 0.010
+BASE_PERIOD = 0
+SERVO_PERIOD = 1000000
+
+# Hardware Abstraction Layer section --------------------------------------------------
+[HAL]
+HALFILE = core_sim.hal
+HALFILE = sim_spindle_encoder.hal
+HALFILE = axis_manualtoolchange.hal
+HALFILE = simulated_home.hal
+
+# Single file that is executed after the GUI has started.
+POSTGUI_HALFILE = gmoccapy_postgui.hal
+
+HALUI = halui
+
+# Trajectory planner section --------------------------------------------------
+[TRAJ]
+AXES = 3
+COORDINATES = X Y Z
+HOME = 0 0 0
+LINEAR_UNITS = mm
+ANGULAR_UNITS = degree
+CYCLE_TIME = 0.010
+DEFAULT_VELOCITY = 9.0
+MAX_VELOCITY = 234
+POSITION_FILE = position.txt
+
+# First axis
+[AXIS_0]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 400.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 1
+HOME_IS_SHARED = 1
+
+# Second axis
+[AXIS_1]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 400.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 1
+
+# Third axis
+[AXIS_2]
+TYPE = LINEAR
+HOME = 0.0
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 0.001
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 1.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 0
+HOME_IS_SHARED = 1
+
+# Only needed for gmoccapy to set min and max values for the spindle bar
+[SPINDLE]
+MIN_REV = 0
+MAX_REV = 6000
+
+# section for main IO controller parameters -----------------------------------
+[EMCIO]
+EMCIO = io
+CYCLE_TIME = 0.100
+
+# tool table file
+TOOL_TABLE = tool.tbl
+TOOL_CHANGE_POSITION = 100 100 -10
+TOOL_CHANGE_QUILL_UP = 1
diff --git a/configs/sim/gmoccapy/gmoccapy_postgui.hal b/configs/sim/gmoccapy/gmoccapy_postgui.hal
new file mode 100644
index 000000000..9df0e0df3
--- /dev/null
+++ b/configs/sim/gmoccapy/gmoccapy_postgui.hal
@@ -0,0 +1,36 @@
+###################################################################
+# moccapy_postgui.hal file from Norbert Schechner #
+###################################################################
+
+net spindle-speed-limited gscreen.hal_hbar_spindle_feedback
+net spindle-at-speed gscreen.hal_led_spindle_at_speed
+
+unlinkp iocontrol.0.tool-change
+unlinkp iocontrol.0.tool-changed
+unlinkp hal_manualtoolchange.change
+unlinkp hal_manualtoolchange.changed
+unlinkp hal_manualtoolchange.number
+
+net tool-change gscreen.change-tool iocontrol.0.tool-change
+net tool-changed gscreen.tool-changed iocontrol.0.tool-changed
+net tool-prep-number gscreen.tool-number iocontrol.0.tool-prep-number
+
+#net h_hardware_button_0 h_buttonlist.h_button_0 => gscreen.h_button_0
+#net h_hardware_button_1 h_buttonlist.h_button_1 => gscreen.h_button_1
+#net h_hardware_button_2 h_buttonlist.h_button_2 => gscreen.h_button_2
+#net h_hardware_button_3 h_buttonlist.h_button_3 => gscreen.h_button_3
+#net h_hardware_button_4 h_buttonlist.h_button_4 => gscreen.h_button_4
+#net h_hardware_button_5 h_buttonlist.h_button_5 => gscreen.h_button_5
+#net h_hardware_button_6 h_buttonlist.h_button_6 => gscreen.h_button_6
+#net h_hardware_button_7 h_buttonlist.h_button_7 => gscreen.h_button_7
+#net h_hardware_button_8 h_buttonlist.h_button_8 => gscreen.h_button_8
+#net h_hardware_button_9 h_buttonlist.h_button_9 => gscreen.h_button_9
+
+#net v_hardware_button_0 v_buttonlist.v_button_0 => gscreen.v_button_0
+#net v_hardware_button_1 v_buttonlist.v_button_1 => gscreen.v_button_1
+#net v_hardware_button_2 v_buttonlist.v_button_2 => gscreen.v_button_2
+#net v_hardware_button_3 v_buttonlist.v_button_3 => gscreen.v_button_3
+#net v_hardware_button_4 v_buttonlist.v_button_4 => gscreen.v_button_4
+#net v_hardware_button_5 v_buttonlist.v_button_5 => gscreen.v_button_5
+#net v_hardware_button_6 v_buttonlist.v_button_6 => gscreen.v_button_6
+
diff --git a/configs/sim/gmoccapy/gmoccapy_right_panel.ini b/configs/sim/gmoccapy/gmoccapy_right_panel.ini
new file mode 100644
index 000000000..d4fe78672
--- /dev/null
+++ b/configs/sim/gmoccapy/gmoccapy_right_panel.ini
@@ -0,0 +1,200 @@
+# EMC controller parameters for a simulated machine.
+# General note: Comments can either be preceded with a # or ; - either is
+# acceptable, although # is in keeping with most linux config files.
+
+# General section -------------------------------------------------------------
+[EMC]
+VERSION = $Revision$
+MACHINE = gmoccapy
+#DEBUG = 0x7FFFFFFF
+DEBUG = 0
+
+# for details see nc_files/subroutines/maco_instructions.txt
+[MACROS]
+MACRO = i_am_lost
+MACRO = halo_world
+MACRO = jog_around
+MACRO = increment xinc yinc
+MACRO = go_to_position X-pos Y-pos Z-pos
+
+# Sections for display options ------------------------------------------------
+[DISPLAY]
+DISPLAY = gscreen -c gmoccapy -d
+PREFERENCE_FILE_PATH = ~/.gmoccapy_preferences
+
+EMBED_TAB_NAME = right_side_panel
+EMBED_TAB_LOCATION = box_right
+EMBED_TAB_COMMAND = gladevcp -x {XID} v_buttonlist.glade
+
+#EMBED_TAB_NAME = camera
+#EMBED_TAB_LOCATION = ntb_user_tabs
+#EMBED_TAB_COMMAND = camview-emc -w {XID}
+
+#EMBED_TAB_NAME = Tab 2
+#EMBED_TAB_LOCATION = ntb_user_tabs
+#EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade
+
+#EMBED_TAB_NAME = left_side_panel
+#EMBED_TAB_LOCATION = box_left
+#EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade
+
+# uncomment the following three lines to show the buttonlist
+# dont forget to uncomment also the button lines in gmoccapy_postgui.hal
+#EMBED_TAB_NAME = h_buttonlist
+#EMBED_TAB_LOCATION = ntb_setup
+#EMBED_TAB_COMMAND = gladevcp h_buttonlist.glade
+
+#EMBED_TAB_NAME = v_buttonlist
+#EMBED_TAB_LOCATION = ntb_setup
+#EMBED_TAB_COMMAND = gladevcp v_buttonlist.glade
+
+# Cycle time, in milliseconds, that display will sleep between polls
+CYCLE_TIME = 100
+
+# Highest value that will be allowed for feed override, 1.0 = 100%
+MAX_FEED_OVERRIDE = 1.5
+MAX_SPINDLE_OVERRIDE = 1.2
+MIN_SPINDLE_OVERRIDE = .5
+
+# Max and default jog speeds in units per second
+MAX_LINEAR_VELOCITY = 166
+DEFAULT_LINEAR_VELOCITY = 5
+MAX_ANGULAR_VELOCITY = 234
+
+# Prefix to be used
+PROGRAM_PREFIX = nc_files/
+
+# Introductory graphic
+INTRO_GRAPHIC = linuxcnc.gif
+INTRO_TIME = 5
+
+# list of selectable jog increments
+INCREMENTS = 1mm, 0.1mm, 0.01mm, 0.001mm, 10mm, 1.2345in
+
+[FILTER]
+PROGRAM_EXTENSION = .png,.gif,.jpg Grayscale Depth Image
+PROGRAM_EXTENSION = .py Python Script
+png = image-to-gcode
+gif = image-to-gcode
+jpg = image-to-gcode
+py = python
+
+# Task controller section -----------------------------------------------------
+[TASK]
+TASK = milltask
+CYCLE_TIME = 0.001
+
+# Part program interpreter section --------------------------------------------
+[RS274NGC]
+RS274NGC_STARTUP_CODE = G17 G21 G40 G43H0 G54 G64P0.005 G80 G90 G94 G97 M5 M9
+PARAMETER_FILE = sim.var
+SUBROUTINE_PATH = nc_files/subroutines
+
+# Motion control section ------------------------------------------------------
+[EMCMOT]
+EMCMOT = motmod
+COMM_TIMEOUT = 1.0
+COMM_WAIT = 0.010
+BASE_PERIOD = 0
+SERVO_PERIOD = 1000000
+
+# Hardware Abstraction Layer section --------------------------------------------------
+[HAL]
+HALFILE = core_sim.hal
+HALFILE = sim_spindle_encoder.hal
+HALFILE = axis_manualtoolchange.hal
+HALFILE = simulated_home.hal
+
+# Single file that is executed after the GUI has started.
+POSTGUI_HALFILE = gmoccapy_postgui.hal
+
+HALUI = halui
+
+# Trajectory planner section --------------------------------------------------
+[TRAJ]
+AXES = 3
+COORDINATES = X Y Z
+HOME = 0 0 0
+LINEAR_UNITS = mm
+ANGULAR_UNITS = degree
+CYCLE_TIME = 0.010
+DEFAULT_VELOCITY = 9.0
+MAX_VELOCITY = 234
+POSITION_FILE = position.txt
+
+# First axis
+[AXIS_0]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 400.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 1
+HOME_IS_SHARED = 1
+
+# Second axis
+[AXIS_1]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 400.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 1
+
+# Third axis
+[AXIS_2]
+TYPE = LINEAR
+HOME = 0.0
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 0.001
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 1.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 0
+HOME_IS_SHARED = 1
+
+# Only needed for gmoccapy to set min and max values for the spindle bar
+[SPINDLE]
+MIN_REV = 0
+MAX_REV = 6000
+
+# section for main IO controller parameters -----------------------------------
+[EMCIO]
+EMCIO = io
+CYCLE_TIME = 0.100
+
+# tool table file
+TOOL_TABLE = tool.tbl
+TOOL_CHANGE_POSITION = 100 100 -10
+TOOL_CHANGE_QUILL_UP = 1
diff --git a/configs/sim/gmoccapy/gmoccapy_with_simulated_hardware_buttons.ini b/configs/sim/gmoccapy/gmoccapy_with_simulated_hardware_buttons.ini
new file mode 100644
index 000000000..82f5df081
--- /dev/null
+++ b/configs/sim/gmoccapy/gmoccapy_with_simulated_hardware_buttons.ini
@@ -0,0 +1,200 @@
+# EMC controller parameters for a simulated machine.
+# General note: Comments can either be preceded with a # or ; - either is
+# acceptable, although # is in keeping with most linux config files.
+
+# General section -------------------------------------------------------------
+[EMC]
+VERSION = $Revision$
+MACHINE = gmoccapy
+#DEBUG = 0x7FFFFFFF
+DEBUG = 0
+
+# for details see nc_files/subroutines/maco_instructions.txt
+[MACROS]
+MACRO = i_am_lost
+MACRO = halo_world
+MACRO = jog_around
+MACRO = increment xinc yinc
+MACRO = go_to_position X-pos Y-pos Z-pos
+
+# Sections for display options ------------------------------------------------
+[DISPLAY]
+DISPLAY = gscreen -c gmoccapy -d
+PREFERENCE_FILE_PATH = ~/.gmoccapy_preferences
+
+#EMBED_TAB_NAME = right_side_panel
+#EMBED_TAB_LOCATION = box_right
+#EMBED_TAB_COMMAND = gladevcp -x {XID} v_buttonlist.glade
+
+#EMBED_TAB_NAME = left_side_panel
+#EMBED_TAB_LOCATION = box_left
+#EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade
+
+#EMBED_TAB_NAME = camera
+#EMBED_TAB_LOCATION = ntb_user_tabs
+#EMBED_TAB_COMMAND = camview-emc -w {XID}
+
+#EMBED_TAB_NAME = Tab 2
+#EMBED_TAB_LOCATION = ntb_user_tabs
+#EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade
+
+# uncomment the following three lines to show the buttonlist
+# dont forget to uncomment also the button lines in gmoccapy_postgui.hal
+EMBED_TAB_NAME = h_buttonlist
+EMBED_TAB_LOCATION = ntb_setup
+EMBED_TAB_COMMAND = gladevcp h_buttonlist.glade
+
+EMBED_TAB_NAME = v_buttonlist
+EMBED_TAB_LOCATION = ntb_setup
+EMBED_TAB_COMMAND = gladevcp v_buttonlist.glade
+
+# Cycle time, in milliseconds, that display will sleep between polls
+CYCLE_TIME = 100
+
+# Highest value that will be allowed for feed override, 1.0 = 100%
+MAX_FEED_OVERRIDE = 1.5
+MAX_SPINDLE_OVERRIDE = 1.2
+MIN_SPINDLE_OVERRIDE = .5
+
+# Max and default jog speeds in units per second
+MAX_LINEAR_VELOCITY = 166
+DEFAULT_LINEAR_VELOCITY = 5
+MAX_ANGULAR_VELOCITY = 234
+
+# Prefix to be used
+PROGRAM_PREFIX = nc_files/
+
+# Introductory graphic
+INTRO_GRAPHIC = linuxcnc.gif
+INTRO_TIME = 5
+
+# list of selectable jog increments
+INCREMENTS = 1mm, 0.1mm, 0.01mm, 0.001mm, 10mm, 1.2345in
+
+[FILTER]
+PROGRAM_EXTENSION = .png,.gif,.jpg Grayscale Depth Image
+PROGRAM_EXTENSION = .py Python Script
+png = image-to-gcode
+gif = image-to-gcode
+jpg = image-to-gcode
+py = python
+
+# Task controller section -----------------------------------------------------
+[TASK]
+TASK = milltask
+CYCLE_TIME = 0.001
+
+# Part program interpreter section --------------------------------------------
+[RS274NGC]
+RS274NGC_STARTUP_CODE = G17 G21 G40 G43H0 G54 G64P0.005 G80 G90 G94 G97 M5 M9
+PARAMETER_FILE = sim.var
+SUBROUTINE_PATH = nc_files/subroutines
+
+# Motion control section ------------------------------------------------------
+[EMCMOT]
+EMCMOT = motmod
+COMM_TIMEOUT = 1.0
+COMM_WAIT = 0.010
+BASE_PERIOD = 0
+SERVO_PERIOD = 1000000
+
+# Hardware Abstraction Layer section --------------------------------------------------
+[HAL]
+HALFILE = core_sim.hal
+HALFILE = sim_spindle_encoder.hal
+HALFILE = axis_manualtoolchange.hal
+HALFILE = simulated_home.hal
+
+# Single file that is executed after the GUI has started.
+POSTGUI_HALFILE = gmoccapy_hw_btn_postgui.hal
+
+HALUI = halui
+
+# Trajectory planner section --------------------------------------------------
+[TRAJ]
+AXES = 3
+COORDINATES = X Y Z
+HOME = 0 0 0
+LINEAR_UNITS = mm
+ANGULAR_UNITS = degree
+CYCLE_TIME = 0.010
+DEFAULT_VELOCITY = 9.0
+MAX_VELOCITY = 234
+POSITION_FILE = position.txt
+
+# First axis
+[AXIS_0]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 400.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 1
+HOME_IS_SHARED = 1
+
+# Second axis
+[AXIS_1]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 400.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 1
+
+# Third axis
+[AXIS_2]
+TYPE = LINEAR
+HOME = 0.0
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 0.001
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 1.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 0
+HOME_IS_SHARED = 1
+
+# Only needed for gmoccapy to set min and max values for the spindle bar
+[SPINDLE]
+MIN_REV = 0
+MAX_REV = 6000
+
+# section for main IO controller parameters -----------------------------------
+[EMCIO]
+EMCIO = io
+CYCLE_TIME = 0.100
+
+# tool table file
+TOOL_TABLE = tool.tbl
+TOOL_CHANGE_POSITION = 100 100 -10
+TOOL_CHANGE_QUILL_UP = 1
diff --git a/configs/sim/gmoccapy/gmoccapy_with_user_tabs.ini b/configs/sim/gmoccapy/gmoccapy_with_user_tabs.ini
new file mode 100644
index 000000000..3a10ee640
--- /dev/null
+++ b/configs/sim/gmoccapy/gmoccapy_with_user_tabs.ini
@@ -0,0 +1,201 @@
+# EMC controller parameters for a simulated machine.
+# General note: Comments can either be preceded with a # or ; - either is
+# acceptable, although # is in keeping with most linux config files.
+
+# General section -------------------------------------------------------------
+[EMC]
+VERSION = $Revision$
+MACHINE = gmoccapy
+#DEBUG = 0x7FFFFFFF
+DEBUG = 0
+
+# for details see nc_files/subroutines/maco_instructions.txt
+[MACROS]
+MACRO = i_am_lost
+MACRO = halo_world
+MACRO = jog_around
+MACRO = increment xinc yinc
+MACRO = go_to_position X-pos Y-pos Z-pos
+
+# Sections for display options ------------------------------------------------
+[DISPLAY]
+DISPLAY = gscreen -c gmoccapy -d
+PREFERENCE_FILE_PATH = ~/.gmoccapy_preferences
+
+#EMBED_TAB_NAME = right_side_panel
+#EMBED_TAB_LOCATION = box_right
+#EMBED_TAB_COMMAND = gladevcp -x {XID} v_buttonlist.glade
+
+#EMBED_TAB_NAME = left_side_panel
+#EMBED_TAB_LOCATION = box_left
+#EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade
+
+EMBED_TAB_NAME = DRO
+EMBED_TAB_LOCATION = ntb_user_tabs
+EMBED_TAB_COMMAND = gladevcp -x {XID} dro.glade
+
+EMBED_TAB_NAME = Tab 2
+EMBED_TAB_LOCATION = ntb_user_tabs
+EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade
+
+
+# uncomment the following three lines to show the buttonlist
+# dont forget to uncomment also the button lines in gmoccapy_postgui.hal
+#EMBED_TAB_NAME = h_buttonlist
+#EMBED_TAB_LOCATION = ntb_setup
+#EMBED_TAB_COMMAND = gladevcp h_buttonlist.glade
+
+#EMBED_TAB_NAME = v_buttonlist
+#EMBED_TAB_LOCATION = ntb_setup
+#EMBED_TAB_COMMAND = gladevcp v_buttonlist.glade
+
+# Cycle time, in milliseconds, that display will sleep between polls
+CYCLE_TIME = 100
+
+# Highest value that will be allowed for feed override, 1.0 = 100%
+MAX_FEED_OVERRIDE = 1.5
+MAX_SPINDLE_OVERRIDE = 1.2
+MIN_SPINDLE_OVERRIDE = .5
+
+# Max and default jog speeds in units per second
+MAX_LINEAR_VELOCITY = 166
+DEFAULT_LINEAR_VELOCITY = 5
+MAX_ANGULAR_VELOCITY = 234
+
+# Prefix to be used
+PROGRAM_PREFIX = nc_files/
+
+# Introductory graphic
+INTRO_GRAPHIC = linuxcnc.gif
+INTRO_TIME = 5
+
+# list of selectable jog increments
+INCREMENTS = 1mm, 0.1mm, 0.01mm, 0.001mm, 10mm, 1.2345in
+
+[FILTER]
+PROGRAM_EXTENSION = .png,.gif,.jpg Grayscale Depth Image
+PROGRAM_EXTENSION = .py Python Script
+png = image-to-gcode
+gif = image-to-gcode
+jpg = image-to-gcode
+py = python
+
+# Task controller section -----------------------------------------------------
+[TASK]
+TASK = milltask
+CYCLE_TIME = 0.001
+
+# Part program interpreter section --------------------------------------------
+[RS274NGC]
+RS274NGC_STARTUP_CODE = G17 G21 G40 G43H0 G54 G64P0.005 G80 G90 G94 G97 M5 M9
+PARAMETER_FILE = sim.var
+SUBROUTINE_PATH = nc_files/subroutines
+
+# Motion control section ------------------------------------------------------
+[EMCMOT]
+EMCMOT = motmod
+COMM_TIMEOUT = 1.0
+COMM_WAIT = 0.010
+BASE_PERIOD = 0
+SERVO_PERIOD = 1000000
+
+# Hardware Abstraction Layer section --------------------------------------------------
+[HAL]
+HALFILE = core_sim.hal
+HALFILE = sim_spindle_encoder.hal
+HALFILE = axis_manualtoolchange.hal
+HALFILE = simulated_home.hal
+
+# Single file that is executed after the GUI has started.
+POSTGUI_HALFILE = gmoccapy_postgui.hal
+
+HALUI = halui
+
+# Trajectory planner section --------------------------------------------------
+[TRAJ]
+AXES = 3
+COORDINATES = X Y Z
+HOME = 0 0 0
+LINEAR_UNITS = mm
+ANGULAR_UNITS = degree
+CYCLE_TIME = 0.010
+DEFAULT_VELOCITY = 9.0
+MAX_VELOCITY = 234
+POSITION_FILE = position.txt
+
+# First axis
+[AXIS_0]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 400.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 1
+HOME_IS_SHARED = 1
+
+# Second axis
+[AXIS_1]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 400.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 1
+
+# Third axis
+[AXIS_2]
+TYPE = LINEAR
+HOME = 0.0
+MAX_VELOCITY = 166
+MAX_ACCELERATION = 1500.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -400.0
+MAX_LIMIT = 0.001
+FERROR = 0.050
+MIN_FERROR = 0.010
+HOME_OFFSET = 1.0
+HOME_SEARCH_VEL = 200.0
+HOME_LATCH_VEL = 20.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+HOME_SEQUENCE = 0
+HOME_IS_SHARED = 1
+
+# Only needed for gmoccapy to set min and max values for the spindle bar
+[SPINDLE]
+MIN_REV = 0
+MAX_REV = 6000
+
+# section for main IO controller parameters -----------------------------------
+[EMCIO]
+EMCIO = io
+CYCLE_TIME = 0.100
+
+# tool table file
+TOOL_TABLE = tool.tbl
+TOOL_CHANGE_POSITION = 100 100 -10
+TOOL_CHANGE_QUILL_UP = 1
diff --git a/configs/sim/gmoccapy/h_buttonlist.glade b/configs/sim/gmoccapy/h_buttonlist.glade
new file mode 100644
index 000000000..beb4b0e2a
--- /dev/null
+++ b/configs/sim/gmoccapy/h_buttonlist.glade
@@ -0,0 +1,169 @@
+<?xml version="1.0"?>
+<interface>
+ <!-- interface-requires gtk+ 2.8 -->
+ <!-- interface-requires gladevcp 0.0 -->
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkWindow" id="window1">
+ <property name="width_request">1024</property>
+ <property name="height_request">64</property>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="width_request">1024</property>
+ <property name="height_request">64</property>
+ <property name="visible">True</property>
+ <property name="spacing">5</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="HAL_Button" id="h_button_0">
+ <property name="label" translatable="yes">h_button_0</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="h_button_1">
+ <property name="label" translatable="yes">h_button_1</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="h_button_2">
+ <property name="label" translatable="yes">h_button_2</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="h_button_3">
+ <property name="label" translatable="yes">h_button_3</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="h_button_4">
+ <property name="label" translatable="yes">h_button_4</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="h_button_5">
+ <property name="label" translatable="yes">h_button_5</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="h_button_6">
+ <property name="label" translatable="yes">h_button_6</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="h_button_7">
+ <property name="label" translatable="yes">h_button_7</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="h_button_8">
+ <property name="label" translatable="yes">h_button_8</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="h_button_9">
+ <property name="label" translatable="yes">h_button_9</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/configs/sim/gmoccapy/icon/Auto.gif b/configs/sim/gmoccapy/icon/Auto.gif
new file mode 100644
index 000000000..30c64ba4e
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/Auto.gif
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/E-Stop.gif b/configs/sim/gmoccapy/icon/E-Stop.gif
new file mode 100644
index 000000000..b4b6d7835
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/E-Stop.gif
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/Logo.png b/configs/sim/gmoccapy/icon/Logo.png
new file mode 100755
index 000000000..a26f0c730
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/Logo.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/clear.png b/configs/sim/gmoccapy/icon/clear.png
new file mode 100755
index 000000000..59255ad54
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/clear.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/configure-2.png b/configs/sim/gmoccapy/icon/configure-2.png
new file mode 100755
index 000000000..87fbb4bb6
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/configure-2.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/coolant_off.png b/configs/sim/gmoccapy/icon/coolant_off.png
new file mode 100644
index 000000000..219fca165
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/coolant_off.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/coolant_on.gif b/configs/sim/gmoccapy/icon/coolant_on.gif
new file mode 100644
index 000000000..8262f344c
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/coolant_on.gif
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/dimensions.png b/configs/sim/gmoccapy/icon/dimensions.png
new file mode 100755
index 000000000..025648dda
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/dimensions.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/editor.png b/configs/sim/gmoccapy/icon/editor.png
new file mode 100644
index 000000000..0c114054d
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/editor.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/enter.png b/configs/sim/gmoccapy/icon/enter.png
new file mode 100755
index 000000000..b1c72d0aa
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/enter.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/estopred.png b/configs/sim/gmoccapy/icon/estopred.png
new file mode 100644
index 000000000..15741143b
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/estopred.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/exit.png b/configs/sim/gmoccapy/icon/exit.png
new file mode 100644
index 000000000..f23e43c0f
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/exit.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/exit_application.png b/configs/sim/gmoccapy/icon/exit_application.png
new file mode 100755
index 000000000..805ddfc67
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/exit_application.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/forward.png b/configs/sim/gmoccapy/icon/forward.png
new file mode 100644
index 000000000..ae1aa4bef
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/forward.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/forward_on.gif b/configs/sim/gmoccapy/icon/forward_on.gif
new file mode 100644
index 000000000..f0ec9bf96
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/forward_on.gif
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/from where are the icons.txt b/configs/sim/gmoccapy/icon/from where are the icons.txt
new file mode 100644
index 000000000..de696c016
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/from where are the icons.txt
@@ -0,0 +1,73 @@
+This is just a list showing the origin from the icons
+
+the following icons are from moccagui projekt:
+http://code.google.com/p/moccagui/
+with the friendly permission from the owner
+info@jetsport.de
+
+auto.gif
+coolant_off.png
+coolant_on.png (modified by nieson@web.de)
+editor.png
+E-Stop.gif
+estopred.png
+forward.png
+forward_on.png (modified by nieson@web.de)
+jog.png
+machineoff.png
+mdi.png
+mist_off.png
+mist_on.png (modified by nieson@web.de)
+pause.png
+refall.png
+refx.png
+refy.png
+refz.png
+reverse.png
+reverse_on.png (modified by nieson@web.de)
+run.png
+runfrom.png
+start.png
+step.png
+stop.gif
+stop.png
+stop_on.png
+toolchange.png
+tools.png
+touchoffwz.png
+touchoffx.png
+touchoffy.png
+touchoffz.png
+touchoffx_value.png (modified by nieson@web.de)
+touchoffy_value.png (modified by nieson@web.de)
+touchoffz_value.png (modified by nieson@web.de)
+unhome.png
+
+the following icons are created by nieson@web.de under free license
+Logo.png
+index_tool.png
+
+the following Icons are from linuxcnc
+toolaxisp.png
+toolaxisx.png
+toolaxisy.png
+toolaxisz.png
+tool_blockdelete.gif
+tool_rotate.gif
+
+and this icons are from openiconlibrary.sourceforge.net
+clear.png
+configure-2.png
+dimensions.png
+enter.png
+exit.png
+exit_application.png
+keyboard.png
+reload.png
+save.png
+saveas.png
+toolpath.png
+zoom-in.png
+zoom-out.png
+
+
diff --git a/configs/sim/gmoccapy/icon/index_tool.svg b/configs/sim/gmoccapy/icon/index_tool.svg
new file mode 100644
index 000000000..7c1c2cd92
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/index_tool.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ width="46"
+ height="48"
+ sodipodi:docname="tools.png">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ id="perspective10" />
+ </defs>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="845"
+ inkscape:window-height="661"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="4.9166667"
+ inkscape:cx="23"
+ inkscape:cy="24"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <image
+ xlink:href="file:///home/emcmesa/linuxcnc-dev/configs/sim/gscreen_mocca/tools.png"
+ width="46"
+ height="48"
+ id="image12"
+ x="0"
+ y="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ff0000;fill-opacity:1;stroke:none;font-family:DejaVu Serif;-inkscape-font-specification:DejaVu Serif Bold"
+ x="22.983051"
+ y="18.305086"
+ id="text2826"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan2828"
+ x="22.983051"
+ y="18.305086">M61</tspan><tspan
+ sodipodi:role="line"
+ x="22.983051"
+ y="40.805088"
+ id="tspan2830">Q ?</tspan></text>
+</svg>
diff --git a/configs/sim/gmoccapy/icon/jog.png b/configs/sim/gmoccapy/icon/jog.png
new file mode 100644
index 000000000..989d79c8f
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/jog.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/keyboard.png b/configs/sim/gmoccapy/icon/keyboard.png
new file mode 100755
index 000000000..796a2aa92
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/keyboard.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/machineonoff.png b/configs/sim/gmoccapy/icon/machineonoff.png
new file mode 100644
index 000000000..99117cb26
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/machineonoff.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/mdi.png b/configs/sim/gmoccapy/icon/mdi.png
new file mode 100644
index 000000000..175c80a21
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/mdi.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/mist_off.png b/configs/sim/gmoccapy/icon/mist_off.png
new file mode 100644
index 000000000..d6f68c01b
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/mist_off.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/mist_on.gif b/configs/sim/gmoccapy/icon/mist_on.gif
new file mode 100644
index 000000000..0055c0a76
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/mist_on.gif
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/pause.png b/configs/sim/gmoccapy/icon/pause.png
new file mode 100644
index 000000000..5544c6f24
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/pause.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/refall.png b/configs/sim/gmoccapy/icon/refall.png
new file mode 100644
index 000000000..48d5295fe
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/refall.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/refx.png b/configs/sim/gmoccapy/icon/refx.png
new file mode 100644
index 000000000..1d5f24ce2
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/refx.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/refy.png b/configs/sim/gmoccapy/icon/refy.png
new file mode 100644
index 000000000..790da9d3d
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/refy.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/refz.png b/configs/sim/gmoccapy/icon/refz.png
new file mode 100644
index 000000000..8316bebd9
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/refz.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/reload.png b/configs/sim/gmoccapy/icon/reload.png
new file mode 100755
index 000000000..fb6768e72
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/reload.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/reverse.png b/configs/sim/gmoccapy/icon/reverse.png
new file mode 100644
index 000000000..e2618c1f3
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/reverse.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/reverse_on.gif b/configs/sim/gmoccapy/icon/reverse_on.gif
new file mode 100644
index 000000000..0d8fa98f4
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/reverse_on.gif
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/run.png b/configs/sim/gmoccapy/icon/run.png
new file mode 100644
index 000000000..e78ff6e4f
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/run.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/runfrom.png b/configs/sim/gmoccapy/icon/runfrom.png
new file mode 100644
index 000000000..171e63fe8
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/runfrom.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/save-as.png b/configs/sim/gmoccapy/icon/save-as.png
new file mode 100755
index 000000000..1e034410a
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/save-as.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/save.png b/configs/sim/gmoccapy/icon/save.png
new file mode 100755
index 000000000..1f13724ea
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/save.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/start.png b/configs/sim/gmoccapy/icon/start.png
new file mode 100644
index 000000000..4883c73d8
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/start.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/step.png b/configs/sim/gmoccapy/icon/step.png
new file mode 100644
index 000000000..9278ec3e5
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/step.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/stop.gif b/configs/sim/gmoccapy/icon/stop.gif
new file mode 100644
index 000000000..dcd0fd0c3
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/stop.gif
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/stop.png b/configs/sim/gmoccapy/icon/stop.png
new file mode 100644
index 000000000..ce73ad864
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/stop.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/stop_on.gif b/configs/sim/gmoccapy/icon/stop_on.gif
new file mode 100644
index 000000000..15fc71b00
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/stop_on.gif
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/tool_blockdelete.gif b/configs/sim/gmoccapy/icon/tool_blockdelete.gif
new file mode 100644
index 000000000..3253e8a0d
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/tool_blockdelete.gif
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/tool_rotate.gif b/configs/sim/gmoccapy/icon/tool_rotate.gif
new file mode 100644
index 000000000..329d902a4
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/tool_rotate.gif
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/toolaxisp.png b/configs/sim/gmoccapy/icon/toolaxisp.png
new file mode 100644
index 000000000..ce0fc982b
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/toolaxisp.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/toolaxisx.png b/configs/sim/gmoccapy/icon/toolaxisx.png
new file mode 100644
index 000000000..57c4bdcec
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/toolaxisx.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/toolaxisy.png b/configs/sim/gmoccapy/icon/toolaxisy.png
new file mode 100644
index 000000000..33768e339
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/toolaxisy.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/toolaxisz.png b/configs/sim/gmoccapy/icon/toolaxisz.png
new file mode 100644
index 000000000..3cf539813
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/toolaxisz.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/toolchange.png b/configs/sim/gmoccapy/icon/toolchange.png
new file mode 100755
index 000000000..da18dc405
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/toolchange.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/toolpath.png b/configs/sim/gmoccapy/icon/toolpath.png
new file mode 100644
index 000000000..a94bad73d
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/toolpath.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/tools.png b/configs/sim/gmoccapy/icon/tools.png
new file mode 100644
index 000000000..d0d4f16f6
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/tools.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/touchoffwz.png b/configs/sim/gmoccapy/icon/touchoffwz.png
new file mode 100644
index 000000000..14baa38eb
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/touchoffwz.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/touchoffx.png b/configs/sim/gmoccapy/icon/touchoffx.png
new file mode 100644
index 000000000..27647f1a3
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/touchoffx.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/touchoffx_value.png b/configs/sim/gmoccapy/icon/touchoffx_value.png
new file mode 100644
index 000000000..1dec2ada4
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/touchoffx_value.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/touchoffy.png b/configs/sim/gmoccapy/icon/touchoffy.png
new file mode 100644
index 000000000..0938878bb
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/touchoffy.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/touchoffy_value.png b/configs/sim/gmoccapy/icon/touchoffy_value.png
new file mode 100644
index 000000000..c0ac95984
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/touchoffy_value.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/touchoffz.png b/configs/sim/gmoccapy/icon/touchoffz.png
new file mode 100644
index 000000000..9290cb28c
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/touchoffz.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/touchoffz_value.png b/configs/sim/gmoccapy/icon/touchoffz_value.png
new file mode 100644
index 000000000..e9de41374
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/touchoffz_value.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/unhome.png b/configs/sim/gmoccapy/icon/unhome.png
new file mode 100644
index 000000000..cec72ebaa
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/unhome.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/zoom-in.png b/configs/sim/gmoccapy/icon/zoom-in.png
new file mode 100755
index 000000000..714f1f606
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/zoom-in.png
Binary files differ
diff --git a/configs/sim/gmoccapy/icon/zoom-out.png b/configs/sim/gmoccapy/icon/zoom-out.png
new file mode 100755
index 000000000..05ddf0f51
--- /dev/null
+++ b/configs/sim/gmoccapy/icon/zoom-out.png
Binary files differ
diff --git a/configs/sim/gmoccapy/nc_files/Gmoccapy_2_tools_with compensation.ngc b/configs/sim/gmoccapy/nc_files/Gmoccapy_2_tools_with compensation.ngc
new file mode 100644
index 000000000..3d51347a1
--- /dev/null
+++ b/configs/sim/gmoccapy/nc_files/Gmoccapy_2_tools_with compensation.ngc
@@ -0,0 +1,95 @@
+; Gmoccapy_2_tools_with_compensation.ngc
+; testprogram to mill two circles with cutter radius compansation
+; and two different tools
+
+; set the basic settings, this should be
+; on every program the beginning
+G17
+G21
+G54
+G61
+G40
+G49
+G80
+G90
+
+; get the first tool
+T3 M6
+G43
+G0 Z30
+
+; go to center of the workpiece
+G0 Y50
+G0 X50
+
+; turn on spindle clockwise
+S3000
+M3
+
+; coolant on
+M7
+
+G0 Z10
+F250
+G1 Z0
+
+; tool radius compansation
+; go in circle with lower feed rate
+G41
+G3 X70 Y 50 Z-1 I10 J0
+
+; make first circle with normal feed
+F2000
+G3 I -20
+
+; out of the workpiece
+G3 X50 Y 50 Z1 I-10 J0
+G0 Z 30
+
+; coolant off
+M9
+; turn off cutter radius compensation, otherwise no tool change is possible
+G40
+T1 M6
+G43
+G0Z 10
+
+; optional stop for testing
+(MSG, optional stop, i.e. for cleaning the workpiece, or other thinks)
+M1
+
+; go again to the center of the workpiece
+G0 Y50
+G0 X50
+
+; turn on spindle clockwise
+S6000
+M3
+
+; coolant on
+M9
+
+G0 Z10
+F400
+G1 Z1
+
+; Werkzeugradienkompensation ein
+; Anfahrradius mit Eintauchgeschwindigkeit
+G41
+G3 X65 Y 50 Z-1 I7.5 J0
+
+; 2. Kreis mit Vorschubgeschwindigkeit fräsen
+F1000
+G3 I -15
+
+; Aus dem Werkstück
+G3 X50 Y 50 Z1 I-7.5 J0
+G0 Z 30
+
+G0 Z 30
+G0 Y 50
+G0 X 50
+
+M9 ; coolant off
+M5 ; spindle off
+M2 ; program end
diff --git a/configs/sim/gmoccapy/nc_files/diferent speeds.ngc b/configs/sim/gmoccapy/nc_files/diferent speeds.ngc
new file mode 100644
index 000000000..4e19b4c5c
--- /dev/null
+++ b/configs/sim/gmoccapy/nc_files/diferent speeds.ngc
@@ -0,0 +1,36 @@
+; different_speeds.ngc
+; basic settings
+
+G17
+G21
+G54
+G61
+G40
+G49
+G80
+G90
+
+; get tool
+T3 M6
+G43
+S2500
+M3
+
+G42
+F5000
+G01 X-10 Y-10 Z30
+
+G00 X0 Y0 Z0
+G01 X100 F500
+G01 Y100 F400
+/G01 X0 F300
+/G01 Y0 F250
+
+G0 Z 30
+G0 Y 50
+G0 X 50
+
+G40
+G49
+M5
+M2
diff --git a/configs/sim/gmoccapy/nc_files/subroutines/go_to_position.ngc b/configs/sim/gmoccapy/nc_files/subroutines/go_to_position.ngc
new file mode 100644
index 000000000..d5ed9637c
--- /dev/null
+++ b/configs/sim/gmoccapy/nc_files/subroutines/go_to_position.ngc
@@ -0,0 +1,24 @@
+; Testfile go to position
+; will jog the machine to a position to give
+
+O<go_to_position> sub
+
+G17
+G21
+G54
+G61
+G40
+G49
+G80
+G90
+
+;#1 = <X-Pos>
+;#2 = <Y-Pos>
+;#3 = <Z-Pos>
+
+(DBG, Will now move machine to X = #1 , Y = #2 , Z = #3)
+G0 X #1 Y #2 Z #3
+
+O<go_to_position> endsub
+
+M2
diff --git a/configs/sim/gmoccapy/nc_files/subroutines/halo_world.ngc b/configs/sim/gmoccapy/nc_files/subroutines/halo_world.ngc
new file mode 100644
index 000000000..f93f36dde
--- /dev/null
+++ b/configs/sim/gmoccapy/nc_files/subroutines/halo_world.ngc
@@ -0,0 +1,26 @@
+; Testfile I am Lost
+; will just give messages
+
+O<halo_world> sub
+
+G17
+G21
+G54
+G61
+G40
+G49
+G80
+G90
+
+G0 X10
+
+(MSG, Hallo Welt)
+(MSG, halo world)
+(MSG, why does this apeera as an error?)
+
+G0X-10
+
+O<halo_world> endsub
+
+M2
+
diff --git a/configs/sim/gmoccapy/nc_files/subroutines/i_am_lost.ngc b/configs/sim/gmoccapy/nc_files/subroutines/i_am_lost.ngc
new file mode 100644
index 000000000..cd971d425
--- /dev/null
+++ b/configs/sim/gmoccapy/nc_files/subroutines/i_am_lost.ngc
@@ -0,0 +1,24 @@
+; Testfile I am Lost
+; will jog to machine cero and set all axis to cero
+
+O<i_am_lost> sub
+
+G17
+G21
+G54
+G61
+G40
+G49
+G80
+G90
+
+(MSG, Will now move to machine cero)
+G53 G0 X0 Y0 Z0
+(MSG, will now set all axis to cero)
+G10 L20 P0 X0 Y0 Z0
+(MSG, all done)
+
+
+O<i_am_lost> endsub
+
+M2
diff --git a/configs/sim/gmoccapy/nc_files/subroutines/increment.ngc b/configs/sim/gmoccapy/nc_files/subroutines/increment.ngc
new file mode 100644
index 000000000..870e5f200
--- /dev/null
+++ b/configs/sim/gmoccapy/nc_files/subroutines/increment.ngc
@@ -0,0 +1,22 @@
+; Testfile I am Lost
+; will jog to machine cero and set all axis to cero
+
+O<increment> sub
+
+G17
+G21
+G54
+G61
+G40
+G49
+G80
+G90
+
+G91 G0 X#1 Y#2
+G90
+
+(DEBUG, X was [#1] and Y was [#2])
+
+O<increment> endsub
+
+M2
diff --git a/configs/sim/gmoccapy/nc_files/subroutines/jog_around.ngc b/configs/sim/gmoccapy/nc_files/subroutines/jog_around.ngc
new file mode 100644
index 000000000..070dd65af
--- /dev/null
+++ b/configs/sim/gmoccapy/nc_files/subroutines/jog_around.ngc
@@ -0,0 +1,29 @@
+; Testfile I am Lost
+; will just jog a litle bit around
+
+O<jog_around> sub
+
+G17
+G21
+G54
+G61
+G40
+G49
+G80
+G90
+
+G91 G0 X 25
+Y-25
+Z-25
+Y25
+X-25
+Z25
+F250
+G2 I 25
+
+(MSG, It is done!)
+
+O<jog_around> endsub
+
+M2
+
diff --git a/configs/sim/gmoccapy/nc_files/subroutines/macro_Instructions.txt b/configs/sim/gmoccapy/nc_files/subroutines/macro_Instructions.txt
new file mode 100644
index 000000000..d751c87ed
--- /dev/null
+++ b/configs/sim/gmoccapy/nc_files/subroutines/macro_Instructions.txt
@@ -0,0 +1,44 @@
+This is a smal instruction to include macros in gmoccapy.
+
+In your INI File you need to introduce a section called [MACROS]
+and for every macro you wan't to include one line like so:
+
+MACRO = jog_around
+or
+MACRO = increment xinc yinc
+
+where xinc and yinc are place holders
+
+During excecution of the macro, you will be asked to enter the values.
+
+You are allowed to introduce 9 macros!
+If you enter more macros, only the first 9 will apear with button in gmoccapy.
+
+In the [RS274NGC] section you may want to give a path to your macros like so:
+
+[RS274NGC]
+SUBROUTINE_PATH = nc_files/subroutines
+
+or you place your macros in the nc_files folder.
+
+Each macro mus have its own file in one of the mentioned folders and are normal subroutines, so the must begin with:
+
+O<jog_around> sub
+
+and end with
+
+O<jog_around> endsub
+M2
+
+The name of the file must be jog_around.ngc.
+And an macro must contain at least one movement of one axis.
+
+macro name in INI file have to be the same as the file name and the sub must have also the same name!
+
+BE CARFULL:
+At this development step, the macros can only be interupted by pressing the machine off button or the emergency exit button! I will check how to make this more secure!
+
+Hope this helps.
+
+Norbert
+
diff --git a/configs/sim/gmoccapy/release_notes.txt b/configs/sim/gmoccapy/release_notes.txt
new file mode 100755
index 000000000..76b19c95d
--- /dev/null
+++ b/configs/sim/gmoccapy/release_notes.txt
@@ -0,0 +1,228 @@
+ver. 0.8.5
+- included a button to toggle gremlin fullview
+ but getting out of the fullscreen mode will hide the DRO not
+ taking care of preferences, I do not not why
+- implemented a function to set gremlin grid
+ Grid is set in INCH, not taking care of the preferences file
+
+ver. 0.8.4
+- thanks to Chris the software starts now on a new installation with
+ "Follow System Theme" theme
+- Keyboard now with upper and lower letters (SHIFT Key included)
+
+ver. 0.8.3
+- there was still a problem with DTG and DRO switching,
+ now everythink is working like it should
+- now not the gscreen colors are used, on first start every color
+ is set to black, after that the colors are handled as they are
+ in gscreen.
+- Delete MDI is working, but until now only for the running session
+- I deleted some lines of code in 0.7.05, resulting in demage of the working of
+ the tool editor, fixed this
+- reorganized the order from buttons to be modified during INIT, now they
+ are in alphabetic order
+- made several INI Files to show teh behavior with side panels and user tabs
+ and simulated hardware button
+- included following buttuns in settings page
+ - enable gremlin DRO
+ - Show gremlin DTG
+ - show gremlin offsets
+- check if tool in spindle == tool to change, then give message and return
+
+ver. 0.8.2
+- solved the error related to the DTG Button
+- clearing the code
+- added a SPINDLE section to INI to get the min and max spindle speed
+- change the spindle bar propertys by code to show also negative revolutions
+- spindle speed label shows also negativ values if spindle runs reverse
+- solved a bug in macro excecution, when wrong values has been given
+
+ver. 0.8.1
+- clearing the code
+- unlock code now in the hiddeen preference file, but I still need
+ to include an change function in the settings page
+- emergency exit is now default on start
+- there is still an error changing from DTG to GTD in ABS and REL changing
+
+ver. 0.8.0
+- colorselection for the diferent dro states now works, but there is
+ still a small error, after changing a color, it will not show the
+ eventboxes in propper color. After a new start of gmoccapy it works
+ like it should. I searched allready three days for a solution, but I
+ couldn't find any.
+- removed some unused print() commands
+- gmoccapy.glade is now able to add side panels,
+ on the left and right
+- user tabs are working, I need to make some dokumentation
+
+ver. 0.7.09
+- changed tool change dialog from axis dialog to gscreen dialog,
+ you can switch back if you like by comenting the tool change lines in
+ postgui.hal file.
+- btn not implemented clicked now logs the button
+
+ver. 0.7.08
+- merged with /origin/master instead of mah/master
+- using now hide_buttonbox from tooledit Widget instedt of hiding the box by an own method
+- solved a problem reported by Chris, blinking coolant button. The behavior was caused
+ from _update_coolant()
+- renamed tbtn_coolant to tbtn_flood
+- bugfix on macro goto position caused from self.on_btn_macro_pressed()
+- finshed the hal connections also for the vertical buttons
+ to test with simulated buttons, you have to uncomment the coresponing lines in INI and postgui.hal
+ then two buttonlist will aperear
+- There was a problem excecuting the macros with the hardwarebutton, user where able to start a second macro
+ while the first was still running, solved that
+- Running macros can be aborted, the show_keyboard button will change it's image and get an other function
+
+ver. 0.7.07
+- solved a problem of switchung main button list, wait on tool change has not
+ been reseted properly
+- now I hide the hbuttonbox of tooledit widget instead of every button,
+ this saved 6 lines of code :-)
+
+ver. 0.7.06
+- finshed the h_button hardware pin connection
+- macros can be run by hardware button
+
+ to test the features, just uncomment 3 lines in INI File DISPLAY section, see comments there
+ and uncomment the connections made in gmoccapy_postgui.hal
+ I need someone to test this with real hardware, as with gladevcp buttons there seems to be
+ a problem with the mode settings, change a tool with M61 will not bring you back in manual mode
+ using the software keys, due to gladevcp in my opinion.
+
+ver. 0.7.05
+- made the tooledit Button work on my layout
+- all bottom button have there own hal pins, witch can be connected to hardwre
+ button so no touch screen is needed. v_button still to do and macros not working jet.
+- added an icon for tool-change
+
+ver. 0.7.04
+- added preference file path to INIU file
+- added the release notes file
+- hide the button of tooledit widget
+- all tool change thinks are now done with the tool_edit_widget
+ by selecting the tool from the list
+
+ver. 0.7.03
+- added Release Number to title bar,
+ so it is easer for users to see if they got
+ the latest release
+
+ver. 0.7.02
+- added the capability to launch macros with variable parameters
+- MDI and Auto mode can now only be reached if state all_homed = True
+- added sample macros
+
+ver. 0.7.01
+- changed teh foldername to use only lower letters
+- cleared the directory gmoccapy, all hal files are now again
+ symbolic links
+- renamed the scripts folder to subroutines and moved it in the
+ nc_files folder
+- icons folder not touched at the moment
+- changed INI File to use other paths and renamed SCRIPTS to nacros, next it will be
+ changed to be the same as in touchy
+
+ver. 0.7.00
+- finished the keyboard, it does now scroll in EditMode
+ as well as in MDI Mode
+- Solved a problem with the index tool button, it stays unsensitive after
+ an machine off, now it is working like it should
+- smaler changes in the Icon folder
+
+ver. 0.6.09
+- some more new icon
+- merged with maste
+- added some new icon
+- changed the position from the right button
+- in emergency state the button to close gmoccapy was disabled,
+ so it wasn't possible to close the application in fullscreen mode.
+
+ver. 0.6.08
+- Virtual Keyboard included and working on MDI and AUTO Mode
+ unfortunately the coresponding windows will not scroll as they should
+- Bug found in setting G54 origin, solved!
+
+ver. 0.6.07
+- I finished the keyboard, in editing mode it is working fine
+ in MDI mode I have to find out, how to move the selected row in the
+ hal_mdi_history using the cursor buttons!
+
+ver. 0.6.06
+- Edit program works
+- make new programs works too
+- new keyboard with nearly all keys
+- Attention: On editing a program the keyboard need some more
+ fine polishing, to allow editing text in the middle and I have to
+ include cursor keys
+
+ver. 0.6.05
+- begin to include the edit mode for g-code programs
+ not working jet, still work to do
+ The grafics part is finished, just the ICOn are not very nice
+
+ver 0.6.04
+- changed hal pin vonnections to control homing to gscreen matter
+ so nearly all conections to postgui hal are not needed any more
+- all messages prepared to get translated _(message)
+- Run from line is now included, but at the moment without control
+ of previos lines, this is still to do.
+- settings page begin to work
+ + fullscreen is included
+ + hide cursor is working
+ + sounds are selectable
+ + spindle start rpm is working
+
+ver. 0.6.03
+- optional blocks now working
+- optional stops working too
+- added missing button in MDI Keypad (I missed I ; J ; K )
+- cooling and spindle buttons react to emc stat, so setting an M7 will
+ toggle the corresponding button, so will an M3 or an M5
+ This is not working in AUTO MODE with interpreter running to avoid error
+ messages.
+- changed the test files to have optional blocks and stops.
+
+ver 0.6.02
+- all icons moved to icon folder
+- implemented get toolinfo, tool frame now shows
+ correct data
+- implemented user mdi command through gscreen, so there is no need
+ any more to import linuxcnc
+- added some more icon
+
+ver. 0.6.01
+- solved the problme that widgets don't get sensitized after a pause
+ and a later resume.
+- there will apera an error if in Pause you push coolant or spindle button
+ because the command mode will be changed, the programm will run later as usual
+
+ver. 0.6.00
+- mostly I changed the name to Gmoccapy as invented by Chris
+- some minor changes in code
+
+ver. 0.5.08
+- program label at start up was wrong
+- after pushing manual button staying in settings, main button list was not changed back to manual
+- max velocity now again in units per minute, seems Chris changed it back
+
+ver 0.5.07
+- axis setting to an value with preferences is working fine
+- DRO labels changing colors like they should
+- Added a button to set tool with M61 Q?
+- Commented a little bit more the code
+- prepared INI File for scripts execution
+- Fullscreen is included now
+- HalScope Button added
+- Prepared to execute MDI commands,
+ will later read them also from the INI File as HALUI_COMMAND
+
+ver. 0.5.06
+- added hal scope
+- cleared the code a little bit more
+- removed unused jog-increment-out pin
+
+ver. 0.5.05
+-cleaned up and solved merge conflicts
+ This is a version for first tests by users!
diff --git a/configs/sim/gmoccapy/sim_spindle_encoder.hal b/configs/sim/gmoccapy/sim_spindle_encoder.hal
new file mode 120000
index 000000000..1dac03e59
--- /dev/null
+++ b/configs/sim/gmoccapy/sim_spindle_encoder.hal
@@ -0,0 +1 @@
+../sim_spindle_encoder.hal \ No newline at end of file
diff --git a/configs/sim/gmoccapy/simulated_home.hal b/configs/sim/gmoccapy/simulated_home.hal
new file mode 120000
index 000000000..291b8a6ca
--- /dev/null
+++ b/configs/sim/gmoccapy/simulated_home.hal
@@ -0,0 +1 @@
+../simulated_home.hal \ No newline at end of file
diff --git a/configs/sim/gmoccapy/tool.tbl b/configs/sim/gmoccapy/tool.tbl
new file mode 100755
index 000000000..063860d5b
--- /dev/null
+++ b/configs/sim/gmoccapy/tool.tbl
@@ -0,0 +1,24 @@
+T1 P1 X0.0 Y0.0 Z-100.125 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D4.5 I0.0 J0.0 Q0.0 ;4.5 mm 3 flute cutter
+T2 P2 X0.0 Y0.0 Z-124.214 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D25.0 I0.0 J0.0 Q0.0 ;25 mm cutter
+T3 P3 X0.0 Y0.0 Z-125.125 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D7.5 I0.0 J0.0 Q0.0 ;7.5 mm 3 flute cutter
+T4 P4 X0.0 Y0.0 Z-104.256 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D4.0 I0.0 J0.0 Q0.0 ;4 mm Drill
+T5 P5 X0.0 Y0.0 Z-104.254 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D5.0 I0.0 J0.0 Q0.0 ;5 mm Drill
+T6 P6 X0.0 Y0.0 Z-110.12 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D6.0 I0.0 J0.0 Q0.0 ;6 mm Carbide burr
+T7 P7 X0.0 Y0.0 Z-142.589 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D6.5 I0.0 J0.0 Q0.0 ;6.5 mm HSS burr
+T8 P8 X0.0 Y0.0 Z-142.458 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D12.0 I0.0 J0.0 Q0.0 ;Cutter with 2 faces
+T9 P9 X0.0 Y0.0 Z-142.254 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D16.0 I0.0 J0.0 Q0.0 ;Cutter with 3 faces
+T10 P10 X0.0 Y0.0 Z-120.112 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D165.0 I0.0 J0.0 Q0.0 ;Facer with carbide inserts
+T11 P11 X0.0 Y0.0 Z-142.258 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D10.0 I0.0 J0.0 Q0.0 ;Centering drill
+T12 P12 X0.0 Y0.0 Z138.214 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D4.0 I0.0 J0.0 Q0.0 ;3d taster elektronisch
+T13 P13 X0.0 Y0.0 Z-141.388 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D13.0 I0.0 J0.0 Q0.0 ;3-Schneider Schaftfräser
+T14 P14 X0.0 Y0.0 Z-125.256 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D10.0 I0.0 J0.0 Q0.0 ;3 Schneiden Stufenbohrer 5.5 auf 10
+T15 P15 X0.0 Y0.0 Z-143.888 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D10.0 I0.0 J0.0 Q0.0 ;Bohrer TiN beschichtet
+T16 P16 X0.0 Y0.0 Z-143.583 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D12.5 I0.0 J0.0 Q0.0 ;Stufenbohrer 6.8 auf 12.5 - 3 Schneiden
+T17 P17 X0.0 Y0.0 Z-145.254 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D6.5 I0.0 J0.0 Q0.0 ;Stufenbohrer 4.2 auf 6.5 mit 45 Grad Übergang
+T18 P18 X0.0 Y0.0 Z-169.595 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D4.0 I0.0 J0.0 Q0.0 ;Schaftfräser 4 Schneider
+T19 P19 X0.0 Y0.0 Z-153.235 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D11.0 I0.0 J0.0 Q0.0 ;Bohrer
+T20 P20 X0.0 Y0.0 Z-169.235 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D50.1 I0.0 J0.0 Q0.0 ;Messerkopf 4 Platten
+T21 P21 X0.0 Y0.0 Z-143.587 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D7.8 I0.0 J0.0 Q0.0 ;Bohrer poliert
+T22 P22 X0.0 Y0.0 Z-187.253 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D16.15 I0.0 J0.0 Q0.0 ;Messerkopf Zweischneider
+T23 P23 X0.0 Y0.0 Z-145.254 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D3.3 I0.0 J0.0 Q0.0 ;Bohrer poliert
+T24 P24 X0.0 Y0.0 Z-140.256 A0.0 B0.0 C0.0 U0.0 V0.0 W0.0 D12.02 I0.0 J0.0 Q0.0 ;Fräser nachgeschliffen, nicht beschichtet
diff --git a/configs/sim/gmoccapy/v_buttonlist.glade b/configs/sim/gmoccapy/v_buttonlist.glade
new file mode 100644
index 000000000..b4525636b
--- /dev/null
+++ b/configs/sim/gmoccapy/v_buttonlist.glade
@@ -0,0 +1,122 @@
+<?xml version="1.0"?>
+<interface>
+ <!-- interface-requires gladevcp 0.0 -->
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkWindow" id="window1">
+ <property name="default_width">64</property>
+ <property name="default_height">724</property>
+ <child>
+ <object class="GtkVButtonBox" id="vbuttonbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <property name="layout_style">spread</property>
+ <child>
+ <object class="HAL_Button" id="v_button_0">
+ <property name="label" translatable="yes">v_button_0</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="v_button_1">
+ <property name="label" translatable="yes">v_button_1</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="v_button_2">
+ <property name="label" translatable="yes">v_button_2</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="v_button_3">
+ <property name="label" translatable="yes">v_button_3</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="v_button_4">
+ <property name="label" translatable="yes">v_button_4</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="v_button_5">
+ <property name="label" translatable="yes">v_button_5</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_Button" id="v_button_6">
+ <property name="label" translatable="yes">v_button_6</property>
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/configs/sim/gmoccapy/vcp_box.glade b/configs/sim/gmoccapy/vcp_box.glade
new file mode 100644
index 000000000..85ed19b46
--- /dev/null
+++ b/configs/sim/gmoccapy/vcp_box.glade
@@ -0,0 +1,69 @@
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-requires gladevcp 0.0 -->
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkWindow" id="window1">
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="width_request">300</property>
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="HAL_Meter" id="hal_meter1">
+ <property name="visible">True</property>
+ <property name="bg_color">#ffffffffffff</property>
+ <property name="minorscale">100</property>
+ <property name="z0_color">#0000ffff0000</property>
+ <property name="label">RPM</property>
+ <property name="z1_color">#ffffffff0000</property>
+ <property name="z2_color">#ffff00000000</property>
+ <property name="majorscale">500</property>
+ <property name="max">3000</property>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <child>
+ <object class="HAL_LED" id="hal_led1">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_LED" id="hal_led3">
+ <property name="visible">True</property>
+ <property name="pick_color_off">#f6e0ebe201e9</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HAL_LED" id="hal_led2">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>