Fossil SCM

Exempt diff line numbers and diff marks (separators) from text selections and have click-and-drag selection include only the most recently clicked side for side-by-side (split) diffs.

florian 2024-08-25 05:16 diff-word-wrap
Commit abd3bca70ecb9ef3128297926c16fd751fffd32f30c13fdbe1786d47292f0e4f
--- src/default.css
+++ src/default.css
@@ -691,10 +691,16 @@
691691
td.difftxt.ins ins {
692692
background-color: #a0e4b2;
693693
}
694694
td.difftxt.ins ins.edit {
695695
background-color: #c0c0ff;
696
+}
697
+table.diff td.diffln,
698
+table.diff td.diffsep,
699
+table.splitdiff.select_right td.difftxtl,
700
+table.splitdiff.select_left td.difftxtr {
701
+ user-select: none;
696702
}
697703
body.tkt div.content li > table.udiff {
698704
margin-left: 1.5em;
699705
margin-top: 0.5em;
700706
}
701707
--- src/default.css
+++ src/default.css
@@ -691,10 +691,16 @@
691 td.difftxt.ins ins {
692 background-color: #a0e4b2;
693 }
694 td.difftxt.ins ins.edit {
695 background-color: #c0c0ff;
 
 
 
 
 
 
696 }
697 body.tkt div.content li > table.udiff {
698 margin-left: 1.5em;
699 margin-top: 0.5em;
700 }
701
--- src/default.css
+++ src/default.css
@@ -691,10 +691,16 @@
691 td.difftxt.ins ins {
692 background-color: #a0e4b2;
693 }
694 td.difftxt.ins ins.edit {
695 background-color: #c0c0ff;
696 }
697 table.diff td.diffln,
698 table.diff td.diffsep,
699 table.splitdiff.select_right td.difftxtl,
700 table.splitdiff.select_left td.difftxtr {
701 user-select: none;
702 }
703 body.tkt div.content li > table.udiff {
704 margin-left: 1.5em;
705 margin-top: 0.5em;
706 }
707
--- src/fossil.diff.js
+++ src/fossil.diff.js
@@ -544,5 +544,35 @@
544544
});
545545
return F;
546546
};
547547
Diff.setupDiffContextLoad();
548548
});
549
+/* Click-handler for side-by-side diffs to activate text selection for the most
550
+** recently clicked side (left or right). If the click-handler target is one of
551
+** the simple-nested <del> or <ins> elements, the parent <td> is deciding. Note
552
+** the "pointerdown" event seems to be exactly what is desired here: activating
553
+** the clicked side just before the selection operation starts. */
554
+(function(){
555
+ window.addEventListener('load',function(){
556
+ var s = document.getElementsByClassName('splitdiff');
557
+ for( var i=0; i<s.length; i++ ){
558
+ s[i].addEventListener('pointerdown',splitdiff_click);
559
+ }
560
+ });
561
+ function splitdiff_click(e){
562
+ var n = e.target.nodeName,
563
+ t = n=='DEL' || n=='INS' ? e.target.parentElement : e.target;
564
+ if( /\bdifftxtl\b/.test(t.className) ){
565
+ var s = document.getElementsByClassName('splitdiff');
566
+ for( var i=0; i<s.length; i++ ){
567
+ s[i].classList.remove('select_right');
568
+ s[i].classList.add('select_left');
569
+ }
570
+ }else if( /\bdifftxtr\b/.test(t.className) ){
571
+ var s = document.getElementsByClassName('splitdiff');
572
+ for( var i=0; i<s.length; i++ ){
573
+ s[i].classList.remove('select_left');
574
+ s[i].classList.add('select_right');
575
+ }
576
+ }
577
+ }
578
+}());
549579
--- src/fossil.diff.js
+++ src/fossil.diff.js
@@ -544,5 +544,35 @@
544 });
545 return F;
546 };
547 Diff.setupDiffContextLoad();
548 });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
549
--- src/fossil.diff.js
+++ src/fossil.diff.js
@@ -544,5 +544,35 @@
544 });
545 return F;
546 };
547 Diff.setupDiffContextLoad();
548 });
549 /* Click-handler for side-by-side diffs to activate text selection for the most
550 ** recently clicked side (left or right). If the click-handler target is one of
551 ** the simple-nested <del> or <ins> elements, the parent <td> is deciding. Note
552 ** the "pointerdown" event seems to be exactly what is desired here: activating
553 ** the clicked side just before the selection operation starts. */
554 (function(){
555 window.addEventListener('load',function(){
556 var s = document.getElementsByClassName('splitdiff');
557 for( var i=0; i<s.length; i++ ){
558 s[i].addEventListener('pointerdown',splitdiff_click);
559 }
560 });
561 function splitdiff_click(e){
562 var n = e.target.nodeName,
563 t = n=='DEL' || n=='INS' ? e.target.parentElement : e.target;
564 if( /\bdifftxtl\b/.test(t.className) ){
565 var s = document.getElementsByClassName('splitdiff');
566 for( var i=0; i<s.length; i++ ){
567 s[i].classList.remove('select_right');
568 s[i].classList.add('select_left');
569 }
570 }else if( /\bdifftxtr\b/.test(t.className) ){
571 var s = document.getElementsByClassName('splitdiff');
572 for( var i=0; i<s.length; i++ ){
573 s[i].classList.remove('select_left');
574 s[i].classList.add('select_right');
575 }
576 }
577 }
578 }());
579

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button