VNC는 아시는 분들은 잘아시는 원격데스크탑과 같은 원격제어도구입니다.

VNC는 RealVNC, TightVNC, UltraVNC 등 여러 버전으로 배포중이구요... 서버와 클라이언트의 클립보드를 공유하는 기능을 제공하고 있지만 문자열만 공유가 가능합니다.

2006년 2학기 졸업작품을 위해 문자열 뿐만아닌 이미지도 공유가 가능하도록 확장하였습니다.

서버는 플랫폼에 의존적이지만(윈도우즈) 클라이언트는 자바가 동작하는 어느 GUI 시스템이든지 상관없습니다.

사실 리눅스 X-window 시스템은 클립보드 메니저가 존재하지 않아 이러한 시도가 무의미해지는 경우가 많았는데 요즘은 윈도우즈의 단일 클립보드 메니저와 OLE 객체의 통일함의 편리성과 강력함을 따르게 되어 이러한 구현이 가치있게 되었습니다.

다음은 윈도우즈 서버와 리눅스 클라이언트를 제가 확장한 VNC 시스템을 통해 클립보드를 이용한 이미지 공유를 한 예입니다.


사용자 삽입 이미지
사용자 삽입 이미지
신고

부요리눅스의 클립보드

Projects/CoVNC 2007.02.20 15:43 Posted by soulfree >동네청년<

자연스러운 Cut/Paste 환경 지원
윈도우 환경에서는 Cut/Paste가 일관성있게 동작하고 데이터 교환이 제대로 이루어지지만, X윈도우 환경 하에서는 표준이 없어서 Cut/Paste가 제대로 이루어지지 않는다. 부요 데스크탑에서는 X윈도우 환경 하에서 응용 프로그램끼리 Cut/Paste가 자연스럽게 이루어지면서 데이터 교환을 원활히 할 수 있도록 했다. 이 사업에서 개발되고 있는 클립보드 프로그램 이름은 Bclipboard라 이름붙였다. Bclipboard 구조는 <그림 5>와 같으며, 클립보드 동작에 필요한 주요 요소들은 다음과 같다.

◆ 클립보드 서버 : MS에서는 데이터의 보관을 OS 레벨에서 하지만, X윈도우에서는 응용 프로그램끼리 데이터를 주고받아야 한다. Cut한 응용 프로그램이 종료하면 그 데이터도 따라서 사라지게 된다. 이를 방지하기 위해 응용 프로그램의 종료 뒤에도 데이터를 보관해 주는 서버가 필요하다.
◆ 이력 관리기 : 클립보드 데이터의 히스토리를 보관하고 이를 관리한다.
◆ 클립보드 제어 : X윈도우 환경에서의 클립보드에는 owner와 requestor가 존재하기 때문에 owner와 requestor간 데이터를 제어한다.
◆ 데이터 교환 포맷 : 부요 데스크탑에서는 응용 간 데이터 변환을 위해 XML를 사용한다.

기존의 공개 소프트웨어인 Gcm, Klipper, Gclipboard와 BClip board를 <표 2>와 같이 비교해 보았다.

신고

'Projects > CoVNC' 카테고리의 다른 글

DIB/DDB 구조  (0) 2007.03.30
CListBox  (0) 2007.02.21
부요리눅스의 클립보드  (0) 2007.02.20
Virtual Network Computing  (0) 2007.02.14
클립보드의 정의  (0) 2007.02.14
Ultra VNC 소개  (0) 2007.02.13

클립보드의 정의

Projects/CoVNC 2007.02.14 15:59 Posted by soulfree >동네청년<
http://en.wikipedia.org/wiki/Clipboard

Clipboard (software)

From Wikipedia, the free encyclopedia

Jump to: navigation, search
For the writing aid, see Clipboard.

The clipboard is a software program that is used for short-term storage of data as it is transferred between documents or applications, via copy and paste operations. It is most commonly a part of a GUI environment and is usually implemented as an anonymous, temporary block of memory that can be accessed from most or all programs within the environment.

Contents

[hide]

[edit] Basic Clipboard functions

The semantics of the clipboard facility varies from one operating environment to another, and can also vary between versions of the same system. They can sometimes be changed programmatically or by user preference. This can lead to user frustration when switching between environments with different clipboard semantics particularly as copy and paste operations often become embedded in the user's muscle memory.

Most environments support a single clipboard transaction. Each cut or copy overwrites the previous contents. Normally paste operations copy the contents, leaving the contents available in the clipboard for further pasting operations.

[edit] Clipboard data formats

Early implementations of the clipboard stored data as plain text without meta-information such as typeface, type style or color. More recent implemenations support the multiple flavors of data; a flavor is a type of data, allowing complex data structures to be stored. These range from styled text formats such as RTF or HTML, through a variety of bitmap and vector image formats to complex data types like spreadsheets and database entries.

For example cutting a range of cells in a spreadsheet and then pasting them into another sheet may preserve the underlying formulae and data, and may even translate intra-cell references, so that a "SUM(...)" calculation on a sub-range of the cells is converted to refer to the newly pasted copies of those cells.

Not all applications can interpret every flavor that a clipboard supports. Often applications will attempt to translate complex formats into simpler ones they can handle. Many text editors, for example, translate structured data from the clipboard into plain text. This is a common way for users to convert small selections of data into plain text for various purposes.

[edit] Clipboard Management

Modern GUIs often provide a clipboard manager which supports multiple cut and paste transactions. In this model the clipboard is treated as a stack or scrap book, with new cuts and copies being placed added to the top of the list of recent transations. The standard paste operation copies the most recent transaction, while specialized pastes provide access to the other stored transactions. These managers generally also provide a window that displays the transaction history and allows the user to select earlier copies, edit them, change their format and even search amongst them.

Most environments do not save the clipboard contents to any persistent storage - when a user logs out or reboots his or her system the clipboard contents are cleared and forgotten.

[edit] Operating System Specific Clipboards

[edit] Microsoft Windows

In newer versions of the Microsoft Windows operating system, the contents of the clipboard can be viewed at any time by using the ClipBook Viewer application (clipbrd.exe). In older versions of Windows the common practice was to open a copy of the "Notepad" or "Wordpad" editor, and paste into that. Often these operations are available from the "Edit" pull down menu and they may be available via a context menu, usually accessible by context-clicking in the window or dialog entry that is to be cut from or pasted into.

The standard Windows keybindings are:

  • Ctrl-c to copy data onto the clipboard
  • Ctrl-x to cut data to the clipboard
  • Ctrl-v to paste data from the clipboard

Many MS Windows applications also provide Mac OS compatible keybindings.

[edit] Mac OS X

In the Macintosh Operating System the contents can be viewed by selecting the Show Clipboard menu item from the Finder's Edit menu. The standard Mac OS keybindings are:

  • Command-c to copy data into the clipboard
  • Command-x to cut into it
  • Command-v to paste data from the clipboard.

Also available as a secondary, text-only clipboard, is an emacs-style kill-ring. This works in all applications that use standard Cocoa text boxes:

  • Ctrl-k to kill from cursor to end-of-line.
  • Ctrl-y to yank from kill-ring to cursor.

[edit] X Window

In the X Window System (the graphical user interface commonly used on Unix and Linux systems), the clipboard is conventionally used by highlighting text in a window, and using the middle mouse button to paste it into the target. However, there is great diversity among X applications, toolkits and libraries. For example, the GNOME and KDE environments provide closer analogs to the MS Windows clipboard semantics, and applications like Mozilla also provide their own.

[edit] External links

신고

'Projects > CoVNC' 카테고리의 다른 글

부요리눅스의 클립보드  (0) 2007.02.20
Virtual Network Computing  (0) 2007.02.14
클립보드의 정의  (0) 2007.02.14
Ultra VNC 소개  (0) 2007.02.13
vnc 소개  (0) 2007.02.09
Java DataFlavor를 이용한 클립보드 사용  (0) 2007.02.07

Java DataFlavor를 이용한 클립보드 사용

Projects/CoVNC 2007.02.07 15:00 Posted by soulfree >동네청년<

   // If an image is on the system clipboard, this method returns it;
   // otherwise it returns null.
   public static Image getClipboard() {
       Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
  
       try {
           if (t != null && t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
               Image text = (Image)t.getTransferData(DataFlavor.imageFlavor);
               return text;
           }
       } catch (UnsupportedFlavorException e) {
       } catch (IOException e) {
       }
       return null;
   }

Setting an image on the system clipboard requires a custom Transferable object to hold the image while on the clipboard.
   // This method writes a image to the system clipboard.
   // otherwise it returns null.
   public static void setClipboard(Image image) {
       ImageSelection imgSel = new ImageSelection(image);
       Toolkit.getDefaultToolkit().getSystemClipboard().setContents(imgSel, null);
   }
  
   // This class is used to hold an image while on the clipboard.
   public static class ImageSelection implements Transferable {
       private Image image;
  
       public ImageSelection(Image image) {
           this.image = image;
       }
  
       // Returns supported flavors
       public DataFlavor[] getTransferDataFlavors() {
           return new DataFlavor[]{DataFlavor.imageFlavor};
       }
  
       // Returns true if flavor is supported
       public boolean isDataFlavorSupported(DataFlavor flavor) {
           return DataFlavor.imageFlavor.equals(flavor);
       }
  
       // Returns image
       public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
           if (!DataFlavor.imageFlavor.equals(flavor)) {
               throw new UnsupportedFlavorException(flavor);
           }
           return image;
       }
   }


신고

'Projects > CoVNC' 카테고리의 다른 글

Ultra VNC 소개  (0) 2007.02.13
vnc 소개  (0) 2007.02.09
Java DataFlavor를 이용한 클립보드 사용  (0) 2007.02.07
DIB 형식 파일로 저장  (0) 2007.02.06
DIB구조  (0) 2007.02.05
DIB를 DDB로 변환  (0) 2007.02.05

CF_BITMAP 사용하기

Projects/CoVNC 2007.01.30 20:46 Posted by soulfree >동네청년<
 // to set a bitmap to a button, load a 32x32 bitmap
   // and copy it to clipboard. Call CommandBarButton's PasteFace()
   // to copy the bitmap to the button face. to use
   // Outlook's set of predefined bitmap, set button's FaceId to     //the
   // button whose bitmap you want to use
   HBITMAP hBmp =(HBITMAP)::LoadImage(_Module.GetResourceInstance(),
   MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);

   // put bitmap into Clipboard
   ::OpenClipboard(NULL);
   ::EmptyClipboard();
   ::SetClipboardData(CF_BITMAP, (HANDLE)hBmp);
   ::CloseClipboard();
   ::DeleteObject(hBmp);       
   // set style before setting bitmap
   spCmdButton->PutStyle(Office::msoButtonIconAndCaption);
신고

'Projects > CoVNC' 카테고리의 다른 글

BMP를 DDB로 변환  (0) 2007.02.01
비트맵 파일 저장하고 읽기  (0) 2007.02.01
CF_BITMAP 사용하기  (0) 2007.01.30
클립보드에서 이미지 읽기  (0) 2007.01.25
Swap16IfLE() 매크로  (0) 2007.01.24
자바 이미지 저장  (0) 2007.01.24

클립보드에서 이미지 읽기

Projects/CoVNC 2007.01.25 04:17 Posted by soulfree >동네청년<
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
char Mes[]="왼쪽 버튼을 비트맵 복사, 오른쪽 버튼은 비트맵 붙이기";
HBITMAP hBit,hOldBitmap;
HDC hmemDC;
BITMAP bmp; //비트맵 구조체 DDB형식

switch(message)
{
case WM_CREATE:
if(OpenClipboard(hWnd))
{
EmptyClipboard();
CloseClipboard();
}
return 0;
case WM_LBUTTONDOWN:
//리소스타입인 DIB를 DDB형식으로 변환함
hBit=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP1));
if(OpenClipboard(hWnd))
{
EmptyClipboard();
SetClipboardData(CF_BITMAP,hBit);
CloseClipboard();
}
return 0;
case WM_RBUTTONDOWN:
//클립보드상에 들어있는지 없는지 여부
if(!IsClipboardFormatAvailable(CF_BITMAP))
return 0;
if(OpenClipboard(hWnd))
{
hBit=(HBITMAP)GetClipboardData(CF_BITMAP);
CloseClipboard();
hdc=GetDC(hWnd);
//화면DC 핸들을 주면 동일한 특성을 지닌 DC를 메모리에 만들고 핸들을 리턴
hmemDC=CreateCompatibleDC(hdc);
//클립보드에 얻은 비트맵을 메모리DC에 선택하고 HBITMAP캐스팅(원래 HGDIOBJ)
hOldBitmap=(HBITMAP)SelectObject(hmemDC,hBit);
//조사하고자 하는 핸들이 첫번째 인수 비트맵의 폭, 높이, 색상 정보만 조사됨
GetObject(hBit,sizeof(BITMAP),&bmp);
//메모리DC내용을 화면 DC에 복사
BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hmemDC,0,0,SRCCOPY);
SelectObject(hmemDC,hOldBitmap);
DeleteDC(hmemDC);
ReleaseDC(hWnd,hdc);
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,100,100,Mes,strlen(Mes));
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
신고

'Projects > CoVNC' 카테고리의 다른 글

비트맵 파일 저장하고 읽기  (0) 2007.02.01
CF_BITMAP 사용하기  (0) 2007.01.30
클립보드에서 이미지 읽기  (0) 2007.01.25
Swap16IfLE() 매크로  (0) 2007.01.24
자바 이미지 저장  (0) 2007.01.24
자바 드래그엔 드랍, 클립보드 튜토리얼  (0) 2007.01.23

자바 드래그엔 드랍, 클립보드 튜토리얼

Projects/CoVNC 2007.01.23 15:45 Posted by soulfree >동네청년<
http://java.sun.com/docs/books/tutorial/uiswing/dnd/intro.html
신고

Cut & Paste 자바 클립보드 - 최종명

Projects/CoVNC 2007.01.23 14:23 Posted by soulfree >동네청년<

Cut & Paste
-최종명
java.awt.datatransfer 패키지에서 클립보드를 지원하기 위한 클래스들이 정의되어 있다.
현재 JDK 1.1버전에서 지원되는 클립보드는 아직 초보적인 수준이어서 문자열의
cut, copy, paste 기능만 지원한다. 다른 타입을 위한 기능은 추후에 첨가될 예정이다.

전송될 데이타를 가지고 있는 클래스는 Tansferable 인터페이스를 임플리멘츠해주어야 한다.

DataFlavor 클래스는 클립보드로 전송될 데이타의 MIME 타입을 제공하기 위해 사용된다.

Clipboard 클래스는 cut, copy, paste 기능을 제공한다.


COPY 절차
1. java.awt.Toolkit 클래스의 getSYstemClipboard() 메소드를 이용해서 클립보드를
생성한다.

2. Tansferable 인터페이스를 임플리멘츠한 클래스(ex, StringSelection)를 생성한다.

3. Tansferable 인터페이스를 임플리멘츠한 클래스를 클립보드에 setContents() 메소드를
이용해서 붙인다.
예:
  public void copy(TextField tf)  {
   StringSelection data = new StringSelection(tf.getText());
   Clipboard clipboard = Toolkit().getDefaultToolkit().getSystemClipboard();
   clipboard.setContents(data, data);
  }


PASTE 절차
1. java.awt.Toolkit 클래스의 getSystemClipboard() 메소드를 이용해서 클립보드를
생성한다.

2. 클립보드의 getContents() 메소드를 이용해서 클립보드의 내용을 얻는다.

3. getTransferData() 메소드를 이용해서 원하는 데이타를 얻는다.

4. 얻어진 데이타를 적당한 타입으로 변환한다.
예:
  public void paste(TextField tf)  {
   Clipboard clipboard = Toolkit().getDefaultToolkit().getSystemClipboard();
   Transferable data = clipboard.getContents(this);
   String s;
   try {
     s = (String) (data.getTransferData(DataFlavor.stringFlavor));
   } catch (Exception e) {
     s = data.toString();
   }
   tf.setText(s);
  }


예제: CutNPaste.java 파일


    1  import java.io.*;
    2  import java.awt.*;
    3  import java.awt.datatransfer.*;
    4  import java.awt.event.*;
    5  
    6
    7  public class CutNPaste extends Frame implements ActionListener {
    8      TextField tf;
    9      TextArea ta;
   10      String  selection = "";
   11
   12      public static void main (String args[]) {
   13          new CutNPaste().show();
   14      }
   15
   16      public CutNPaste() {
   17          super("Cut & Paste Example");
   18          add(tf = new TextField("클립보드 예제 프로그램입니다."), "North");
   19          add(ta = new TextArea(), "Center");
   20          MenuBar mb = new MenuBar();
   21          mb.add(makeEditMenu());
   22          setMenuBar(mb);
   23          setSize(250, 250);
   24      }
   25
   26      Menu makeEditMenu() {
   27          Menu editMenu = new Menu("Edit");
   28          MenuItem mi = new MenuItem("Cut");
   29          mi.addActionListener(this);
   30          editMenu.add(mi);
   31          mi = new MenuItem("Copy");
   32          mi.addActionListener(this);
   33          editMenu.add(mi);
   34          mi = new MenuItem("Paste");
   35          mi.addActionListener(this);
   36          editMenu.add(mi);
   37          mi = new MenuItem("Clear");
   38          mi.addActionListener(this);
   39          editMenu.add(mi);
   40  
   41          return editMenu;
   42      }
   43  
   44      public void actionPerformed (ActionEvent evt) {
   45          Clipboard clipboard = getToolkit().getSystemClipboard();
   46          String cmd = evt.getActionCommand();
   47          if (cmd.equalsIgnoreCase("copy")) {
   48              selection = tf.getSelectedText();
   49              if(selection == null || selection.length() == 0)
   50                  selection = tf.getText();
   51              StringSelection data = new StringSelection(selection);
   52              clipboard.setContents(data, data);
   53          } else if (cmd.equalsIgnoreCase("clear")) {
   54              tf.setText("");
   55          } else if (cmd.equalsIgnoreCase("paste")) {
   56              Transferable clipData = clipboard.getContents(this);
   57              String s;
   58              try {
   59                  s = (String)(clipData.getTransferData(DataFlavor.stringFlavor));
   60              } catch (Exception e) {
   61                  s = e.toString();
   62              }
   63              ta.append(s+"\n");
   64          } else if (cmd.equalsIgnoreCase("cut")) {
   65              StringSelection data = new StringSelection(tf.getText());
   66              clipboard.setContents(data, data);
   67              tf.setText("");
   68          }
   69      }
   70  }


신고