Created program logic.
This commit is contained in:
parent
2a0d2559b8
commit
8f8e68a83b
106
src/main.c
106
src/main.c
@ -16,16 +16,120 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
|
int run;
|
||||||
|
void *data;
|
||||||
|
size_t data_size;
|
||||||
|
|
||||||
|
void quit() {
|
||||||
|
run = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void send_selection(Display *display, XSelectionRequestEvent *sre, Atom utf8) {
|
||||||
|
XSelectionEvent se;
|
||||||
|
time_t now_tm;
|
||||||
|
char *now;
|
||||||
|
|
||||||
|
now_tm = time(NULL);
|
||||||
|
now = ctime(&now_tm);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
char *an = XGetAtomName(display, sre->property);
|
||||||
|
printf("Sending CLIPBOARD to window 0x%1x, property '%s'\n", sre->requestor, an);
|
||||||
|
if(an)
|
||||||
|
XFree(an);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
XChangeProperty(display, sre->requestor, sre->property, utf8, 8, PropModeReplace, data, data_size);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
Display *display = XOpenDisplay(NULL);
|
Display *display;
|
||||||
|
Window clip_win, root, owner;
|
||||||
|
int screen;
|
||||||
|
Atom selection, utf8, clip_property;
|
||||||
|
XEvent event;
|
||||||
|
|
||||||
|
// get current X display
|
||||||
|
display = XOpenDisplay(NULL);
|
||||||
if(!display)
|
if(!display)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Could not open X display.\n");
|
fprintf(stderr, "Could not open X display.\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
screen = DefaultScreen(display);
|
||||||
|
root = RootWindow(display, screen);
|
||||||
|
|
||||||
|
// create a dummy window for tinyclip
|
||||||
|
clip_win = XCreateSimpleWindow(display, root, -10, -10, 1, 1, 0, 0, 0);
|
||||||
|
XSelectInput(display, clip_win,
|
||||||
|
SelectionClear | SelectionRequest | SelectionNotify);
|
||||||
|
|
||||||
|
// create atoms for selections
|
||||||
|
selection = XInternAtom(display, "CLIPBOARD", 0);
|
||||||
|
utf8 = XInternAtom(display, "UTF8_STRING", 0);
|
||||||
|
clip_property = XInternAtom(display, "TINYCLIP", 0);
|
||||||
|
|
||||||
|
// check if there is currently someone using the clipboard
|
||||||
|
owner = XGetSelectionOwner(display, selection);
|
||||||
|
if(owner != None)
|
||||||
|
{
|
||||||
|
// take ownership of clipboard while copying contents
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("Current owner: 0x%1X\n", owner);
|
||||||
|
#endif
|
||||||
|
XConvertSelection(display, selection, utf8,
|
||||||
|
clip_property, clip_win, CurrentTime);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XSetSelectionOwner(display, selection, clip_win, CurrentTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
run = 1;
|
||||||
|
signal(SIGINT, quit);
|
||||||
|
|
||||||
|
while(run)
|
||||||
|
{
|
||||||
|
XNextEvent(display, &event);
|
||||||
|
XSelectionRequestEvent *sre;
|
||||||
|
XSelectionEvent *se;
|
||||||
|
switch(event.type)
|
||||||
|
{
|
||||||
|
case SelectionClear:
|
||||||
|
// if someone else took the clipboard, regain ownership
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("Lost selection.\n");
|
||||||
|
#endif
|
||||||
|
XConvertSelection(display, selection, utf8,
|
||||||
|
clip_property, clip_win, CurrentTime);
|
||||||
|
break;
|
||||||
|
case SelectionNotify:
|
||||||
|
se = (XSelectionEvent*)&event.xselection;
|
||||||
|
if(se->property == None)
|
||||||
|
fprintf(stderr, "Conversion impossible.");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: handle new clipboard information
|
||||||
|
}
|
||||||
|
XSetSelectionOwner(display, selection, clip_win, CurrentTime);
|
||||||
|
break;
|
||||||
|
case SelectionRequest:
|
||||||
|
// respond to request for clipboard
|
||||||
|
sre = (XSelectionRequestEvent*) &event.xselectionrequest;
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("New selection request:\n"
|
||||||
|
" requestor: 0x%1x\n", sre->requestor);
|
||||||
|
#endif
|
||||||
|
send_selection(display, sre, utf8);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user