/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* SourceControlDesktop.java
*
* Created on 23-Apr-2012, 10:16:29 AM
*/
package webcamstudio.components;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.SpinnerNumberModel;
import webcamstudio.mixers.MasterMixer;
import webcamstudio.streams.SourceDesktop;
import webcamstudio.util.Screen;
import webcamstudio.util.Tools;
/**
*
* @author patrick (modified by karl)
*/
public class SourceControlDesktop extends javax.swing.JPanel {
SourceDesktop source = null;
ArrayList<String> xidList = new ArrayList<>();
ArrayList<String> deskList = new ArrayList<>();
protected String[] screenID = Screen.getSources();
/** Creates new form SourceControlDesktop
* @param source */
public SourceControlDesktop(SourceDesktop source) {
initComponents();
this.source=source;
setName("Desktop");
SpinnerNumberModel model = new SpinnerNumberModel(0, 0, 3000, 1);
spinX.setModel(model);
model = new SpinnerNumberModel(0, 0, 3000, 1);
spinY.setModel(model);
model = new SpinnerNumberModel(0, 0, 3000, 1);
spinH.setModel(model);
model = new SpinnerNumberModel(0, 0, 3000, 1);
spinW.setModel(model);
spinX.setValue(source.getDesktopX());
spinY.setValue(source.getDesktopY());
spinW.setValue(source.getDesktopW());
spinH.setValue(source.getDesktopH());
spinN.setValue(source.getDeskN());
SpinnerNumberModel rateModel = new SpinnerNumberModel(source.getRate(), 1, MasterMixer.getInstance().getRate(), 1);
spinRate.setModel(rateModel);
spinRate.setValue(source.getRate());
initCapWindows();
if ("GS".equals(source.getComm())){
jchEnableWindowsCap.setSelected(source.getSingleWindow());
if (source.getSingleWindow()){
lblDesktopX.setEnabled(false);
spinX.setEnabled(false);
lblDesktopY.setEnabled(false);
spinY.setEnabled(false);
lblDesktopW.setEnabled(false);
spinW.setEnabled(false);
lblDesktopH.setEnabled(false);
spinH.setEnabled(false);
jcbWindowsCapList.setEnabled(true);
lblWindowsCap.setEnabled(true);
btnRefreshWindowsList.setEnabled(true);
} else {
lblDesktopX.setEnabled(true);
spinX.setEnabled(true);
lblDesktopY.setEnabled(true);
spinY.setEnabled(true);
lblDesktopW.setEnabled(true);
spinW.setEnabled(true);
lblDesktopH.setEnabled(true);
spinH.setEnabled(true);
jcbWindowsCapList.setEnabled(false);
lblWindowsCap.setEnabled(false);
btnRefreshWindowsList.setEnabled(false);
}
} else {
lblDesktopX.setEnabled(true);
spinX.setEnabled(true);
lblDesktopY.setEnabled(true);
spinY.setEnabled(true);
lblDesktopW.setEnabled(true);
spinW.setEnabled(true);
lblDesktopH.setEnabled(true);
spinH.setEnabled(true);
jcbWindowsCapList.setEnabled(false);
lblWindowsCap.setEnabled(false);
btnRefreshWindowsList.setEnabled(false);
jchEnableWindowsCap.setSelected(false);
source.setSingleWindow(false);
source.setDesktopXid("");
source.setElementXid("");
source.setDesktopN("0");
}
if (!"".equals(source.getElementXid())){
jcbWindowsCapList.setSelectedItem(source.getElementXid());
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jButton2 = new javax.swing.JButton();
lblDesktopX = new javax.swing.JLabel();
lblDesktopY = new javax.swing.JLabel();
lblDesktopW = new javax.swing.JLabel();
lblDesktopH = new javax.swing.JLabel();
spinX = new javax.swing.JSpinner();
spinY = new javax.swing.JSpinner();
spinW = new javax.swing.JSpinner();
spinH = new javax.swing.JSpinner();
jLabel5 = new javax.swing.JLabel();
spinN = new javax.swing.JSpinner();
lblWindowsCap = new javax.swing.JLabel();
jcbWindowsCapList = new javax.swing.JComboBox();
jchEnableWindowsCap = new javax.swing.JCheckBox();
btnRefreshWindowsList = new javax.swing.JButton();
lblDesktopRate = new javax.swing.JLabel();
spinRate = new javax.swing.JSpinner();
jButton2.setText("jButton2");
jButton2.setName("jButton2"); // NOI18N
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("webcamstudio/Languages"); // NOI18N
lblDesktopX.setText(bundle.getString("DESKTOP_CAPTURE_X")); // NOI18N
lblDesktopX.setName("lblDesktopX"); // NOI18N
lblDesktopY.setText(bundle.getString("DESKTOP_CAPTURE_Y")); // NOI18N
lblDesktopY.setName("lblDesktopY"); // NOI18N
lblDesktopW.setText(bundle.getString("DESKTOP_CAPTURE_WIDTH")); // NOI18N
lblDesktopW.setName("lblDesktopW"); // NOI18N
lblDesktopH.setText(bundle.getString("DESKTOP_CAPTURE_HEIGHT")); // NOI18N
lblDesktopH.setName("lblDesktopH"); // NOI18N
spinX.setName("spinX"); // NOI18N
spinX.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinXStateChanged(evt);
}
});
spinY.setName("spinY"); // NOI18N
spinY.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinYStateChanged(evt);
}
});
spinW.setName("spinW"); // NOI18N
spinW.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinWStateChanged(evt);
}
});
spinH.setName("spinH"); // NOI18N
spinH.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinHStateChanged(evt);
}
});
jLabel5.setText(bundle.getString("DESKTOP_CAPTURE_NUMBER")); // NOI18N
jLabel5.setName("jLabel5"); // NOI18N
spinN.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(0), null, Integer.valueOf(Screen.getSources().length - 1), Integer.valueOf(1)));
spinN.setName("spinN"); // NOI18N
spinN.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinNStateChanged(evt);
}
});
lblWindowsCap.setText(bundle.getString("DESKTOP_CAPTURE_WINDOW")); // NOI18N
lblWindowsCap.setEnabled(false);
lblWindowsCap.setName("lblWindowsCap"); // NOI18N
jcbWindowsCapList.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
jcbWindowsCapList.setEnabled(false);
jcbWindowsCapList.setName("jcbWindowsCapList"); // NOI18N
jcbWindowsCapList.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jcbWindowsCapListActionPerformed(evt);
}
});
jchEnableWindowsCap.setText("Enable Single Window Capture");
jchEnableWindowsCap.setToolTipText("Only with GStreamer BackEnd");
jchEnableWindowsCap.setName("jchEnableWindowsCap"); // NOI18N
jchEnableWindowsCap.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jchEnableWindowsCapActionPerformed(evt);
}
});
btnRefreshWindowsList.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/view-refresh.png"))); // NOI18N
btnRefreshWindowsList.setToolTipText("Refresh Windows List");
btnRefreshWindowsList.setEnabled(false);
btnRefreshWindowsList.setPreferredSize(new java.awt.Dimension(28, 28));
btnRefreshWindowsList.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRefreshWindowsListActionPerformed(evt);
}
});
lblDesktopRate.setText(bundle.getString("DESKTOP_CAPTURE_RATE")); // NOI18N
lblDesktopRate.setName("lblDesktopRate"); // NOI18N
spinRate.setName("spinRate"); // NOI18N
spinRate.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinRateStateChanged(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(spinN))
.addGroup(layout.createSequentialGroup()
.addComponent(lblWindowsCap)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jcbWindowsCapList, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(2, 2, 2)
.addComponent(btnRefreshWindowsList, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(jchEnableWindowsCap)
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(lblDesktopX)
.addComponent(lblDesktopY)
.addComponent(lblDesktopW)
.addComponent(lblDesktopH)
.addComponent(lblDesktopRate))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(spinH, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)
.addComponent(spinY, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)
.addComponent(spinX, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)
.addComponent(spinW, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)
.addComponent(spinRate, javax.swing.GroupLayout.Alignment.TRAILING))))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblDesktopX)
.addComponent(spinX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblDesktopY)
.addComponent(spinY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblDesktopW)
.addComponent(spinW, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblDesktopH)
.addComponent(spinH, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblDesktopRate)
.addComponent(spinRate, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(spinN, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel5))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addComponent(jchEnableWindowsCap)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jcbWindowsCapList, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(lblWindowsCap)))
.addComponent(btnRefreshWindowsList, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
private void spinXStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinXStateChanged
source.setDesktopX((Integer)spinX.getValue());
}//GEN-LAST:event_spinXStateChanged
private void spinYStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinYStateChanged
source.setDesktopY((Integer)spinY.getValue());
}//GEN-LAST:event_spinYStateChanged
private void spinWStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinWStateChanged
source.setDesktopW((Integer)spinW.getValue());
}//GEN-LAST:event_spinWStateChanged
private void spinHStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinHStateChanged
source.setDesktopH((Integer)spinH.getValue());
}//GEN-LAST:event_spinHStateChanged
private void spinNStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinNStateChanged
int deskN = (Integer)spinN.getValue();
if (deskN < 0) {
spinN.setValue(0);
} else {
for (int i = 0 ; i <= Screen.getSources().length - 1 ; i++) {
if ((Integer)spinN.getValue() == i) {
spinX.setValue(Screen.getX(screenID[i]));
spinY.setValue(Screen.getY(screenID[i]));
spinW.setValue(Screen.getWidth(screenID[i]));
spinH.setValue(Screen.getHeight(screenID[i]));
}
}
source.setDeskN(deskN);
}
}//GEN-LAST:event_spinNStateChanged
private void jchEnableWindowsCapActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jchEnableWindowsCapActionPerformed
if (jchEnableWindowsCap.isSelected()){
lblDesktopX.setEnabled(false);
spinX.setEnabled(false);
lblDesktopY.setEnabled(false);
spinY.setEnabled(false);
lblDesktopW.setEnabled(false);
spinW.setEnabled(false);
lblDesktopH.setEnabled(false);
spinH.setEnabled(false);
jcbWindowsCapList.setEnabled(true);
lblWindowsCap.setEnabled(true);
btnRefreshWindowsList.setEnabled(true);
source.setSingleWindow(true);
} else {
lblDesktopX.setEnabled(true);
spinX.setEnabled(true);
lblDesktopY.setEnabled(true);
spinY.setEnabled(true);
lblDesktopW.setEnabled(true);
spinW.setEnabled(true);
lblDesktopH.setEnabled(true);
spinH.setEnabled(true);
jcbWindowsCapList.setEnabled(false);
lblWindowsCap.setEnabled(false);
btnRefreshWindowsList.setEnabled(false);
source.setSingleWindow(false);
source.setDesktopXid("");
source.setElementXid("");
source.setDesktopN("0");
}
}//GEN-LAST:event_jchEnableWindowsCapActionPerformed
private void jcbWindowsCapListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcbWindowsCapListActionPerformed
String elementXid = jcbWindowsCapList.getSelectedItem().toString();
String[] getXid = null;
for (int i=0 ; i < xidList.size() ; i++){
if (xidList.get(i).contains(elementXid)){
getXid = xidList.get(i).split(" ");
source.setDesktopXid(getXid[0]);
source.setElementXid(elementXid);
source.setDesktopN(deskList.get(i));
}
}
setWindowGeometry(source.getDesktopXid());
}//GEN-LAST:event_jcbWindowsCapListActionPerformed
private void btnRefreshWindowsListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshWindowsListActionPerformed
initCapWindows();
}//GEN-LAST:event_btnRefreshWindowsListActionPerformed
private void spinRateStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinRateStateChanged
source.setRate((Integer)spinRate.getValue());
}//GEN-LAST:event_spinRateStateChanged
@SuppressWarnings("unchecked")
private void setWindowGeometry(String xid) {
Runtime rt = Runtime.getRuntime();
String setWinGeometry = "xwininfo -id " + xid;
try {
Process setWindowGeometry = rt.exec(setWinGeometry);
Tools.sleep(10);
setWindowGeometry.waitFor(); //Author spoonybard896
BufferedReader buf = new BufferedReader(new InputStreamReader(
setWindowGeometry.getInputStream()));
String line = "";
while ((line = buf.readLine()) != null) {
// System.out.println("Windows Info: "+line);
line = line.replaceAll(" ", "");
line = line.replaceAll(" ", "");
if (line.contains("Absolute")) {
if (line.contains("X")) {
String[] value = line.split(":");
source.setWindowX(Integer.parseInt(value[1]));
}
if (line.contains("Y")) {
String[] value = line.split(":");
source.setWindowY(Integer.parseInt(value[1]));
}
}
if (line.contains("Width")) {
String[] value = line.split(":");
source.setWindowW(Integer.parseInt(value[1]));
}
if (line.contains("Height")) {
String[] value = line.split(":");
source.setWindowH(Integer.parseInt(value[1]));
}
}
System.out.println("X:" + source.getWindowX() + " Y:" + source.getWindowX() + " W:" + source.getWindowW() + " H:" + source.getWindowH());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
private void initCapWindows() {
Runtime rt = Runtime.getRuntime();
String getAllWindowsComm = "wmctrl -l";
DefaultComboBoxModel model = new DefaultComboBoxModel();
try {
Process getAllWindowsList = rt.exec(getAllWindowsComm);
Tools.sleep(10);
getAllWindowsList.waitFor(); //Author spoonybard896
BufferedReader buf = new BufferedReader(new InputStreamReader(
getAllWindowsList.getInputStream()));
String line = "";
while ((line = buf.readLine()) != null) {
// System.out.println("Windows: "+line);
line = line.replaceAll(" ", " ");
String[] window = line.split(" ");
String windowRest = "";
for (int i = 3; i < window.length ; i++) {
windowRest += window[i];
}
model.addElement(windowRest);
xidList.add(window[0]+" "+windowRest);
String desktop = window[1];
// System.out.println("desktop: "+desktop);
deskList.add(desktop);
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
jcbWindowsCapList.setModel(model);
if ("GS".equals(source.getComm())){
jchEnableWindowsCap.setEnabled(true);
} else {
jchEnableWindowsCap.setEnabled(false);
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnRefreshWindowsList;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel5;
private javax.swing.JComboBox jcbWindowsCapList;
private javax.swing.JCheckBox jchEnableWindowsCap;
private javax.swing.JLabel lblDesktopH;
private javax.swing.JLabel lblDesktopRate;
private javax.swing.JLabel lblDesktopW;
private javax.swing.JLabel lblDesktopX;
private javax.swing.JLabel lblDesktopY;
private javax.swing.JLabel lblWindowsCap;
private javax.swing.JSpinner spinH;
private javax.swing.JSpinner spinN;
private javax.swing.JSpinner spinRate;
private javax.swing.JSpinner spinW;
private javax.swing.JSpinner spinX;
private javax.swing.JSpinner spinY;
// End of variables declaration//GEN-END:variables
}