Les utilisateurs de Linux: notes sur le bureau


Les notes décrites ici, WRemarques, sont utiles pour les fois que vous voulez un bloc-notes assis tranquillement dans un coin des postes de travail du système X Window. Un wNOTE est essentiellement une fenêtre simple qui vous permet d'écrire, l'importation, l'exportation, couper et coller bits utiles de texte et d'autres WRemarques et programmes.

Chaque wNOTE est complètement autonome. Installation et utilisation WRemarques exige que vous installez des programmes qui utilisent les bibliothèques Xlib et libXpm, que vous pouvez déjà avoir fait la plupart des programmes graphiques utilisent. Une fois installé WRemarques, courir à partir de l'invite du shell que les fenêtres normales.




Contrairement aux programmes connus sous le nom de post-it GNOME ou collantes Apple, WRemarques pas utiliser une base de données dédiée pour stocker des notes. Au lieu de cela, WRemarques utiliser les options de la ligne de commande, sélectionnez X, et les fichiers réguliers pour ne importe quelle note de texte que vous souhaitez conserver.

WRemarques sont conçus pour être simple et flexible. Sont compatibles avec le Nautilus gestionnaire de fenêtres GNOME, et fournir des options qui leur permettent de coexister avec ne importe quel programme de bureau disponible pour Linux.

WRemarques à installer, copier les deux fichiers source ci-dessous, "main.cpp" et "notewindow.cpp," dans un éditeur de texte, puis construire avec la commande suivante.

$ G ++ main.cpp -o notewindow.cpp wNOTE -lXpm -lX11

En supposant que vous avez installé les fichiers à inclure pour les bibliothèques du système X Window, qui est tout à elle. Ensuite, copiez le fichier exécutable "wNOTE" dans un endroit utile, comme, "/ usr/local/bin," si vous avez des privilèges de superutilisateur.

Tapant "-h wNOTE," Impression d'une liste d'options de la ligne de commande. Vous pouvez choisir la police, la position de départ de la note et la taille, se il est au-dessus ou en dessous des autres fenêtres, couleurs de notes, un fichier de sortie pour sauver le texte, et la possibilité d'écrire les paramètres de la note que une commande shell.

En cliquant sur le bouton de fermeture dans le coin supérieur gauche de la note ferme la note et sorties. En cliquant sur la barre le long du bord supérieur déplace la note, et en cliquant sur l'onglet en bas à gauche redimensionner la note.

Double-cliquer sur une note amène à rester au-dessus des autres fenêtres. Un double-clic met à nouveau la note ci-dessous d'autres fenêtres, au moins avec le gestionnaire de fenêtre en utilisant une norme fenêtre de fond. Pourquoi pas tous les gestionnaires de fenêtres font, en particulier les gestionnaires de fenêtres qui utilisent les icônes du bureau, la "-a" et "z", les options de ligne de commande vous permettent de conserver des notes visibles sur le bureau, sans se soucier trop de configuration de bureau spécifique du programme.

Pour couper et coller du texte en utilisant la sélection de X, cliquez sur le texte dans la note et déplacez le curseur à la fin du texte que vous souhaitez sélectionner. Ensuite, allez à la fenêtre que vous souhaitez coller le texte, et cliquez sur le bouton du milieu de la souris ou les boutons gauche et droite ensemble si vous avez une souris à deux boutons. Pour coller le texte dans une note, sélectionnez le texte dans la fenêtre où sa position, déplacer la souris sur la fenêtre de la note, et, une fois de plus, cliquez sur le bouton central de la souris. Pour maintenir le programme simple, WRemarques utiliser la sélection au lieu de notes, lorsque vous copiez du texte avec "Control-C», et collez-le avec "Ctrl-V", parce que le soutien de la plupart des programmes X coupe et coller en utilisant la sélection.

Dans ce cas également, les notes ne utilisent pas une base de données pour stocker des informations. Sont conçus pour être simples et souples, de manière à ne utiliser que le texte tapé dans la note elle-même, ou de fournir sur la ligne de commande avec l'option "-t". Lorsque vous fermez une note, est imprimé le texte sur l'écran de sorte que vous pouvez rediriger vers un fichier. Le "-o", l'option a le même effet. Ainsi, afin de sauver le texte d'une note, vous pouvez utiliser l'une des commandes suivantes.

$ WNOTE> this_note.txt $ WNOTE -o this_note.txt

Lorsque vous ouvrez une note, vous pouvez saisir du texte avec l'option "-t".

$ WNOTE -t «Ce est le texte de la note."

Ne oubliez pas que vous devez placer le texte entre guillemets se il contient des espaces ou des retours chariot.

Ensemble, les, "-o", et, les options "-c" vous permettent d'utiliser des commandes shell pour sauver note de texte, et "sorties option -c", "-t" non seulement le texte de la note, mais aussi la commande et les options de rouvrir la note avec le même texte, la couleur, et l'emplacement de la coquille. Ainsi, par exemple, de prendre note persistante, il est possible d'utiliser d'autres commandes similaires à ces derniers.

$ WNOTE de -a -g bleu 200x200 + 10 + 10 -c> note.out Sh $ -c "` de note.out` de chat "

Le texte de la ligne de commande pour ouvrir la note est de nouveau en "note.out", après les sorties de la note. Quand il rouvre, vous devez utiliser les deux les guillemets et apostrophes inverses d'élargir le texte intégral de la commande et les options de la note précédente.

Ensemble, ces options permettent de nombreuses utilisations possibles, en gardant le programme WRemarques aussi simple que possible. WRemarques ne sont pas un mini traitement de texte, pas encore en tout cas, parce que dans cette version qui fournissent des fonctionnalités pour l'édition de texte que de base, mais le programme offre de nombreuses possibilités d'expansion que la découverte de nouveaux usages.


Télécharger WRemarques

  • Cliquez ici pour télécharger la dernière mise à jour de WRemarques.

main.cpp

/ * Ce fichier fait partie de WRemarques. Ce programme est un logiciel libre; vous pouvez le redistribuer et/ou le modifier selon les termes de la GNU General Public License telle que publiée par la Free Software Foundation; soit la version 2 de la licence, ou (à votre choix) toute version ultérieure. Ce programme est distribué dans l'espoir qu'il sera être utile, mais SANS AUCUNE GARANTIE; sans même la garantie implicite de COMMERCIALISATION ou D'ADAPTATION A USAGE PARTICULIER. Voir la GNU General Public Licence pour plus de détails. Vous devriez avoir reçu une copie de la GNU General Public License avec ce programme; sinon, la Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * / #include #include #include #include #include #include #include using namespace std; // Lancé si l'utilisateur appuie sur Ctrl-C. #define SIGINT 2 vide de l'aide (void); parse_args int (int, char **); app_exit (int); Bg_color static char [255] = ""; fg_color static char [255] = ""; wd_color static char [255] = ""; géométrie static char [255] = ""; static char de caractères [255] = ""; WRITE_CMD statique Bool = False; static char de n [FILENAME_MAX] = ""; texte statique char [8192] = ""; nom_app static char [255]; Affichage * d; fenêtre racine; typedef enum { stay_default, stay_on_top, stay_on_bottom FloatState}; Float_opt FloatState; initialize_notewindows extern void (*, Fenêtre); delete_note extern void (void); remove_note extern void (void); note_event_loop (void); extern char * note_text (void); extern char * note_output (void); vide handle_ctrl_c (int signo) {app_exit (0); } int main (int argc, char ** argv) { if ((d = XOpenDisplay (getenv ("DISPLAY"))) == NULL) { cout << argv [0] << ": l'exposition ne pouvait pas être ouvert." << Endl; sortie (1); } RootWindow = racine (d, DefaultScreen (d)); float_opt = stay_default; parse_args (argc, argv); Signal (SIGINT, handle_ctrl_c); Signal (SIGTERM, handle_ctrl_c); initialize_notewindows (d, racine); (note_event_loop); app_exit (0); return 0; } char * fg_color_opt (void) {* Retour fg_color? fg_color: NULL;} char * bg_color_opt (void) {* Retour bg_color? Bg_color: NULL;} char * wd_color_opt (void) {* Retour wd_color? wd_color: NULL;} char * fn_opt (void) Retour * {font? police: NULL;} char * geometry_opt (void) {* Retour géométrie? Géométrie: NULL;} char * text_opt (void) {Text Retour *? Texte: NULL; } FloatState stay_opt (void) {Retour float_opt;} Write_cmd_opt bool (void) {Retour WRITE_CMD;} char * get_app_name (void) {Retour APP_NAME; } char * get_ofn (void) {* Retour de n? ofn: NULL; } #define ARGCHECK ((i notewindow.cpp #include #include #include #include #include #include #include #include using namespace std; #define profondeur (D) \ DefaultDepth (d, DefaultScreen (d)) #define DEFAULT_BG "jaune" #define DEFAULT_FG "noir" #define DEFAULT_BOX "DarkSlateGray" #define DEFAULT_FONT \ "- * - Helvetica-medium-r - * - * - 12 - * - * - * - * - * - * - *" #define PADDING 1 #define BOX_SIDE 5 MAXTEXT #define 8192 #define POINT_WIDTH 2 // Fin de Linux en ligne sont un seul caractère. #define LINE_END '\ x0d' // Définitions pour les décorations de fenêtres. #define N_RESIZE_POINTS 11 statique resize_tab XPoint [N_RESIZE_POINTS] = { {-10, 0}, {-9, -1}, {-8, -2}, {-7, -3}, {-6, -4}, {-5, -5}, {-4, -6}, {-3, -7}, {-2, -8}, {-1, -9}, {0, -10}}; case XRectangle statique [1] = {{Padding, rembourrage, BOX_SIDE, BOX_SIDE}}; XSegment lignes statiques [2] = { {Padding, rembourrage, PADDING + BOX_SIDE, PADDING BOX_SIDE +}, {Padding, PADDING + BOX_SIDE, PADDING + BOX_SIDE, PADDING}}; #define move_mask_width 6 #define move_mask_height 6 move_mask_bits unsigned char statique [] = { 0x2a, 0x15, 0x2a, 0x15, 0x2a, 0x15}; // Comment savons-nous si nous sommes cloués ou // Dans d'autres fenêtres. typedef enum { stay_default, stay_on_top, stay_on_bottom FloatState}; // Fonctions C sont pratiques pour les appels // De autres fichiers et pour une utilisation dans les constructeurs. app_exit (int); char * fg_color_opt (void); char * bg_color_opt (void); char * wd_color_opt (void); char * geometry_opt (void); char * fn_opt (void); char * text_opt (void); FloatState stay_opt (void); Write_cmd_opt bool (void); char * get_app_name (void); char * get_ofn (void); color_to_pix unsigned long (Affichage *, char *); shifted_keysym int (int); note_form void (* Affichage, Pixmap, Pixmap, GC, unsigned long, unsigned long, unsigned long, XRectangle *, * XRectangle, int, int); Gnome_ws Fenêtre (* Affichage, Fenêtre, int *); // Un CharBox contient un caractère typé et // La taille de la police comme coordonnées d'écran. classe CharBox { publique: CharBox (int, int, int, int, int, int); Add_to_list vide (CharBox *, CharBox *); Insert_after vide (CharBox *, CharBox *); get_x int (void) {return x;} get_y int (void) {return y;} get_insert_x int (void) {return insert_x;} get_insert_y int (void) {return insert_y;} get_width int (void) {largeur de retour;} get_height int (void) {hauteur de retour;} get_keysym int (void) {return keysym;} vide set_x (int x_point) {x = x_point; } vide set_y (int y_point, int pascent) {Y = y_point - pascent; } vide set_insert_x (int x_point) = {x_point insert_x;} vide set_insert_y (int y_point) = {insert_y y_point;} CharBox Get_Next * (void) {return prochaine;} CharBox get_prev * (void) {return prev;} CharBox * remove_from_list (CharBox *); Privé: int keysym, x, y, largeur, hauteur, insert_x, insert_y; CharBox * à côté, * prev; }; CharBox :: CharBox (pkeysym int, int x_point, y_point int, int pwidth, pascent int, int pdescent) { keysym = pkeysym; x = x_point; y = y_point - pascent; width = pwidth; height = + pdescent pascent; insert_x = x_point; insert_y = y_point; next = prev = NULL; } CharBox vide :: add_to_list (CharBox * list_end, CharBox C *) { list_end -> prochaines = C; c -> prev = list_end; list_end = c; } CharBox vide :: insert_after (CharBox * insert_point, CharBox C *) { if (insert_point -> suivant) { insert_point -> suivant -> prev = c; c -> suivant = insert_point -> suivant; } c -> prev = insert_point; insert_point -> suivant = c; } CharBox * CharBox :: remove_from_list (CharBox * t) { si (t -> prev) t -> prev -> suivant = t -> suivant; si (t -> suivant) t -> suivant -> prev = t -> prev; retourner t; } classe NoteWindow { publique: NoteWindow (Affichage *, fenêtre); ~ NoteWindow (void); event_loop (void); Point_is_in_note bool (int, int, bool); Point_is_in_closebox bool (int, int, bool); Point_is_in_movebar bool (int, int, bool); Point_is_in_resizetab bool (int, int, bool); char * dump_text (void); char * dump_command (void); char * dump_selection (void); draw_point_cursor (void); erase_point_cursor (void); reflow_text vide (void); redraw_reflow (void); nettoyage (void); Affichage * (void) {return d;} CharBox find_point_char * (int, int); vide import_text (char *); selection_text_color (void); normal_text_color (void); send_selection void (XEvent); insert_selection (void); annuler moins (void); Privé: Affichage * d; Racine Fenêtre, note_win; Pixmap note_fg, move_mask; GC win_gc, fg_gc; XEvent e_send; à long fg_pixel non signé, bg_pixel, box_pixel; F police; XFontStruct * font_struct; int x, y, largeur, hauteur; XRectangle movebar, CloseBox; int insert_x, insert_y, line_height, line_space; CharBox * textbuf, * Text_end, * Point, * S_select, * E_select; int point_height; Mark curseur flèche; Vivre FloatState; int have_gnome_ws; Desktop_win fenêtre; }; NoteWindow * n; NoteWindow :: NoteWindow (Affichage * d_arg, Root_arg fenêtre) { XGCValues ​​GCV; XSetWindowAttributes set_attrs; char * couleur * géométrie, * La police; d = d_arg; root = root_arg; x = y = largeur = hauteur = 100; rester stay_opt = (); textbuf = point = = NULL text_end; s_select e_select = = NULL; if ((géométrie = geometry_opt ())! = null) { XParseGeometry (La géométrie, et x, y, et, (Unsigned int *) et la largeur, (Unsigned int *) et la hauteur); } desktop_win = gnome_ws (D, racine, et have_gnome_ws); (NULL (couleur wd_color_opt = ())! =) si box_pixel color_to_pix = (d, couleur); autre box_pixel color_to_pix = (d, DEFAULT_BOX); (NULL (couleur bg_color_opt = ())! =) si bg_pixel color_to_pix = (d, couleur); autre bg_pixel color_to_pix = (d, DEFAULT_BG); (NULL (couleur fg_color_opt = ())! =) si fg_pixel color_to_pix = (d, couleur); autre fg_pixel color_to_pix = (d, DEFAULT_FG); set_attrs.override_redirect = True; set_attrs.background_pixel = bg_pixel; note_win = XCreateWindow (D, racine, x, y, largeur, hauteur, 0, profondeur (D), CopyFromParent, CopyFromParent, CWOverrideRedirect | CWBackPixel, & Set_attrs); note_fg = XCreatePixmap (d, note_win, la largeur, la hauteur, la profondeur (d)); if ((move_mask = XCreatePixmapFromBitmapData (D, racine, (char *) move_mask_bits, move_mask_width, move_mask_height, box_pixel, bg_pixel, 1)) == 0) cout max_bounds.descent; insert_x = 0; insert_y = movebar.height + line_height; e_send.type = Exposer; e_send.xexpose.send_event = True; e_send.xexpose.window = note_win; point_height = (Int) font_struct -> max_bounds.ascent * 0,8; } NoteWindow :: ~ NoteWindow (void) {} NoteWindow vide :: nettoyage (void) { CharBox * c * t; if ((c = textbuf)! = NULL) do { t = c-> Get_Next (); c éliminer; c = t; } Bien que (c); XUnloadFont (d, f); XFreeGC (d, win_gc); XFreeGC (d, fg_gc); XFreePixmap (d, note_fg); XFreePixmap (d, move_mask); XDestroyWindow (d, note_win); } Bool NoteWindow :: point_is_in_note (int px, py int, Win_rel bool) { if (win_rel!) { if ((px> = x && py> = y) && (Px <= (x + largeur) && py = 0 && py> = 0) && (Px <= largeur && py <= hauteur)) return true; autre return false; } } Bool NoteWindow :: point_is_in_resizetab (Int px, py Int, Bool win_rel) { int i; if (win_rel!) { for (i = 0; i = (y + closebox.y)) && (Px <= (x + + closebox.x closebox.width) && py = closebox.x && py> = closebox.y) && (Px <= (+ closebox.x closebox.width) && py = (x + movebar.x) && py> = (y + movebar.y)) && (Px <= (x + + movebar.x movebar.width) && py = movebar.x && py> = movebar.y) && (Px <= (+ movebar.x movebar.width) && py Get_Next ()) { if ((c == insert_x -> get_insert_x ()) && (C == Insert_y -> get_insert_y ())) in_selection = True; si (c == e_select) pause; } if (in_selection) n -> selection_text_color (); autre XSetForeground (d, fg_gc, box_pixel); } Else { XSetForeground (d, fg_gc, box_pixel); } XFillRectangle (d, note_fg, fg_gc, insert_x? insert_x: 1 insert_y - point_height, POINT_WIDTH, point_height); XSendEvent (d, note_win, Faux, ExposureMask, et e_send); } NoteWindow vide :: erase_point_cursor (void) { XGCValues ​​GCV; gcv.foreground = bg_pixel; XChangeGC (d, fg_gc, GCForeground et GCV); XFillRectangle (d, note_fg, fg_gc, insert_x? insert_x: 1 insert_y - point_height, POINT_WIDTH, point_height); gcv.foreground = fg_pixel; XChangeGC (d, fg_gc, GCForeground et GCV); XSendEvent (d, note_win, Faux, ExposureMask, et e_send); } NoteWindow vide :: reflow_text (void) { CharBox t *; int keysym; insert_x = 0; insert_y = movebar.height + line_height; pour (t = textbuf; t; t = t -> Get_Next ()) { keysym = t -> get_keysym (); t -> set_insert_x (insert_x); t -> set_insert_y (insert_y); t -> set_x (insert_x); t -> set_y (Insert_y, ((Keysym == LINE_END) 0?: font_struct-> per_char [keysym] .ascent)); if ((+ insert_x font_struct-> per_char [keysym] .width > Largeur) || (Keysym == LINE_END)) { insert_x = 0; insert_y + = + line_height line_space; } if ((t == s_select) && e_select) n -> selection_text_color (); si (t == e_select) n -> normal_text_color (); if (keysym! = LINE_END) { XDrawString (d, note_fg, fg_gc, insert_x, insert_y, (Const char *) et keysym, 1); insert_x + = t -> get_width (); } } si (le point && (points! = text_end)) { insert_x = point -> get_insert_x () + Point -> get_width (); insert_y = point -> get_insert_y (); } } NoteWindow vide :: redraw_reflow (void) { XFreePixmap (d, note_fg); note_fg = XCreatePixmap (d, note_win, la largeur, la hauteur, la profondeur (d)); note_form (d, note_fg, move_mask, fg_gc, fg_pixel, bg_pixel, box_pixel, & Movebar, et CloseBox, largeur, hauteur); this -> reflow_text (); } char * NoteWindow :: dump_text (void) { CharBox t *; int i; statique char buf [MAXTEXT] = ""; pour (t = textbuf, i = 0; la Get_Next (), i ++) { si (t!) briser; buf [i] = t -> get_keysym (); if (buf [i] == LINE_END) sprintf (et buf [i], "\ n"); buf [i + 1] = '\ 0'; } retourner * buf? buf: NULL; } char * NoteWindow :: dump_command (void) { statique char buf [0xffff] CBUF [0xff], * c; XWindowAttributes W; XGetWindowAttributes (d, note_win, & w); sprintf (buf, "% s -c -g% dx% d + +% d% d", get_app_name () w.width, w.height, w.x, w.y); si (== rester stay_on_top) strcat (buf, "-a"); si (== rester stay_on_bottom) strcat (buf, "z"); if ((c = bg_color_opt ())! = null) { sprintf (CBUF, "-BG% s", c); strcat (buf, CBUF); } if ((c = fg_color_opt ())! = null) { sprintf (CBUF, "-fg% s", c); strcat (buf, CBUF); } if ((c = wd_color_opt ())! = null) { sprintf (CBUF, "-wd% s", c); strcat (buf, CBUF); } if ((c = get_ofn ())! = null) { sprintf (CBUF, "-o% s", c); strcat (buf, CBUF); } if ((c = n -> dump_text ()) = NULL) { strcat (buf, "-t "); strcat (buf, c); strcat (buf, ""); } retourner buf; } char * NoteWindow :: dump_selection (void) { CharBox t *; int i; static char buf [MAXTEXT]; if (s_select && e_select) { pour (t = s_select, i = 0; la Get_Next (), i ++) { buf [i] = t -> get_keysym (); if (buf [i] == LINE_END) sprintf (et buf [i], "\ n"); buf [i + 1] = '\ 0'; si (t == e_select) pause; } } Else { * Buf = '\ 0'; } retourner buf; } CharBox * NoteWindow :: find_point_char (int px, py int) { CharBox * c * c_prev; if (textbuf) { pour (c = textbuf; c = c -> Get_Next ()) { if ((px> = c -> get_x () && py> = c -> get_y ()) && (Px get_x () + c -> get_width ()) && py get_y () + c -> get_height ()))) c revenir; si (c == text_end) break; } // Si le curseur est passé la dernière visibles // Caractères sur une ligne. pour (c = textbuf; c = c -> Get_Next ()) { si (c -> Get_Next () && (C -> Get_insert_y () = c -> Get_Next () -> get_insert_y ())) { if ((px> = (c -> get_x () + c -> get_width ())) && (Py> = (c -> get_y () - line_space) && py get_y () + line_height))) { si (c -> get_keysym () == LINE_END) retourner c -> get_prev (); autre c revenir; } } si (c == text_end) break; } } retourner NULL; } NoteWindow vide :: import_text (char * texte) { int i; CharBox * c; textbuf = new CharBox (Texte [0], insert_x, insert_y, font_struct-> per_char [texte [0]]. largeur, font_struct-> per_char [texte [0]]. ascension, font_struct-> per_char [texte [0]] descente).; text_end = textbuf; for (i = 1; texte [i]; i ++) { c = new CharBox (Texte [i], insert_x, insert_y, font_struct-> per_char [texte [i]]. largeur, font_struct-> per_char [texte [i]]. ascension, font_struct-> per_char [texte [i]] descente).; textbuf -> add_to_list (text_end, c); text_end = c; } Point = text_end; n -> redraw_reflow (); } NoteWindow vide :: selection_text_color (void) { XSetForeground (D, fg_gc, (Fg_pixel == WhitePixel (D, DefaultScreen (d))? BlackPixel (D, DefaultScreen (d)): WhitePixel (D, DefaultScreen (d)))); } NoteWindow vide :: normal_text_color (void) { XSetForeground (d, fg_gc, fg_pixel); } NoteWindow vide :: send_selection (XEvent e) { XEvent il; char buf [MAXTEXT]; strcpy (buf, n -> dump_selection ()); XChangeProperty (D, e.xselectionrequest.requestor, e.xselectionrequest.property, XA_STRING, 8, PropModeReplace, (Unsigned char *) buf, strlen (buf)); ne.xselection.property = e.xselectionrequest.property; ne.xselection.type = SelectionNotify; ne.xselection.display = e.xselectionrequest.display; ne.xselection.requestor = e.xselectionrequest.requestor; ne.xselection.selection = e.xselectionrequest.selection; ne.xselection.target = e.xselectionrequest.target; ne.xselection.time = e.xselectionrequest.time; XSendEvent (d, e.xselectionrequest.requestor, 0, 0, et I); XFlush (d); } NoteWindow vide :: insert_selection (void) { Fenêtre propriétaire; int conséquence, fmt_return, i; nitems unsigned long, bytes_left, mannequin; données unsigned char *; type_return Atom; CharBox insérer *, * c; if ((propriétaire = XGetSelectionOwner (d, XA_PRIMARY)) ! = Aucun) { XConvertSelection (d, XA_PRIMARY, XA_STRING, None, propriétaire, CurrentTime); XFlush (d); XGetWindowProperty (D, propriétaire, XA_STRING, 0, 0, False, AnyPropertyType, & type_return, & Fmt_return, et nitems, et bytes_left, Et des données); if (bytes_left) { if (! XGetWindowProperty (D, propriétaire, XA_STRING, 0, bytes_left, 0, AnyPropertyType, & Type_return, & fmt_return, et nitems et fictive, et des données)) { insérez = point? Point: text_end; for (i = 0;. per_char les données [[i]] largeur, font_struct-> [per_char données [i]]. ascension, font_struct-> [per_char données [i]] descente).; if (! insérer) { textbuf text_end = = c; } Else { if (insert == text_end) { textbuf -> add_to_list (text_end, c); } Else { textbuf -> insert_after (insert, c); } } insérez = c; } n -> redraw_reflow (); n -> draw_point_cursor (); } } } } // Utilisé avec gestionnaire de fenêtres Nautilus jusqu'ici. Gnome_ws Fenêtre (Affichage * d, fenêtre racine, int * have_gnome_ws) { Atom NAUTILUS_DESKTOP_WINDOW_ID, actual_type; * Fenêtre w = (Fenêtre *) 0; int actual_format; nitems unsigned long, bytesafter; NAUTILUS_DESKTOP_WINDOW_ID = XInternAtom (D, "NAUTILUS_DESKTOP_WINDOW_ID", false); if ((XGetWindowProperty (D, racine, NAUTILUS_DESKTOP_WINDOW_ID, 0, 1, Faux, XA_WINDOW et actual_type, & Actual_format, et nitems, et bytesafter, (Unsigned char **) & w) == succès) && w) { * Have_gnome_ws = True; retourner * w; } Else { * Have_gnome_ws = False; retour (fenêtre) 0; } } NoteWindow vide :: inférieure (void) { if () {have_gnome_ws // Ce est une façon simple de // La note sur un ordinateur de bureau // Nous savons Jobs // Sur le Nautilus .... // Tableau qu'au moment. Fenêtre Stack [2]; empiler [0] = note_win; pile [1] = gnome_ws (d, profondes, et have_gnome_ws); XRestackWindows (d, pile, 2); } Else { XLowerWindow (d, note_win); } } NoteWindow vide :: event_loop (void) { Fenêtre r, c; int px, py, PWX, Pwy; int grab_result; int keysym, c_wd, c_asc, C_DES; masque unsigned int; char * texte; XEvent et warp_start, prev_click; Ourdissage Bool = false; Bool redimensionnement = False; Buttondown Bool = false; Bool changement = False; if ((text = text_opt ())! = NULL) n -> import_text (texte); XSelectInput (d, note_win, ExposureMask | \ ButtonPressMask | \ ButtonReleaseMask | \ PointerMotionMask | \ EnterWindowMask | \ LeaveWindowMask | \ KeyPressMask | \ KeyReleaseMask | \ EnterWindowMask | \ LeaveWindowMask | \ FocusChangeMask); XMapWindow (d, note_win); n -> draw_point_cursor (); while (1) { XQueryPointer (d, racine, et r, etc., & Px et Py, et PWX et Pwy et masque); if ((c == note_win) && n -> point_is_in_note (px, py, False)) else { XDefineCursor (d, note_win flèche); } if (XPending (d)) { XNextEvent (d, e); interrupteur (e.type) { Si ButtonPress: si (== e.xbutton.window note_win) { if ((prev_click.xbutton.x == e.xbutton.x) && (Prev_click.xbutton.y == e.xbutton.y) && (E.xbutton.time - prev_click.xbutton.time inférieure (); break; Si stay_on_bottom: Si stay_default: XRaiseWindow (d, note_win); = Rester stay_on_top; break; } } Else { si (== e.xbutton.button Button2) { n -> insert_selection (); } Else { if (point_is_in_closebox (E.xbutton.x, e.xbutton.y, True)) { app_exit (0); } Else { if (point_is_in_movebar (E.xbutton.x, e.xbutton.y, True)) { Ourdissage = True; warp_start = e; } Else { Ourdissage = False; if (point_is_in_resizetab (E.xbutton.x, e.xbutton.y, True)) { redimensionner = True; } Else { redimensionner = False; if ((point N = -> find_point_char (E.xbutton.x, e.xbutton.y)) == NULL) { Point = text_end; } n -> redraw_reflow (); n -> draw_point_cursor (); buttondown = True; prev_click = e; s_select = find_point_char (e.xbutton.x, e.xbutton.y); e_select = NULL; } } } } } prev_click = e; } break; Si ButtonRelease: if (déformation || redimensionnement) { while (XCheckTypedWindowEvent (D, note_win, MotionNotify, et e)) ; if (gauchissement) déformation = False; if (downsizing) mise à l'échelle = False; } if (buttondown) buttondown = False; break; Si MotionNotify: while (XCheckTypedWindowEvent (D, note_win, MotionNotify, et e)) ; if (gauchissement) { si (== e.xmotion.window note_win) { x + = (e.xmotion.x_root - warp_start.xmotion.x_root); y + = (e.xmotion.y_root - warp_start.xmotion.y_root); XMoveWindow (d, note_win, x, y); warp_start.xmotion.x_root = e.xmotion.x_root; warp_start.xmotion.y_root = e.xmotion.y_root; } } if (redimensionner) { si (== e.xmotion.window note_win) { width = e.xmotion.x; height = e.xmotion.y; XResizeWindow (d, note_win, largeur, hauteur); n -> redraw_reflow (); n -> draw_point_cursor (); } } if (buttondown && e.xmotion.window == note_win) { if (s_select) { CharBox * new_e_select; if (((= new_e_select find_point_char (E.xmotion.x, e.xmotion.y)) ! = NULL) || ((= New_e_select find_point_char (E.xmotion.x, e.xmotion.y + (Int) line_height/2)) ! = NULL) || ((= New_e_select find_point_char (e.xmotion.x, e.xmotion.y + line_height)) ! = NULL)) { e_select = new_e_select; CharBox * c; n -> erase_point_cursor (); n -> selection_text_color (); pour (c = s_select ;; c = c -> Get_Next ()) { int keysym = c -> get_keysym (); XDrawString (D, note_fg, fg_gc, c -> get_insert_x (), c -> get_insert_y (), (Const char *) et keysym, 1); si (c == e_select) pause; } n -> normal_text_color (); } } XSetSelectionOwner (D, XA_PRIMARY, note_win, CurrentTime); XFlush (d); XSendEvent (d, note_win, Faux, ExposureMask, et e_send); } break; Événement KeyPress: s_select e_select = = NULL; interrupteur (keysym = XKeycodeToKeysym (D, e.xkey.keycode, 0)) { Si XK_Shift_L: Si XK_Shift_R: mouvement = True; break; Si XK_BackSpace: if (textbuf) { CharBox t *; n -> erase_point_cursor (); if ((t = point à pointsmile text_end) ! = Null) { Point = Point -> get_prev ()? Point -> get_prev (): textbuf; si (t == text_end) text_end = text_end -> get_prev (); textbuf -> remove_from_list (t); si (t == textbuf) textbuf = point = = NULL text_end; n -> redraw_reflow (); n -> draw_point_cursor (); éliminer t; } } break; Si XK_Return: n -> erase_point_cursor (); si (== NULL textbuf) { cout redraw_reflow (); } Else { textbuf -> add_to_list (text_end, c); text_end = c; } } insert_x = 0; insert_y + = + line_height line_space; n -> draw_point_cursor (); break; défaut: n -> erase_point_cursor (); if (keysym max_char_or_byte2) { if (changement) keysym = shifted_keysym (keysym); c_wd = font_struct -> Per_char [keysym] .width; c_asc = font_struct -> Per_char .ascent [keysym]; C_DES = font_struct -> Per_char .descent [keysym]; si (== NULL textbuf) { textbuf = nouvelle CharBox (Keysym, insert_x, insert_y, c_wd, c_asc, C_DES); pointer = = text_end textbuf; XDrawString (d, note_fg, fg_gc, insert_x, insert_y, (Const char *) & keysym, 1); XSendEvent (d, note_win, Faux, ExposureMask, et e_send); insert_x + = c_wd; n -> draw_point_cursor (); } Else { CharBox * c = new CharBox (Keysym, insert_x, insert_y, c_wd, c_asc, C_DES); if (insert_x + c_wd> largeur) { insert_x = 0; insert_y + = + line_height line_space; } if (item == text_end) { textbuf -> add_to_list (text_end, c); Point = = c de text_end; XDrawString (d, note_fg, fg_gc, insert_x, insert_y, (Const char *) et keysym, 1); XSendEvent (d, note_win, Faux, ExposureMask, et e_send); insert_x + = c_wd; n -> draw_point_cursor (); } Else { textbuf -> insert_after (point C); pointer = c; n -> redraw_reflow (); n -> draw_point_cursor (); } } } break; } break; cas relâchez le bouton: interrupteur (keysym = XKeycodeToKeysym (D, e.xkey.keycode, 0)) { Si XK_Shift_R: Si XK_Shift_L: if (shift) changement = False; break; } break; Si EnterNotify: grab_result = XGrabKeyboard (D, note_win, True, GrabModeAsync, GrabModeAsync, CurrentTime); if (chambre! = stay_on_bottom) XRaiseWindow (d, note_win); break; Si LeaveNotify: XUngrabKeyboard (d, CurrentTime); XQueryPointer (d, racine, & R, etc., & Px et Py, et PWX et Pwy et masque); si (c && (séjour! stay_on_top =)) n -> inférieure (); break; événement focusIn: événement focusOut: XSendEvent (d, note_win, Faux, ExposureMask, et e_send); break; Si SelectionRequest: n -> send_selection (s); break; Exposer cas: XCopyArea (D, note_fg, note_win, win_gc, 0, 0, largeur, hauteur, 0, 0); défaut: break; } } Else { usleep (10000L); } } } Note_form vide (Affichage * d, p Pixmap masque Pixmap, GC gc, fg_pixel unsigned long, bg_pixel unsigned long, box_pixel unsigned long, XRectangle * movebar, XRectangle * CloseBox, Largeur int, int hauteur) GCForeground et GCV); XDrawLine (d, p, gc, largeur + resize_tab [0] .x, hauteur + resize_tab [0] .y, largeur + resize_tab [N_RESIZE_POINTS-1] .x, hauteur + resize_tab [N_RESIZE_POINTS-1] .y); initialize_notewindows vide (Affichage * d, fenêtre racine) {N = new NoteWindow (d, racine);} remove_note (void) {n -> nettoyage ();} char * note_text (void) {return n -> dump_text ();} char * note_output (void) { if (WR

(0)
(0)

Commentaires - 0

Sans commentaires

Ajouter un commentaire

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Caractères restants: 3000
captcha