summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Morley <chrisinnanaimo@hotmail.com>2013-09-05 21:00:25 -0700
committerChris Morley <chrisinnanaimo@hotmail.com>2013-09-05 21:00:25 -0700
commit7b327b9d749913acfbf982cb72d9bfdd9af0f6fb (patch)
tree9686aed42ca235d4d41959bea86569462da42a59
parent6f4b1dfb54ccb9f073ada7b88d4a836d69b5f03b (diff)
downloadlinuxcnc-7b327b9d749913acfbf982cb72d9bfdd9af0f6fb.tar.gz
linuxcnc-7b327b9d749913acfbf982cb72d9bfdd9af0f6fb.zip
gscreen config -add skin folder and files, remove skin files from sample configs
We now have 'built-in' skins so we don't want them in sample configs folder. I have tempararily left Gmoccapy in the sample configs so as to let Norbert prepare for the change.
-rw-r--r--configs/sim/gscreen_custom/gscreen_custom.ini322
-rw-r--r--share/gscreen/skins/9_axis/9_axis.glade (renamed from configs/sim/gscreen_custom/gscreen.glade)0
-rwxr-xr-xshare/gscreen/skins/9_axis/9_axis_handler.py (renamed from configs/sim/gscreen_custom/gscreen_handler.py)0
-rw-r--r--share/gscreen/skins/gaxis/gaxis.glade (renamed from configs/sim/gscreen_custom/gaxis.glade)0
-rw-r--r--share/gscreen/skins/gaxis/gaxis_handler.py (renamed from configs/sim/gscreen_custom/gaxis_handler.py)0
-rw-r--r--share/gscreen/skins/gmoccapy/dro.glade278
-rwxr-xr-xshare/gscreen/skins/gmoccapy/gmoccapy.glade6103
-rwxr-xr-xshare/gscreen/skins/gmoccapy/gmoccapy_handler.py2864
-rw-r--r--share/gscreen/skins/gmoccapy/icon/Auto.gifbin0 -> 780 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/E-Stop.gifbin0 -> 2181 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/Logo.pngbin0 -> 500 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/clear.pngbin0 -> 2088 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/configure-2.pngbin0 -> 5145 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/coolant_off.pngbin0 -> 1159 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/coolant_on.gifbin0 -> 1669 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/dimensions.pngbin0 -> 2802 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/editor.pngbin0 -> 2535 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/enter.pngbin0 -> 1230 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/estopred.pngbin0 -> 3509 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/exit.pngbin0 -> 3998 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/exit_application.pngbin0 -> 2989 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/forward.pngbin0 -> 1098 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/forward_on.gifbin0 -> 1634 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/from where are the icons.txt75
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/fullscreen_preview.pngbin0 -> 2854 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/index_tool.svg83
-rw-r--r--share/gscreen/skins/gmoccapy/icon/jog.pngbin0 -> 1317 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/keyboard.pngbin0 -> 4136 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/machineonoff.pngbin0 -> 896 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/mdi.pngbin0 -> 1394 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/mist_off.pngbin0 -> 1341 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/mist_on.gifbin0 -> 1743 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/pause.pngbin0 -> 1391 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/refa.pngbin0 -> 2604 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/refall.pngbin0 -> 1858 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/refb.pngbin0 -> 2492 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/refc.pngbin0 -> 2585 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/refu.pngbin0 -> 1818 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/refv.pngbin0 -> 2060 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/refw.pngbin0 -> 2249 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/refx.pngbin0 -> 1850 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/refy.pngbin0 -> 1742 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/refz.pngbin0 -> 1732 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/reload.pngbin0 -> 4065 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/reverse.pngbin0 -> 1098 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/reverse_on.gifbin0 -> 1656 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/run.pngbin0 -> 1091 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/runfrom.pngbin0 -> 1245 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/save-as.pngbin0 -> 4233 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/save.pngbin0 -> 3886 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/start.pngbin0 -> 2276 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/step.pngbin0 -> 1171 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/stop.gifbin0 -> 1325 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/stop.pngbin0 -> 3200 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/stop_on.gifbin0 -> 1301 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/tool_blockdelete.gifbin0 -> 350 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/tool_by_no.svg33
-rw-r--r--share/gscreen/skins/gmoccapy/icon/tool_rotate.gifbin0 -> 1285 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/toolaxisp.pngbin0 -> 990 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/toolaxisx.pngbin0 -> 511 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/toolaxisy.pngbin0 -> 423 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/toolaxisy2.pngbin0 -> 343 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/toolaxisz.pngbin0 -> 499 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/toolchange.pngbin0 -> 2937 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/toolpath.pngbin0 -> 971 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/tools.pngbin0 -> 1905 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/touchoffwz.pngbin0 -> 3207 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/touchoffx.pngbin0 -> 3224 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/touchoffx_value.pngbin0 -> 2570 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/touchoffy.pngbin0 -> 2961 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/touchoffy_value.pngbin0 -> 2474 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/touchoffz.pngbin0 -> 2969 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/touchoffz_value.pngbin0 -> 2476 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/icon/unhome.pngbin0 -> 1871 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/user_tabs.pngbin0 -> 2739 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/zoom-in.pngbin0 -> 2879 bytes
-rwxr-xr-xshare/gscreen/skins/gmoccapy/icon/zoom-out.pngbin0 -> 2783 bytes
-rw-r--r--share/gscreen/skins/gmoccapy/nc_files/Gmoccapy_2_tools_with_compensation.ngc93
-rw-r--r--share/gscreen/skins/gmoccapy/nc_files/diferent speeds.ngc36
-rw-r--r--share/gscreen/skins/gmoccapy/nc_files/subroutines/go_to_position.ngc24
-rw-r--r--share/gscreen/skins/gmoccapy/nc_files/subroutines/halo_world.ngc26
-rw-r--r--share/gscreen/skins/gmoccapy/nc_files/subroutines/i_am_lost.ngc24
-rw-r--r--share/gscreen/skins/gmoccapy/nc_files/subroutines/increment.ngc22
-rw-r--r--share/gscreen/skins/gmoccapy/nc_files/subroutines/jog_around.ngc29
-rw-r--r--share/gscreen/skins/gmoccapy/nc_files/subroutines/macro_Instructions.txt44
-rw-r--r--share/gscreen/skins/industrial/industrial.glade (renamed from configs/sim/gscreen_custom/industrial.glade)0
-rw-r--r--share/gscreen/skins/industrial/industrial2.glade81
-rw-r--r--share/gscreen/skins/industrial/industrial_handler.py (renamed from configs/sim/gscreen_custom/industrial_handler.py)0
88 files changed, 9815 insertions, 322 deletions
diff --git a/configs/sim/gscreen_custom/gscreen_custom.ini b/configs/sim/gscreen_custom/gscreen_custom.ini
deleted file mode 100644
index ac5a60c16..000000000
--- a/configs/sim/gscreen_custom/gscreen_custom.ini
+++ /dev/null
@@ -1,322 +0,0 @@
-# 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 of this INI file
-VERSION = $Revision$
-
-# Name of machine, for use with display, etc.
-MACHINE = LinuxCNC-HAL-SIM-GSCREEN
-
-# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
-# DEBUG = 0x7FFFFFFF
-DEBUG = 0
-
-# Sections for display options ------------------------------------------------
-[DISPLAY]
-
-; -c sets the glade and handler file to load -d is to display extra debug messages
-; In this case the glade and handler file are named gscreen so we don't need -c
-DISPLAY = gscreen -d -v
-
-# Cycle time, in milliseconds, that display will sleep between polls
-CYCLE_TIME = 100
-
-# Highest / lowest value that will be allowed for overrides, 1.0 = 100%
-MAX_SPINDLE_OVERRIDE = 2.0
-MIN_SPINDLE_OVERRIDE = .5
-MAX_FEED_OVERRIDE = 2.0
-
-# Max and default jog speeds in units per second
-MAX_LINEAR_VELOCITY = 1.2
-DEFAULT_LINEAR_VELOCITY = .5
-DEFAULT_ANGULAR_VELOCITY = 30
-
-# list of selectable jog increments
-INCREMENTS = 1 in, 0.1 in, 10 mil, 1 mil, 1mm, .1mm, 1/8000 in
-ANGULAR_INCREMENTS = 1,10,15,45,90,180
-
-# This is used by Gscreen to display the machine anglular joints movements properly
-GEOMETRY = XYZBCUVW
-
-# Prefix to be used
-PROGRAM_PREFIX = ../../../nc_files/
-
-# Introductory graphic
-INTRO_GRAPHIC = linuxcnc.gif
-INTRO_TIME = 5
-
-[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]
-
-# Name of task controller program, e.g., milltask
-TASK = milltask
-
-# Cycle time, in seconds, that task controller will sleep between polls
-CYCLE_TIME = 0.001
-
-# Part program interpreter section --------------------------------------------
-[RS274NGC]
-
-# File containing interpreter variables
-PARAMETER_FILE = sim-9gscreen.var
-
-# Motion control section ------------------------------------------------------
-[EMCMOT]
-
-EMCMOT = motmod
-
-# Timeout for comm to emcmot, in seconds
-COMM_TIMEOUT = 1.0
-
-# Interval between tries to emcmot, in seconds
-COMM_WAIT = 0.010
-
-# Servo task period, in nano-seconds
-SERVO_PERIOD = 1000000
-
-# Hardware Abstraction Layer section --------------------------------------------------
-[HAL]
-
-# The run script first uses halcmd to execute any HALFILE
-# files, and then to execute any individual HALCMD commands.
-#
-
-# list of hal config files to run through halcmd
-# files are executed in the order in which they appear
-HALFILE = core_sim9.hal
-HALFILE = sim_spindle_encoder.hal
-HALFILE = axis_manualtoolchange.hal
-HALFILE = simulated_home.hal
-HALFILE = locking_indexer.hal
-
-# list of halcmd commands to execute
-# commands are executed in the order in which they appear
-#HALCMD = save neta
-
-# Single file that is executed after the GUI has started.
-#POSTGUI_HALFILE = test_postgui.hal
-
-HALUI = halui
-
-# Trajectory planner section --------------------------------------------------
-[TRAJ]
-
-AXES = 9
-COORDINATES = X Y Z A B C U V W
-HOME = 0 0 0 0 0 0 0 0 0
-LINEAR_UNITS = inch
-ANGULAR_UNITS = degree
-CYCLE_TIME = 0.010
-DEFAULT_VELOCITY = 1.0
-POSITION_FILE = position9.txt
-MAX_VELOCITY = 1.2
-
-# Axes sections ---------------------------------------------------------------
-
-[AXIS_0]
-
-TYPE = LINEAR
-HOME = 0.000
-MAX_VELOCITY = 1.2
-MAX_ACCELERATION = 20.0
-BACKLASH = 0.000
-INPUT_SCALE = 4000
-OUTPUT_SCALE = 1.000
-MIN_LIMIT = -10.0
-MAX_LIMIT = 10.0
-FERROR = 0.050
-MIN_FERROR = 0.010
-HOME_OFFSET = 0.0
-HOME_SEARCH_VEL = 5.0
-HOME_LATCH_VEL = 1.0
-HOME_USE_INDEX = NO
-HOME_IGNORE_LIMITS = NO
-HOME_SEQUENCE = 1
-HOME_IS_SHARED = 1
-
-[AXIS_1]
-
-TYPE = LINEAR
-HOME = 0.000
-MAX_VELOCITY = 1.2
-MAX_ACCELERATION = 20.0
-BACKLASH = 0.000
-INPUT_SCALE = 4000
-OUTPUT_SCALE = 1.000
-MIN_LIMIT = -10.0
-MAX_LIMIT = 10.0
-FERROR = 0.050
-MIN_FERROR = 0.010
-HOME_OFFSET = 0.0
-HOME_SEARCH_VEL = 5.0
-HOME_LATCH_VEL = 1.0
-HOME_USE_INDEX = NO
-HOME_IGNORE_LIMITS = NO
-HOME_SEQUENCE = 1
-
-[AXIS_2]
-
-TYPE = LINEAR
-HOME = 0.0
-MAX_VELOCITY = 1.2
-MAX_ACCELERATION = 20.0
-BACKLASH = 0.000
-INPUT_SCALE = 4000
-OUTPUT_SCALE = 1.000
-MIN_LIMIT = -2.0
-MAX_LIMIT = 4.0
-FERROR = 0.050
-MIN_FERROR = 0.010
-HOME_OFFSET = 1.0
-HOME_SEARCH_VEL = 5.0
-HOME_LATCH_VEL = 1.0
-HOME_USE_INDEX = NO
-HOME_IGNORE_LIMITS = NO
-HOME_SEQUENCE = 0
-HOME_IS_SHARED = 1
-
-[AXIS_3]
-
-TYPE = ANGULAR
-HOME = 0.0
-MAX_VELOCITY = 90.0
-MAX_ACCELERATION = 1200.0
-BACKLASH = 0.000
-INPUT_SCALE = 40
-OUTPUT_SCALE = 1.000
-FERROR = 5.0
-MIN_FERROR = 1.0
-HOME_OFFSET = 0.0
-HOME_SEARCH_VEL = 0.0
-HOME_LATCH_VEL = 0.0
-HOME_USE_INDEX = NO
-HOME_IGNORE_LIMITS = NO
-HOME_SEQUENCE = 1
-
-[AXIS_4]
-
-TYPE = ANGULAR
-HOME = 0.0
-MAX_VELOCITY = 90.0
-MAX_ACCELERATION = 1200.0
-BACKLASH = 0.000
-INPUT_SCALE = 40
-OUTPUT_SCALE = 1.000
-FERROR = 5.0
-MIN_FERROR = 1.0
-HOME_OFFSET = 45.0
-HOME_SEARCH_VEL = 0.0
-HOME_LATCH_VEL = 0.0
-HOME_USE_INDEX = NO
-HOME_IGNORE_LIMITS = NO
-HOME_SEQUENCE = 1
-LOCKING_INDEXER = 1
-
-[AXIS_5]
-
-TYPE = ANGULAR
-HOME = 0.0
-MAX_VELOCITY = 90.0
-MAX_ACCELERATION = 1200.0
-BACKLASH = 0.000
-INPUT_SCALE = 40
-OUTPUT_SCALE = 1.000
-FERROR = 5.0
-MIN_FERROR = 1.0
-HOME_OFFSET = 0.0
-HOME_SEARCH_VEL = 0.0
-HOME_LATCH_VEL = 0.0
-HOME_USE_INDEX = NO
-HOME_IGNORE_LIMITS = NO
-HOME_SEQUENCE = 1
-
-[AXIS_6]
-
-TYPE = LINEAR
-HOME = 0.000
-MAX_VELOCITY = 1.2
-MAX_ACCELERATION = 20.0
-BACKLASH = 0.000
-INPUT_SCALE = 4000
-OUTPUT_SCALE = 1.000
-MIN_LIMIT = -10.0
-MAX_LIMIT = 10.0
-FERROR = 0.050
-MIN_FERROR = 0.010
-HOME_OFFSET = 0.0
-HOME_SEARCH_VEL = 0.0
-HOME_LATCH_VEL = 0.0
-HOME_USE_INDEX = NO
-HOME_IGNORE_LIMITS = NO
-HOME_SEQUENCE = 0
-HOME_IS_SHARED = 0
-
-[AXIS_7]
-
-TYPE = LINEAR
-HOME = 0.000
-MAX_VELOCITY = 1.2
-MAX_ACCELERATION = 20.0
-BACKLASH = 0.000
-INPUT_SCALE = 4000
-OUTPUT_SCALE = 1.000
-MIN_LIMIT = -10.0
-MAX_LIMIT = 10.0
-FERROR = 0.050
-MIN_FERROR = 0.010
-HOME_OFFSET = 0.0
-HOME_SEARCH_VEL = 0.0
-HOME_LATCH_VEL = 0.0
-HOME_USE_INDEX = NO
-HOME_IGNORE_LIMITS = NO
-HOME_SEQUENCE = 0
-HOME_IS_SHARED = 0
-
-[AXIS_8]
-
-TYPE = LINEAR
-HOME = 0.0
-MAX_VELOCITY = 1.2
-MAX_ACCELERATION = 20.0
-BACKLASH = 0.000
-INPUT_SCALE = 4000
-OUTPUT_SCALE = 1.000
-MIN_LIMIT = -2.0
-MAX_LIMIT = 4.0
-FERROR = 0.050
-MIN_FERROR = 0.010
-HOME_OFFSET = 0.0
-HOME_SEARCH_VEL = 0.0
-HOME_LATCH_VEL = 0.0
-HOME_USE_INDEX = NO
-HOME_IGNORE_LIMITS = NO
-HOME_SEQUENCE = 0
-HOME_IS_SHARED = 0
-
-
-# section for main IO controller parameters -----------------------------------
-[EMCIO]
-
-# Name of IO controller program, e.g., io
-EMCIO = io
-
-# cycle time, in seconds
-CYCLE_TIME = 0.100
-
-# tool table file
-TOOL_TABLE = sim.tbl
-TOOL_CHANGE_POSITION = 0 0 2
diff --git a/configs/sim/gscreen_custom/gscreen.glade b/share/gscreen/skins/9_axis/9_axis.glade
index be6d6a873..be6d6a873 100644
--- a/configs/sim/gscreen_custom/gscreen.glade
+++ b/share/gscreen/skins/9_axis/9_axis.glade
diff --git a/configs/sim/gscreen_custom/gscreen_handler.py b/share/gscreen/skins/9_axis/9_axis_handler.py
index f675b821d..f675b821d 100755
--- a/configs/sim/gscreen_custom/gscreen_handler.py
+++ b/share/gscreen/skins/9_axis/9_axis_handler.py
diff --git a/configs/sim/gscreen_custom/gaxis.glade b/share/gscreen/skins/gaxis/gaxis.glade
index 0ff29bd51..0ff29bd51 100644
--- a/configs/sim/gscreen_custom/gaxis.glade
+++ b/share/gscreen/skins/gaxis/gaxis.glade
diff --git a/configs/sim/gscreen_custom/gaxis_handler.py b/share/gscreen/skins/gaxis/gaxis_handler.py
index a3a7f9b78..a3a7f9b78 100644
--- a/configs/sim/gscreen_custom/gaxis_handler.py
+++ b/share/gscreen/skins/gaxis/gaxis_handler.py
diff --git a/share/gscreen/skins/gmoccapy/dro.glade b/share/gscreen/skins/gmoccapy/dro.glade
new file mode 100644
index 000000000..06d54598e
--- /dev/null
+++ b/share/gscreen/skins/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/share/gscreen/skins/gmoccapy/gmoccapy.glade b/share/gscreen/skins/gmoccapy/gmoccapy.glade
new file mode 100755
index 000000000..10d535f0b
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/gmoccapy.glade
@@ -0,0 +1,6103 @@
+<?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="width_request">979</property>
+ <property name="height_request">750</property>
+ <property name="title">gmoccapy</property>
+ <property name="icon">icon/Logo.png</property>
+ <signal name="show" handler="on_window1_show"/>
+ <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="expand">False</property>
+ <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">13</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_text" translatable="yes">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">12</property>
+ <property name="right_attach">13</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_text" translatable="yes">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">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_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_text" translatable="yes">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">9</property>
+ <property name="right_attach">10</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_text" translatable="yes">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_text" translatable="yes">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_text" translatable="yes">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_text" translatable="yes">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>
+ <property name="tooltip_text" translatable="yes">Show or hide tool path</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="tooltip_markup">Show or hide tool path</property>
+ <property name="pixbuf">icon/toolpath.png</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">11</property>
+ <property name="right_attach">12</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>
+ <property name="tooltip_text" translatable="yes">Show or hide dimensions</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">10</property>
+ <property name="right_attach">11</property>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_view_y2">
+ <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_text" translatable="yes">view along the y axis from positive to negative as viewn for a back tool lathe</property>
+ <property name="draw_indicator">False</property>
+ <property name="group">rbt_view_p</property>
+ <signal name="toggled" handler="on_rbt_view_y2_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_view_y2">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/toolaxisy2.png</property>
+ </object>
+ </child>
+ </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>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </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>
+ <child>
+ <object class="OffsetPage" id="offsetpage1">
+ <property name="visible">True</property>
+ <property name="foreground_color">#ffff00000000</property>
+ <property name="highlight_color">#adadd8d8e6e6</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_frm_preview_offset_page">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Offset Page</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_frm_preview_tooledit">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Tooledit</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="IconFileSelection" id="IconFileSelection1">
+ <property name="visible">True</property>
+ <property name="filetypes">ngc,py,bmp</property>
+ <signal name="selected" handler="on_IconFileSelection1_selected"/>
+ <signal name="exit" handler="on_IconFileSelection1_exit"/>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_preview_file_sel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">File Selection</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <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">85</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_text" translatable="yes">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="hbox_jog">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkVBox" id="vbox_jog_button">
+ <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="tooltip_text" translatable="yes">buttons to jog the different axis</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_jog_button">
+ <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_btn">
+ <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="GtkButton" id="btn_y_plus">
+ <property name="label">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>
+ <signal name="pressed" handler="on_btn_jog_pressed"/>
+ <signal name="released" handler="on_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="GtkButton" id="btn_y_minus">
+ <property name="label">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>
+ <signal name="pressed" handler="on_btn_jog_pressed"/>
+ <signal name="released" handler="on_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="GtkButton" id="btn_x_minus">
+ <property name="label">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>
+ <signal name="pressed" handler="on_btn_jog_pressed"/>
+ <signal name="released" handler="on_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="GtkButton" id="btn_x_plus">
+ <property name="label">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>
+ <signal name="pressed" handler="on_btn_jog_pressed"/>
+ <signal name="released" handler="on_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="GtkButton" id="btn_z_plus">
+ <property name="label">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>
+ <signal name="pressed" handler="on_btn_jog_pressed"/>
+ <signal name="released" handler="on_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="GtkButton" id="btn_4_plus">
+ <property name="label">4+</property>
+ <property name="width_request">50</property>
+ <property name="height_request">50</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="pressed" handler="on_btn_jog_pressed"/>
+ <signal name="released" handler="on_btn_jog_released"/>
+ </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="GtkButton" id="btn_z_minus">
+ <property name="label">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>
+ <signal name="pressed" handler="on_btn_jog_pressed"/>
+ <signal name="released" handler="on_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>
+ <object class="GtkButton" id="btn_4_minus">
+ <property name="label">4-</property>
+ <property name="width_request">50</property>
+ <property name="height_request">50</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="xalign">0.47999998927116394</property>
+ <signal name="pressed" handler="on_btn_jog_pressed"/>
+ <signal name="released" handler="on_btn_jog_released"/>
+ </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>
+ <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>
+ </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="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_text" translatable="yes">ignore limits / turn on this if you need to move an axis which 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="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_jog_rates">
+ <property name="width_request">120</property>
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">select jog distance</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_jog_rates">
+ <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">2</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">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>
+ <property name="tooltip_text" translatable="yes">Shows the MDI command history</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">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="gcode_view">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">shows the source of the loaded program</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="right_margin_position">81</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">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="GtkHBox" id="hbx_dro">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkTable" id="tbl_dro_button">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="n_rows">3</property>
+ <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>
+ <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_dtg">
+ <property name="label">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>
+ <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="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>
+ <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="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">4</property>
+ <property name="n_columns">2</property>
+ <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">X</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="x_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="label">label</property>
+ <property name="actual">False</property>
+ <property name="reference_type">2</property>
+ <property name="display_units_mm">True</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">1</property>
+ <property name="right_attach">2</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">label</property>
+ <property name="actual">False</property>
+ <property name="reference_type">1</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="foreground" value="#ffff00000000"/>
+ <attribute name="background" value="#000000000000"/>
+ <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>
+ </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">label</property>
+ <property name="actual">False</property>
+ <property name="reference_type">1</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="foreground" value="#ffff00000000"/>
+ <attribute name="background" value="#000000000000"/>
+ <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>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="eventbox_4">
+ <child>
+ <object class="GtkLabel" id="lbl_4">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="label">4</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="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="eventbox_dro_4">
+ <child>
+ <object class="HAL_DRO" id="hal_dro_4">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label">label</property>
+ <property name="actual">False</property>
+ <property name="reference_type">1</property>
+ <property name="joint_number">3</property>
+ <property name="display_units_mm">True</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">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="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">Y</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="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</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">Z</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="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <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="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="tooltip_text" translatable="yes">Information over the tool in spindle</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_tool_info">
+ <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="table2tbl_tool_info">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">4</property>
+ <property name="homogeneous">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>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_tool_no">
+ <property name="visible">True</property>
+ <property name="label">0</property>
+ <property name="justify">center</property>
+ <property name="width_chars">8</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <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="lbl_diameter">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Diameter</property>
+ <property name="width_chars">8</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_tool_dia">
+ <property name="visible">True</property>
+ <property name="label">0</property>
+ <property name="justify">center</property>
+ <property name="width_chars">8</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </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="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="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_tool_offset_z">
+ <property name="visible">True</property>
+ <property name="label">0</property>
+ <property name="justify">center</property>
+ <property name="width_chars">8</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </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="GtkLabel" id="lbl_offset_x">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">offset x</property>
+ <property name="width_chars">8</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_tool_offset_x">
+ <property name="visible">True</property>
+ <property name="label">0</property>
+ <property name="justify">center</property>
+ <property name="width_chars">8</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </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="GtkLabel" id="lbl_tool_name">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">No tool description available</property>
+ <attributes>
+ <attribute name="style" value="normal"/>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_tool_info">
+ <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="tooltip_text" translatable="yes">G and M code information as well as speed and feed</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">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="lbl_active_feed">
+ <property name="width_request">50</property>
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label">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">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">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="tooltip_text" translatable="yes">The name and location of the loaded program</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 Program 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">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="tooltip_text" translatable="yes">adjust max vel of machine</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&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_override">
+ <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">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">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>
+ <property name="tooltip_text" translatable="yes">reset feed override to 100 %</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="tooltip_text" translatable="yes">adjust feed override</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_override">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Feed Override [%]&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="tooltip_text" translatable="yes">switch flood coolant</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="tooltip_text" translatable="yes">switch mist coolant</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">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">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>
+ <property name="tooltip_text" translatable="yes">reset spindle override to 100 %</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="tooltip_text" translatable="yes">adjust spindle override</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="tooltip_text" translatable="yes">turn on spindle counterclockwise</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="tooltip_text" translatable="yes">turn on spindle clockwise</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="tooltip_text" translatable="yes">stop spindle</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_color">#0000ffff0000</property>
+ <property name="bg_color">#bebebebebebe</property>
+ <property name="z1_border">0.80000001192092896</property>
+ <property name="text_template">%i</property>
+ <property name="z0_border">0.40000000596046448</property>
+ <property name="z2_color">#0000ffff0000</property>
+ <property name="target_color">#0000ffff0000</property>
+ <property name="max">6000</property>
+ <property name="target_value">-0.039999999105930328</property>
+ <property name="z0_color">#0000ffff0000</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;Spindle [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="GtkHBox" id="key_box">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_frm_info_emb_keyb">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Embeded keyboard</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="ntb_message">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">False</property>
+ <property name="show_border">False</property>
+ <property name="tab_border">0</property>
+ <property name="tab_hborder">0</property>
+ <property name="tab_vborder">0</property>
+ <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="GtkVBox" id="vbox12">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="hbox15">
+ <property name="visible">True</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>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_clear_statusbar">
+ <property name="width_request">32</property>
+ <property name="height_request">32</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_clear_statusbar_clicked"/>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-delete</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </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>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_message_frm_message">
+ <property name="visible">True</property>
+ <property name="label">message</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table3">
+ <property name="visible">True</property>
+ <property name="n_columns">7</property>
+ <child>
+ <object class="GtkEntry" id="search_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_undo">
+ <property name="label" translatable="yes">undo</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_undo_clicked"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_SHRINK</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_search_back">
+ <property name="label" translatable="yes">search
+ back</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_search_back_clicked"/>
+ </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="GtkButton" id="btn_search_forward">
+ <property name="label" translatable="yes">search
+ fwd</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_search_forward_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_redo">
+ <property name="label" translatable="yes">redo</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_redo_clicked"/>
+ </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>
+ <child>
+ <object class="GtkLabel" id="lbl_space">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_spac">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="right_attach">6</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_message_frm_search">
+ <property name="visible">True</property>
+ <property name="label">search</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</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="GtkHBox" id="hbox_settings">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkFrame" id="frm_apearance">
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_apearance">
+ <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="GtkHBox" id="hbox17">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkVBox" id="vbox18">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkFrame" id="frm_main_window">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">select how to start gmoccapy</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_main_window">
+ <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="vbox_main_window">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkRadioButton" id="rbtn_fullscreen">
+ <property name="label" translatable="yes">Start as fullscreen</property>
+ <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">True</property>
+ <signal name="toggled" handler="on_rbtn_fullscreen_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbtn_maximized">
+ <property name="label" translatable="yes">Start maximized</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">rbtn_fullscreen</property>
+ <signal name="toggled" handler="on_rbtn_maximized_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbtn_window">
+ <property name="label" translatable="yes">Start as window</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">rbtn_fullscreen</property>
+ <signal name="toggled" handler="on_rbtn_window_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="tbl_main_window">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkLabel" id="lbl_x_pos">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">X Pos.</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_y_pos">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">Y Pos.</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_width">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">Width</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_height">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">Height</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spbtn_x_pos">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="xalign">1</property>
+ <property name="adjustment">adj_x_pos</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spbtn_y_pos">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="xalign">1</property>
+ <property name="adjustment">adj_y_pos</property>
+ </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="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spbtn_width">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="xalign">1</property>
+ <property name="adjustment">adj_width</property>
+ </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="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spbtn_height">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="xalign">1</property>
+ <property name="adjustment">adj_height</property>
+ </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="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_hide_cursor">
+ <property name="label" translatable="yes">hide cursor</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_hide_cursor_toggled"/>
+ </object>
+ <packing>
+ <property name="padding">10</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_main_window">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Main Window&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_keyboard">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">select virtual keyboard behavior</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_keyboard">
+ <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="vbox_keyboard">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkCheckButton" id="chk_use_kb_on_offset">
+ <property name="label" translatable="yes">Show keyboard on offset</property>
+ <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">True</property>
+ <signal name="toggled" handler="on_chk_use_kb_on_offset_toggled"/>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_use_kb_on_tooledit">
+ <property name="label" translatable="yes">Show keyboard on tooledit</property>
+ <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">True</property>
+ <signal name="toggled" handler="on_chk_use_kb_on_tooledit_toggled"/>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_use_kb_on_mdi">
+ <property name="label" translatable="yes">Show keyboard on MDI</property>
+ <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">True</property>
+ <signal name="toggled" handler="on_chk_use_kb_on_mdi_toggled"/>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_use_kb_on_edit">
+ <property name="label" translatable="yes">Show keyboard on EDIT</property>
+ <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">True</property>
+ <signal name="toggled" handler="on_chk_use_kb_on_edit_toggled"/>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_use_kb_on_file_selection">
+ <property name="label" translatable="yes">Show keyboard on load file</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_use_kb_on_file_selection_toggled"/>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_keyboard">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Keyboard&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_ntb_preview">
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_keyboard1">
+ <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="vbox_keyboard1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkRadioButton" id="rbtn_show_preview">
+ <property name="label" translatable="yes">show preview</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_rbtn_show_preview_toggled"/>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbtn_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">False</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">rbtn_show_preview</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_ntb_preview">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;On Touch off&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_use_screen2">
+ <property name="label" translatable="yes"> Display
+Aux Screen</property>
+ <property name="width_request">100</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_use_screen2_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkFrame" id="frm_dro">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">DRO settings</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_dro">
+ <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_frm_dro">
+ <property name="visible">True</property>
+ <property name="n_rows">6</property>
+ <property name="n_columns">2</property>
+ <property name="row_spacing">3</property>
+ <child>
+ <object class="GtkLabel" id="lbl_rel_text_color">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Relative Text Color</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</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="y_options">GTK_SHRINK</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_abs_text_color">
+ <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">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</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">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_dtg_color">
+ <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">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</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">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_show_dro">
+ <property name="label" translatable="yes">Show DRO in preview</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_show_dro_toggled"/>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_show_offsets">
+ <property name="label" translatable="yes">Show offsets in preview</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_show_offsets_toggled"/>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="chk_show_dtg">
+ <property name="label" translatable="yes">Show DTG in preview</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="xalign">1</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_show_dtg_toggled"/>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_dro">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;DRO&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_desktop_notify">
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="alali_desktop_notify">
+ <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="GtkCheckButton" id="chk_use_desktop_notify">
+ <property name="label" translatable="yes">Use desktop notify</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_use_desktop_notify_toggled"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_desktop_notify">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Desktop notify&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_spindl">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">spindle relevant settings</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_spindle">
+ <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_spindle">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkLabel" id="lbl_start_rpm">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Starting RPM</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</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="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="y_options">GTK_SHRINK</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="sbtn_spindle_bar_min">
+ <property name="visible">True</property>
+ <property name="can_focus">True</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_spindle_bar_min</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">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="sbtn_spindle_bar_max">
+ <property name="visible">True</property>
+ <property name="can_focus">True</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_spindle_bar_max</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">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_spindle_min_rpm">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Spindle bar min</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_spindle_max_rpm">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Spindle bar max</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_spindle">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Spindle&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_themes">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">themes and sounds to be used</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_themes">
+ <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="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkLabel" id="lbl_themes">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Themes</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</property>
+ </packing>
+ </child>
+ <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="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_SHRINK</property>
+ <property name="x_padding">5</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">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</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">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</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">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</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">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_SHRINK</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_themes">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Themes and sound&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_gremlin_gridsize">
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_gremlin_gridsize">
+ <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="GtkHBox" id="hbox16">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Grid size</property>
+ </object>
+ <packing>
+ <property name="position">0</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="xalign">1</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="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_gremlin_grid_size">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Preview&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_apearance">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Appearance&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_hardware">
+ <property name="visible">True</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_hardware">
+ <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="vbox21">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkFrame" id="frm_mpg_scale">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">here you can set the scales to apply to the hardware MPG to avoid to fast or to slow moving of the sliders, default is (max-min)/100</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_mpg_scale">
+ <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_mpg_scale">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkLabel" id="lbl_scale_max_vel">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">Scale max velocity</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_scale_jog_vel">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">Scale jog velocity</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_feed_overid">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">Scale feed override</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_spindle_override">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">Scale spindle override</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spbtn_scale_max_vel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="xalign">1</property>
+ <property name="adjustment">adj_scale_max_vel</property>
+ <property name="digits">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_padding">5</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spbtn_scale_jog_vel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="xalign">1</property>
+ <property name="adjustment">adj_scale_jog_vel</property>
+ <property name="digits">1</property>
+ </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_padding">5</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spbtn_scale_feed_override">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="xalign">1</property>
+ <property name="adjustment">adj_scale_feed_override</property>
+ <property name="digits">1</property>
+ </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_padding">5</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spbtn_scale_spindle_override">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">&#x25CF;</property>
+ <property name="xalign">1</property>
+ <property name="adjustment">adj_scale_spindle_override</property>
+ <property name="digits">1</property>
+ </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_padding">5</property>
+ <property name="y_padding">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_mpg_scale">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Hardware MPG Scale&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_kb_shortcuts">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">If you select this, you will be able to use several keyboard buttons to operate your machine</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_kb_shortcuts">
+ <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="GtkCheckButton" id="chk_use_kb_shortcuts">
+ <property name="label" translatable="yes">Use keyboard shortcuts</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_chk_use_kb_shortcuts_toggled"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_kb_shortcuts">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Keyboard shortcuts&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_unlock">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">Here you can select the unlock mode to enter the settings page</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_unlock_settings">
+ <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="vbox_unlock_settings">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkRadioButton" id="rbt_use_unlock">
+ <property name="label" translatable="yes">Use unlock code</property>
+ <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">True</property>
+ <signal name="toggled" handler="on_rbt_unlock_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_no_unlock">
+ <property name="label" translatable="yes">Do not use unlock code</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">rbt_use_unlock</property>
+ <signal name="toggled" handler="on_rbt_unlock_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbt_hal_unlock">
+ <property name="label" translatable="yes">Use hal pin to unlock</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">rbt_use_unlock</property>
+ <signal name="toggled" handler="on_rbt_unlock_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_unlock">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Unlock settings&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_run_from_line">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">Do you want to use run from line, it is not very save to use this option, because linuxcnc will ignore all information previous of the start line</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_run_from_line">
+ <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="vbox_run_from_line">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkRadioButton" id="rbtn_no_run_from_line">
+ <property name="label" translatable="yes">Do not use run from line</property>
+ <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">True</property>
+ <signal name="toggled" handler="on_rbtn_run_from_line_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rbtn_run_from_line">
+ <property name="label" translatable="yes">Use run from line</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">rbtn_no_run_from_line</property>
+ <signal name="toggled" handler="on_rbtn_run_from_line_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_run_from_line">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Run from line&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frm_file_to_load">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">Select the file you want to be loaded on start of gmoccapy</property>
+ <property name="label_xalign">0.5</property>
+ <child>
+ <object class="GtkAlignment" id="ali_file_to_load">
+ <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="vbox_file_to_load">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkFileChooserButton" id="file_to_load_chooser">
+ <property name="visible">True</property>
+ <property name="filter">ff_file_to_load</property>
+ <signal name="file_set" handler="on_file_to_load_chooser_file_set"/>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbtb_file_to_load">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkButton" id="btn_use_current">
+ <property name="label" translatable="yes">current
+ file</property>
+ <property name="height_request">56</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_use_current_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_none">
+ <property name="label" translatable="yes">none</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_none_clicked"/>
+ </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="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_file_to_load">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;File to load on start&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">5</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="tbtn_log_actions">
+ <property name="label" translatable="yes">Log actions</property>
+ <property name="width_request">100</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_text" translatable="yes">Log all actions in the alarm history</property>
+ <signal name="toggled" handler="on_tbtn_log_actions_toggled"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_shut_down">
+ <property name="label">gtk-quit</property>
+ <property name="width_request">100</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_text" translatable="yes">Close gmoccapy</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_btn_exit_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="lbl_frm_hardware">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Hardware and security&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </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="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">2</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">2</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="expand">False</property>
+ <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="GtkToggleButton" id="tbtn_estop">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Estop the machine</property>
+ <signal name="toggled" handler="on_tbtn_estop_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_emergency">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/estopred.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="GtkToggleButton" id="tbtn_on">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Turn the machine on/off</property>
+ <signal name="toggled" handler="on_tbtn_on_toggled"/>
+ <child>
+ <object class="GtkImage" id="img_machine_off">
+ <property name="visible">True</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_text" translatable="yes">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="active">True</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_text" translatable="yes">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="tooltip_text" translatable="yes">enter auto mode to run programs</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_text" translatable="yes">Enter the setup page to adjust program options</property>
+ <property name="draw_indicator">False</property>
+ <property name="group">rbt_auto</property>
+ <signal name="clicked" handler="on_rbt_setup_clicked"/>
+ <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="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">show user tabs</property>
+ <property name="image">img_user_tabs</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_text" translatable="yes">open homing button list</property>
+ <property name="image">img_ref_al</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_text" translatable="yes">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_text" translatable="yes">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="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">make the preview as large as possible</property>
+ <property name="image">img_fullsize_preview</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_text" translatable="yes">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">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_text" translatable="yes">This button will show or hide the Keyboard</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">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_text" translatable="yes">run the loaded program</property>
+ <property name="related_action">hal_toggleaction_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_text" translatable="yes">stop the running program</property>
+ <property name="related_action">hal_action_stop</property>
+ <property name="image">img_stop</property>
+ <signal name="clicked" handler="on_btn_stop_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_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_text" translatable="yes">run the program 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="tooltip_text" translatable="yes">Pause a running program</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_text" translatable="yes">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">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_text" translatable="yes">Ignore or not the optional stops. 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_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_text" translatable="yes">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_text" translatable="yes">load a program</property>
+ <property name="image">img_open</property>
+ <signal name="clicked" handler="on_btn_load_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_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_text" translatable="yes">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">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_text" translatable="yes">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_text" translatable="yes">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_text" translatable="yes">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="GtkLabel" id="lbl_replace_y"/>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</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_text" translatable="yes">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">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_home_4">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_btn_home_selected_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_home_a">
+ <property name="width_request">48</property>
+ <property name="height_request">48</property>
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refa.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_replace_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">8</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>
+ <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">9</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">10</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_text" translatable="yes">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">11</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="GtkToggleButton" id="tbtn_edit_offsets">
+ <property name="label" translatable="yes"> edit
+offsets</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_edit_offsets_toggled"/>
+ </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_zero_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_text" translatable="yes">touch off x / set x to 0</property>
+ <signal name="clicked" handler="on_btn_zero_x_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_zero_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_zero_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_text" translatable="yes">touch off y / set y to 0</property>
+ <signal name="clicked" handler="on_btn_zero_y_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_zero_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="GtkLabel" id="lbl_replace_zero_y">
+ <property name="width_request">56</property>
+ <property name="height_request">56</property>
+ </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_zero_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_text" translatable="yes">touch off z / set to 0</property>
+ <signal name="clicked" handler="on_btn_zero_z_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_zero_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">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_zero_g92">
+ <property name="label" translatable="yes">zero
+G92</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_zero_g92_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_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_text" translatable="yes">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">6</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_text" translatable="yes">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_y">
+ <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">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_replace_set_value_y">
+ <property name="width_request">56</property>
+ <property name="height_request">56</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_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_text" translatable="yes">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_set_value_z">
+ <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">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_set_selected">
+ <property name="label" translatable="yes"> set
+selected</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">set the selected coordinate system to be the active one</property>
+ <signal name="clicked" handler="on_btn_set_selected_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_back_zero">
+ <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_zero</property>
+ <signal name="clicked" handler="on_btn_back_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">11</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">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_text" translatable="yes">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="GtkButton" id="btn_classicladder">
+ <property name="label" translatable="yes">Cl.-ladder</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">Open classicladder</property>
+ <signal name="clicked" handler="on_btn_classicladder_clicked"/>
+ </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_text" translatable="yes">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_text" translatable="yes">launch linuxcnc status</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_text" translatable="yes">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_text" translatable="yes">launch calibration</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_text" translatable="yes">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">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_text" translatable="yes">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_text" translatable="yes">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_text" translatable="yes">save the program reload it and run it</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_text" translatable="yes">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_text" translatable="yes">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_text" translatable="yes">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>
+ <property name="tooltip_text" translatable="yes">Show or hide the virtual keyboard</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="tooltip_text" translatable="yes">Go back to main button list</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">edit buttons</property>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbtb_tool">
+ <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>
+ <property name="tooltip_text" translatable="yes">delete selected tool or tools</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>
+ <property name="tooltip_text" translatable="yes">add a new tool to tool table</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">reload tool table from file</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>
+ <property name="tooltip_text" translatable="yes">apply the changes you made, G43 will be excecuted only if it is active g-code</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="GtkButton" id="btn_select_tool_by_no">
+ <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_select_tool_by_no_clicked"/>
+ <child>
+ <object class="GtkImage" id="img_tool_by_no">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/tool_by_no.svg</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_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>
+ <property name="tooltip_text" translatable="yes">change tool with the command M61 Q?, no machine move will be done</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="tooltip_text" translatable="yes">change tool to the selected one</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="GtkButton" id="btn_tool_touchoff_x">
+ <property name="label" translatable="yes">touchoff
+ tool x</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">touch off the tool and set the value to the tool table</property>
+ <signal name="clicked" handler="on_btn_tool_touchoff_clicked"/>
+ </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_hide_tto_x">
+ <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_tool_touchoff_z">
+ <property name="label" translatable="yes">touchoff
+ tool z</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">touch off the tool and set the value to the tool table</property>
+ <signal name="clicked" handler="on_btn_tool_touchoff_clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">9</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="tooltip_text" translatable="yes">Go back to main button list</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">10</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">tool</property>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbtb_load_file">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkButton" id="btn_home">
+ <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">Move to your home directory</property>
+ <property name="image">img_home</property>
+ <signal name="clicked" handler="on_btn_home_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_dir_up">
+ <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">Move to parrent directory</property>
+ <property name="image">img_dir_up</property>
+ <signal name="clicked" handler="on_btn_dir_up_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_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">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_sel_prev">
+ <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">Select the previos file</property>
+ <property name="image">img_sel_prev</property>
+ <property name="image_position">top</property>
+ <signal name="clicked" handler="on_btn_sel_prev_clicked"/>
+ </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_sel_next">
+ <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">Select the next file</property>
+ <property name="image">img_sel_next</property>
+ <property name="image_position">top</property>
+ <signal name="clicked" handler="on_btn_sel_next_clicked"/>
+ </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_jump_to">
+ <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">Jump to user defined directory</property>
+ <property name="image">img_jump_to</property>
+ <property name="image_position">top</property>
+ <signal name="clicked" handler="on_btn_jump_to_clicked"/>
+ </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_12">
+ <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_select">
+ <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">select the highlighted file and return the path</property>
+ <property name="image">img_select</property>
+ <property name="image_position">top</property>
+ <signal name="clicked" handler="on_btn_select_clicked"/>
+ </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_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">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_back_file_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_text" translatable="yes">Close without returning a file path</property>
+ <property name="image">img_back_zero1</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">8</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="lbl_ntb_button_load_file">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Load File</property>
+ </object>
+ <packing>
+ <property name="position">8</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>
+ <signal name="value_changed" handler="on_adj_max_vel_value_changed"/>
+ </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_al">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refall.png</property>
+ </object>
+ <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="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">test</col>
+ </row>
+ <row>
+ <col id="0">test2</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkAdjustment" id="adj_grid_size">
+ <property name="upper">100</property>
+ <property name="step_increment">0.10000000000000001</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="not_all_homed" handler="on_hal_status_not_all_homed"/>
+ <signal name="homed" handler="on_hal_status_homed"/>
+ <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"/>
+ <signal name="tool_in_spindle_changed" handler="on_hal_status_tool_in_spindle_changed"/>
+ </object>
+ <object class="GtkImage" id="img_back_zero1">
+ <property name="visible">True</property>
+ <property name="ypad">3</property>
+ <property name="icon_name">edit-undo</property>
+ </object>
+ <object class="EMC_Action_Save" id="hal_action_save">
+ <property name="stock_id">gtk-save</property>
+ <property name="textview">gcode_view</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">gcode_view</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_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_home_b">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refb.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>
+ <object class="GtkImage" id="img_fullsize_preview">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/fullscreen_preview.png</property>
+ </object>
+ <object class="GtkImage" id="img_user_tabs">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/user_tabs.png</property>
+ </object>
+ <object class="GtkFileFilter" id="ff_file_to_load"/>
+ <object class="GtkAdjustment" id="adj_spindle_bar_min">
+ <property name="upper">10000</property>
+ <property name="step_increment">50</property>
+ <property name="page_increment">10</property>
+ <property name="page_size">10</property>
+ <signal name="value_changed" handler="on_adj_spindle_bar_min_value_changed"/>
+ </object>
+ <object class="GtkAdjustment" id="adj_spindle_bar_max">
+ <property name="value">6000</property>
+ <property name="upper">100000</property>
+ <property name="step_increment">50</property>
+ <property name="page_increment">10</property>
+ <property name="page_size">10</property>
+ <signal name="value_changed" handler="on_adj_spindle_bar_max_value_changed"/>
+ </object>
+ <object class="GtkAdjustment" id="adj_scale_max_vel">
+ <property name="value">1</property>
+ <property name="lower">0.10000000022351742</property>
+ <property name="upper">1000</property>
+ <property name="step_increment">0.10000000000000001</property>
+ <property name="page_increment">10</property>
+ <property name="page_size">10</property>
+ <signal name="value_changed" handler="on_adj_scale_max_vel_value_changed"/>
+ </object>
+ <object class="GtkAdjustment" id="adj_scale_jog_vel">
+ <property name="value">1</property>
+ <property name="lower">0.10000000000000001</property>
+ <property name="upper">1000</property>
+ <property name="step_increment">0.10000000000000001</property>
+ <property name="page_increment">10</property>
+ <property name="page_size">10</property>
+ <signal name="value_changed" handler="on_adj_scale_jog_vel_value_changed"/>
+ </object>
+ <object class="GtkAdjustment" id="adj_scale_feed_override">
+ <property name="value">1</property>
+ <property name="lower">0.10000000000000001</property>
+ <property name="upper">10</property>
+ <property name="step_increment">0.10000000000000001</property>
+ <property name="page_increment">1</property>
+ <property name="page_size">1</property>
+ <signal name="value_changed" handler="on_adj_scale_feed_override_value_changed"/>
+ </object>
+ <object class="GtkAdjustment" id="adj_scale_spindle_override">
+ <property name="value">1</property>
+ <property name="lower">0.10000000000000001</property>
+ <property name="upper">10</property>
+ <property name="step_increment">0.10000000000000001</property>
+ <property name="page_increment">1</property>
+ <property name="page_size">1</property>
+ <signal name="value_changed" handler="on_adj_scale_spindle_override_value_changed"/>
+ </object>
+ <object class="GtkAdjustment" id="adj_x_pos">
+ <property name="value">10</property>
+ <property name="upper">1024</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_x_pos_value_changed"/>
+ </object>
+ <object class="GtkAdjustment" id="adj_y_pos">
+ <property name="value">10</property>
+ <property name="upper">768</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_y_pos_value_changed"/>
+ </object>
+ <object class="GtkAdjustment" id="adj_width">
+ <property name="value">979</property>
+ <property name="lower">979</property>
+ <property name="upper">1280</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_width_value_changed"/>
+ </object>
+ <object class="GtkAdjustment" id="adj_height">
+ <property name="value">750</property>
+ <property name="lower">750</property>
+ <property name="upper">2000</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_height_value_changed"/>
+ </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_toolchange1">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/toolchange.png</property>
+ </object>
+ <object class="GtkTextBuffer" id="log_buffer"/>
+ <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_back_zero">
+ <property name="visible">True</property>
+ <property name="icon_name">edit-undo</property>
+ </object>
+ <object class="EMC_ToggleAction_Run" id="hal_toggleaction_run"/>
+ <object class="GtkImage" id="img_hom_all">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refall.png</property>
+ </object>
+ <object class="GtkImage" id="img_touch_off_z">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/touchoffwz.png</property>
+ </object>
+ <object class="GtkImage" id="img_close1">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/exit_application.png</property>
+ </object>
+ <object class="GtkImage" id="img_home">
+ <property name="visible">True</property>
+ <property name="stock">gtk-home</property>
+ </object>
+ <object class="GtkImage" id="img_dir_up">
+ <property name="visible">True</property>
+ <property name="stock">gtk-sort-ascending</property>
+ </object>
+ <object class="GtkImage" id="img_sel_prev">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-back</property>
+ </object>
+ <object class="GtkImage" id="img_sel_next">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-forward</property>
+ </object>
+ <object class="GtkImage" id="img_jump_to">
+ <property name="visible">True</property>
+ <property name="stock">gtk-jump-to</property>
+ </object>
+ <object class="GtkImage" id="img_select">
+ <property name="visible">True</property>
+ <property name="stock">gtk-ok</property>
+ </object>
+ <object class="GtkImage" id="img_home_c">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refc.png</property>
+ </object>
+ <object class="GtkImage" id="img_home_u">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refu.png</property>
+ </object>
+ <object class="GtkImage" id="img_home_v">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refv.png</property>
+ </object>
+ <object class="GtkImage" id="img_home_w">
+ <property name="visible">True</property>
+ <property name="pixbuf">icon/refw.png</property>
+ </object>
+</interface>
diff --git a/share/gscreen/skins/gmoccapy/gmoccapy_handler.py b/share/gscreen/skins/gmoccapy/gmoccapy_handler.py
new file mode 100755
index 000000000..ad77519ef
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/gmoccapy_handler.py
@@ -0,0 +1,2864 @@
+#!/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 2012 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 # base hal class to react to hal signals
+import hal_glib # needed to make our own hal pins
+import gtk # base for pygtk widgets and constants
+import os # needed to get the paths and directorys
+import pango # needed for font settings and changing
+import gladevcp.makepins # needed for the dialog"s calulator widget
+import locale # for translations
+import subprocess # to launch onboard and other proceses
+
+# 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.9.7"
+_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 class that do allow you to show messages in popup windows
+# # it will be used later on to display the error messages like known from axis
+# import gtk
+# import gobject
+# import pango
+#
+# class Notification(gtk.Window):
+#
+# __gtype_name__ = 'Notification'
+# __gproperties__ = {
+# 'icon_size' : ( gobject.TYPE_INT, 'Icon Size', 'Sets the size of the displayed button icon',
+# 12,96,48, gobject.PARAM_READWRITE | gobject.PARAM_CONSTRUCT),
+# 'frame_width' : ( gobject.TYPE_INT, 'Frame Width', 'Sets the frame width in pixel',
+# 12,96,48, gobject.PARAM_READWRITE | gobject.PARAM_CONSTRUCT),
+# 'font' : ( gobject.TYPE_STRING, 'Pango Font', 'Display font to use',
+# "sans 10", gobject.PARAM_READWRITE|gobject.PARAM_CONSTRUCT),
+# }
+# __gproperties = __gproperties__
+#
+# # build the main gui
+# def __init__(self):
+# gtk.Window.__init__(self)
+# self.connect("destroy",lambda*w:gtk.main_quit())
+# self.messages=[]
+# self.popup=gtk.Window(gtk.WINDOW_POPUP)
+# self.vbox = gtk.VBox()
+# self.popup.add(self.vbox)
+# self.icon_size = 24
+# self.frame_width = 400
+# self.font = "sans 22"
+#
+# # this will fill the main gui with the frames, containing the messages or errors
+# def _show_message(self,message):
+# number = message[0]
+# text = message[1]
+# frame = gtk.Frame()
+# frame.set_label("")
+# hbox = gtk.HBox()
+# frame.add(hbox)
+# labelnumber = gtk.Label(number)
+# hbox.pack_start(labelnumber)
+# label=gtk.Label()
+# label.set_line_wrap(True)
+# label.set_text(text)
+# label.set_size_request(self.frame_width,-1)
+# font_desc = pango.FontDescription(self.font)
+# label.modify_font(font_desc)
+# hbox.pack_start(label)
+# btn_close = gtk.Button()
+# image = gtk.Image()
+# image.set_from_stock(gtk.STOCK_CANCEL,self.icon_size)
+# btn_close.set_image(image)
+# btn_close.connect("clicked", self._on_btn_close_clicked,labelnumber.get_text())
+# hbox.pack_start(btn_close)
+# self.vbox.pack_end(frame)
+# frame.show()
+# label.show()
+# btn_close.show()
+# hbox.show()
+# # labelnumber.show()
+# self.vbox.show()
+# self.popup.show()
+# self.popup.move(0,0)
+#
+# # add a message, the message is a string, it will be line wraped
+# # if to long for the frame
+# def add_message(self, message):
+# number_of_messages = len(self.messages)
+# self.messages.append([number_of_messages,message])
+# self._show_message(self.messages[number_of_messages])
+#
+# def del_first(self):
+# if len(self.messages) != 0:
+# del self.messages[0]
+# self._refill_messages()
+#
+# def del_last(self):
+# if len(self.messages) != 0:
+# del self.messages[len(self.messages)-1]
+# self._refill_messages()
+#
+# # this will delete a message, if the user gives a valid number it will be deleted,
+# # but the user must take care to use the correct number
+# # if you give a value of "-1" all messages will be deletet
+# def del_message(self,messagenumber):
+# if messagenumber == -1:
+# self.messages = []
+# self._refill_messages()
+# return True
+# elif messagenumber > len(self.messages) or messagenumber < 0:
+# self.add_message(_("Error trying to delet the message with number %s"%messagenumber))
+# return False
+# try:
+# del self.messages[int(messagenumber)]
+# except:
+# return False
+# self._refill_messages()
+# return True
+#
+# # this is the recomendet way to delete a message, by clicking the
+# # close button of the coresponding frame
+# def _on_btn_close_clicked(self,widget,labelnumber):
+# del self.messages[int(labelnumber)]
+# self._refill_messages()
+#
+# def _refill_messages(self):
+# # first we have to hide all messages, otherwise the popup window will mantain
+# # all the old messages
+# self.popup.hide_all()
+# # then we rezise the popup window to a very smal size, otherwise the dimensions
+# # of the window will be mantained
+# self.popup.resize(10,10)
+# # if it was the laste message, than we can hide the popup window
+# if len(self.messages) == 0:
+# self.popup.hide()
+# else: # or we do refill the popup window
+# index = 0
+# for message in self.messages:
+# self.messages[index][0] = index
+# self._show_message(message)
+# index += 1
+#
+# def do_get_property(self, property):
+# name = property.name.replace('-', '_')
+# if name in self.__gproperties.keys():
+# return getattr(self, name)
+# else:
+# raise AttributeError('unknown iconview get_property %s' % property.name)
+#
+# def do_set_property(self, property, value):
+# try:
+# name = property.name.replace('-', '_')
+# if name in self.__gproperties.keys():
+# setattr(self, name, value)
+# self.queue_draw()
+# if name == 'icon_size':
+# self.icon_size(value)
+# if name == 'frame_width':
+# self.frame_width = value
+# if name == 'font':
+# self.font(value)
+# else:
+# raise AttributeError('unknown iconview set_property %s' % property.name)
+# except:
+# pass
+
+
+# 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.interpreter = _IDLE # This hold the interpreter state, so we could check if actions 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 = False # decide if the actions should be loged
+ self.fo_counts = 0 # need to calculate diference in counts to change the feed override slider
+ self.so_counts = 0 # need to calculate diference in counts to change the spindle override slider
+ self.jv_counts = 0 # need to calculate diference in counts to change the jog_vel slider
+ self.mv_counts = 0 # need to calculate diference in counts to change the max_speed slider
+ self.incr_rbt_list= [] # we use this list to add hal pin to the button later
+ self.no_increments = 0 # number of increments from INI File, because of space we allow a max of 10
+ self.unlock = False # this value will be set using the hal pin unlock settings
+ self.system_list = (0,"G54","G55","G56","G57","G58","G59","G59.1","G59.2","G59.3") # needed to display the labels
+ self.axisnumber_four = "" # we use this to get the number of the 4-th axis
+ self.axisletter_four = None# we use this to get the letter of the 4-th axis
+# self.notification = Notification()
+
+ def initialize_preferences(self):
+ self.data.theme_name = self.gscreen.prefs.getpref("gtk_theme", "Follow System Theme", str)
+ self.gscreen.init_general_pref()
+ self._init_axis_four()
+
+ def _init_axis_four(self):
+ if len(self.data.axis_list) < 4:
+ return
+ axis_four = list(set(self.data.axis_list)-set(("x","y","z")))
+ if len(axis_four) > 1:
+ message = _("gmoccapy can only handle 4 axis,\nbut you have given %d through your INI file\n"%len(self.data.axis_list))
+ message += _("gmoccapy will not start\n\n")
+ print(message)
+ self.widgets.window1.destroy()
+ self.axisletter_four = axis_four[0]
+ self.axisnumber_four = "xyzabcuvw".index(self.axisletter_four)
+ image = self.widgets["img_home_%s"%self.axisletter_four]
+ self.widgets.btn_home_4.set_image(image)
+
+ # 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_embeded_terminal()
+ self.gscreen.init_themes() # load all avaiable themes in the combo box
+ self.gscreen.init_audio()
+
+ # and now our own ones
+ self.init_gremlin()
+ self.init_hide_cursor()
+ self.init_keyboard()
+ self.init_offsetpage()
+ self.init_IconFileSelection()
+
+ # now we initialize the file to load widget
+ self.init_file_to_load()
+
+ self._show_offset_tab(False)
+ self._show_tooledit_tab(False)
+ self._show_iconview_tab(False)
+
+ # and we want to set the default path
+ default_path = self.gscreen.inifile.find("DISPLAY", "PROGRAM_PREFIX")
+ if not os.path.exists(os.path.expanduser(default_path)):
+ print(_("Path %s from DISPLAY , PROGRAM_PREFIX does not exist")%default_path)
+ print(_("Trying default path..."))
+ default_path = "~/linuxcnc/nc_files/"
+ if not os.path.exists(os.path.expanduser(default_path)):
+ print(_("Default path to ~/linuxcnc/nc_files does not exist"))
+ print(_("setting now home as path"))
+ default_path = os.path.expanduser("~/")
+ self.widgets.hal_action_open.currentfolder = os.path.expanduser(default_path)
+ self.widgets.IconFileSelection1.set_property("start_dir",default_path)
+
+ # set the slider limmits
+ 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.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, self.data.spindle_override_min * 100,
+ 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)
+
+ # the scale to apply to the count of the hardware mpg wheel, to avoid to much turning
+ default = (self.data._maxvelocity * 60 - self.data._maxvelocity * 0.1)/100
+ self.scale_max_vel = self.gscreen.prefs.getpref("scale_max_vel", default, float)
+ self.widgets.adj_scale_max_vel.set_value(self.scale_max_vel)
+ default = (self.data.jog_rate_max / 100)
+ self.scale_jog_vel = self.gscreen.prefs.getpref("scale_jog_vel", default, float)
+ self.widgets.adj_scale_jog_vel.set_value(self.scale_jog_vel)
+ self.scale_spindle_override = self.gscreen.prefs.getpref("scale_spindle_override", 1, float)
+ self.widgets.adj_scale_spindle_override.set_value(self.scale_spindle_override)
+ self.scale_feed_override = self.gscreen.prefs.getpref("scale_feed_override", 1, float)
+ self.widgets.adj_scale_feed_override.set_value(self.scale_feed_override)
+
+ # set the title of the window, to show the release
+ self.widgets.window1.set_title("gmoccapy for linuxcnc %s"%_RELEASE)
+
+ # the velocity settings
+ self.min_spindle_rev = self.gscreen.prefs.getpref("spindle_bar_min", 0.0, float)
+ self.max_spindle_rev = self.gscreen.prefs.getpref("spindle_bar_max", 6000.0, float)
+ self.widgets.adj_spindle_bar_min.set_value((self.min_spindle_rev))
+ self.widgets.adj_spindle_bar_max.set_value((self.max_spindle_rev))
+ 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))
+
+ # Window position and size
+ self.widgets.adj_x_pos.set_value(self.gscreen.prefs.getpref("x_pos", 10, float))
+ self.widgets.adj_y_pos.set_value(self.gscreen.prefs.getpref("y_pos", 10, float))
+ self.widgets.adj_width.set_value(self.gscreen.prefs.getpref("width", 979, float))
+ self.widgets.adj_height.set_value(self.gscreen.prefs.getpref("height", 750, float))
+
+ # this sets the background colors of several buttons
+ # the colors are different for the states of the button
+ self.widgets.tbtn_on.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FF0000"))
+ self.widgets.tbtn_on.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#00FF00"))
+ self.widgets.tbtn_estop.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FF0000"))
+ self.widgets.tbtn_estop.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#00FF00"))
+ 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_y2.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_dtg.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_fullsize_preview.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.tbtn_log_actions.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#FFFF00"))
+ self.widgets.tbtn_mist.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("#00FF00"))
+ 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"))
+ self.widgets.tbtn_rel.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_user_tabs.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"))
+
+ # Now we will build the option buttons to select the Jog-rates
+ # We do this dynamicly, because users are able to set them in INI File
+ # because of space on the screen only 10 items are allowed
+ # jogging increments
+
+ # We get the increments from INI File with self._check_len_increments
+
+ # 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 emitted
+ # One from the released button and one from the pressed button
+ # we make a list of the buttons to later add the hardware pins to them
+
+ 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()
+ self.incr_rbt_list.append(rbt0)
+ # the rest of the buttons are now added to the group
+ # self.no_increments is set while setting the hal pins with self._check_len_increments
+ for increment in range(1,self.no_increments):
+ 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.incr_rbt_list.append(rbt)
+
+ 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"),
+ (5,"btn_home_z"),(7,"btn_unhome_all"),(9,"btn_back_ref")
+ ]
+ if not self.data.lathe_mode:
+ tab_ref.append((4,"btn_home_y"))
+ if len(self.data.axis_list) == 4:
+ tab_ref.append((6,"btn_home_4"))
+ self.h_tabs.append(tab_ref)
+
+ tab_touch = [(0,"tbtn_edit_offsets"),(1,"btn_zero_x"),(3,"btn_zero_z"),(4,"btn_zero_g92"),
+ (5,"btn_set_value_x"),(7,"btn_set_value_z"),(8,"btn_set_selected"),(9,"btn_back_zero")
+ ]
+ if not self.data.lathe_mode:
+ tab_touch.append((2,"btn_zero_y"))
+ tab_touch.append((6,"btn_set_value_y"))
+ self.h_tabs.append(tab_touch)
+
+ tab_setup = [(0,"btn_delete"),(4,"btn_classicladder"),(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"),(4,"btn_select_tool_by_no"),(5,"btn_index_tool"),
+ (6,"btn_change_tool"),(8,"btn_tool_touchoff_z"),(9,"btn_back_tool")
+ ]
+ if self.data.lathe_mode:
+ tab_tool.append((7,"btn_tool_touchoff_x"))
+ self.h_tabs.append(tab_tool)
+
+ tab_file = [(0,"btn_home"),(1,"btn_dir_up"),(3,"btn_sel_prev"),(4,"btn_sel_next"),
+ (5,"btn_jump_to"),(7,"btn_select"),(9,"btn_back_file_load")
+ ]
+ self.h_tabs.append(tab_file)
+
+ self.v_tabs = [(0,"tbtn_estop"),(1,"tbtn_on"),(2,"rbt_manual"),(3,"rbt_mdi"),
+ (4,"rbt_auto"),(5,"rbt_setup"),(6,"tbtn_user_tabs")
+ ]
+
+ 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.emc.blockdel(self.widgets.tbtn_optional_blocks.get_active())
+ self.widgets.tbtn_optional_stops.set_active(not self.gscreen.prefs.getpref("opstop", False))
+ self.emc.opstop(self.widgets.tbtn_optional_stops.get_active())
+ self.log = self.gscreen.prefs.getpref("log_actions", False, bool)
+ self.widgets.tbtn_log_actions.set_active(self.log)
+ self.widgets.chk_show_dro.set_active(self.gscreen.prefs.getpref("enable_dro", False))
+ self.widgets.chk_show_offsets.set_active(self.gscreen.prefs.getpref("show_offsets", False))
+ self.widgets.chk_show_dtg.set_active(self.gscreen.prefs.getpref("show_dtg", False))
+ self.widgets.chk_show_offsets.set_sensitive(self.widgets.chk_show_dro.get_active())
+ self.widgets.chk_show_dtg.set_sensitive(self.widgets.chk_show_dro.get_active())
+ if "ntb_preview" in self.gscreen.inifile.findall("DISPLAY", "EMBED_TAB_LOCATION"):
+ self.widgets.ntb_preview.set_property("show-tabs", True)
+# page_offset = self.widgets.ntb_preview.get_nth_page(1)
+# page_offset.hide()
+ if self.gscreen.machine_units_mm == 1: # is needed to show vel in machine units
+ self.gscreen.set_dro_units(_MM,True)
+
+ self.data.desktop_notify = self.gscreen.prefs.getpref("desktop_notify", False, bool)
+
+ # get if run from line should be used
+ rfl = self.gscreen.prefs.getpref("run_from_line", "no_run", str)
+ # and set the corresponding button active
+ self.widgets["rbtn_%s_from_line"%rfl].set_active(True)
+ if rfl == "no_run":
+ self.widgets.btn_from_line.set_sensitive(False)
+ else:
+ self.widgets.btn_from_line.set_sensitive(True)
+
+ # get the way to unlock the settings
+ unlock = self.gscreen.prefs.getpref("unlock_way", "use", str)
+ # and set the corresponding button active
+ self.widgets["rbt_%s_unlock"%unlock].set_active(True)
+ # if Hal pin should be used, only set the button active, if the pin is high
+ if unlock == "hal" and not self.gscreen.halcomp["unlock-settings"]:
+ self.widgets.rbt_setup.set_sensitive(False)
+ self.unlock_code = self.gscreen.prefs.getpref("unlock_code", "123", str) # get unlock code
+
+ # get when the keyboard should be shown
+ # and set the corresponding button active
+ self.widgets.chk_use_kb_on_offset.set_active(self.gscreen.prefs.getpref("show_keyboard_on_offset",
+ True, bool))
+ self.widgets.chk_use_kb_on_tooledit.set_active(self.gscreen.prefs.getpref("show_keyboard_on_tooledit",
+ False, bool))
+ self.widgets.chk_use_kb_on_edit.set_active(self.gscreen.prefs.getpref("show_keyboard_on_edit",
+ True, bool))
+ self.widgets.chk_use_kb_on_mdi.set_active(self.gscreen.prefs.getpref("show_keyboard_on_mdi",
+ True, bool))
+ self.widgets.chk_use_kb_on_file_selection.set_active(self.gscreen.prefs.getpref("show_keyboard_on_file_selection",
+ False, bool))
+
+ # check if the user want to display preview window insteadt of offsetpage widget
+ state = self.gscreen.prefs.getpref("show_preview_on_offset", False, bool)
+ if state:
+ self.widgets.rbtn_show_preview.set_active(True)
+ else:
+ self.widgets.rbtn_show_offsets.set_active(True)
+
+ # check if keyboard shortcuts should be used and set the chkbox widget
+ self.widgets.chk_use_kb_shortcuts.set_active(self.gscreen.prefs.getpref("use_keyboard_shortcuts",
+ False, bool))
+
+# ToDo: check in settings if the user like the highlighting or not
+# self.widgets.gcode_view.buf.set_language(None)
+# ToDo: End
+
+ # 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 everything 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()
+ self.widgets.adj_start_spindle_RPM.set_value(self.data.spindle_start_rpm)
+ self.widgets.gcode_view.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)
+ self.widgets.ntb_user_tabs.remove_page(0)
+ self.add_macro_button()
+ self.units = self.gscreen.inifile.find("TRAJ", "LINEAR_UNITS")
+ if self.units == "inch":
+ self.widgets.tbtn_units.set_active(True)
+ if not self.gscreen.inifile.find("DISPLAY", "EMBED_TAB_COMMAND"):
+ self.widgets.tbtn_user_tabs.set_sensitive(False)
+
+ # we click the clear button from statusbar, because else ready for homing will be displayed.
+ # but this is not true, because the machine is not in On state
+ self.widgets.btn_clear_statusbar.emit("clicked")
+
+ # call the function to change the button status
+ # so every thing 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_select_tool_by_no",
+ "btn_spindle_100", "scl_max_vel", "scl_spindle", "rbt_manual",
+ "btn_tool_touchoff_x", "btn_tool_touchoff_z"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,False)
+
+ # Do we control a lathe?
+ if self.data.lathe_mode:
+ # is this a backtool lathe?
+ temp = self.gscreen.inifile.find("DISPLAY", "BACK_TOOL_LATHE")
+ self.backtool_lathe = bool(temp == "1" or temp == "True" or temp == "true")
+ print("backtool = ",self.backtool_lathe)
+
+ # we first hide the Y button to home and touch off
+ self.widgets.btn_home_y.hide()
+ self.widgets.btn_zero_y.hide()
+ self.widgets.btn_set_value_y.hide()
+ self.widgets.lbl_replace_y.show()
+ self.widgets.lbl_replace_zero_y.show()
+ self.widgets.lbl_replace_set_value_y.show()
+ self.widgets.btn_tool_touchoff_x.show()
+ self.widgets.lbl_hide_tto_x.hide()
+
+ # we have to re-arrange the jog buttons, so first remove all button
+ self.widgets.tbl_jog_btn.remove(self.widgets.btn_y_minus)
+ self.widgets.tbl_jog_btn.remove(self.widgets.btn_y_plus)
+ self.widgets.tbl_jog_btn.remove(self.widgets.btn_x_minus)
+ self.widgets.tbl_jog_btn.remove(self.widgets.btn_x_plus)
+ self.widgets.tbl_jog_btn.remove(self.widgets.btn_z_minus)
+ self.widgets.tbl_jog_btn.remove(self.widgets.btn_z_plus)
+
+ # now we place them in a different order
+ if self.backtool_lathe:
+ self.widgets.tbl_jog_btn.attach(self.widgets.btn_x_plus,1,2,0,1,gtk.SHRINK, gtk.SHRINK)
+ self.widgets.tbl_jog_btn.attach(self.widgets.btn_x_minus,1,2,2,3,gtk.SHRINK, gtk.SHRINK)
+ else:
+ self.widgets.tbl_jog_btn.attach(self.widgets.btn_x_plus,1,2,2,3,gtk.SHRINK, gtk.SHRINK)
+ self.widgets.tbl_jog_btn.attach(self.widgets.btn_x_minus,1,2,0,1,gtk.SHRINK, gtk.SHRINK)
+ self.widgets.tbl_jog_btn.attach(self.widgets.btn_z_plus,2,3,1,2,gtk.SHRINK, gtk.SHRINK)
+ self.widgets.tbl_jog_btn.attach(self.widgets.btn_z_minus,0,1,1,2,gtk.SHRINK, gtk.SHRINK)
+
+ # and the Y DRO we make to a second X DRO then indicate the diameter
+ self.widgets.hal_dro_y.set_property("joint_number",0)
+ self.widgets.hal_dro_y.set_property("diameter",True)
+
+ # we change the label text of the DRO
+ self.widgets.lbl_y.set_label("D")
+ self.widgets.lbl_x.set_label("R")
+
+ # For gremlin we don"t need the following button
+ if self.backtool_lathe:
+ self.widgets.rbt_view_y2.set_active(True)
+ else:
+ self.widgets.rbt_view_y.set_active(True)
+ self.widgets.rbt_view_p.hide()
+ self.widgets.rbt_view_x.hide()
+ self.widgets.rbt_view_z.hide()
+
+ # check if G7 or G8 is active
+ # this is set on purpose wrong, because we want the periodic
+ # to update the state correctly
+ if "G7" in self.data.active_gcodes:
+ self.data.diameter_mode = False
+ else:
+ self.data.diameter_mode = True
+
+ else:
+ # the Y2 view is not needed on a mill
+ self.widgets.rbt_view_y2.hide()
+ # X Offset is not necesary on a mill
+ self.widgets.lbl_tool_offset_x.hide()
+ self.widgets.lbl_offset_x.hide()
+ self.widgets.btn_tool_touchoff_x.hide()
+ self.widgets.lbl_hide_tto_x.show()
+ # is there a 4_th axis?
+ # We need to show the corresponding widgets
+ # and change some sizes
+ if len(self.data.axis_list) > 3:
+ #let us find out wich axis is the 4-th one
+ # and set things accordingly
+
+ self.widgets.btn_4_plus.set_label("%s+"%self.axisletter_four.upper())
+ self.widgets.btn_4_minus.set_label("%s-"%self.axisletter_four.upper())
+ self.widgets.lbl_4.set_label(self.axisletter_four.upper())
+ self.widgets.hal_dro_4.set_property("joint_number",self.axisnumber_four)
+
+ # is axis 4 a rotary axis ? If so, the DRO should not change
+ # in case of metric or imperial changes, that"s why we set the
+ # text template for both units to be the same
+ if self.axisletter_four in "abc":
+ self.widgets.hal_dro_4.set_property("mm_text_template","%11.2f")
+ self.widgets.hal_dro_4.set_property("imperial_text_template","%11.2f")
+
+ self.widgets.eventbox_dro_4.show()
+ self.widgets.eventbox_4.show()
+ self.widgets.btn_4_plus.show()
+ self.widgets.btn_4_minus.show()
+ self.widgets.lbl_x.set_size_request(-1,-1)
+ self.widgets.lbl_y.set_size_request(-1,-1)
+ self.widgets.lbl_z.set_size_request(-1,-1)
+ self.widgets.lbl_4.set_size_request(-1,-1)
+ self.widgets.lbl_replace_4.hide()
+ self.widgets.btn_home_4.show()
+
+ # we have to re-arrange the jog buttons, so first remove all button
+ self.widgets.tbl_jog_btn.remove(self.widgets.btn_z_minus)
+ self.widgets.tbl_jog_btn.remove(self.widgets.btn_z_plus)
+ self.widgets.tbl_jog_btn.remove(self.widgets.btn_4_minus)
+ self.widgets.tbl_jog_btn.remove(self.widgets.btn_4_plus)
+
+ # now we place them in a different order
+ self.widgets.tbl_jog_btn.attach(self.widgets.btn_z_plus,2,3,0,1,gtk.SHRINK, gtk.SHRINK)
+ self.widgets.tbl_jog_btn.attach(self.widgets.btn_z_minus,2,3,2,3,gtk.SHRINK, gtk.SHRINK)
+ self.widgets.tbl_jog_btn.attach(self.widgets.btn_4_plus,3,4,0,1,gtk.SHRINK, gtk.SHRINK)
+ self.widgets.tbl_jog_btn.attach(self.widgets.btn_4_minus,3,4,2,3,gtk.SHRINK, gtk.SHRINK)
+
+ # shows "Onboard" virtual keyboard if available
+ # else error message
+ def init_keyboard(self,args="",x="",y=""):
+ print args,x,y
+# result = subprocess.call("setxkbmap -layout de",shell=True)
+# if result<> 0:
+# print("error",result)
+ try:
+ self.data.ob = subprocess.Popen(["onboard","--xid",args,x,y],
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ close_fds=True)
+ sid = self.data.ob.stdout.readline()
+ print"keyboard", sid # skip header line
+ socket = gtk.Socket()
+ socket.show()
+ self.widgets.key_box.add(socket)
+ socket.add_id(long(sid))
+ except:
+ print _("Error with launching 'Onboard' on-screen keyboard program, is onboard installed?")
+
+ def kill_keyboard(self):
+ try:
+ self.widgets.key_box.hide()
+ self.data.ob.kill()
+ self.data.ob.terminate()
+ self.data.ob = None
+ except:
+ try:
+ self.data.ob.kill()
+ self.data.ob.terminate()
+ self.data.ob = None
+ except:
+ pass
+
+ def init_offsetpage(self):
+ temp = "xyzabcuvw"
+ self.widgets.offsetpage1.set_col_visible(temp,False)
+ temp =""
+ for axis in self.data.axis_list:
+ temp=temp+axis
+ self.widgets.offsetpage1.set_col_visible(temp,True)
+ CONFIGPATH = os.environ["CONFIG_DIR"]
+ path = os.path.join(CONFIGPATH,self.data.varfile)
+ self.widgets.offsetpage1.set_filename(path)
+ self.widgets.offsetpage1.hide_buttonbox(True)
+ self.widgets.offsetpage1.set_row_visible("1",False)
+ self.widgets.offsetpage1.set_font("sans 12")
+ self.widgets.offsetpage1.set_foreground_color("#28D0D9")
+ self.widgets.offsetpage1.selection_mask = ("Tool","G5x","Rot")
+ systemlist = ["Tool", "G5x", "Rot", "G92", "G54", "G55", "G56", "G57", "G58", "G59", "G59.1",
+ "G59.2", "G59.3"]
+ names = []
+ for system in systemlist:
+ system_name = "system_name_%s"%system
+ name = self.gscreen.prefs.getpref(system_name, system, str)
+ names.append([system,name])
+ self.widgets.offsetpage1.set_names(names)
+
+ def init_IconFileSelection(self):
+ iconsize= 48
+ filetypes = "ngc,py"
+ self.widgets.IconFileSelection1.set_property("icon_size",iconsize)
+ # self.widgets.IconFileSelection1.set_property("start_dir",startdir)
+ # is set in init with the selection of the NC_FILES path from INI
+ self.widgets.IconFileSelection1.set_property("user_dir",os.path.expanduser("~"))
+ self.widgets.IconFileSelection1.set_property("filetypes",filetypes)
+ self.widgets.IconFileSelection1.show_buttonbox(False)
+ self.widgets.IconFileSelection1.show_filelabel(False)
+
+ # init the preview
+ def init_gremlin(self):
+ self.widgets.grid_size.set_value(self.data.grid_size)
+ self.widgets.gremlin.grid_size = self.data.grid_size
+ self.widgets.gremlin.set_property("view",self.data.plot_view[0])
+ self.widgets.gremlin.set_property("metric_units",(self.data.dro_units == _MM))
+
+ # init the function to hide the cursor
+ def init_hide_cursor(self):
+ self.widgets.chk_hide_cursor.set_active(self.data.hide_cursor)
+ # if hide cursor requested
+ # we set the graphics to use touchscreen controls
+ if self.data.hide_cursor:
+ self.widgets.window1.window.set_cursor(INVISABLE)
+ self.widgets.gremlin.set_property("use_default_controls",False)
+ else:
+ self.widgets.window1.window.set_cursor(None)
+ self.widgets.gremlin.set_property("use_default_controls",True)
+
+ # init the keyboard shortcut bindings
+ def initialize_keybindings(self):
+ try:
+ accel_group = gtk.AccelGroup()
+ self.widgets.window1.add_accel_group(accel_group)
+ self.widgets.button_estop.add_accelerator("clicked", accel_group, 65307,0, gtk.ACCEL_LOCKED)
+ except:
+ pass
+ self.widgets.window1.connect("key_press_event", self.on_key_event,1)
+ self.widgets.window1.connect("key_release_event", self.on_key_event,0)
+
+ def on_key_event(self, widget, event, signal):
+
+ #get the keyname
+ keyname = gtk.gdk.keyval_name(event.keyval)
+
+ # estop with F1 shold work every time
+ # so should also escape aboart actions
+ if keyname == "F1": # will estop the machine, but not reset estop!
+ self.emc.estop(1)
+ return True
+ if keyname == "Escape":
+ self.emc.abort()
+ return True
+
+ # This will avoid excecuting the key press event several times caused by keyboard auto repeat
+ if self.data.key_event_last[0] == keyname and self.data.key_event_last[1] == signal:
+ return True
+
+ try:
+ if keyname =="F2" and signal:
+ # only turn on if no estop!
+ if self.widgets.tbtn_estop.get_active():
+ return True
+ self.widgets.tbtn_on.emit("clicked")
+ return True
+ except:
+ pass
+
+# if keyname =="F5":
+# self.notification.add_message("Dies ist die erste Nachricht")
+# self.widgets.window1.grab_focus()
+# return True
+# if keyname =="F6":
+# self.notification.add_message("Dies ist die zweite Nachricht")
+# self.widgets.window1.grab_focus()
+# return True
+# if keyname =="F7":
+# self.notification.add_message("Dies ist die dritte Nachricht")
+# self.widgets.window1.grab_focus()
+# return True
+# if keyname =="F8":
+# self.notification.del_message(-1)
+# self.widgets.window1.grab_focus()
+# return True
+# if keyname =="F9":
+# self.notification.del_message(5)
+# self.widgets.window1.grab_focus()
+# return True
+# if keyname =="F10":
+# self.notification.del_first()
+# self.widgets.window1.grab_focus()
+# return True
+
+ # if the user do not want to use keyboard shortcuts, we leave here
+ # in this case we do not return true, otherwise entering code in MDI history
+ # and the integrated editor will not work
+ if not self.widgets.chk_use_kb_shortcuts.get_active():
+ print("Settings say: do not use keyboard shortcuts, aboart")
+ return
+
+ # Only in manual mode jogging with keyboard is allowed
+ # in this case we do not return true, otherwise entering code in MDI history
+ # and the integrated editor will not work
+ # we also check if we are in settings or terminal or alarm page
+ if self.gscreen.emcstat.task_mode <> _MANUAL or not self.widgets.ntb_main.get_current_page() == 0:
+ return
+
+ # offset page is active, so keys must go through
+ if self.widgets.ntb_preview.get_current_page() == 1:
+ return
+
+ # tooledit page is active, so keys must go through
+ if self.widgets.ntb_preview.get_current_page() == 2:
+ return
+
+ # take care of differnt key handling for lathe operation
+ if self.data.lathe_mode:
+ if keyname == "Page_Up" or keyname == "Page_Down":
+ return
+
+ if keyname == "Up":
+ if self.data.lathe_mode:
+ if self.backtool_lathe:
+ widget = self.widgets.btn_x_plus
+ else:
+ widget = self.widgets.btn_x_minus
+ else:
+ widget = self.widgets.btn_y_plus
+ if signal:
+ self.on_btn_jog_pressed(widget)
+ else:
+ self.on_btn_jog_released(widget)
+ elif keyname == "Down":
+ if self.data.lathe_mode:
+ if self.backtool_lathe:
+ widget = self.widgets.btn_x_minus
+ else:
+ widget = self.widgets.btn_x_plus
+ else:
+ widget = self.widgets.btn_y_minus
+ if signal:
+ self.on_btn_jog_pressed(widget)
+ else:
+ self.on_btn_jog_released(widget)
+ elif keyname == "Left":
+ if self.data.lathe_mode:
+ widget = self.widgets.btn_z_minus
+ else:
+ widget = self.widgets.btn_x_minus
+ if signal:
+ self.on_btn_jog_pressed(widget)
+ else:
+ self.on_btn_jog_released(widget)
+ elif keyname == "Right":
+ if self.data.lathe_mode:
+ widget = self.widgets.btn_z_plus
+ else:
+ widget = self.widgets.btn_x_plus
+ if signal:
+ self.on_btn_jog_pressed(widget)
+ else:
+ self.on_btn_jog_released(widget)
+ elif keyname == "Page_Up":
+ widget = self.widgets.btn_z_plus
+ if signal:
+ self.on_btn_jog_pressed(widget)
+ else:
+ self.on_btn_jog_released(widget)
+ elif keyname == "Page_Down":
+ widget = self.widgets.btn_z_minus
+ if signal:
+ self.on_btn_jog_pressed(widget)
+ else:
+ self.on_btn_jog_released(widget)
+ else:
+ print("This key has not been implemented yet")
+ print "Key %s (%d) was pressed" % (keyname, event.keyval),signal, self.data.key_event_last
+ self.data.key_event_last = keyname,signal
+ return True
+
+ # check if macros are in the INI file and add them to MDI Button List
+ def add_macro_button(self):
+ macros = self.gscreen.inifile.findall("MACROS", "MACRO")
+ num_macros = len(macros)
+ if num_macros > 9:
+ message = _("no more than 9 macros are allowed, only the first 9 will be used")
+ self.gscreen.add_alarm_entry(message)
+ print(message)
+ num_macros = 9
+ for increment in range(0,num_macros):
+ name = macros[increment]
+ # shorten the name if it is to long
+ 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
+ # we add the button to a list to be able later to see what makro to excecute
+ self.macrobuttons.append(btn)
+ self.widgets.hbtb_MDI.pack_start(btn,True,True,0)
+ btn.show()
+ # if there is still place, we fill it with empty labels, to be sure the button will not be on differnt
+ # places if the amount of macros change.
+ 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
+
+ # What to do if a macro button has been pushed
+ def on_btn_macro_pressed(self, widget = None, data = None):
+ o_codes = data.split()
+ subroutines_folder = self.gscreen.inifile.find("RS274NGC", "SUBROUTINE_PATH")
+ if not subroutines_folder:
+ subroutines_folder = self.gscreen.inifile.find("DISPLAY", "PROGRAM_PREFIX")
+ if not subroutines_folder:
+ message = _("No subroutine folder or program prefix is given in the ini file \n")
+ message += _("so the corresponding file could not be found")
+ self.gscreen.warning_dialog(_("Important Warning"), True, message)
+ self.gscreen.add_alarm_entry( message)
+ self.widgets.statusbar1.push(1, message)
+ return
+ file = subroutines_folder + "/" + o_codes[0] + ".ngc"
+ if not os.path.isfile(file):
+ message = _("File %s of the macro could not be found\n"%[o_codes[0] + ".ngc"])
+ message += _("we searched in subdirectory %s"%[subroutines_folder])
+ self.gscreen.warning_dialog(_("Important Warning"), True, message)
+ self.gscreen.add_alarm_entry( message)
+ self.widgets.statusbar1.push(1, message)
+ return
+ 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, integer=False )
+ if parameter == "ERROR":
+ 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
+ elif parameter == "CANCEL":
+ self.gscreen.add_alarm_entry(_("entry for macro %s has been canceled")%o_codes[0])
+ return
+ else:
+ self.gscreen.add_alarm_entry(_("macro {0} , parameter {1} set to {2:f}".format(o_codes[0],code,parameter)))
+ command = command + " [" + str(parameter) + "] "
+# ToDo: Should not only clear the plot, but also the loaded programm?
+ #self.emc.emccommand.program_open("")
+ #self.emc.emccommand.reset_interpreter()
+ self.widgets.gremlin.clear_live_plotter()
+# ToDo: End
+ 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.btn_show_kbd.set_property("tooltip-text",_("interrupt running macro"))
+ self.widgets.ntb_info.set_current_page(0)
+
+ # There are some settings we can only do if the window is on the screen allready
+ def on_window1_show(self, widget, data=None):
+ # it is time to get the correct estop state and set the button status
+ self.gscreen.status.emcstat.poll()
+ estop = self.gscreen.status.emcstat.task_state == self.gscreen.status.emc.STATE_ESTOP
+ if estop:
+ self.widgets.tbtn_estop.set_active(True)
+ self.widgets.tbtn_estop.set_image(self.widgets.img_emergency)
+ self.widgets.tbtn_on.set_image(self.widgets.img_machine_off)
+ else:
+ self.widgets.tbtn_estop.set_active(False)
+ self.widgets.tbtn_estop.set_image(self.widgets.img_emergency_off)
+ self.widgets.tbtn_on.set_sensitive(True)
+
+ # if a file should be loaded, we will do so
+ file = self.gscreen.prefs.getpref("open_file", " ", str)
+ if file:
+ self.widgets.file_to_load_chooser.set_filename(file)
+ self.widgets.hal_action_open.load_file(file)
+
+ # check how to start the GUI
+ start_as = "rbtn_" + self.gscreen.prefs.getpref("screen1", "window",str)
+ self.widgets[start_as].set_active(True)
+ if start_as == "rbtn_fullscreen":
+ self.widgets.window1.fullscreen()
+ elif start_as == "rbtn_maximized":
+ self.widgets.window1.maximize()
+ else:
+ self.widgets.window1.move(int(self.widgets.adj_x_pos.get_value()),
+ int(self.widgets.adj_y_pos.get_value()))
+ self.widgets.window1.resize(int(self.widgets.adj_width.get_value()),
+ int(self.widgets.adj_height.get_value()))
+
+ # does the user want to show screen2
+ self.widgets.tbtn_use_screen2.set_active(self.gscreen.prefs.getpref("use_screen2", False, bool))
+
+ # kill keyboard and estop machine before closing
+ def on_window1_destroy(self, widget, data=None):
+ self.kill_keyboard()
+ print "estopping / killing gscreen"
+ self.emc.machine_off(1)
+ self.emc.estop(1)
+ time.sleep(2)
+ gtk.main_quit()
+
+ # use the current loaded file to be loaded on start up
+ def on_btn_use_current_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("use_current_clicked %s"%self.data.file)
+ if self.data.file:
+ self.widgets.file_to_load_chooser.set_filename(self.data.file)
+ self.gscreen.prefs.putpref("open_file", self.data.file, str)
+
+ # Clear the status to load a file on start up, so ther will not be loaded a programm
+ # on the next start of the GUI
+ def on_btn_none_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("button none clicked %s")
+ self.widgets.file_to_load_chooser.set_filename(" ")
+ self.gscreen.prefs.putpref("open_file", " ", str)
+
+ # toggle emergency button
+ def on_tbtn_estop_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("tbtn_estop_clicked")
+ if self.widgets.tbtn_estop.get_active(): # estop is active, open circuit
+ self.widgets.tbtn_estop.set_image(self.widgets.img_emergency)
+ self.widgets.tbtn_on.set_image(self.widgets.img_machine_off)
+ self.emc.estop(1)
+ self.widgets.tbtn_on.set_sensitive(False)
+ self.widgets.tbtn_on.set_active(False)
+ else: # estop circuit is fine
+ self.widgets.tbtn_estop.set_image(self.widgets.img_emergency_off)
+ self.widgets.tbtn_on.set_image(self.widgets.img_machine_on)
+ self.emc.estop_reset(1)
+ self.widgets.tbtn_on.set_sensitive(True)
+
+# ToDo: find out why the values are modified by 1 on startup
+# and correct this to avoid the need of this clicks
+ # will need to click, otherwise we get 101 % after startup
+ self.widgets.btn_feed_100.emit("clicked")
+ self.widgets.btn_spindle_100.emit("clicked")
+# ToDo: End
+
+ # toggle machine on / off button
+ def on_tbtn_on_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("hal_tgbt_on_clicked")
+ if self.widgets.tbtn_on.get_active():
+ self.widgets.tbtn_on.set_image(self.widgets.img_machine_on)
+ self.emc.machine_on(1)
+ self._update_widgets(True)
+ else:
+ self.widgets.tbtn_on.set_image(self.widgets.img_machine_off)
+ self.emc.machine_off(1)
+ self._update_widgets(False)
+
+ def _update_widgets(self,state):
+ widgetlist = ["rbt_manual", "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_select_tool_by_no",
+ "btn_spindle_100", "scl_max_vel", "scl_spindle",
+ "btn_tool_touchoff_x", "btn_tool_touchoff_z"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,state)
+
+ # The mode buttons
+ def on_rbt_manual_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_manual_clicked")
+ self.emc.set_manual_mode()
+ self.widgets.ntb_main.set_current_page(0)
+ self.widgets.ntb_button.set_current_page(0)
+ self.widgets.ntb_info.set_current_page(0)
+ self.widgets.ntb_jog.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()
+ if self.widgets.chk_use_kb_on_mdi.get_active():
+ self.widgets.ntb_info.set_current_page(1)
+ else:
+ self.widgets.ntb_info.set_current_page(0)
+ self.widgets.ntb_main.set_current_page(0)
+ self.widgets.ntb_button.set_current_page(1)
+ self.widgets.ntb_jog.set_current_page(1)
+ self.widgets.hal_mdihistory.entry.grab_focus()
+
+ 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)
+ self.widgets.ntb_info.set_current_page(0)
+ self.widgets.ntb_jog.set_current_page(2)
+
+ def on_rbt_setup_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_setup_clicked")
+ code = False
+ # here the user don"t want an unlock code
+ if self.widgets.rbt_no_unlock.get_active():
+ code = True
+ # if hal pin is true, we are allowed to enter settings, this may be
+ # realized using a key switch
+ if self.widgets.rbt_hal_unlock.get_active() and self.gscreen.halcomp["unlock-settings"]:
+ code = True
+ # else we ask for the code using the system.dialog
+ if self.widgets.rbt_use_unlock.get_active():
+ if self.system_dialog():
+ code = True
+ else:
+ code = False
+ # Lets see if the user has the right to enter settings
+ if code:
+ 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:
+ if self.widgets.rbt_hal_unlock.get_active():
+ message = _("Hal Pin is low, Access denied")
+ else:
+ message = _("wrong code entered, Access denied")
+ self.gscreen.warning_dialog(_("Just to warn you"), True, message)
+ self.gscreen.add_alarm_entry( message)
+ self.widgets.statusbar1.push(1, message)
+ self.widgets.rbt_manual.emit("clicked")
+
+ # 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")
+ calc.set_editable(True)
+ calc.entry.connect("activate", lambda w : dialog.emit("response",gtk.RESPONSE_ACCEPT))
+ 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
+
+ # Show or hide the user tabs
+ def on_tbtn_user_tabs_toggled(self, widget, data=None):
+ if widget.get_active():
+ self.widgets.ntb_main.set_current_page(2)
+ self.widgets.tbtn_fullsize_preview.set_sensitive(False)
+ else:
+ self.widgets.ntb_main.set_current_page(0)
+ self.widgets.tbtn_fullsize_preview.set_sensitive(True)
+
+ # 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)
+ if len(self.data.axis_list) > 3:
+ size = pango.AttrSize(22500, 0, -1)
+ else:
+ 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 # not RGB
+ bgcolor = self.data.abs_color # is RGB
+ 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]:
+ fg_color = "#00FF00"
+ fgcolor = (0,65535,0)
+ else:
+ fg_color = "#FF0000"
+ fgcolor = (65000,0,0)
+ self.gscreen.add_alarm_entry("%s_homed"%axis + " = " + str(self.data["%s_is_homed"%axis]))
+ if axis == self.axisletter_four:
+ axis = "4"
+ self._dro_label_color_change("hal_dro_%s"%axis,bgcolor,fgcolor)
+ self._dro_label_color_change("lbl_%s"%axis,bgcolor,fgcolor)
+
+ widgetname = "eventbox_" + axis
+ self.widgets[widgetname].modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bg_color))
+ widgetname ="eventbox_dro_" + axis
+ self.widgets[widgetname].modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bg_color))
+
+
+ if self.data.lathe_mode:
+ if "G8" in self.data.active_gcodes:
+ self.widgets.eventbox_y.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#F2F1F0"))
+ self.widgets.eventbox_dro_y.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#F2F1F0"))
+ self.widgets.eventbox_x.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#000000"))
+ self.widgets.eventbox_dro_x.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#000000"))
+ fgcolor = self.gscreen.convert_to_rgb(gtk.gdk.color_parse(fg_color))
+ bgcolor = self.gscreen.convert_to_rgb(gtk.gdk.color_parse("#F2F1F0"))
+ self._dro_label_color_change("lbl_y", bgcolor, fgcolor)
+ self._dro_label_color_change("hal_dro_y", bgcolor, fgcolor)
+ else:
+ self.widgets.eventbox_x.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#F2F1F0"))
+ self.widgets.eventbox_dro_x.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#F2F1F0"))
+ self.widgets.eventbox_y.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#000000"))
+ self.widgets.eventbox_dro_y.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#000000"))
+ fgcolor = self.gscreen.convert_to_rgb(gtk.gdk.color_parse(fg_color))
+ bgcolor = self.gscreen.convert_to_rgb(gtk.gdk.color_parse("#F2F1F0"))
+ self._dro_label_color_change("lbl_x", bgcolor, fgcolor)
+ self._dro_label_color_change("hal_dro_x", bgcolor, fgcolor)
+
+ 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.data.all_homed = False
+ self.emc.unhome_all(1)
+ for axis in self.data.axis_list:
+ self.data["%s_is_homed"%axis] = False
+ self._update_homed(axis)
+ if self.data.lathe_mode:
+ self.data.y_is_homed = False
+ self._update_homed("y")
+
+ 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
+ elif widget == self.widgets.btn_home_4:
+ axis = "xyzabcuvw".index(self.axisletter_four)
+ self.emc.home_selected(axis)
+
+ 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())
+
+ 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())
+ 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 not self.widgets.chk_show_dro.get_active():
+ self.widgets.gremlin.set_property("enable_dro",False)
+
+ # 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.tbtn_estop.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)
+
+ def on_btn_classicladder_clicked(self, widget, data=None):
+ if hal.component_exists("classicladder_rt"):
+ p = os.popen("classicladder &","w")
+ else:
+ self.gscreen.warning_dialog(_("INFO:"), True,
+ _("Classicladder real-time component not detected"))
+ self.gscreen.add_alarm_entry(_("ladder not available - is the real-time component loaded?"))
+
+ def _check_spindle_max(self,rpm):
+ spindle_override = self.widgets.scl_spindle.get_value() / 100
+ real_spindle_speed = rpm * spindle_override
+ if real_spindle_speed > self.widgets.adj_spindle_bar_max.get_value():
+ try:
+ value_to_set = self.widgets.scl_spindle.get_value()/(real_spindle_speed/self.widgets.adj_spindle_bar_max.get_value())
+ self.widgets.scl_spindle.set_value(value_to_set)
+ except:
+ pass
+
+ # spindle stuff
+ def _set_spindle(self, widget, data=None):
+ rpm = abs(float(self.data.active_spindle_command))
+ if rpm == 0:
+ rpm = self.data.spindle_start_rpm
+
+ self._check_spindle_max(rpm)
+
+ if widget == self.widgets.rbt_forward:
+ self.emc.emccommand.spindle(1,rpm)
+ elif widget == self.widgets.rbt_reverse:
+ self.emc.emccommand.spindle(-1,rpm)
+ elif widget == self.widgets.rbt_stop:
+ self.emc.emccommand.spindle(0)
+ else:
+ self.gscreen.add_alarm_entry(_("Something went wrong, we have an unknown widget"))
+
+ if self.log: self.gscreen.add_alarm_entry("Spindle set to %i rpm, mode is %s"%(rpm,self.emc.get_mode()))
+ self.widgets.lbl_spindle_act.set_label("S %s"%rpm)
+ self.on_scl_spindle_value_changed(self.widgets.scl_spindle)
+
+ 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("max",float(self.min_spindle_rev)*-1)
+ self.widgets.hal_hbar_spindle_feedback.set_property("min",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):
+ if not self.data.active_spindle_command:
+ return
+ spindle_override = self.widgets.scl_spindle.get_value() / 100
+ real_spindle_speed = float(self.data.active_spindle_command) * spindle_override
+ if real_spindle_speed > self.widgets.adj_spindle_bar_max.get_value():
+ try:
+ value_to_set = widget.get_value()/(real_spindle_speed/self.widgets.adj_spindle_bar_max.get_value())
+ widget.set_value(value_to_set)
+ except:
+ pass
+ 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 on_adj_spindle_bar_min_value_changed(self, widget, data = None):
+ if self.log: self.gscreen.add_alarm_entry("Spindle bar min has been set to %s"%widget.get_value())
+ self.gscreen.prefs.putpref("spindle_bar_min", widget.get_value(),float)
+
+ def on_adj_spindle_bar_max_value_changed(self, widget, data = None):
+ if self.log: self.gscreen.add_alarm_entry("Spindle bar max has been set to %s"%widget.get_value())
+ self.gscreen.prefs.putpref("spindle_bar_max", widget.get_value(),float)
+
+ def _update_spindle_btn(self):
+ if self.gscreen.emcstat.task_mode == _AUTO and self.interpreter == _RUN:
+ return
+ if not self.data.spindle_speed:
+ self.widgets.rbt_stop.set_active(True)
+ 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.data.flood:
+ if not self.widgets.tbtn_flood.get_active():
+ self.widgets.tbtn_flood.set_active(True)
+ self.widgets.tbtn_flood.set_image(self.widgets.img_coolant_on)
+ else:
+ if self.widgets.tbtn_flood.get_active():
+ self.widgets.tbtn_flood.set_active(False)
+ self.widgets.tbtn_flood.set_image(self.widgets.img_coolant_off)
+ if self.data.mist:
+ if not self.widgets.tbtn_mist.get_active():
+ self.widgets.tbtn_mist.set_active(True)
+ self.widgets.tbtn_mist.set_image(self.widgets.img_mist_on)
+ else:
+ if self.widgets.tbtn_mist.get_active():
+ self.widgets.tbtn_mist.set_active(False)
+ self.widgets.tbtn_mist.set_image(self.widgets.img_mist_off)
+
+ # feed stuff
+ def on_scl_feed_value_changed(self, widget, data=None):
+ self.emc.feed_override(self.widgets.scl_feed.get_value() / 100)
+
+ 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 labels
+ def _update_vel(self):
+ self.widgets.lbl_current_vel.set_text("%d" %self.data.velocity)
+ feed_override = self.widgets.scl_feed.get_value() / 100
+ real_feed = float(self.widgets.lbl_active_feed.get_text()) * feed_override
+ if "G95" in self.data.active_gcodes:
+ self.widgets.lbl_feed_act.set_text("F %.2f" %real_feed)
+ self.widgets.lbl_active_feed.set_label("%.2f"%float(self.data.active_feed_command))
+ else:
+ self.widgets.lbl_feed_act.set_text("F %d" %real_feed)
+ self.widgets.lbl_active_feed.set_label(self.data.active_feed_command)
+
+ # 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
+ self.gscreen.halcomp["jog-increment"] = self.distance
+
+ def on_adj_jog_vel_value_changed(self, widget, data = None):
+ if widget.get_value() > self.widgets.adj_max_vel.get_value():
+ widget.set_value(self.widgets.adj_max_vel.get_value())
+ self.emc.continuous_jog_velocity(widget.get_value())
+
+ def on_adj_max_vel_value_changed(self, widget, data = None):
+ if widget.get_value() < self.widgets.adj_jog_vel.get_value():
+ self.widgets.adj_jog_vel.set_value(widget.get_value())
+ self.emc.max_velocity(widget.get_value() / 60)
+
+ def on_btn_jog_pressed(self, widget, data = None):
+ # only in manual mode we will allow jogging the axis at this development state
+ if not self.gscreen.emcstat.task_mode == _MANUAL:
+ return
+
+ axisletter = widget.get_label()[0]
+ if not axisletter.lower() in "xyzabcuvw":
+ print ("unknown axis %s"%axisletter)
+ return
+
+ dir = widget.get_label()[1]
+ if dir == "+":
+ direction = 1
+ else:
+ direction = -1
+
+ axis = "xyzabcuvw".index(axisletter.lower())
+
+ self.gscreen.add_alarm_entry("btn_jog_%i_%i"%(axis,direction))
+
+ if self.distance <> 0: # incremental jogging
+ # DOKU : emc.incremental_jog(<axis number>,<direction>,<distance to jog>)
+ self.emc.incremental_jog(axis, direction, self.distance)
+ else: # continuous jogging
+ self.emc.continuous_jog(axis,direction)
+
+ def on_btn_jog_released(self, widget, data = None):
+ axisletter = widget.get_label()[0]
+ if not axisletter.lower() in "xyzabcuvw":
+ print ("unknown axis %s"%axisletter)
+ return
+
+ axis = "xyzabcuvw".index(axisletter.lower())
+
+ if self.distance <>0:
+ pass
+ else:
+ self.emc.continuous_jog(axis,0)
+
+ # this are the MDI thinks we need
+ def on_btn_delete_clicked(self, widget, data=None):
+ message = _("Do you really 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
+
+ def on_tbtn_use_screen2_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("show window 2 set to %s"%widget.get_active())
+ self.gscreen.prefs.putpref("use_screen2", widget.get_active(), bool)
+ if widget.get_active():
+ self.widgets.window2.show()
+ if self.widgets.rbtn_window.get_active():
+ try:
+ pos = self.widgets.window1.get_position()
+ size = self.widgets.window1.get_size()
+ left = pos[0] +size[0]
+ self.widgets.window2.move(left,pos[1])
+ except:
+ pass
+ else:
+ self.widgets.window2.hide()
+
+ 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.emc.abort()
+ for btn in self.macrobuttons:
+ btn.set_sensitive(True)
+ self.widgets.btn_show_kbd.set_image(self.widgets.img_keyboard)
+ self.widgets.btn_show_kbd.set_property("tooltip-text",_("This button will show or hide the keyboard"))
+ elif 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):
+ if self.emc.get_mode() == _MDI:
+ self.widgets.hal_mdihistory.entry.grab_focus()
+ elif self.emc.get_mode() == _AUTO:
+ self.widgets.gcode_view.grab_focus()
+
+ # Three back buttons to be able to leave notebook pages
+ # All use the same callback offset
+ 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)
+ elif self.widgets.ntb_button.get_current_page() == 8: # File selection mode
+ 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)
+ self.widgets.ntb_preview.set_current_page(0)
+
+ def on_btn_clear_statusbar_clicked(self, widget, data=None):
+ self.widgets.statusbar1.pop(self.gscreen.statusbar_id)
+
+ # The offset settings, set to zero
+ 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)
+ self._show_offset_tab(True)
+ if self.widgets.rbtn_show_preview.get_active():
+ self.widgets.ntb_preview.set_current_page(0)
+
+ def on_tbtn_edit_offsets_toggled(self, widget, data=None):
+ state = widget.get_active()
+ self.widgets.offsetpage1.edit_button.set_active(state)
+ widgetlist = ["btn_zero_x","btn_zero_y","btn_zero_z","btn_set_value_x","btn_set_value_y",
+ "btn_set_value_z","btn_set_selected","ntb_jog","btn_zero_g92"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,not state)
+
+ if not state: # we must switch back to manual mode, otherwise jogging is not possible
+ self.emc.set_manual_mode()
+
+ # show virtual keyboard
+ if state:
+ self.widgets.ntb_info.set_current_page(1)
+ else:
+ self.widgets.ntb_info.set_current_page(0)
+
+ def on_btn_zero_g92_clicked(self, widget, data=None):
+ self.widgets.offsetpage1.zero_g92(self)
+
+ def _show_offset_tab(self,state):
+ page = self.widgets.ntb_preview.get_nth_page(1)
+ print("offset",state,page.get_visible())
+ if page.get_visible()and state or not page.get_visible()and not state:
+ return
+ if state:
+ page.show()
+ self.widgets.ntb_preview.set_property("show-tabs",state)
+ self.widgets.ntb_preview.set_current_page(1)
+ self.widgets.offsetpage1.mark_active((self.system_list[self.data.system]).lower())
+ if self.widgets.chk_use_kb_on_offset.get_active():
+ self.widgets.ntb_info.set_current_page(1)
+ else:
+ names = self.widgets.offsetpage1.get_names()
+ for system,name in names:
+ system_name = "system_name_%s"%system
+ self.gscreen.prefs.putpref(system_name, name, str)
+ page.hide()
+ self.widgets.tbtn_edit_offsets.set_active(False)
+ self.widgets.ntb_preview.set_current_page(0)
+ self.widgets.ntb_info.set_current_page(0)
+ if self.widgets.ntb_preview.get_n_pages() <= 4: # else user tabs are availible
+ self.widgets.ntb_preview.set_property("show-tabs",state)
+
+#ToDo: what to do when there are more axis?
+ def on_btn_zero_x_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_zero_X_clicked")
+ self.emc.set_mdi_mode()
+ self.gscreen.mdi_control.set_axis("X",0)
+ self.widgets.btn_reload.emit("clicked")
+ self.emc.set_manual_mode()
+
+ def on_btn_zero_y_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_zero_Y_clicked")
+ self.emc.set_mdi_mode()
+ self.gscreen.mdi_control.set_axis("Y",0)
+ self.widgets.btn_reload.emit("clicked")
+ self.emc.set_manual_mode()
+
+ def on_btn_zero_z_clicked(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("btn_zero_Z_clicked")
+ self.emc.set_mdi_mode()
+ self.gscreen.mdi_control.set_axis("Z",0)
+ self.widgets.btn_reload.emit("clicked")
+ self.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 unknown axis")%axis)
+ return
+ self.gscreen.add_alarm_entry("btn_set_value_%s_clicked"%axis)
+ preset = self.gscreen.prefs.getpref("offset_axis_%s"%axis, 0, float)
+ offset = self.entry_dialog(data = preset, header = _("Enter value for axis %s")%axis,
+ label=_("Set axis %s to:")%axis, integer = False )
+ if offset == "CANCEL" or offset == "ERROR":
+ return
+ if offset != False or offset == 0:
+ self.gscreen.add_alarm_entry(_("offset {0} set to {1:f}".format(axis,offset)))
+ self.emc.set_mdi_mode()
+ self.gscreen.mdi_control.set_axis(axis,offset)
+ self.widgets.btn_reload.emit("clicked")
+ self.emc.set_manual_mode()
+ self.gscreen.prefs.putpref("offset_axis_%s"%axis, offset, float)
+ else:
+ print(_("Conversion error in btn_set_value"))
+ self.gscreen.add_alarm_entry(_("Offset conversion error because off wrong entry"))
+ self.gscreen.warning_dialog(_("Conversion error in btn_set_value!"), True,
+ _("Please enter only numerical values\nValues have not been applied"))
+#ToDo:End
+
+ def on_btn_set_selected_clicked(self, widget, data=None):
+ system , name = self.widgets.offsetpage1.get_selected()
+ if not system:
+ message = _("you did not selected a system to be changed to, so nothing will be changed")
+ self.gscreen.warning_dialog(_("Important Warning!"), True, message)
+ self.gscreen.add_alarm_entry(message)
+ return
+ if system == self.system_list[self.data.system]:
+ return
+ else:
+ self.emc.set_mdi_mode()
+ self.gscreen.mdi_control.user_command(system)
+ self.emc.set_manual_mode()
+
+ def entry_dialog(self, data=None, header=_("Enter value") ,label=_("Enter the value to set"), integer = False):
+ 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")
+ calc.set_editable(True)
+ calc.entry.connect("activate", lambda w : dialog.emit("response",gtk.RESPONSE_ACCEPT))
+ dialog.parse_geometry("400x400")
+ dialog.set_decorated(True)
+ dialog.show_all()
+ if integer: # The user is only allowed to enter integer values, we hide some button
+ calc.num_pad_only(True)
+ temp = calc.wTree.get_object("Dot")
+ temp.hide()
+ response = dialog.run()
+ value = calc.get_value()
+ dialog.destroy()
+ if response == gtk.RESPONSE_ACCEPT:
+ if value!= None:
+ print("Value = ",value)
+ return float(value)
+ else:
+ return "ERROR"
+ return "CANCEL"
+
+ # 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 to %s"%widget.get_active())
+ if widget.get_active():
+ widget.set_label("Abs.")
+ self.widgets.gremlin.set_property("use_relative",False)
+ self.set_property_dro("reference_type", 0)
+ else:
+ widget.set_label(self.system_list[self.data.system])
+ 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 to %s"%widget.get_active())
+ if widget.get_active():
+ widget.set_label("GTD.")
+ self.widgets.gremlin.set_property("show_dtg",True)
+ self.set_property_dro("reference_type", 2)
+ else:
+ widget.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 to %s"%widget.get_active())
+ if widget.get_active():
+ widget.set_label("Inch")
+ self.data.dro_units = _IMPERIAL # 0 = _IMPERIAL ; 1 = _MM
+ else:
+ widget.set_label("mm")
+ self.data.dro_units = _MM # 0 = _IMPERIAL ; 1 = _MM
+ self.set_property_dro("display_units_mm", not widget.get_active())
+ self.widgets.gremlin.set_property("metric_units", not widget.get_active())
+
+ def set_property_dro(self, property, status):
+ for axis in self.data.axis_list:
+ if axis not in "xyz":
+ axis = "4"
+ self.widgets["hal_dro_%s"%axis].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())
+
+ def on_rbt_unlock_toggled(self, widget, data = None):
+ if widget.get_active():
+ if widget == self.widgets.rbt_use_unlock:
+ self.gscreen.prefs.putpref("unlock_way", "use", str)
+ elif widget == self.widgets.rbt_no_unlock:
+ self.gscreen.prefs.putpref("unlock_way", "no", str)
+ else:
+ self.gscreen.prefs.putpref("unlock_way", "hal", str)
+
+ def on_rbtn_run_from_line_toggled(self, widget, data = None):
+ if widget.get_active():
+ if widget == self.widgets.rbtn_no_run_from_line:
+ self.gscreen.prefs.putpref("run_from_line", "no_run", str)
+ self.widgets.btn_from_line.set_sensitive(False)
+ else: #widget == self.widgets.rbtn_run_from_line:
+ self.gscreen.prefs.putpref("run_from_line", "run", str)
+ self.widgets.btn_from_line.set_sensitive(True)
+
+ def on_chk_use_kb_on_offset_toggled(self, widget, data = None):
+ self.gscreen.prefs.putpref("show_keyboard_on_offset", widget.get_active(), bool)
+
+ def on_chk_use_kb_on_tooledit_toggled(self, widget, data = None):
+ self.gscreen.prefs.putpref("show_keyboard_on_tooledit", widget.get_active(), bool)
+
+ def on_chk_use_kb_on_edit_toggled(self, widget, data = None):
+ self.gscreen.prefs.putpref("show_keyboard_on_edit", widget.get_active(), bool)
+
+ def on_chk_use_kb_on_mdi_toggled(self, widget, data = None):
+ self.gscreen.prefs.putpref("show_keyboard_on_mdi", widget.get_active(), bool)
+
+ def on_chk_use_kb_on_file_selection_toggled(self, widget, data = None):
+ self.gscreen.prefs.putpref("show_keyboard_on_file_selection", widget.get_active(), bool)
+
+ def on_chk_use_desktop_notify_toggled(self, widget, data = None):
+ self.gscreen.prefs.putpref("desktop_notify", widget.get_active(), bool)
+ self.data.desktop_notify = widget.get_active()
+
+ def on_chk_use_kb_shortcuts_toggled(self, widget, data = None):
+ self.gscreen.prefs.putpref("use_keyboard_shortcuts", widget.get_active(), bool)
+
+ def on_rbtn_show_preview_toggled(self, widget, data = None):
+ self.gscreen.prefs.putpref("show_preview_on_offset", widget.get_active(), bool)
+
+ def on_adj_scale_max_vel_value_changed(self, widget, data = None):
+ self.gscreen.prefs.putpref("scale_max_vel", widget.get_value(), float)
+ self.scale_max_vel = widget.get_value()
+
+ def on_adj_scale_jog_vel_value_changed(self, widget, data = None):
+ self.gscreen.prefs.putpref("scale_jog_vel", widget.get_value(), float)
+ self.scale_jog_vel = widget.get_value()
+
+ def on_adj_scale_feed_override_value_changed(self, widget, data = None):
+ self.gscreen.prefs.putpref("scale_feed_override", widget.get_value(), float)
+ self.scale_feed_override = widget.get_value()
+
+ def on_adj_scale_spindle_override_value_changed(self, widget, data = None):
+ self.gscreen.prefs.putpref("scale_spindle_override", widget.get_value(), float)
+ self.scale_spindle_override = widget.get_value()
+
+ def on_rbtn_fullscreen_toggled(self, widget):
+ if self.log: self.gscreen.add_alarm_entry("rbtn_fullscreen_toggled to %s"%widget.get_active())
+ if widget.get_active():
+ self.widgets.window1.fullscreen()
+ self.gscreen.prefs.putpref("screen1", "fullscreen", str)
+ else:
+ self.widgets.window1.unfullscreen()
+
+ def on_rbtn_maximized_toggled(self, widget):
+ if self.log: self.gscreen.add_alarm_entry("rbtn_maximized_toggled to %s"%widget.get_active())
+ if widget.get_active():
+ self.widgets.window1.maximize()
+ self.gscreen.prefs.putpref("screen1", "maximized", str)
+ else:
+ self.widgets.window1.unmaximize()
+
+ def on_rbtn_window_toggled(self, widget):
+ if self.log: self.gscreen.add_alarm_entry("rbtn_window_toggled to %s"%widget.get_active())
+ self.widgets.spbtn_x_pos.set_sensitive(widget.get_active())
+ self.widgets.spbtn_y_pos.set_sensitive(widget.get_active())
+ self.widgets.spbtn_width.set_sensitive(widget.get_active())
+ self.widgets.spbtn_height.set_sensitive(widget.get_active())
+ # we have to check also if the window is active, because the button is toggled the first time
+ # before the window is shown
+ if widget.get_active() and self.widgets.window1.is_active():
+ self.widgets.window1.move(int(self.widgets.adj_x_pos.get_value()),
+ int(self.widgets.adj_y_pos.get_value()))
+ self.widgets.window1.resize(int(self.widgets.adj_width.get_value()),
+ int(self.widgets.adj_height.get_value()))
+ self.gscreen.prefs.putpref("screen1", "window", str)
+
+ def on_adj_x_pos_value_changed(self, widget, data = None):
+ self.gscreen.prefs.putpref("x_pos", widget.get_value(),float)
+ position = self.widgets.window1.get_position()
+ self.widgets.window1.move(int(widget.get_value()),position[1])
+
+ def on_adj_y_pos_value_changed(self, widget, data = None):
+ self.gscreen.prefs.putpref("y_pos", widget.get_value(),float)
+ position = self.widgets.window1.get_position()
+ self.widgets.window1.move(position[0],int(widget.get_value()))
+
+ def on_adj_width_value_changed(self, widget, data = None):
+ self.gscreen.prefs.putpref("width", widget.get_value(),float)
+ size = self.widgets.window1.get_size()
+ self.widgets.window1.resize(int(widget.get_value()),size[1])
+
+ def on_adj_height_value_changed(self, widget, data = None):
+ self.gscreen.prefs.putpref("height", widget.get_value(),float)
+ size = self.widgets.window1.get_size()
+ self.widgets.window1.resize(size[0],int(widget.get_value()))
+
+ def on_chk_hide_cursor_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("hide_cursor_toggled to %s"%widget.get_active())
+ self.gscreen.prefs.putpref("hide_cursor", widget.get_active())
+ self.data.hide_cursor = widget.get_active()
+ if widget.get_active():
+ self.widgets.window1.window.set_cursor(INVISABLE)
+ else:
+ self.widgets.window1.window.set_cursor(None)
+
+ 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)
+
+ 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)
+
+ 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)
+
+ def on_file_to_load_chooser_file_set(self, widget):
+ if self.log: self.gscreen.add_alarm_entry("file to load on startup set to : %s"%widget.get_filename())
+ print("file to load on startup set to : %s "%widget.get_filename())
+ self.gscreen.prefs.putpref("open_file", widget.get_filename(), str)
+
+ def on_grid_size_value_changed(self, widget, data=None):
+ self.gscreen.set_grid_size(widget)
+
+ def on_tbtn_log_actions_toggled(self, widget, data=None):
+ self.log = widget.get_active()
+ self.gscreen.prefs.putpref("log_actions", widget.get_active(), bool)
+
+ def on_chk_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)
+ self.widgets.chk_show_offsets.set_sensitive(widget.get_active())
+ self.widgets.chk_show_dtg.set_sensitive(widget.get_active())
+
+ def on_chk_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_chk_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.widgets.gremlin.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_button.set_current_page(7)
+ self._show_tooledit_tab(True)
+
+ def _show_tooledit_tab(self,state):
+ page = self.widgets.ntb_preview.get_nth_page(2)
+ print("tooledit",state,page.get_visible())
+ if page.get_visible()and state or not page.get_visible()and not state:
+ return
+ if state:
+ page.show()
+ self.widgets.ntb_preview.set_property("show-tabs",not state)
+ self.widgets.vbx_jog.hide()
+ self.widgets.ntb_preview.set_current_page(2)
+ self.widgets.tooledit1.set_selected_tool(self.data.tool_in_spindle)
+ if self.widgets.chk_use_kb_on_tooledit.get_active():
+ self.widgets.ntb_info.set_current_page(1)
+ else:
+ page.hide()
+ if self.widgets.ntb_preview.get_n_pages() > 4: # user tabs are availible
+ self.widgets.ntb_preview.set_property("show-tabs",not state)
+ self.widgets.vbx_jog.show()
+ self.widgets.ntb_preview.set_current_page(0)
+ self.widgets.ntb_info.set_current_page(0)
+
+ 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_no.set_text(str(toolinfo[1]))
+ 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_no.set_text("0")
+ self.widgets.lbl_tool_dia.set_text("0")
+ self.widgets.lbl_tool_name.set_text(_("No tool description available"))
+ if "G43" in self.data.active_gcodes:
+ mode = self.emc.get_mode()
+ if mode != _AUTO:
+ self.emc.set_mdi_mode()
+ self.gscreen.mdi_control.user_command("G43")
+ if mode == _MANUAL:
+ self.wait_tool_change = True
+ self.on_hal_status_interp_idle(self)
+
+ 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")
+ tool = self.widgets.tooledit1.get_selected_tool()
+ #self._update_toolinfo(tool)
+
+ def on_btn_tool_touchoff_clicked(self, widget, data=None):
+ if not self.widgets.tooledit1.get_selected_tool():
+ return
+ if widget == self.widgets.btn_tool_touchoff_x:
+ axis = "x"
+ elif widget == self.widgets.btn_tool_touchoff_z:
+ axis = "z"
+ else:
+ self.gscreen.warning_dialog(_("Real big error!"), True,
+ _("You managed to come to a place that is not possible in on_btn_tool_touchoff"))
+ return
+
+ if "G41" in self.data.active_gcodes or "G42" in self.data.active_gcodes:
+ message = _("Tool touch off is not possible with cutter radius compensation switched on!\n")
+ message += _("Please emit an G40 before tool touch off")
+ print(message)
+ self.gscreen.add_alarm_entry(message)
+ self.gscreen.warning_dialog(_("Warning Tool Touch off not possible!"), True, message)
+ return
+
+ value = self.entry_dialog(data = None, header = _("Enter value for axis %s to set:")%axis,
+ label=_("Set parameter of tool {0:d} and axis {1} to:".format(self.data.tool_in_spindle,axis)),
+ integer = False)
+ if value == "ERROR":
+ message = _("Conversion error because of wrong entry for touch off axis %s")%axis
+ print(message)
+ self.gscreen.add_alarm_entry(message)
+ self.gscreen.warning_dialog(_("Conversion error !"), True, message)
+ return
+ elif value == "CANCEL":
+ self.gscreen.add_alarm_entry(_("entry for axis %s has been canceled")%axis)
+ return
+ else:
+ self.gscreen.add_alarm_entry(_("axis {0} , has been set to {1:f}".format(axis,value)))
+ self.gscreen.mdi_control.touchoff(self.widgets.tooledit1.get_selected_tool(),axis,value)
+ #self._update_toolinfo(self.data.tool_in_spindle)
+ # will set the label, but the tool do not need to be in the spindle,
+ # so information may be no homogeniuos
+ #self._update_toolinfo(self._get_selected_tool())
+ self.widgets.rbt_manual.emit("clicked")
+
+ # select a tool entering a number
+ def on_btn_select_tool_by_no_clicked(self, widget, data=None):
+ value = self.entry_dialog(data = None, header = _("Enter the tool number as integer "),
+ label=_("Select the tool to change"),integer=True)
+ if value == "ERROR":
+ message = _("Conversion error because of wrong entry for tool number\n")
+ message += _("enter only integer nummbers")
+ print(message)
+ self.gscreen.add_alarm_entry(message)
+ self.gscreen.warning_dialog(_("Conversion error !"), True, message)
+ return
+ elif value == "CANCEL":
+ self.gscreen.add_alarm_entry(_("entry for selection of tool number has been canceled"))
+ return
+ else:
+ if int(value) == self.gscreen.data.tool_in_spindle:
+ message = _("Selected tool is already in spindle, no change needed.")
+ self.gscreen.warning_dialog(_("Important Warning!"), True, message)
+ self.gscreen.add_alarm_entry(message)
+ return
+ self.wait_tool_change = True
+ self.emc.set_mdi_mode()
+ command = "T%s M6"%int(value)
+ self.gscreen.mdi_control.user_command(command)
+ self.wait_tool_change = True
+
+ # set tool with M61 Q? or with T? M6
+ def on_btn_selected_tool_clicked(self, widget, data=None):
+ tool = self.widgets.tooledit1.get_selected_tool()
+ if tool == None:
+ message = _("you selected no or more than one tool, the tool selection must be unique")
+ self.gscreen.warning_dialog(_("Important Warning!"), True, message)
+ self.gscreen.add_alarm_entry(message)
+ return
+ if tool == self.gscreen.data.tool_in_spindle:
+ message = _("Selected tool is already in spindle, no change needed.")
+ self.gscreen.warning_dialog(_("Important Warning!"), True, message)
+ self.gscreen.add_alarm_entry(message)
+ return
+ if tool or tool == 0:
+ tool = int(tool)
+ self.wait_tool_change = True
+ self.emc.set_mdi_mode()
+
+ if widget == self.widgets.btn_change_tool:
+ command = "T%s M6"%tool
+ else:
+ command = "M61 Q%s"%tool
+ #self.on_hal_status_interp_idle(self)
+ self.gscreen.mdi_control.user_command(command)
+ if self.log: self.gscreen.add_alarm_entry("set_tool_with %s"%command)
+ else:
+ message = _("Could not understand the entered tool number. Will not change anything")
+ self.gscreen.warning_dialog(_("Important Warning!"), True, message)
+ self.widgets.statusbar1.push(1,message)
+
+ # 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_rbt_view_y2_toggled(self, widget, data=None):
+ if self.log: self.gscreen.add_alarm_entry("rbt_view_y2_toggled")
+ if self.widgets.rbt_view_y2.get_active():
+ self.widgets.gremlin.set_property("view","y2")
+
+ 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())
+
+ def _show_iconview_tab(self,state):
+ page = self.widgets.ntb_preview.get_nth_page(3)
+ if page.get_visible()and state or not page.get_visible()and not state:
+ return
+ if state:
+ page.show()
+ self.widgets.ntb_preview.set_property("show-tabs", not state)
+ self.widgets.ntb_preview.set_current_page(3)
+ if self.widgets.chk_use_kb_on_file_selection.get_active():
+ self.widgets.box_info.show()
+ self.widgets.ntb_info.set_current_page(1)
+ else:
+ page.hide()
+ if self.widgets.ntb_preview.get_n_pages() > 4: # user tabs are availible
+ self.widgets.ntb_preview.set_property("show-tabs",not state)
+ self.widgets.ntb_preview.set_current_page(0)
+ self.widgets.ntb_info.set_current_page(0)
+
+ def on_btn_load_clicked(self, widget, data=None):
+ self.widgets.ntb_button.set_current_page(8)
+ self.widgets.ntb_preview.set_current_page(3)
+ self.widgets.tbtn_fullsize_preview.set_active(True)
+ self._show_iconview_tab(True)
+ self.widgets.IconFileSelection1.iconView.grab_focus()
+
+ def on_btn_sel_next_clicked(self, widget, data=None):
+ self.widgets.IconFileSelection1.btn_sel_next.emit("clicked")
+
+ def on_btn_sel_prev_clicked(self, widget, data=None):
+ self.widgets.IconFileSelection1.btn_sel_prev.emit("clicked")
+
+ def on_btn_home_clicked(self, widget, data=None):
+ self.widgets.IconFileSelection1.btn_home.emit("clicked")
+
+ def on_btn_jump_to_clicked(self, widget, data=None):
+ self.widgets.IconFileSelection1.btn_jump_to.emit("clicked")
+
+ def on_btn_dir_up_clicked(self, widget, data=None):
+ self.widgets.IconFileSelection1.btn_dir_up.emit("clicked")
+
+ def on_btn_select_clicked(self, widget, data=None):
+ self.widgets.IconFileSelection1.btn_select.emit("clicked")
+
+ def on_IconFileSelection1_selected(self,widget,path=None):
+ print(path)
+ if path:
+ try:
+ self.widgets.hal_action_open.load_file(path)
+ self.widgets.ntb_preview.set_current_page(0)
+ self.widgets.tbtn_fullsize_preview.set_active(False)
+ self.widgets.ntb_button.set_current_page(2)
+ except:
+ print(_("error trying opening file %s"%path))
+ self._show_iconview_tab(False)
+
+ def on_IconFileSelection1_exit(self,widget):
+ self.widgets.ntb_preview.set_current_page(0)
+ self.widgets.tbtn_fullsize_preview.set_active(False)
+ self._show_iconview_tab(False)
+
+ # 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.hbx_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.gcode_view.set_sensitive(True)
+ self.widgets.gcode_view.grab_focus()
+ if self.widgets.chk_use_kb_on_edit.get_active():
+ self.widgets.ntb_info.set_current_page(1)
+ else:
+ self.widgets.ntb_info.set_current_page(0)
+ self.widgets.ntb_message.set_current_page(1)
+
+ # search forward while in edit mode
+ def on_btn_search_forward_clicked(self, widget, data=None):
+ self.widgets.gcode_view.text_search(direction=True,text=self.widgets.search_entry.get_text())
+
+ # search backward while in edit mode
+ def on_btn_search_back_clicked(self, widget, data=None):
+ self.widgets.gcode_view.text_search(direction=False,text=self.widgets.search_entry.get_text())
+
+ # undo changes while in edit mode
+ def on_btn_undo_clicked(self, widget, data=None):
+ self.widgets.gcode_view.undo()
+
+ # redo changes while in edit mode
+ def on_btn_redo_clicked(self, widget, data=None):
+ self.widgets.gcode_view.redo()
+
+ # if we leave the edit mode, we will have to show all widgets again
+ def on_ntb_button_switch_page(self, *args):
+ message = "ntb_button_page changed to %s"%self.widgets.ntb_button.get_current_page()
+ if self.log: self.gscreen.add_alarm_entry(message)
+
+ if self.widgets.ntb_preview.get_current_page() == 0: # preview tab is active,
+ # check if offset tab is visible, if so we have to hide it
+ page = self.widgets.ntb_preview.get_nth_page(1)
+ if page.get_visible():
+ self._show_offset_tab(False)
+ elif self.widgets.ntb_preview.get_current_page() == 1:
+ self._show_offset_tab(False)
+ elif self.widgets.ntb_preview.get_current_page() == 2:
+ self._show_tooledit_tab(False)
+ elif self.widgets.ntb_preview.get_current_page() == 3:
+ self._show_iconview_tab(False)
+
+ if self.widgets.tbtn_fullsize_preview.get_active():
+ self.widgets.tbtn_fullsize_preview.set_active(False)
+ if self.widgets.ntb_button.get_current_page() == 6 or self.widgets.ntb_preview.get_current_page() == 3:
+ self.widgets.ntb_preview.show()
+ self.widgets.hbx_dro.show()
+ self.widgets.vbx_jog.set_size_request(360 , -1)
+ self.widgets.gcode_view.set_sensitive(0)
+ self.widgets.btn_save.set_sensitive(True)
+ self.widgets.btn_reload.emit("clicked")
+ self.widgets.ntb_info.set_current_page(0)
+ self.widgets.ntb_message.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 unload the loaded file
+ # make a new file
+ def on_btn_new_clicked(self, widget, data=None):
+ self.widgets.btn_save.set_sensitive(False)
+ self.widgets.gcode_view.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 to %s"%widget.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 to %s"%widget.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.data.all_homed = True
+ 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","btn_select_tool_by_no",
+ "btn_tool_touchoff_x", "btn_tool_touchoff_z", "btn_touch"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,True)
+
+ 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_touch", "btn_change_tool","btn_select_tool_by_no",
+ "btn_tool_touchoff_x", "btn_tool_touchoff_z", "btn_touch"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,False)
+
+ def on_hal_status_homed(self,widget,data):
+ for letter in(self.data.axis_list):
+ count = "xyzabcuvws".index(letter)
+ if str(count) in data:
+ if letter == "x" and self.data.lathe_mode:
+ self.data.y_is_homed = True
+ self._update_homed("y")
+ self.data["%s_is_homed"%letter] = True
+ self._update_homed(letter)
+ if self.log:self.gscreen.add_alarm_entry(_("Axes %s are homed"%letter))
+
+ def on_hal_status_file_loaded(self, widget, filename):
+ self.gscreen.add_alarm_entry("file_loaded_%s"%filename)
+ if len(filename) > 50:
+ filename = filename[0:10] + "..." + filename[len(filename)-39:len(filename)]
+ self.widgets.lbl_program.set_text(filename)
+ self.widgets.btn_use_current.set_sensitive(True)
+
+ def on_hal_status_interp_idle(self,widget):
+ self.gscreen.add_alarm_entry("idle")
+ widgetlist = ["rbt_manual", "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"
+ ]
+ if not self.widgets.rbt_hal_unlock.get_active():
+ widgetlist.append("rbt_setup")
+ if self.data.all_homed:
+ widgetlist.append("rbt_mdi")
+ widgetlist.append("rbt_auto")
+ widgetlist.append("btn_index_tool")
+ widgetlist.append("btn_change_tool")
+ widgetlist.append("btn_select_tool_by_no")
+ widgetlist.append("btn_tool_touchoff_x")
+ widgetlist.append("btn_tool_touchoff_z")
+ widgetlist.append("btn_touch")
+ self.gscreen.sensitize_widgets(widgetlist,True)
+ 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)
+ if self.wait_tool_change == True:
+ self.widgets.rbt_manual.emit("clicked")
+ self.wait_tool_change = False
+ self.interpreter = _IDLE
+ self.data.restart_dialog = None
+
+ # 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", "rbt_forward", "rbt_reverse", "rbt_stop"]
+ self.gscreen.sensitize_widgets(widgetlist,widget.get_active())
+
+ def on_btn_stop_clicked(self, widget, data=None):
+ self.gscreen.update_restart_line(0,0)
+
+ 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","btn_index_tool",
+ "btn_from_line", "btn_reload", "btn_change_tool","btn_select_tool_by_no",
+ "btn_load", "btn_edit", "tbtn_optional_blocks",
+ "btn_tool_touchoff_x", "btn_tool_touchoff_z", "btn_touch"
+ ]
+ # in MDI it should be possible to add more commands, even if the interpreter is running
+ if self.gscreen.emcstat.task_mode <> _MDI:
+ widgetlist.append("ntb_jog")
+
+ self.gscreen.sensitize_widgets(widgetlist,False)
+ self.widgets.btn_run.set_sensitive(False)
+ self.interpreter = _RUN
+ if self.data.restart_dialog:
+ self.data.restart_dialog.destroy()
+ self.data.restart_dialog = None
+
+ def on_btn_from_line_clicked(self, widget, data=None):
+ self.gscreen.add_alarm_entry("Restart the program from line clicked")
+ self.gscreen.launch_restart_dialog(self)
+
+ def on_hal_status_tool_in_spindle_changed(self, object, new_tool_no):
+ self.gscreen.add_alarm_entry(_("tool_in_spindle has changed to %s"%new_tool_no))
+ print("hal_status tool changed emitted")
+ self._update_toolinfo(new_tool_no)
+
+ def on_hal_status_state_estop(self,widget=None):
+ self.gscreen.add_alarm_entry("estop")
+ self.widgets.tbtn_estop.set_active(True)
+ self.widgets.tbtn_on.set_active(False)
+ self.widgets.tbtn_on.set_sensitive(False)
+
+ def on_hal_status_state_estop_reset(self,widget=None):
+ self.gscreen.add_alarm_entry("estop_reset")
+ self.widgets.tbtn_estop.set_active(False)
+ self.widgets.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_select_tool_by_no",
+ "btn_spindle_100", "scl_max_vel", "scl_spindle",
+ "btn_tool_touchoff_x", "btn_tool_touchoff_z"
+ ]
+ self.gscreen.sensitize_widgets(widgetlist,False)
+ self.widgets.rbt_manual.set_active(True)
+ if self.widgets.tbtn_on.get_active():
+ self.widgets.tbtn_on.set_active(False)
+
+ 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)
+ if not self.widgets.tbtn_on.get_active():
+ self.widgets.tbtn_on.set_active(True)
+
+ 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 signals 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()
+ if "G8" in self.data.active_gcodes and self.data.lathe_mode and self.data.diameter_mode:
+ self._update_homed("x")
+ self.data.diameter_mode = False
+ elif "G7" in self.data.active_gcodes and self.data.lathe_mode and not self.data.diameter_mode:
+ self._update_homed("y")
+ self.data.diameter_mode = True
+ self._update_vel()
+ self._update_coolant()
+ self._update_spindle_btn()
+ self.widgets.active_speed_label.set_label(self.data.active_spindle_command)
+
+ # check if the coordinate system has changed to display the correct label on the button
+ if self.system_list[self.data.system] <> self.widgets.tbtn_rel.get_label():
+ if not self.widgets.tbtn_rel.get_active():
+ message = "coordinate system has changed from %s"%self.widgets.tbtn_rel.get_label()
+ message += " to %s"%self.system_list[self.data.system]
+ if self.log: self.gscreen.add_alarm_entry(message)
+ self.widgets.tbtn_rel.set_label(self.system_list[self.data.system])
+
+ if self.system_list[self.data.system] <> "G54":
+ self.widgets.tbtn_rel.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#28D0D9"))
+ else:
+ self.widgets.tbtn_rel.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#DCDCDC"))
+
+ # Initialize the file to load dialog, setting an title and the correct
+ # folder as well as a file filter
+ def init_file_to_load(self):
+ file_dir = self.gscreen.inifile.find("DISPLAY", "PROGRAM_PREFIX")
+ self.widgets.file_to_load_chooser.set_current_folder(file_dir)
+ title = _("Select the file you want to be loaded at program start")
+ self.widgets.file_to_load_chooser.set_title(title)
+ self.widgets.ff_file_to_load.set_name("linuxcnc files")
+ self.widgets.ff_file_to_load.add_pattern("*.ngc")
+ file_ext = self.gscreen.inifile.findall("FILTER", "PROGRAM_EXTENSION")
+ for ext in file_ext:
+ if ".py" in ext:
+ self.widgets.ff_file_to_load.add_pattern("*.py")
+ if ".png" in ext:
+ self.widgets.ff_file_to_load.add_pattern("*.png")
+ if ".gif" in ext:
+ self.widgets.ff_file_to_load.add_pattern("*.gif")
+ if ".jpg" in ext:
+ self.widgets.ff_file_to_load.add_pattern("*.jpg")
+
+ # 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):
+ # generate the horizontal button pins
+ for h_button in range(0,10):
+ 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)
+
+ # generate the vertical button pins
+ for v_button in range(0,7):
+ 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)
+
+ # buttons for jogging the axis
+ for jog_button in self.data.axis_list:
+ if jog_button not in "xyz":
+ jog_button = self.axisletter_four
+ self.signal = hal_glib.GPin(self.gscreen.halcomp.newpin("jog-%s-plus"%jog_button,
+ hal.HAL_BIT, hal.HAL_IN))
+ self.signal.connect("value_changed", self._on_pin_jog_changed, jog_button,1)
+ self.signal = hal_glib.GPin(self.gscreen.halcomp.newpin("jog-%s-minus"%jog_button,
+ hal.HAL_BIT, hal.HAL_IN))
+ self.signal.connect("value_changed", self._on_pin_jog_changed, jog_button,-1)
+
+ # jog_increment out pin
+ self.jog_increment = hal_glib.GPin(self.gscreen.halcomp.newpin("jog-increment",
+ hal.HAL_FLOAT, hal.HAL_OUT))
+
+ # generate the pins to set the increments
+ self._check_len_increments()
+ for buttonnumber in range(0,self.no_increments):
+ self.signal = hal_glib.GPin(self.gscreen.halcomp.newpin("jog-inc-%s"%buttonnumber,
+ hal.HAL_BIT, hal.HAL_IN))
+ self.signal.connect("value_changed", self._on_pin_incr_changed, buttonnumber)
+
+ self.signal = hal_glib.GPin(self.gscreen.halcomp.newpin("unlock-settings", hal.HAL_BIT, hal.HAL_IN))
+ self.signal.connect("value_changed", self._on_unlock_settings_changed)
+
+ # generate the pins to connect encoders to the sliders
+ self.feed_override_counts = hal_glib.GPin(self.gscreen.halcomp.newpin("feed-override-counts",
+ hal.HAL_S32, hal.HAL_IN))
+ self.feed_override_counts.connect("value_changed", self._on_fo_counts_changed, "scl_feed")
+ self.spindle_override_counts = hal_glib.GPin(self.gscreen.halcomp.newpin("spindle-override-counts",
+ hal.HAL_S32, hal.HAL_IN))
+ self.spindle_override_counts.connect("value_changed", self._on_so_counts_changed, "scl_spindle")
+ self.jog_speed_counts = hal_glib.GPin(self.gscreen.halcomp.newpin("jog-speed-counts", hal.HAL_S32,
+ hal.HAL_IN))
+ self.jog_speed_counts.connect("value_changed", self._on_jv_counts_changed, "hal_scl_jog_vel")
+ self.max_vel_counts = hal_glib.GPin(self.gscreen.halcomp.newpin("max-vel-counts", hal.HAL_S32,
+ hal.HAL_IN))
+ self.max_vel_counts.connect("value_changed", self._on_mv_counts_changed, "scl_max_vel")
+
+ # This is only necessary, because after connecting the Encoder the value will be increased by one
+ self.widgets.btn_feed_100.emit("clicked")
+
+ # make pins to react to tool_offset changes
+ self.pin_offset_x = hal_glib.GPin(self.gscreen.halcomp.newpin("tooloffset_x", hal.HAL_FLOAT, hal.HAL_IN))
+ self.pin_offset_x.connect("value_changed", self._offset_changed,"tooloffset_x")
+ self.pin_offset_z = hal_glib.GPin(self.gscreen.halcomp.newpin("tooloffset_z", hal.HAL_FLOAT, hal.HAL_IN))
+ self.pin_offset_z.connect("value_changed", self._offset_changed,"tooloffset_z")
+
+ def _offset_changed(self,pin,tooloffset):
+ self.widgets.lbl_tool_offset_z.set_text("%.3f"%self.gscreen.halcomp["tooloffset_z"])
+ self.widgets.lbl_tool_offset_x.set_text("%.3f"%self.gscreen.halcomp["tooloffset_x"])
+
+ def _on_pin_incr_changed(self, pin, buttonnumber):
+ if not pin.get():
+ return
+ data = self.data.jog_increments[int(buttonnumber)]
+ self.on_increment_changed(self.incr_rbt_list[int(buttonnumber)], data)
+ self.incr_rbt_list[int(buttonnumber)].set_active(True)
+
+ def _on_pin_jog_changed(self, pin, axis,direction):
+ if axis not in "xyz":
+ axis = "4"
+ if direction == 1:
+ widget = self.widgets["btn_%s_plus"%axis]
+ else:
+ widget = self.widgets["btn_%s_minus"%axis]
+ if pin.get():
+ self.on_btn_jog_pressed(widget)
+ else:
+ self.on_btn_jog_released(widget)
+
+ def _on_unlock_settings_changed(self, pin):
+ if not self.widgets.rbt_hal_unlock.get_active():
+ return
+ self.widgets.rbt_setup.set_sensitive(pin.get())
+
+ def _on_fo_counts_changed(self, pin, widget):
+ counts = pin.get()
+ difference = (counts - self.fo_counts) * self.scale_feed_override
+ self.fo_counts = counts
+ val = self.widgets[widget].get_value() + difference
+ if val < 0:
+ val = 0
+ if difference != 0:
+ self.widgets[widget].set_value(val)
+
+ def _on_so_counts_changed(self, pin, widget):
+ counts = pin.get()
+ difference = (counts - self.so_counts) * self.scale_spindle_override
+ self.so_counts = counts
+ val = self.widgets[widget].get_value() + difference
+ if val < 0:
+ val = 0
+ if difference != 0:
+ self.widgets[widget].set_value(val)
+
+ def _on_jv_counts_changed(self, pin, widget):
+ counts = pin.get()
+ difference = (counts - self.jv_counts) * self.scale_jog_vel
+ self.jv_counts = counts
+ val = self.widgets[widget].get_value() + difference
+ if val < 0:
+ val = 0
+ if difference != 0:
+ self.widgets[widget].set_value(val)
+
+ def _on_mv_counts_changed(self, pin, widget):
+ counts = pin.get()
+ difference = (counts - self.mv_counts) * self.scale_max_vel
+ self.mv_counts = counts
+ val = self.widgets[widget].get_value() + difference
+ if val < 0:
+ val = 0
+ if difference != 0:
+ self.widgets[widget].set_value(val)
+
+ # 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 zero
+ 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:
+ # 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)
+
+ def _check_len_increments(self):
+ increments = self.gscreen.inifile.find("DISPLAY", "INCREMENTS")
+ if increments:
+ if "," in increments:
+ self.data.jog_increments = [i.strip() for i in increments.split(",")]
+ else:
+ self.data.jog_increments = increments.split()
+ self.data.jog_increments.insert(0,_("Continuous"))
+ else:
+ self.data.jog_increments = [_("Continuous"),"1,000","0,100","0,010","0,001"]
+ self.add_alarm_entry(_("No default jog increments entry found in [DISPLAY] of INI file"))
+ self.no_increments = len(self.data.jog_increments)
+ if self.no_increments > 10:
+ print(_("To many increments given in INI File for this screen"))
+ print(_("Only the first 10 will be reachable through this screen"))
+ self.no_increments = 10
+
diff --git a/share/gscreen/skins/gmoccapy/icon/Auto.gif b/share/gscreen/skins/gmoccapy/icon/Auto.gif
new file mode 100644
index 000000000..30c64ba4e
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/Auto.gif
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/E-Stop.gif b/share/gscreen/skins/gmoccapy/icon/E-Stop.gif
new file mode 100644
index 000000000..b4b6d7835
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/E-Stop.gif
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/Logo.png b/share/gscreen/skins/gmoccapy/icon/Logo.png
new file mode 100755
index 000000000..a26f0c730
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/Logo.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/clear.png b/share/gscreen/skins/gmoccapy/icon/clear.png
new file mode 100755
index 000000000..59255ad54
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/clear.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/configure-2.png b/share/gscreen/skins/gmoccapy/icon/configure-2.png
new file mode 100755
index 000000000..87fbb4bb6
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/configure-2.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/coolant_off.png b/share/gscreen/skins/gmoccapy/icon/coolant_off.png
new file mode 100644
index 000000000..219fca165
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/coolant_off.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/coolant_on.gif b/share/gscreen/skins/gmoccapy/icon/coolant_on.gif
new file mode 100644
index 000000000..8262f344c
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/coolant_on.gif
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/dimensions.png b/share/gscreen/skins/gmoccapy/icon/dimensions.png
new file mode 100755
index 000000000..025648dda
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/dimensions.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/editor.png b/share/gscreen/skins/gmoccapy/icon/editor.png
new file mode 100644
index 000000000..0c114054d
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/editor.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/enter.png b/share/gscreen/skins/gmoccapy/icon/enter.png
new file mode 100755
index 000000000..b1c72d0aa
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/enter.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/estopred.png b/share/gscreen/skins/gmoccapy/icon/estopred.png
new file mode 100644
index 000000000..15741143b
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/estopred.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/exit.png b/share/gscreen/skins/gmoccapy/icon/exit.png
new file mode 100644
index 000000000..f23e43c0f
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/exit.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/exit_application.png b/share/gscreen/skins/gmoccapy/icon/exit_application.png
new file mode 100755
index 000000000..805ddfc67
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/exit_application.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/forward.png b/share/gscreen/skins/gmoccapy/icon/forward.png
new file mode 100644
index 000000000..ae1aa4bef
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/forward.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/forward_on.gif b/share/gscreen/skins/gmoccapy/icon/forward_on.gif
new file mode 100644
index 000000000..f0ec9bf96
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/forward_on.gif
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/from where are the icons.txt b/share/gscreen/skins/gmoccapy/icon/from where are the icons.txt
new file mode 100644
index 000000000..79b750a71
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/from where are the icons.txt
@@ -0,0 +1,75 @@
+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
+tool_by_no.svg
+user_tabs.png (modified two icon from openiconlibrary)
+
+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
+fullscreen_preview.png
+
diff --git a/share/gscreen/skins/gmoccapy/icon/fullscreen_preview.png b/share/gscreen/skins/gmoccapy/icon/fullscreen_preview.png
new file mode 100755
index 000000000..82ac19592
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/fullscreen_preview.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/index_tool.svg b/share/gscreen/skins/gmoccapy/icon/index_tool.svg
new file mode 100644
index 000000000..7c1c2cd92
--- /dev/null
+++ b/share/gscreen/skins/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/share/gscreen/skins/gmoccapy/icon/jog.png b/share/gscreen/skins/gmoccapy/icon/jog.png
new file mode 100644
index 000000000..989d79c8f
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/jog.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/keyboard.png b/share/gscreen/skins/gmoccapy/icon/keyboard.png
new file mode 100755
index 000000000..796a2aa92
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/keyboard.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/machineonoff.png b/share/gscreen/skins/gmoccapy/icon/machineonoff.png
new file mode 100644
index 000000000..99117cb26
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/machineonoff.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/mdi.png b/share/gscreen/skins/gmoccapy/icon/mdi.png
new file mode 100644
index 000000000..175c80a21
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/mdi.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/mist_off.png b/share/gscreen/skins/gmoccapy/icon/mist_off.png
new file mode 100644
index 000000000..d6f68c01b
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/mist_off.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/mist_on.gif b/share/gscreen/skins/gmoccapy/icon/mist_on.gif
new file mode 100644
index 000000000..0055c0a76
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/mist_on.gif
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/pause.png b/share/gscreen/skins/gmoccapy/icon/pause.png
new file mode 100644
index 000000000..5544c6f24
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/pause.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/refa.png b/share/gscreen/skins/gmoccapy/icon/refa.png
new file mode 100755
index 000000000..2346c9df4
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/refa.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/refall.png b/share/gscreen/skins/gmoccapy/icon/refall.png
new file mode 100644
index 000000000..48d5295fe
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/refall.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/refb.png b/share/gscreen/skins/gmoccapy/icon/refb.png
new file mode 100755
index 000000000..f7d3b6029
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/refb.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/refc.png b/share/gscreen/skins/gmoccapy/icon/refc.png
new file mode 100755
index 000000000..eaf20f165
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/refc.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/refu.png b/share/gscreen/skins/gmoccapy/icon/refu.png
new file mode 100755
index 000000000..966576c47
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/refu.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/refv.png b/share/gscreen/skins/gmoccapy/icon/refv.png
new file mode 100755
index 000000000..b88791784
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/refv.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/refw.png b/share/gscreen/skins/gmoccapy/icon/refw.png
new file mode 100755
index 000000000..69888ecee
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/refw.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/refx.png b/share/gscreen/skins/gmoccapy/icon/refx.png
new file mode 100644
index 000000000..1d5f24ce2
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/refx.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/refy.png b/share/gscreen/skins/gmoccapy/icon/refy.png
new file mode 100644
index 000000000..790da9d3d
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/refy.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/refz.png b/share/gscreen/skins/gmoccapy/icon/refz.png
new file mode 100644
index 000000000..8316bebd9
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/refz.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/reload.png b/share/gscreen/skins/gmoccapy/icon/reload.png
new file mode 100755
index 000000000..fb6768e72
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/reload.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/reverse.png b/share/gscreen/skins/gmoccapy/icon/reverse.png
new file mode 100644
index 000000000..e2618c1f3
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/reverse.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/reverse_on.gif b/share/gscreen/skins/gmoccapy/icon/reverse_on.gif
new file mode 100644
index 000000000..0d8fa98f4
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/reverse_on.gif
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/run.png b/share/gscreen/skins/gmoccapy/icon/run.png
new file mode 100644
index 000000000..e78ff6e4f
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/run.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/runfrom.png b/share/gscreen/skins/gmoccapy/icon/runfrom.png
new file mode 100644
index 000000000..171e63fe8
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/runfrom.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/save-as.png b/share/gscreen/skins/gmoccapy/icon/save-as.png
new file mode 100755
index 000000000..1e034410a
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/save-as.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/save.png b/share/gscreen/skins/gmoccapy/icon/save.png
new file mode 100755
index 000000000..1f13724ea
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/save.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/start.png b/share/gscreen/skins/gmoccapy/icon/start.png
new file mode 100644
index 000000000..4883c73d8
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/start.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/step.png b/share/gscreen/skins/gmoccapy/icon/step.png
new file mode 100644
index 000000000..9278ec3e5
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/step.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/stop.gif b/share/gscreen/skins/gmoccapy/icon/stop.gif
new file mode 100644
index 000000000..dcd0fd0c3
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/stop.gif
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/stop.png b/share/gscreen/skins/gmoccapy/icon/stop.png
new file mode 100644
index 000000000..ce73ad864
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/stop.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/stop_on.gif b/share/gscreen/skins/gmoccapy/icon/stop_on.gif
new file mode 100644
index 000000000..15fc71b00
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/stop_on.gif
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/tool_blockdelete.gif b/share/gscreen/skins/gmoccapy/icon/tool_blockdelete.gif
new file mode 100644
index 000000000..3253e8a0d
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/tool_blockdelete.gif
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/tool_by_no.svg b/share/gscreen/skins/gmoccapy/icon/tool_by_no.svg
new file mode 100644
index 000000000..81d2dd352
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/tool_by_no.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="46"
+ height="48"
+ id="svg2">
+ <defs
+ id="defs6" />
+ <image
+ xlink:href="file:///home/emcmesa/linuxcnc-dev/configs/sim/gscreen_mocca/tools.png"
+ x="0"
+ y="0"
+ width="46"
+ height="48"
+ id="image12" />
+ <text
+ x="22.983051"
+ y="18.305086"
+ id="text2815"
+ xml:space="preserve"
+ style="font-size:20px;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:#800000;fill-opacity:1;stroke:none;font-family:DejaVu Serif;-inkscape-font-specification:DejaVu Serif Bold"><tspan
+ x="22.983051"
+ y="18.305086"
+ id="tspan2817">T ?</tspan><tspan
+ x="22.983051"
+ y="43.305084"
+ id="tspan2819">M6</tspan></text>
+</svg>
diff --git a/share/gscreen/skins/gmoccapy/icon/tool_rotate.gif b/share/gscreen/skins/gmoccapy/icon/tool_rotate.gif
new file mode 100644
index 000000000..329d902a4
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/tool_rotate.gif
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/toolaxisp.png b/share/gscreen/skins/gmoccapy/icon/toolaxisp.png
new file mode 100644
index 000000000..ce0fc982b
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/toolaxisp.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/toolaxisx.png b/share/gscreen/skins/gmoccapy/icon/toolaxisx.png
new file mode 100644
index 000000000..57c4bdcec
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/toolaxisx.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/toolaxisy.png b/share/gscreen/skins/gmoccapy/icon/toolaxisy.png
new file mode 100644
index 000000000..33768e339
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/toolaxisy.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/toolaxisy2.png b/share/gscreen/skins/gmoccapy/icon/toolaxisy2.png
new file mode 100755
index 000000000..c8cd41292
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/toolaxisy2.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/toolaxisz.png b/share/gscreen/skins/gmoccapy/icon/toolaxisz.png
new file mode 100644
index 000000000..3cf539813
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/toolaxisz.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/toolchange.png b/share/gscreen/skins/gmoccapy/icon/toolchange.png
new file mode 100755
index 000000000..da18dc405
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/toolchange.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/toolpath.png b/share/gscreen/skins/gmoccapy/icon/toolpath.png
new file mode 100644
index 000000000..a94bad73d
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/toolpath.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/tools.png b/share/gscreen/skins/gmoccapy/icon/tools.png
new file mode 100644
index 000000000..d0d4f16f6
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/tools.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/touchoffwz.png b/share/gscreen/skins/gmoccapy/icon/touchoffwz.png
new file mode 100644
index 000000000..14baa38eb
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/touchoffwz.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/touchoffx.png b/share/gscreen/skins/gmoccapy/icon/touchoffx.png
new file mode 100644
index 000000000..27647f1a3
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/touchoffx.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/touchoffx_value.png b/share/gscreen/skins/gmoccapy/icon/touchoffx_value.png
new file mode 100644
index 000000000..1dec2ada4
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/touchoffx_value.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/touchoffy.png b/share/gscreen/skins/gmoccapy/icon/touchoffy.png
new file mode 100644
index 000000000..0938878bb
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/touchoffy.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/touchoffy_value.png b/share/gscreen/skins/gmoccapy/icon/touchoffy_value.png
new file mode 100644
index 000000000..c0ac95984
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/touchoffy_value.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/touchoffz.png b/share/gscreen/skins/gmoccapy/icon/touchoffz.png
new file mode 100644
index 000000000..9290cb28c
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/touchoffz.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/touchoffz_value.png b/share/gscreen/skins/gmoccapy/icon/touchoffz_value.png
new file mode 100644
index 000000000..e9de41374
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/touchoffz_value.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/unhome.png b/share/gscreen/skins/gmoccapy/icon/unhome.png
new file mode 100644
index 000000000..cec72ebaa
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/unhome.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/user_tabs.png b/share/gscreen/skins/gmoccapy/icon/user_tabs.png
new file mode 100755
index 000000000..227dda91b
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/user_tabs.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/zoom-in.png b/share/gscreen/skins/gmoccapy/icon/zoom-in.png
new file mode 100755
index 000000000..714f1f606
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/zoom-in.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/icon/zoom-out.png b/share/gscreen/skins/gmoccapy/icon/zoom-out.png
new file mode 100755
index 000000000..05ddf0f51
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/icon/zoom-out.png
Binary files differ
diff --git a/share/gscreen/skins/gmoccapy/nc_files/Gmoccapy_2_tools_with_compensation.ngc b/share/gscreen/skins/gmoccapy/nc_files/Gmoccapy_2_tools_with_compensation.ngc
new file mode 100644
index 000000000..a63b0ecf7
--- /dev/null
+++ b/share/gscreen/skins/gmoccapy/nc_files/Gmoccapy_2_tools_with_compensation.ngc
@@ -0,0 +1,93 @@
+; 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
+
+; go to center of the workpiece
+G0 X50 Y50
+G0 Z30
+
+; turn on spindle clockwise
+S3000
+M3
+
+; coolant on
+M8
+
+G0 Z10
+F250
+G1 Z0
+
+; tool radius compansation
+; go in circle with lower feed rate
+G41
+G3 X70 Y50 Z-1 I10 J0
+
+; make first circle with normal feed
+F2000
+G3 I -20
+
+; out of the workpiece
+G3 X50 Y50 Z1 I-10 J0
+G0 Z30
+
+; coolant off
+M9
+
+; turn off cutter radius compensation, otherwise no tool change is possible
+G40
+T1 M6
+G43
+
+; 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 X50 Y50
+G0 Z10
+
+; turn on spindle clockwise
+S6000
+M3
+
+; mist on
+M7
+
+G0 Z10
+F400
+G1 Z1
+
+; Werkzeugradienkompensation ein
+; Anfahrradius mit Eintauchgeschwindigkeit
+G41
+G3 X65 Y50 Z-1 I7.5 J0
+
+; 2. Kreis mit Vorschubgeschwindigkeit fräsen
+F1000
+G3 I-15
+
+; Aus dem Werkstück
+G3 X50 Y50 Z1 I-7.5 J0
+G0 Z30
+
+G0 Z30
+G0 X50 Y50
+
+M9 ; coolant off
+M5 ; spindle off
+M2 ; program end
diff --git a/share/gscreen/skins/gmoccapy/nc_files/diferent speeds.ngc b/share/gscreen/skins/gmoccapy/nc_files/diferent speeds.ngc
new file mode 100644
index 000000000..4e19b4c5c
--- /dev/null
+++ b/share/gscreen/skins/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/share/gscreen/skins/gmoccapy/nc_files/subroutines/go_to_position.ngc b/share/gscreen/skins/gmoccapy/nc_files/subroutines/go_to_position.ngc
new file mode 100644
index 000000000..d5ed9637c
--- /dev/null
+++ b/share/gscreen/skins/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/share/gscreen/skins/gmoccapy/nc_files/subroutines/halo_world.ngc b/share/gscreen/skins/gmoccapy/nc_files/subroutines/halo_world.ngc
new file mode 100644
index 000000000..f93f36dde
--- /dev/null
+++ b/share/gscreen/skins/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/share/gscreen/skins/gmoccapy/nc_files/subroutines/i_am_lost.ngc b/share/gscreen/skins/gmoccapy/nc_files/subroutines/i_am_lost.ngc
new file mode 100644
index 000000000..cd971d425
--- /dev/null
+++ b/share/gscreen/skins/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/share/gscreen/skins/gmoccapy/nc_files/subroutines/increment.ngc b/share/gscreen/skins/gmoccapy/nc_files/subroutines/increment.ngc
new file mode 100644
index 000000000..870e5f200
--- /dev/null
+++ b/share/gscreen/skins/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/share/gscreen/skins/gmoccapy/nc_files/subroutines/jog_around.ngc b/share/gscreen/skins/gmoccapy/nc_files/subroutines/jog_around.ngc
new file mode 100644
index 000000000..070dd65af
--- /dev/null
+++ b/share/gscreen/skins/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/share/gscreen/skins/gmoccapy/nc_files/subroutines/macro_Instructions.txt b/share/gscreen/skins/gmoccapy/nc_files/subroutines/macro_Instructions.txt
new file mode 100644
index 000000000..d751c87ed
--- /dev/null
+++ b/share/gscreen/skins/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/gscreen_custom/industrial.glade b/share/gscreen/skins/industrial/industrial.glade
index d00822c95..d00822c95 100644
--- a/configs/sim/gscreen_custom/industrial.glade
+++ b/share/gscreen/skins/industrial/industrial.glade
diff --git a/share/gscreen/skins/industrial/industrial2.glade b/share/gscreen/skins/industrial/industrial2.glade
new file mode 100644
index 000000000..8ccaa92f5
--- /dev/null
+++ b/share/gscreen/skins/industrial/industrial2.glade
@@ -0,0 +1,81 @@
+<?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="window2">
+ <property name="height_request">600</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">3</property>
+ <child>
+ <object class="HAL_Meter" id="s_display2">
+ <property name="width_request">200</property>
+ <property name="height_request">200</property>
+ <property name="visible">True</property>
+ <property name="label">Spindle</property>
+ <property name="bg_color">#ffffffffffff</property>
+ <property name="z0_color">#0000ffff0000</property>
+ <property name="max">2000</property>
+ <property name="majorscale">200</property>
+ <property name="z1_color">#ffffffff0000</property>
+ <property name="z2_color">#ffff00000000</property>
+ <property name="sublabel">RPM</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">screen 2</property>
+ </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>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkButton" id="button1">
+ <property name="label" translatable="yes">Custom
+Button</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_button_press"/>
+ </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>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/configs/sim/gscreen_custom/industrial_handler.py b/share/gscreen/skins/industrial/industrial_handler.py
index 040fc959b..040fc959b 100644
--- a/configs/sim/gscreen_custom/industrial_handler.py
+++ b/share/gscreen/skins/industrial/industrial_handler.py