|
| |||||||||||||
#include "mit-copyright.h"#include <X11/Xlib.h>#include <X11/Xutil.h>#include "new_string.h"#include "X_gram.h"#include "main.h"#include "xselect.h"#include "xmark.h"#include "error.h"#include "xrevstack.h"Go to the source code of this file.
Defines | |
| #define | PRESSOP_NONE 0 |
| #define | PRESSOP_KILL 1 |
| #define | PRESSOP_SEL 2 |
| #define | PRESSOP_EXT 3 |
| #define | PRESSOP_NUKE 4 |
| #define | PRESSOP_STOP 5 |
Functions | |
| char * | xmarkGetText () |
| char * | getSelectedText () |
| Bool | isShiftButton1 (Display *dpy, XEvent *event, char *arg) |
| Bool | isShiftButton3 (Display *dpy, XEvent *event, char *arg) |
| void | getLastEvent (Display *dpy, unsigned int state, XEvent *event) |
| void | xunmark (Display *dpy, Window w, x_gram *gram, XContext desc_context) |
| void | xdestroygram (Display *dpy, Window w, XContext desc_context, x_gram *gram) |
| void | xcut (Display *dpy, XEvent *event, XContext desc_context) |
Variables | |
| long | ttl |
|
|
|
|
|
Definition at line 106 of file xcut.c. Referenced by xcut(). |
|
|
|
|
|
|
|
|
Definition at line 107 of file xcut.c. Referenced by xcut(). |
|
|
|
|
||||||||||||||||
|
Definition at line 71 of file xcut.c. References dpy, isShiftButton1(), isShiftButton3(), and NULL. 00075 {
00076 XEvent xev;
00077
00078 if (state & Button1Mask) {
00079 while (XCheckIfEvent(dpy, &xev, isShiftButton1, NULL))
00080 *event = xev;
00081 }
00082 else if (state & Button3Mask) {
00083 while (XCheckIfEvent(dpy, &xev, isShiftButton3, NULL))
00084 *event = xev;
00085 }
00086 }
|
|
|
Definition at line 41 of file xcut.c. 00042 {
00043 return (selected_text);
00044 }
|
|
||||||||||||||||
|
Definition at line 52 of file xcut.c. Referenced by getLastEvent(). 00056 {
00057 return (event->xbutton.state & (ShiftMask | Button1Mask));
00058 }
|
|
||||||||||||||||
|
Definition at line 62 of file xcut.c. Referenced by getLastEvent(). 00066 {
00067 return (event->xbutton.state & (ShiftMask | Button3Mask));
00068 }
|
|
||||||||||||||||
|
Definition at line 148 of file xcut.c. References _x_gram::above, desc_context, dpy, ERROR, NULL, PRESSOP_KILL, PRESSOP_SEL, ttl, unlink_gram(), x_gram, xdestroygram(), xmarkExtendFromFirst(), xmarkExtendFromNearest(), xmarkGetText(), xmarkRedraw(), xmarkStart, xselGetOwnership(), xselOwnershipLost(), xselProcessSelection(), and xunmark(). 00152 {
00153 x_gram *gram;
00154 Window w = event->xany.window;
00155 int changedbound;
00156
00157 /*
00158 * If event is for a window that's not ours anymore (say we're
00159 * in the process of deleting it...), ignore it:
00160 */
00161 if (XFindContext(dpy, w, desc_context, (caddr_t *) & gram))
00162 return;
00163
00164 /*
00165 * Dispatch on the event type:
00166 */
00167 switch (event->type) {
00168 case ClientMessage:
00169 if ((event->xclient.message_type == XA_WM_PROTOCOLS) &&
00170 (event->xclient.format == 32) &&
00171 (event->xclient.data.l[0] == XA_WM_DELETE_WINDOW))
00172 xdestroygram(dpy, w, desc_context, gram);
00173 break;
00174
00175 case MapNotify:
00176 /*
00177 * I don't like using the local time, but MapNotify
00178 * events don't come with a timestamp, and there's no
00179 * way to query the server
00180 */
00181
00182 if (gram->can_die.tv_sec == 0) {
00183 gettimeofday(&(gram->can_die), NULL);
00184 gram->can_die.tv_sec += (int) (ttl / 1000);
00185 gram->can_die.tv_usec += (ttl % 1000) * 1000;
00186 }
00187 break;
00188
00189 case UnmapNotify:
00190 unlink_gram(gram);
00191 break;
00192
00193 case LeaveNotify:
00194 if (current_pressop == PRESSOP_KILL ||
00195 current_pressop == PRESSOP_NUKE)
00196 current_pressop = PRESSOP_STOP;
00197 break;
00198
00199 case MotionNotify:
00200 if (current_pressop == PRESSOP_SEL) {
00201 /* getLastEvent(dpy,Button1Mask,event); */
00202 changedbound = xmarkExtendFromFirst(gram, event->xmotion.x,
00203 event->xmotion.y);
00204 xmarkRedraw(dpy, w, gram, changedbound);
00205 }
00206 else if (current_pressop == PRESSOP_EXT) {
00207 /* getLastEvent(dpy,Button3Mask,event); */
00208 changedbound = xmarkExtendFromNearest(gram, event->xmotion.x,
00209 event->xmotion.y);
00210 xmarkRedraw(dpy, w, gram, changedbound);
00211 }
00212 break;
00213
00214 case ButtonPress:
00215 if (current_pressop != PRESSOP_NONE) {
00216 current_pressop = PRESSOP_STOP;
00217 }
00218 else if ((event->xbutton.state) & ShiftMask) {
00219 if (event->xbutton.button == Button1) {
00220 if (selecting_in)
00221 xunmark(dpy, selecting_in, NULL, desc_context);
00222 if (selected_text)
00223 free(selected_text);
00224 selected_text = NULL;
00225 if (!xselGetOwnership(dpy, w, event->xbutton.time)) {
00226 XBell(dpy, 0);
00227 ERROR("Unable to get ownership of PRIMARY selection.\n");
00228 selecting_in = 0;
00229 current_pressop = PRESSOP_STOP;
00230 }
00231 else {
00232 selecting_in = w;
00233 xmarkStart(gram, event->xbutton.x, event->xbutton.y);
00234 current_pressop = PRESSOP_SEL;
00235 }
00236 }
00237 else if ((event->xbutton.button == Button3) &&
00238 (w == selecting_in)) {
00239 if (selected_text)
00240 free(selected_text);
00241 selected_text = NULL;
00242 changedbound = xmarkExtendFromNearest(gram, event->xbutton.x,
00243 event->xbutton.y);
00244 xmarkRedraw(dpy, w, gram, changedbound);
00245 selected_text = xmarkGetText();
00246 /*
00247 * this is ok, since to get here, the
00248 * selection must be owned
00249 */
00250 current_pressop = PRESSOP_EXT;
00251 }
00252 }
00253 else if ((event->xbutton.state) & ControlMask) {
00254 current_pressop = PRESSOP_NUKE;
00255 }
00256 else {
00257 current_pressop = PRESSOP_KILL;
00258 }
00259 break;
00260
00261 case ButtonRelease:
00262 if (current_pressop == PRESSOP_KILL) {
00263 xdestroygram(dpy, w, desc_context, gram);
00264 }
00265 else if (current_pressop == PRESSOP_SEL ||
00266 current_pressop == PRESSOP_EXT) {
00267 if (selected_text)
00268 free(selected_text);
00269 selected_text = xmarkGetText();
00270 }
00271 else if (current_pressop == PRESSOP_NUKE) {
00272 XWindowAttributes wa;
00273 int gx, gy;
00274 Window temp;
00275 x_gram *next;
00276
00277 for (gram = bottom_gram; gram; gram = next) {
00278 XGetWindowAttributes(dpy, gram->w, &wa);
00279 XTranslateCoordinates(dpy, gram->w, wa.root, 0, 0, &gx, &gy,
00280 &temp);
00281
00282 next = gram->above;
00283
00284 if ((wa.map_state == IsViewable) &&
00285 (gx <= event->xbutton.x_root) &&
00286 (event->xbutton.x_root < gx + wa.width) &&
00287 (gy <= event->xbutton.y_root) &&
00288 (event->xbutton.y_root < gy + wa.height)) {
00289 xdestroygram(dpy, gram->w, desc_context, gram);
00290 }
00291 }
00292 for (gram = unlinked; gram; gram = next) {
00293 XGetWindowAttributes(dpy, gram->w, &wa);
00294 XTranslateCoordinates(dpy, gram->w, wa.root, 0, 0, &gx, &gy,
00295 &temp);
00296
00297 next = gram->above;
00298
00299 if ((wa.map_state == IsViewable) &&
00300 (gx <= event->xbutton.x_root) &&
00301 (event->xbutton.x_root < gx + wa.width) &&
00302 (gy <= event->xbutton.y_root) &&
00303 (event->xbutton.y_root < gy + wa.height)) {
00304 xdestroygram(dpy, gram->w, desc_context, gram);
00305 }
00306 }
00307 }
00308 current_pressop = PRESSOP_NONE;
00309 break;
00310
00311 case SelectionRequest:
00312 xselProcessSelection(dpy, w, event);
00313 break;
00314
00315 case SelectionClear:
00316 xselOwnershipLost(event->xselectionclear.time);
00317 if (w == selecting_in) {
00318 selecting_in = 0;
00319 xunmark(dpy, w, gram, desc_context);
00320 if (selected_text)
00321 free(selected_text);
00322 selected_text = NULL;
00323 }
00324 break;
00325
00326 default:
00327 break;
00328 }
00329
00330 XFlush(dpy);
00331 }
|
|
||||||||||||||||||||
|
Definition at line 115 of file xcut.c. References _x_gram::blocks, bottom_gram, _x_gram::can_die, delete_gram(), desc_context, dpy, NULL, _x_gram::text, unlinked, x_gram, and xmarkClear(). Referenced by xcut(). 00120 {
00121 struct timeval now;
00122
00123 gettimeofday(&now, NULL);
00124 if ((gram->can_die.tv_sec == 0) ||
00125 (gram->can_die.tv_sec > now.tv_sec) ||
00126 ((gram->can_die.tv_sec == now.tv_sec) &&
00127 (gram->can_die.tv_usec > now.tv_usec)))
00128 return;
00129
00130 if (w == selecting_in) {
00131 selecting_in = 0;
00132 xmarkClear();
00133 }
00134 current_pressop = PRESSOP_NONE;
00135 XDeleteContext(dpy, w, desc_context);
00136 XDestroyWindow(dpy, w);
00137 delete_gram(gram);
00138 free(gram->text);
00139 free(gram->blocks);
00140 free(gram);
00141
00142 if (bottom_gram == NULL && unlinked == NULL) {
00143 /* flush colormap here */
00144 }
00145 }
|
|
|
Definition at line 338 of file xmark.c. References _x_gram::blocks, markgram, _xblock::strindex, string, string_Concat2, string_Copy, string_CreateFromData, _xblock::strlen, _x_gram::text, xmarkSecond(), xmarkValid, and _xblock::y. Referenced by xcut(). 00339 {
00340 int i, index, len;
00341 int last_y = -1;
00342 string temp;
00343 string text_so_far = string_Copy("");
00344 char *text = markgram->text;
00345 int startblock, endblock, startchar, endchar;
00346
00347 if (xmarkValid()) {
00348 if (xmarkSecond() == XMARK_END_BOUND) {
00349 startblock = STARTBLOCK;
00350 endblock = ENDBLOCK;
00351 startchar = STARTCHAR;
00352 endchar = ENDCHAR;
00353 }
00354 else {
00355 startblock = ENDBLOCK;
00356 endblock = STARTBLOCK;
00357 startchar = ENDCHAR;
00358 endchar = STARTCHAR;
00359 }
00360
00361 for (i = startblock; i <= endblock; i++) {
00362 if (last_y != -1 && last_y != markgram->blocks[i].y)
00363 text_so_far = string_Concat2(text_so_far, "\n");
00364 index = markgram->blocks[i].strindex;
00365 len = markgram->blocks[i].strlen;
00366 if (startblock == endblock)
00367 temp = string_CreateFromData(text + index + startchar,
00368 endchar - startchar);
00369 else if (i == startblock)
00370 temp = string_CreateFromData(text + index + startchar, len - startchar);
00371 else if (i == endblock)
00372 temp = string_CreateFromData(text + index, endchar);
00373 else
00374 temp = string_CreateFromData(text + index, len);
00375 text_so_far = string_Concat2(text_so_far, temp);
00376 free(temp);
00377 last_y = markgram->blocks[i].y;
00378 }
00379 }
00380
00381 return (text_so_far);
00382 }
|
|
||||||||||||||||||||
|
Definition at line 89 of file xcut.c. References desc_context, dpy, x_gram, XMARK_REDRAW_OLD, xmarkClear(), and xmarkRedraw(). Referenced by xcut(). 00094 {
00095 if (gram == NULL)
00096 if (XFindContext(dpy, w, desc_context, (caddr_t *) & gram))
00097 return;
00098
00099 xmarkClear();
00100 xmarkRedraw(dpy, w, gram, XMARK_REDRAW_OLD);
00101 }
|
|
|
Definition at line 40 of file X_gram.c. Referenced by x_gram_init(), and xcut(). |
| Last updated at Tue Dec 18 21:07:42 PST 2007. | This site and project hosted by... |