summaryrefslogtreecommitdiffstats
path: root/perl-install/mygtk2.pm
blob: 6d1ca13f4c9f7a762c27bb232463a439ff0ca6da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
package mygtk2;

use diagnostics;
use strict;
use feature 'state';

our @ISA = qw(Exporter);
our @EXPORT = qw(gtknew gtkset gtkadd gtkval_register gtkval_modify);

use c;
use log;
use common;

use Gtk2;

sub init() {
    !check_for_xserver() and print("Cannot be run in console mode.\n"), c::_exit(0);
    $::one_message_has_been_translated and warn("N() was called from $::one_message_has_been_translated BEFORE gtk2 initialisation, replace it with a N_() AND a translate() later.\n"), c::_exit(1);

    Gtk2->init;
    Locale::gettext::bind_textdomain_codeset($_, 'UTF8') foreach 'libDrakX', if_(!$::isInstall, 'libDrakX-standalone'),
        if_($::isInstall, 'draksnapshot'),
        'drakx-net', 'drakx-kbd-mouse-x11', # shared translation
          @::textdomains;
    Gtk2->croak_execeptions;
}
init() unless ($::no_ugtk_init);
Gtk2->croak_execeptions if $::isInstall;



sub gtknew {
    my $class = shift;
    if (@_ % 2 != 0) {
	internal_error("gtknew $class: bad options @_");
    }
    if (my $r = find { ref $_->[0] } group_by2(@_)) {
	internal_error("gtknew $class: $r should be a string in @_");
    }
    my %opts = @_;
    _gtk(undef, $class, 'gtknew', \%opts);
}

sub gtkset {
    my $w = shift;
    my $class = ref($w);
    if (@_ % 2 != 0) {
	internal_error("gtkset $class: bad options @_");
    }
    if (my $r = find { ref $_->[0] } group_by2(@_)) {
	internal_error("gtkset $class: $r should be a string in @_");
    }
    my %opts = @_;

    $class =~ s/^(Gtk2|Gtk2::Gdk|mygtk2)::// or internal_error("gtkset unknown class $class");
    
    _gtk($w, $class, 'gtkset', \%opts);
}

sub gtkadd {
    my $w = shift;
    my $class = ref($w);
    if (@_ % 2 != 0) {
	internal_error("gtkadd $class: bad options @_");
    }
    if (my $r = find { ref $_->[0] } group_by2(@_)) {
	internal_error("gtkadd $class: $r should be a string in @_");
    }
    my %opts = @_;
    $class =~ s/^(Gtk2|Gtk2::Gdk|mygtk2)::// or internal_error("gtkadd unknown class $class");
    
    _gtk($w, $class, 'gtkadd', \%opts);
}


my %refs;

sub gtkval_register {
    my ($w, $ref, $sub) = @_;
    push @{$w->{_ref}}, $ref;
    $w->signal_connect(destroy => sub { 
	@{$refs{$ref}} = grep { $_->[1] != $w } @{$refs{$ref}};
	delete $refs{$ref} if !@{$refs{$ref}};
    });
    push @{$refs{$ref}}, [ $sub, $w ];
}
sub gtkval_modify {
    my ($ref, $val, @to_skip) = @_;
    my $prev = '' . $ref;
    $$ref = $val;
    if ($prev ne '' . $ref) {
	internal_error();
    }
    foreach (@{$refs{$ref} || []}) {	
	my ($f, @para) = @$_;
	$f->(@para) if !member($f, @to_skip);
    }
}

my $global_tooltips;

sub _gtk {
    my ($w, $class, $action, $opts) = @_;

    if (my $f = $mygtk2::{"_gtk__$class"}) {
	$w = $f->($w, $opts, $class, $action);
    } else {
	internal_error("$action $class: unknown class");
    }

    $w->set_size_request(delete $opts->{width} || -1, delete $opts->{height} || -1) if exists $opts->{width} || exists $opts->{height};
    if (my $position = delete $opts->{position}) {
	$w->move($position->[0], $position->[1]);
    }
    $w->set_name(delete $opts->{widget_name}) if exists $opts->{widget_name};
    $w->can_focus(delete $opts->{can_focus}) if exists $opts->{can_focus};
    $w->can_default(delete $opts->{can_default}) if exists $opts->{can_default};
    $w->grab_focus if delete $opts->{grab_focus};
    $w->set_padding(@{delete $opts->{padding}}) if exists $opts->{padding};
    $w->set_sensitive(delete $opts->{sensitive}) if exists $opts->{sensitive};
    $w->signal_connect(expose_event => delete $opts->{expose_event}) if exists $opts->{expose_event};
    $w->signal_connect(realize => delete $opts->{realize}) if exists $opts->{realize};
    (delete $opts->{size_group})->add_widget($w) if $opts->{size_group};
    if (my $tip = delete $opts->{tip}) {
	$global_tooltips ||= Gtk2::Tooltips->new;
	$global_tooltips->set_tip($w, $tip);
    }

    #- WARNING: hide_ref and show_ref are not effective until you gtkval_modify the ref
    if (my $hide_ref = delete $opts->{hide_ref}) {
	gtkval_register($w, $hide_ref, sub { $$hide_ref ? $w->hide : $w->show });
    } elsif (my $show_ref = delete $opts->{show_ref}) {
	gtkval_register($w, $show_ref, sub { $$show_ref ? $w->show : $w->hide });
    }

    if (my $sensitive_ref = delete $opts->{sensitive_ref}) {
	my $set = sub { $w->set_sensitive($$sensitive_ref) };
	gtkval_register($w, $sensitive_ref, $set);
	$set->();
    }

    if (%$opts && !$opts->{allow_unknown_options}) {
	internal_error("$action $class: unknown option(s) " . join(', ', keys %$opts));
    }
    $w;
}

sub _gtk__Install_Button {
    my ($w, $opts, $class) = @_;
    $opts->{child} = gtknew('HBox', spacing => 5, 
                             children_tight => [
                                 # FIXME: not RTL compliant (lang::text_direction_rtl() ? ...)
                                 gtknew('Image', file => 'advanced_expander'),
                                 gtknew('Label', text => delete $opts->{text}),
                             ],
                         );
    $opts->{relief} = 'none';
    _gtk__Button($w, $opts, 'Button');
}

sub _gtk__Button       { &_gtk_any_Button }
sub _gtk__ToggleButton { &_gtk_any_Button }
sub _gtk__CheckButton  { &_gtk_any_Button }
sub _gtk__RadioButton  { &_gtk_any_Button }
sub _gtk_any_Button {
    my ($w, $opts, $class) = @_;

    if (!$w) {
        my @radio_options;
        if ($class eq 'RadioButton') {
            @radio_options = delete $opts->{group};
	}
	$w = $opts->{child} ? "Gtk2::$class"->new(@radio_options) :
	  delete $opts->{mnemonic} ? "Gtk2::$class"->new_with_mnemonic(@radio_options, delete $opts->{text} || '') :
	    $opts->{text} ? "Gtk2::$class"->new_with_label(@radio_options, delete $opts->{text} || '') :
           "Gtk2::$class"->new(@radio_options);

	$w->{format} = delete $opts->{format} if exists $opts->{format};
    }

    if (my $widget = delete $opts->{child}) {
	$w->add($widget);
	$widget->show;
    }
    $w->set_image(delete $opts->{image}) if exists $opts->{image};
    $w->set_relief(delete $opts->{relief}) if exists $opts->{relief};

    if (my $text_ref = delete $opts->{text_ref}) {
	my $set = sub {
	    eval { $w->set_label(may_apply($w->{format}, $$text_ref)) };
	};
	gtkval_register($w, $text_ref, $set);
	$set->();
    } elsif (exists $opts->{text}) {
	$w->set_label(delete $opts->{text});
    } elsif (exists $opts->{stock}) {
	$w->set_label(delete $opts->{stock});
	$w->set_use_stock(1);
    }

    if ($class eq 'Button') {
	$w->signal_connect(clicked => delete $opts->{clicked}) if exists $opts->{clicked};
    } else {
	if (my $active_ref = delete $opts->{active_ref}) {
	    my $set = sub { $w->set_active($$active_ref) };
	    $w->signal_connect(toggled => sub {
		gtkval_modify($active_ref, $w->get_active, $set);
	    });
	    gtkval_register($w, $active_ref, $set);
	    gtkval_register($w, $active_ref, delete $opts->{toggled}) if exists $opts->{toggled};
	    $set->();
	} else {
	    $w->set_active(delete $opts->{active}) if exists $opts->{active};
	    $w->signal_connect(toggled => delete $opts->{toggled}) if exists $opts->{toggled};
	}
    }
    $w;
}

sub _gtk__CheckMenuItem {
    my ($w, $opts, $class) = @_;

    if (!$w) {
	add2hash_($opts, { mnemonic => 1 });

	$w = $opts->{image} || !exists $opts->{text} ? "Gtk2::$class"->new :
	  delete $opts->{mnemonic} ? "Gtk2::$class"->new_with_label(delete $opts->{text}) :
	    "Gtk2::$class"->new_with_mnemonic(delete $opts->{text});
    }

    $w->set_active(delete $opts->{active}) if exists $opts->{active};
    $w->signal_connect(toggled => delete $opts->{toggled}) if exists $opts->{toggled};
    $w;
}

sub _gtk__SpinButton {
    my ($w, $opts) = @_;

    if (!$w) {
	$opts->{adjustment} ||= do {
	    add2hash_($opts, { step_increment => 1, page_increment => 5, page_size => 1, value => delete $opts->{lower} });
	    Gtk2::Adjustment->new(delete $opts->{value}, delete $opts->{lower}, delete $opts->{upper}, delete $opts->{step_increment}, delete $opts->{page_increment}, delete $opts->{page_size});
	};
	$w = Gtk2::SpinButton->new(delete $opts->{adjustment}, delete $opts->{climb_rate} || 0, delete $opts->{digits} || 0);
    }

    $w->signal_connect(value_changed => delete $opts->{value_changed}) if exists $opts->{value_changed};
    $w;
}

sub _gtk__HScale {
    my ($w, $opts) = @_;

    if (!$w) {
	$opts->{adjustment} ||= do {
	    add2hash_($opts, { step_increment => 1, page_increment => 5, page_size => 1, value => delete $opts->{lower} });
	    Gtk2::Adjustment->new(delete $opts->{value}, delete $opts->{lower}, (delete $opts->{upper}) + 1, delete $opts->{step_increment}, delete $opts->{page_increment}, delete $opts->{page_size});
	};
	$w = Gtk2::HScale->new(delete $opts->{adjustment});
    }

    $w->signal_connect(value_changed => delete $opts->{value_changed}) if exists $opts->{value_changed};
    $w;
}

sub _gtk__ProgressBar {
    my ($w, $opts) = @_;

    if (!$w) {
	$w = Gtk2::ProgressBar->new;
    }

    if (my $fraction_ref = delete $opts->{fraction_ref}) {
	my $set = sub { $w->set_fraction($$fraction_ref) };
	gtkval_register($w, $fraction_ref, $set);
	$set->();
    } elsif (exists $opts->{fraction}) {
	$w->set_fraction(delete $opts->{fraction});
    }

    $w;
}

sub _gtk__VSeparator { &_gtk_any_simple }
sub _gtk__HSeparator { &_gtk_any_simple }
sub _gtk__Calendar   { &_gtk_any_simple }

sub _gtk__DrawingArea {
    my ($w, $opts) = @_;

    if (!$w) {
	$w = Gtk2::DrawingArea->new;
    }
    $w;
}

sub _gtk__Pixbuf {
    my ($w, $opts) = @_;

    if (!$w) {
	my $name = delete $opts->{file} or internal_error("missing file");
	my $file = _find_imgfile($name) or internal_error("can not find image $name");
	if (my $size = delete $opts->{size}) {
	    $w = Gtk2::Gdk::Pixbuf->new_from_file_at_scale($file, $size, $size, 1);
	} else {
	    $w = Gtk2::Gdk::Pixbuf->new_from_file($file);
	}
        $w = $w->flip(1) if delete $opts->{flip};
    }
    $w;
}

# Image_using_pixmap is rendered using DITHER_MAX which is much better on 16bpp displays
sub _gtk__Image_using_pixmap { &_gtk__Image }
sub _gtk__Image {
    my ($w, $opts, $class) = @_;

    if (!$w) {
	$w = Gtk2::Image->new;
	$w->{format} = delete $opts->{format} if exists $opts->{format};

        $w->{set_from_file} = $class =~ /using_pixmap/ ? sub { 
            my ($w, $file) = @_;
            my $pixmap = mygtk2::pixmap_from_pixbuf($w, gtknew('Pixbuf', file => $file));
	    $w->set_from_pixmap($pixmap, undef);
        } : sub { 
            my ($w, $file, $o_size) = @_;
            my $pixbuf = gtknew('Pixbuf', file => $file, if_($o_size, size => $o_size), flip => delete $opts->{flip});
            $w->set_from_pixbuf($pixbuf);
        };
    }

    if (my $name = delete $opts->{file}) {
	my $file = _find_imgfile(may_apply($w->{format}, $name)) or internal_error("can not find image $name");
	$w->{set_from_file}->($w, $file, delete $opts->{size});
    } elsif (my $file_ref = delete $opts->{file_ref}) {
	my $set = sub {
	    my $file = _find_imgfile(may_apply($w->{format}, $$file_ref)) or internal_error("can not find image $$file_ref");
	    $w->{set_from_file}->($w, $file, delete $opts->{size});
	};
	gtkval_register($w, $file_ref, $set);
	$set->() if $$file_ref;
    }
    $w;
}

sub _gtk__WrappedLabel {
    my ($w, $opts) = @_;
    
    $opts->{line_wrap} = 1 if not defined $opts->{line_wrap};
    _gtk__Label($w, $opts);
}

our $left_padding = 20;

sub _gtk__Label_Left {
    my ($w, $opts) = @_;
    $opts->{alignment} ||= [ 0, 0 ];
    $opts->{padding} ||= [ $left_padding, 0 ];
    _gtk__WrappedLabel($w, $opts);
}

sub _gtk__Label_Right {
    my ($w, $opts) = @_;
    $opts->{alignment} ||= [ 1, 0.5 ];
    _gtk__Label($w, $opts);
}


sub _gtk__Label {
    my ($w, $opts) = @_;

    if ($w) {
	$w->set_text(delete $opts->{text}) if exists $opts->{text};
    } else {
	$w = exists $opts->{text} ? Gtk2::Label->new(delete $opts->{text}) : Gtk2::Label->new;
	$w->set_ellipsize(delete $opts->{ellipsize}) if exists $opts->{ellipsize};
	$w->set_justify(delete $opts->{justify}) if exists $opts->{justify};
	$w->set_line_wrap(delete $opts->{line_wrap}) if exists $opts->{line_wrap};
	$w->set_alignment(@{delete $opts->{alignment}}) if exists $opts->{alignment};
	$w->modify_font(Gtk2::Pango::FontDescription->from_string(delete $opts->{font})) if exists $opts->{font};
    }

    if (my $text_ref = delete $opts->{text_ref}) {
	my $set = sub { $w->set_text($$text_ref) };
	gtkval_register($w, $text_ref, $set);
	$set->();
    }

    if (my $t = delete $opts->{text_markup}) {
	$w->set_markup($t);
	if ($w->get_text eq '') {
	    log::l("invalid markup in $t. not using the markup");
	    $w->set_text($t);
	}
    }
    $w;
}


sub _gtk__Alignment {
    my ($w, $opts) = @_;

    if (!$w) {
	$w = Gtk2::Alignment->new(0, 0, 0, 0);
    }
    $w;
}


sub title1_to_markup {
    my ($label) = @_;
    if ($::isInstall) {
        my $font = lang::l2pango_font($::o->{locale}{lang});
        if (my ($font_size) = $font =~ /(\d+)/) {
            $font_size++;
            $font =~ s/\d+/$font_size/;
        }
        qq(<span foreground="#5A8AD6" font="$font">$label</span>);
    } else {
        qq(<b><big>$label</big></b>);
  }
}

sub _gtk__Install_Title {
    my ($w, $opts) = @_;
    local $opts->{widget_name} = 'Banner';
    $opts->{text} = uc($opts->{text}) if $::isInstall;
    gtknew('HBox', widget_name => 'Banner', children => [
        0, gtknew('Label', padding => [ 6, 0 ]),
        1, gtknew('VBox', widget_name => 'Banner', children_tight => [
            _gtk__Title2($w, $opts),
            if_($::isInstall, Gtk2::HSeparator->new),
        ]),
        0, gtknew('Label', padding => [ 6, 0 ]),
    ]);
}

sub _gtk__Title1 {
    my ($w, $opts) = @_;
    $opts ||= {};
    $opts->{text_markup} = title1_to_markup(delete($opts->{label})) if $opts->{label};
    _gtk__WrappedLabel($w, $opts);
}

sub _gtk__Title2 {
    my ($w, $opts) = @_;
    $opts ||= {};
    $opts->{alignment} = [ 0, 0 ];
    _gtk__Title1($w, $opts);
}

sub _gtk__Sexy_IconEntry {
    my ($w, $opts) = @_;

    require Gtk2::Sexy;
    if (!$w) {
	$w = Gtk2::Sexy::IconEntry->new;
	$w->set_editable(delete $opts->{editable}) if exists $opts->{editable};
    }

    $w->add_clear_button if delete $opts->{clear_button};
    if (my $icon = delete $opts->{primary_icon}) {
        $w->set_icon('primary', $icon);
        $w->set_icon_highlight('primary', $icon);
    }
    if (my $icon = delete $opts->{secondary_icon}) {
        $w->set_icon('secondary', $icon);
        $w->set_icon_highlight('secondary', $icon);
    }

    $w->signal_connect('icon-released' => delete $opts->{'icon-released'}) if exists $opts->{'icon-released'};
    $w->signal_connect('icon-pressed' => delete $opts->{'icon-pressed'}) if exists $opts->{'icon-pressed'};

    _gtk__Entry($w, $opts);
}

sub _gtk__Entry {
    my ($w, $opts) = @_;

    if (!$w) {
	$w = Gtk2::Entry->new;
	$w->set_editable(delete $opts->{editable}) if exists $opts->{editable};
    }

    $w->set_text(delete $opts->{text}) if exists $opts->{text};
    $w->signal_connect(key_press_event => delete $opts->{key_press_event}) if exists $opts->{key_press_event};

    if (my $text_ref = delete $opts->{text_ref}) {
	my $set = sub { $w->set_text($$text_ref) };
	gtkval_register($w, $text_ref, $set);
	$set->();
    }

    $w;
}

sub _gtk__TextView {
    my ($w, $opts, $_class, $action) = @_;
	
    if (!$w) {
	$w = Gtk2::TextView->new;
	$w->set_editable(delete $opts->{editable}) if exists $opts->{editable};
	$w->set_wrap_mode(delete $opts->{wrap_mode}) if exists $opts->{wrap_mode};
	$w->set_cursor_visible(delete $opts->{cursor_visible}) if exists $opts->{cursor_visible};
    }

    _text_insert($w, delete $opts->{text}, append => $action eq 'gtkadd') if exists $opts->{text};
    $w;
}

sub _gtk__ComboBox {
    my ($w, $opts, $_class, $action) = @_;

    if (!$w) {
	$w = Gtk2::ComboBox->new_text;
	$w->{format} = delete $opts->{format} if exists $opts->{format};

    }
    my $set_list = sub {
	$w->{formatted_list} = $w->{format} ? [ map { $w->{format}($_) } @{$w->{list}} ] : $w->{list};
	$w->get_model->clear;
	$w->{strings} = $w->{formatted_list};  # used by Gtk2::ComboBox wrappers such as get_text() in ugtk2
	$w->append_text($_) foreach @{$w->{formatted_list}};
    };
    if (my $list_ref = delete $opts->{list_ref}) {
	!$opts->{list} or internal_error("both list and list_ref");
	my $set = sub {
	    $w->{list} = $$list_ref;
	    $set_list->();
	};
	gtkval_register($w, $list_ref, $set);
	$set->();
    } elsif (exists $opts->{list}) {
	$w->{list} = delete $opts->{list};
	$set_list->();
    }

    if ($action eq 'gtknew') {
	if (my $text_ref = delete $opts->{text_ref}) {
	    my $set = sub {
		my $val = may_apply($w->{format}, $$text_ref);
		eval { $w->set_active(find_index { $_ eq $val } @{$w->{formatted_list}}) };
	    };
	    $w->signal_connect(changed => sub {
		gtkval_modify($text_ref, $w->{list}[$w->get_active], $set);
	    });
	    gtkval_register($w, $text_ref, $set);
	    gtkval_register($w, $text_ref, delete $opts->{changed}) if exists $opts->{changed};
	    $set->();
	} else {
	    my $val = delete $opts->{text};
	    eval { $w->set_active(find_index { $_ eq $val } @{$w->{formatted_list}}) } if defined $val;
	    $w->signal_connect(changed => delete $opts->{changed}) if exists $opts->{changed};
	}
    }
    $w;
}

sub _gtk__ScrolledWindow {
    my ($w, $opts, $_class, $action) = @_;
	
    if (!$w) {
	$w = Gtk2::ScrolledWindow->new(undef, undef);
	$w->set_policy(delete $opts->{h_policy} || 'automatic', delete $opts->{v_policy} || 'automatic');
    }

    my $faked_w = $w;

    if (my $child = delete $opts->{child}) {
	if (member(ref($child), qw(Gtk2::Layout Gtk2::Html2::View  Gtk2::SimpleList Gtk2::SourceView::View Gtk2::Text Gtk2::TextView Gtk2::TreeView Gtk2::WebKit::WebView))) {
	    $w->add($child);
	} else {
	    $w->add_with_viewport($child);
	}
	$child->set_focus_vadjustment($w->get_vadjustment) if $child->can('set_focus_vadjustment');
	$child->set_left_margin(6) if ref($child) =~ /Gtk2::TextView/ && $child->get_left_margin() <= 6;
	$child->show;

	$w->child->set_shadow_type(delete $opts->{shadow_type}) if exists $opts->{shadow_type};

	if (ref($child) eq 'Gtk2::TextView' && delete $opts->{to_bottom}) {
	    $child->{to_bottom} = _allow_scroll_TextView_to_bottom($w, $child);
	}

	if ($action eq 'gtknew' && ref($child) =~ /Gtk2::(Html2|SimpleList|TextView|TreeView|WebKit::WebView)/) {
	    $faked_w = gtknew('Frame', shadow_type => 'in', child => $w);
	}
    }
    $faked_w;
}

sub _gtk__Frame {
    my ($w, $opts) = @_;

    if ($w) {
	$w->set_label(delete $opts->{text}) if exists $opts->{text};
    } else {
	$w = Gtk2::Frame->new(delete $opts->{text});
	$w->set_border_width(delete $opts->{border_width}) if exists $opts->{border_width};
	$w->set_shadow_type(delete $opts->{shadow_type}) if exists $opts->{shadow_type};
    }

    if (my $child = delete $opts->{child}) {
	$w->add($child);
	$child->show;
    }
    $w;
}

sub _gtk__Expander {
    my ($w, $opts) = @_;

    if ($w) {
	$w->set_label(delete $opts->{text}) if exists $opts->{text};
    } else {
	$w = Gtk2::Expander->new(delete $opts->{text});
    }

    $w->signal_connect(activate => delete $opts->{activate}) if exists $opts->{activate};

    if (my $child = delete $opts->{child}) {
	$w->add($child);
	$child->show;
    }
    $w;
}



sub _gtk__MDV_Notebook {
    my ($w, $opts, $_class, $action) = @_;
    if (!$w) {
        import_style_ressources();

        my ($layout, $selection_arrow, $selection_bar);
        my $parent_window = delete $opts->{parent_window} || root_window();
        my $root_height = first($parent_window->get_size());
        my $suffix = $::testing || $root_height eq 800 ? '_600' : '_768';
        # the white square is a little bit above the actual left sidepanel:
        my $offset = 20;
        my $is_flip_needed = text_direction_rtl();
        my $left_background = gtknew('Image', file => 'left-background.png');
        my $right_background = gtknew('Image', file => "right-white-background_left_part$suffix", flip => $is_flip_needed);
        my $width1 = $left_background->get_pixbuf->get_width;
        my $total_width = $width1 + $right_background->get_pixbuf->get_width;
        my $arrow_x = text_direction_rtl() ? $offset/2 -4 : $width1 - $offset -3;
        $w = gtknew('HBox', spacing => 0, children => [
            0, $layout = gtknew('Layout', width => $total_width - $offset, children => [ #Layout Fixed
                # stacking order is important for "Z-buffer":
                [ $left_background, 0, 0 ],
                if_($suffix ne '_600',
                   [ gtknew('Image', file => 'left-background-filler.png'), 0, $left_background->get_pixbuf->get_height ],
                ),
                [ $selection_bar = gtknew('Image', file => 'rollover.png'), 0, 0 ], # arbitrary vertical position
                ($opts->{children} ? @{ delete $opts->{children} } : ()),
                [ $right_background, (text_direction_rtl() ? 0 : $width1 - $offset), 0 ],
                # stack on top (vertical position is arbitrary):
                [ $selection_arrow = gtknew('Image', file => 'steps_on', flip => $is_flip_needed), $arrow_x, 0, ],
            ]),
            0, gtknew('Image', file => "right-white-background_right_part$suffix", flip => $is_flip_needed),
        ]);

        bless($w, 'Gtk2::MDV_Notebook');
        add2hash($w, {
            arrow_x         => $arrow_x,
            layout          => $layout,
            selection_arrow => $selection_arrow,
            selection_bar   =>$selection_bar,
        });
    }
    $w;
}


sub _gtk__Fixed {
    my ($w, $opts, $_class, $action) = @_;
	
    if (!$w) {
	$w = Gtk2::Fixed->new;
	$w->set_has_window(delete $opts->{has_window}) if exists $opts->{has_window};
        _gtknew_handle_layout_children($w, $opts);
    }
    $w;
}

sub _gtk__Layout {
    my ($w, $opts, $_class, $_action) = @_;
	
    if (!$w) {
	$w = Gtk2::Layout->new;
        _gtknew_handle_layout_children($w, $opts);
    }
    $w;
}

sub _gtknew_handle_layout_children {
    my ($w, $opts) = @_;
        $opts->{children} ||= [];
        push @{$opts->{children}}, [ delete $opts->{child}, delete $opts->{x}, delete $opts->{y} ] if exists $opts->{child};
        foreach (@{$opts->{children}}) {
            $w->put(@$_);
        }
        delete $opts->{children};

        if ($opts->{pixbuf_file}) {
            my $pixbuf = gtknew('Pixbuf', file => delete $opts->{pixbuf_file}) if $opts->{pixbuf_file};
            $w->signal_connect(
                realize => sub {
                    ugtk2::set_back_pixbuf($w, $pixbuf);
                });
        }
}


sub _gtk__Window { &_gtk_any_Window }
sub _gtk__Dialog { &_gtk_any_Window }
sub _gtk__Plug   { &_gtk_any_Window }
sub _gtk_any_Window {
    my ($w, $opts, $class) = @_;

    if (!$w) {
	if ($class eq 'Window') {
	    $w = "Gtk2::$class"->new(delete $opts->{type} || 'toplevel');
	} elsif ($class eq 'Plug') {
	    $opts->{socket_id} or internal_error("can not create a Plug without a socket_id");
	    $w = "Gtk2::$class"->new(delete $opts->{socket_id});
	} else {
	    $w = "Gtk2::$class"->new;
	}

	if ($::isInstall || $::set_dialog_hint) {
	    $w->set_type_hint('dialog'); # for matchbox window manager
	}

	$w->set_modal(delete $opts->{modal}) if exists $opts->{modal};
	$opts->{transient_for} ||= $::main_window if $::main_window;
	$w->set_modal(1) if exists $opts->{transient_for};
	$w->set_transient_for(delete $opts->{transient_for}) if exists $opts->{transient_for};
	$w->set_border_width(delete $opts->{border_width}) if exists $opts->{border_width};
	$w->set_shadow_type(delete $opts->{shadow_type}) if exists $opts->{shadow_type};
	$w->set_position(delete $opts->{position_policy}) if exists $opts->{position_policy};
	$w->set_default_size(delete $opts->{default_width} || -1, delete $opts->{default_height} || -1) if exists $opts->{default_width} || exists $opts->{default_height};
	my $icon_no_error = $opts->{icon_no_error};
	if (my $name = delete $opts->{icon} || delete $opts->{icon_no_error}) {
	    if (my $f = _find_imgfile($name)) {
		$w->set_icon(gtknew('Pixbuf', file => $f));
	    } elsif (!$icon_no_error) {
		internal_error("can not find $name");
	    }
	}
    }
    $w->set_title(delete $opts->{title}) if exists $opts->{title};

    if (my $child = delete $opts->{child}) {
	$w->add($child);
	$child->show;
    }
    $w;
}

my $previous_popped_and_reuse_window;

sub destroy_previous_popped_and_reuse_window() {
    $previous_popped_and_reuse_window or return;

    $previous_popped_and_reuse_window->destroy;
    $previous_popped_and_reuse_window = undef;
}

sub _gtk__MagicWindow {
    my ($w, $opts) = @_;

    my $pop_it = delete $opts->{pop_it} || !$::isWizard && !$::isEmbedded || $::WizardTable && do {
	#- do not take into account the wizard banner
        # FIXME!!!
	any { !$_->isa('Gtk2::DrawingArea') && $_->visible } $::WizardTable->get_children;
    };

    my $pop_and_reuse = delete $opts->{pop_and_reuse} && $pop_it;
    my $sub_child = delete $opts->{child};
    my $provided_banner = delete $opts->{banner};

    if ($pop_it && $provided_banner) {
	$sub_child = gtknew('VBox', children => [ 0, $provided_banner, if_($sub_child, 1, $sub_child) ]);
    } else {
	$sub_child ||= gtknew('VBox');
    }
    if (!$pop_and_reuse) {
	destroy_previous_popped_and_reuse_window();
    }

    if ($previous_popped_and_reuse_window && $pop_and_reuse) {
	$w = $previous_popped_and_reuse_window;
	$w->remove($w->child);

	gtkadd($w, child => $sub_child);
	%$opts = ();
    } elsif ($pop_it) {
	$opts->{child} = $sub_child;

	$w = _create_Window($opts, pop_and_reuse => $pop_and_reuse);
	$previous_popped_and_reuse_window = $w if $pop_and_reuse;
    } else {
	if (!$::WizardWindow) {

	    my $banner;
	    if (!$::isEmbedded && !$::isInstall && $::Wizard_title) {
		if (_find_imgfile($opts->{icon_no_error})) {
		    $banner = Gtk2::Banner->new($opts->{icon_no_error}, $::Wizard_title);
		} else { 
		    log::l("ERROR: missing wizard banner $opts->{icon_no_error}");
		}
	    }
	    $::WizardTable = gtknew('VBox', if_($banner, children_tight => [ $banner ]));

	    if ($::isEmbedded) {
		add2hash($opts, {
		    socket_id => $::XID,
		    child => $::WizardTable,
		});
		delete $opts->{no_Window_Manager};
		$::Plug = $::WizardWindow = _gtk(undef, 'Plug', 'gtknew', $opts);
		sync($::WizardWindow);
	    } else {
		add2hash($opts, {
		    child => $::WizardTable,
		});
		$::WizardWindow = _create_Window($opts);
	    }
	} else {
	    %$opts = ();
	}

	set_main_window_size($::WizardWindow);

	$w = $::WizardWindow;
     
	gtkadd($::WizardTable, children_tight => [ $provided_banner ]) if $provided_banner;
	gtkadd($::WizardTable, children_loose => [ $sub_child ]);
    }
    bless { 
	real_window => $w, 
	child => $sub_child, pop_it => $pop_it, pop_and_reuse => $pop_and_reuse,
	if_($provided_banner, banner => $provided_banner),
    }, 'mygtk2::MagicWindow';
}

# A standard About dialog. Used with:
# my $w = gtknew('AboutDialog', ...);
# $w->show_all;
# $w->run;
sub _gtk__AboutDialog {
    my ($w, $opts) = @_;

    if (!$w) {
        $w = Gtk2::AboutDialog->new;
        $w->signal_connect(response => sub { $_[0]->destroy });
        $w->set_program_name(delete $opts->{name}) if exists $opts->{name};
        $w->set_version(delete $opts->{version}) if exists $opts->{version};
        $w->set_icon(gtknew('Pixbuf', file => delete $opts->{icon})) if exists $opts->{icon};
        $w->set_logo(gtknew('Pixbuf', file => delete $opts->{logo})) if exists $opts->{logo};
        $w->set_copyright(delete $opts->{copyright}) if exists $opts->{copyright};
        $w->set_url_hook(sub {
            my (undef, $url) = @_;
            run_program::raw({ detach => 1 }, 'www-browser', $url);
        });
        $w->set_email_hook(sub {
            my (undef, $url) = @_;
            run_program::raw({ detach => 1 }, 'www-browser', $url);
        });

        if (my $url = delete $opts->{website}) {
            $url =~ s/^https:/http:/; # Gtk2::About doesn't like "https://..." like URLs
            $w->set_website($url);
        }
        $w->set_license(delete $opts->{license}) if exists $opts->{license};
        $w->set_wrap_license(delete $opts->{wrap_license}) if exists $opts->{wrap_license};
        $w->set_comments(delete $opts->{comments}) if exists $opts->{comments};
        $w->set_website_label(delete $opts->{website_label}) if exists $opts->{website_label};
        $w->set_authors(delete $opts->{authors}) if exists $opts->{authors};
        $w->set_documenters(delete $opts->{documenters}) if exists $opts->{documenters};
        $w->set_translator_credits(delete $opts->{translator_credits}) if exists $opts->{translator_credits};
        $w->set_artists(delete $opts->{artists}) if exists $opts->{artists};
        $w->set_modal(delete $opts->{modal}) if exists $opts->{modal};
        $w->set_transient_for(delete $opts->{transient_for}) if exists $opts->{transient_for};
        $w->set_position(delete $opts->{position_policy}) if exists $opts->{position_policy};
    }
    $w;
}

sub _gtk__FileSelection {
    my ($w, $opts) = @_;

    if (!$w) {
	$w = Gtk2::FileSelection->new(delete $opts->{title} || '');
	gtkset($w->ok_button, %{delete $opts->{ok_button}}) if exists $opts->{ok_button};
	gtkset($w->cancel_button, %{delete $opts->{cancel_button}}) if exists $opts->{cancel_button};
    }
    $w;
}

sub _gtk__FileChooser {
    my ($w, $opts) = @_;

    #- no nice way to have a {file_ref} on a FileChooser since selection_changed only works for browsing, not file/folder creation

    if (!$w) {
	my $action = delete $opts->{action} || internal_error("missing action for FileChooser");
	$w = Gtk2::FileChooserWidget->new($action);

	my $file = $opts->{file} && delete $opts->{file};

	if (my $dir = delete $opts->{directory} || $file && dirname($file)) {
	    $w->set_current_folder($dir);
	}
	if ($file) {
	    if ($action =~ /save|create/) {
		$w->set_current_name(basename($file));
	    } else {
		$w->set_filename($file);
	    }
	}
    }
    $w;
}

sub _gtk__VPaned { &_gtk_any_Paned }
sub _gtk__HPaned { &_gtk_any_Paned }
sub _gtk_any_Paned {
    my ($w, $opts, $class, $action) = @_;

    if (!$w) {
	$w = "Gtk2::$class"->new;
	$w->set_border_width(delete $opts->{border_width}) if exists $opts->{border_width};
        $w->set_position(delete $opts->{position}) if exists $opts->{position};
    } elsif ($action eq 'gtkset') {
	$_->destroy foreach $w->get_children;
    }

    foreach my $opt (qw(resize1 shrink1 resize2 shrink2)) {
        $opts->{$opt} = 1 if !defined $opts->{$opt};
    }
    $w->pack1(delete $opts->{child1}, delete $opts->{resize1}, delete $opts->{shrink1});
    $w->pack2(delete $opts->{child2}, delete $opts->{resize2}, delete $opts->{shrink2});
    $w;
}

sub _gtk__VBox { &_gtk_any_Box }
sub _gtk__HBox { &_gtk_any_Box }
sub _gtk_any_Box {
    my ($w, $opts, $class, $action) = @_;

    if (!$w) {
	$w = "Gtk2::$class"->new;
	$w->set_homogeneous(delete $opts->{homogenous}) if exists $opts->{homogenous};
	$w->set_spacing(delete $opts->{spacing}) if exists $opts->{spacing};
	$w->set_border_width(delete $opts->{border_width}) if exists $opts->{border_width};
    } elsif ($action eq 'gtkset') {
	$_->destroy foreach $w->get_children;
    }

    _gtknew_handle_children($w, $opts);
    $w;
}

sub _gtk__VButtonBox { &_gtk_any_ButtonBox }
sub _gtk__HButtonBox { &_gtk_any_ButtonBox }
sub _gtk_any_ButtonBox {
    my ($w, $opts, $class, $action) = @_;

    if (!$w) {
	$w = "Gtk2::$class"->new;
	$w->set_homogeneous(delete $opts->{homogenous}) if exists $opts->{homogenous};
	$w->set_border_width(delete $opts->{border_width}) if exists $opts->{border_width};
	$w->set_spacing(delete $opts->{spacing}) if exists $opts->{spacing};
	$w->set_layout(delete $opts->{layout} || 'spread');
    } elsif ($action eq 'gtkset') {
	$_->destroy foreach $w->get_children;
    }

    _gtknew_handle_children($w, $opts);
    $w;
}

sub _gtk__Notebook {
    my ($w, $opts) = @_;

    if (!$w) {
	$w = Gtk2::Notebook->new;
	$w->set_property('show-tabs', delete $opts->{show_tabs}) if exists $opts->{show_tabs};
	$w->set_property('show-border', delete $opts->{show_border}) if exists $opts->{show_border};
    }

    if (exists $opts->{children}) {
	foreach (group_by2(@{delete $opts->{children}})) {
	    my ($title, $page) = @$_;
	    $w->append_page($page, $title);
	    $page->show;
	    $title->show;
	}
    }
    $w;
}

sub _gtk__Table {
    my ($w, $opts) = @_;

    if (!$w) {
	add2hash_($opts, { xpadding => 5, ypadding => 0, border_width => $::isInstall ? 3 : 10 });

	$w = Gtk2::Table->new(0, 0, delete $opts->{homogeneous} || 0);
	$w->set_col_spacings(delete $opts->{col_spacings} || 0);
	$w->set_row_spacings(delete $opts->{row_spacings} || 0);
	$w->set_border_width(delete $opts->{border_width});
	$w->{$_} = delete $opts->{$_} foreach 'xpadding', 'ypadding', 'mcc';
    }

    each_index {
	my ($i, $l) = ($::i, $_);
	each_index {
	    my $j = $::i;
	    if ($_) {
		ref $_ or $_ = Gtk2::WrappedLabel->new($_);
		$j != $#$l && !$w->{mcc} ?
		  $w->attach($_, $j, $j + 1, $i, $i + 1,
			     'fill', 'fill', $w->{xpadding}, $w->{ypadding}) :
			       $w->attach($_, $j, $j + 1, $i, $i + 1,
					  ['expand', 'fill'], ref($_) eq 'Gtk2::ScrolledWindow' || $_->get_data('must_grow') ? ['expand', 'fill'] : [], 0, 0);
		$_->show;
	    }
	} @$l;
    } @{delete $opts->{children} || []};

    $w;
}

sub _gtk_any_simple {
    my ($w, $_opts, $class) = @_;

    $w ||= "Gtk2::$class"->new;
}

sub _gtknew_handle_children {
    my ($w, $opts) = @_;

    my @child = exists $opts->{children_tight} ? map { [ 0, $_ ] } @{delete $opts->{children_tight}} :
                exists $opts->{children_loose} ? map { [ 1, $_ ] } @{delete $opts->{children_loose}} :
	        exists $opts->{children} ? group_by2(@{delete $opts->{children}}) : 
		exists $opts->{children_centered} ? 
		  ([ 1, gtknew('VBox') ], (map { [ 0, $_ ] } @{delete $opts->{children_centered}}), [ 1, gtknew('VBox') ]) :
		  ();

    my $padding = delete $opts->{padding};

    foreach (@child) {
	my ($fill, $child) = @$_;
	$fill eq '0' || $fill eq '1' || $fill eq 'fill' || $fill eq 'expand' or internal_error("odd {children} parameter must be 0 or 1 (got $fill)");
	ref $child or $child = Gtk2::WrappedLabel->new($child);
	my $expand = $fill && $fill ne 'fill' ? 1 : 0;
	$w->pack_start($child, $expand, $fill, $padding || 0);
	$child->show;
    }
}

#- this magic function redirects method calls:
#- * default is to redirect them to the {child}
#- * if the {child} doesn't handle the method, we try with the {real_window}
#-   (eg : add_accel_group set_position set_default_size
#- * a few methods are handled specially
my %for_real_window = map { $_ => 1 } qw(show_all size_request);
sub mygtk2::MagicWindow::AUTOLOAD {
    my ($w, @args) = @_;

    my ($meth) = $mygtk2::MagicWindow::AUTOLOAD =~ /mygtk2::MagicWindow::(.*)/;

    my ($s1, @s2) = $meth eq 'show'
              ? ('real_window', 'banner', 'child') :
            $meth eq 'destroy' || $meth eq 'hide' ?
	      ($w->{pop_it} ? 'real_window' : ('child', 'banner')) :
            $meth eq 'get' && $args[0] eq 'window-position' ||
	    $for_real_window{$meth} ||
            !$w->{child}->can($meth)
	      ? 'real_window'
	      : 'child';

#-    warn "mygtk2::MagicWindow::$meth", first($w =~ /HASH(.*)/), " on $s1 @s2 (@args)\n";

    $w->{$_} && $w->{$_}->$meth(@args) foreach @s2;
    $w->{$s1}->$meth(@args);
}

sub _create_Window {
    my ($opts) = @_;

    my $no_Window_Manager = exists $opts->{no_Window_Manager} ? delete $opts->{no_Window_Manager} : !$::isStandalone;

    add2hash($opts, {
	if_(!$::isInstall && !$::isWizard, border_width => 5),

	#- policy: during install, we need a special code to handle the weird centering, see below
	position_policy => $::isInstall ?
          ($opts->{modal} ? 'center-always' : 'none') :
            $no_Window_Manager ? 'center-always' : 'center-on-parent',

	if_($::isInstall, position => [
	    $::stepswidth + ($::o->{windowwidth} - $::real_windowwidth) / 2, 
	    ($::o->{windowheight} - $::real_windowheight) / 2,
	]),
    });
    my $w = _gtk(undef, 'Window', 'gtknew', $opts);

    #- when the window is closed using the window manager "X" button (or alt-f4)
    $w->signal_connect(delete_event => sub { 
	if ($::isWizard) {
	    $w->destroy; 
	    die 'wizcancel';
	} else { 
	    if (Gtk2->main_level) {
                Gtk2->main_quit;
	    } else {
                # block window deletion if not in main loop (eg: while starting the GUI)
                return 1;
	    }
	} 
    });

    if ($no_Window_Manager) {
	_force_keyboard_focus($w);
    }

    if ($::isInstall) {
	require install::gtk; #- for perl_checker
	install::gtk::handle_unsafe_mouse($::o, $w);
	$w->signal_connect(key_press_event => \&install::gtk::special_shortcuts);

	#- force center at a weird position, this can't be handled by position_policy
	#- because center-* really are window manager hints for centering, whereas we want
	#- to center the main window in the right part of the screen
	my ($wi, $he);
	$w->signal_connect(size_allocate => sub {
	    my (undef, $event) = @_;
	    my @w_size = $event->values;

	    # ignore bogus sizing events:
	    return if $w_size[2] < 5;
	    return if $w_size[2] == $wi && $w_size[3] == $he; #BUG
	    (undef, undef, $wi, $he) = @w_size;

            $w->move(max(0, $::rootwidth - ($::o->{windowwidth} + $wi) / 2), 
		     max(0, ($::o->{windowheight} - $he) / 2));
	});
    }

    $w;
}

my $current_window;
sub _force_keyboard_focus {
    my ($w) = @_;

    sub _XSetInputFocus {
	my ($w) = @_;
	if ($current_window == $w) {
	    $w->window->XSetInputFocus;
	}
	0;
    }

    #- force keyboard focus instead of mouse focus
    my $previous_current_window = $current_window;
    $current_window = $w;
    $w->signal_connect(expose_event => \&_XSetInputFocus);
    $w->signal_connect(destroy => sub { $current_window = $previous_current_window });
}

sub _find_imgfile {
    my ($name) = @_;

    if ($name =~ m|/| && -f $name) {
	$name;
    } else {
	foreach my $path (_icon_paths()) {
	    foreach ('', '.png', '.xpm', '.jpg') {
		my $file = "$path/$name$_";
		-f $file and return $file;
	    }
	}
    }
}

# _text_insert() can be used with any of choose one of theses styles:
# - no tags:
#   _text_insert($textview, "My text..");
# - anonymous tags:
#   _text_insert($textview, [ [ 'first text',  { 'foreground' => 'blue', 'background' => 'green', ... } ],
#			        [ 'second text' ],
#		                [ 'third', { 'font' => 'Serif 15', ... } ],
#                               ... ]);
# - named tags:
#   $textview->{tags} = {
#                        'blue_green' => { 'foreground' => 'blue', 'background' => 'green', ... },
#                        'big_font' => { 'font' => 'Serif 35', ... },
#                       }
#   _text_insert($textview, [ [ 'first text',  'blue_green' ],
#		                [ 'second', 'big_font' ],
#                               ... ]);
# - mixed anonymous and named tags:
#   $textview->{tags} = {
#                        'blue_green' => { 'foreground' => 'blue', 'background' => 'green', ... },
#                        'big_font' => { 'font' => 'Serif 35', ... },
#                       }
#   _text_insert($textview, [ [ 'first text',  'blue_green' ],
#			        [ 'second text' ],
#		                [ 'third', 'big_font' ],
#		                [ 'fourth', { 'font' => 'Serif 15', ... } ],
#                               ... ]);
sub _text_insert {
    my ($textview, $t, %opts) = @_;
    my $buffer = $textview->get_buffer;
    $buffer->{tags} ||= {};
    $buffer->{gtk_tags} ||= {};
    my $gtk_tags = $buffer->{gtk_tags};
    my $tags = $buffer->{tags};
    if (ref($t) eq 'ARRAY') {
        if (!$opts{append}) {
            $buffer->set_text('');
            $textview->{anchors} = [];
        }
        foreach my $token (@$t) {
            my ($item, $tag) = @$token;
            my $iter1 = $buffer->get_end_iter;
            if ($item =~ /^Gtk2::Gdk::Pixbuf/) {
                $buffer->insert_pixbuf($iter1, $item);
                next;
            }
            if ($item =~ /^Gtk2::/) {
                my $anchor = $buffer->create_child_anchor($iter1);
                $textview->add_child_at_anchor($item, $anchor);
                $textview->{anchors} ||= [];
                push @{$textview->{anchors}}, $anchor;
                next;
            }
            if ($tag) {
                if (ref($tag)) {
                    # use anonymous tags
                    $buffer->insert_with_tags($iter1, $item, $buffer->create_tag(undef, %$tag));
                } else {
                    # fast text insertion:
                    # since in some contexts (eg: localedrake, rpmdrake), we use quite a lot of identical tags,
                    # it's much more efficient and less memory pressure to use named tags
                    $gtk_tags->{$tag} ||= $buffer->create_tag($tag, %{$tags->{$token->[1]}});
                    $buffer->insert_with_tags($iter1, $item, $gtk_tags->{$tag});
                }
            } else {
                $buffer->insert($iter1, $item);
            }
        }
    } else {
        if ($opts{append}) {
            $buffer->insert($buffer->get_end_iter, $t);
        } else {
            $textview->{anchors} = [];
            $buffer->set_text($t);
        }
    }
    $textview->{to_bottom}->() if $textview->{to_bottom};

    #- the following line is needed to move the cursor to the beginning, so that if the
    #- textview has a scrollbar, it will not scroll to the bottom when focusing (#3633)
    $buffer->place_cursor($buffer->get_start_iter);
    $textview->set_wrap_mode($opts{wrap_mode} || 'word');
    $textview->set_editable($opts{editable} || 0);
    $textview->set_cursor_visible($opts{visible} || 0);
    $textview;
}

sub _allow_scroll_TextView_to_bottom {
    my ($scrolledWindow, $textView) = @_;

    $textView->get_buffer->create_mark('end', $textView->get_buffer->get_end_iter, 0);
    sub {
	my ($o_force) = @_;
	my $adjustment = $scrolledWindow->get_vadjustment;
	if ($o_force || $adjustment->page_size + $adjustment->value == $adjustment->upper) {
	    flush(); #- one must flush before scrolling to end, otherwise the text just added *may* not be taken into account correctly, and so it doesn't really scroll to end
	    $textView->scroll_to_mark($textView->get_buffer->get_mark('end'), 0, 1, 0, 1);
	}
    };
}

sub asteriskize {
    my ($label) = @_;
    "\x{2022} " . $label;
}

sub get_main_window_size() {
    my ($width, $height) = $::real_windowwidth ? ($::real_windowwidth, $::real_windowheight) : $::isWizard ? (540, 360) : (600, 400);
}

# in order to workaround infamous 6 years old gnome bug #101968:
sub get_label_width() {
    first(mygtk2::get_main_window_size()) - 50 - $left_padding;
}

sub set_main_window_size {
    my ($window) = @_;
    my ($width, $height) = get_main_window_size();
    $window->set_size_request($width, $height);
}

my @icon_paths;
sub add_icon_path { push @icon_paths, @_ }
sub _icon_paths() {
   (@icon_paths, (exists $ENV{SHARE_PATH} ? ($ENV{SHARE_PATH}, "$ENV{SHARE_PATH}/icons", "$ENV{SHARE_PATH}/libDrakX/pixmaps") : ()),
    "/usr/lib/libDrakX/icons", "pixmaps", 'data/icons', 'data/pixmaps', 'standalone/icons', '/usr/share/rpmdrake/icons');
}  

sub main {
    my ($window, $o_verif) = @_;
    my $destroyed;
    $window->signal_connect(destroy => sub { $destroyed = 1 });
    $window->show;
    do { Gtk2->main } while (!$destroyed && $o_verif && !$o_verif->());
    may_destroy($window);
    flush();
}

sub sync {
    my ($window) = @_;
    $window->show;
    flush();
}

sub flush() { 
    Gtk2->main_iteration while Gtk2->events_pending;
}

sub may_destroy {
    my ($w) = @_;
    return if !$w;
    @::main_windows = difference2(\@::main_windows, [ $w->{real_window} ]);
    if ($::main_window eq $w->{real_window}) {
        undef $::main_window;
        $::main_window = $::main_windows[-1];
    }
    $w->destroy;
}

sub root_window() {
    state $root;
    $root ||= Gtk2::Gdk->get_default_root_window;
}

sub rgb2color {
    my ($r, $g, $b) = @_;
    my $color = Gtk2::Gdk::Color->new($r, $g, $b);
    root_window()->get_colormap->rgb_find_color($color);
    $color;
}

sub set_root_window_background {
    my ($r, $g, $b) = @_;
    my $root = root_window();
    my $gc = Gtk2::Gdk::GC->new($root);
    my $color = rgb2color($r, $g, $b);
    $gc->set_rgb_fg_color($color);
    set_root_window_background_with_gc($gc);
}

sub set_root_window_background_with_gc {
    my ($gc) = @_;
    my $root = root_window();
    my ($w, $h) = $root->get_size;
    $root->set_background($gc->get_values->{foreground});
    $root->draw_rectangle($gc, 1, 0, 0, $w, $h);
}

sub _new_alpha_pixbuf {
    my ($pixbuf) = @_;
    my ($height, $width) = ($pixbuf->get_height, $pixbuf->get_width);
    my $new_pixbuf = Gtk2::Gdk::Pixbuf->new('rgb', 1, 8, $width, $height);
    $new_pixbuf->fill(0x00000000); # transparent white
    $width, $height, $new_pixbuf;
}

sub _pixbuf_render_alpha {
    my ($pixbuf, $alpha_threshold) = @_;
    my ($width, $height, $new_pixbuf) = _new_alpha_pixbuf($pixbuf);
    $pixbuf->composite($new_pixbuf, 0, 0, $width, $height, 0, 0, 1, 1, 'bilinear', $alpha_threshold);
    $new_pixbuf;
}

sub pixmap_from_pixbuf {
    my ($widget, $pixbuf) = @_;
    my $window = $widget->window or internal_error("you can't use this function if the widget is not realised");
    my ($width, $height) = ($pixbuf->get_width, $pixbuf->get_height);
    my $pixmap = Gtk2::Gdk::Pixmap->new($window, $width, $height, $window->get_depth);
    $pixbuf->render_to_drawable($pixmap, $widget->style->fg_gc('normal'), 0, 0, 0, 0, $width, $height, 'max', 0, 0);
    $pixmap;
}

sub import_style_ressources() {
    if (!$::isInstall) {
        Gtk2::Rc->parse_string(scalar cat_('/usr/share/libDrakX/themes-galaxy.rc')); # FIXME DEBUG
    }
}

sub text_direction_rtl() {
    Gtk2::Widget->get_default_direction() eq 'rtl';
}

package Gtk2::MDV_Notebook; # helper functions for installer & mcc
our @ISA = qw(Gtk2::Widget);

sub hide_selection {
    my ($w) = @_;
    $_->hide foreach $w->{selection_bar}, $w->{selection_arrow};
}

sub move_selection {
    my ($w, $y) = @_;
    my $layout = $w->{layout};
    $layout->{arrow_ydiff} ||=
      ($w->{selection_arrow}->get_pixbuf->get_height - $w->{selection_bar}->get_pixbuf->get_height)/2;
    my $bar_y = $y -3; # text's pos_y -3
    $layout->move($w->{selection_bar}, 0, $bar_y);
    $layout->move($w->{selection_arrow}, $w->{arrow_x}, $bar_y - $layout->{arrow_ydiff}); # arrow is higer
    $_->show foreach $w->{selection_bar}, $w->{selection_arrow};
}

1;
" " --synthesis - використовувати вказаний файл synthesis замість бази " "даних urpmi.\n" #: ../urpmf:40 #, c-format msgid " --uniq - do not print identical lines twice.\n" msgstr " --uniq - не виводити однакові рядки.\n" #: ../urpmf:41 ../urpmi:70 ../urpmq:42 #, c-format msgid " --update - use only update media.\n" msgstr " --update - використовування тільки носії з поновленнями.\n" #: ../urpmf:42 #, c-format msgid " --verbose - verbose mode.\n" msgstr " --verbose - детальний режим.\n" #: ../urpmf:43 #, c-format msgid " -i - ignore case distinctions in patterns.\n" msgstr " -i - нехтувати регістрами в усіх шаблонах.\n" #: ../urpmf:44 #, c-format msgid " -I - honor case distinctions in patterns (default).\n" msgstr "" " -I - зважати на регістр символів у шаблонах (типова " "поведінка).\n" #: ../urpmf:45 #, c-format msgid " -F<str> - change field separator (defaults to ':').\n" msgstr " -F<рядок> - змінити роздільник полів (типовим є «:»).\n" #: ../urpmf:46 #, c-format msgid "Pattern expressions:\n" msgstr "Вирази-шаблони:\n" #: ../urpmf:47 #, c-format msgid " text - any text is parsed as a regexp, unless -l is used.\n" msgstr "" " text - будь-який текст обробляється як формальний вираз, якщо не " "використано параметра -l.\n" #: ../urpmf:48 #, c-format msgid " -e - include perl code directly as perl -e.\n" msgstr " -e - включати код perl безпосередньо як perl -e.\n" #: ../urpmf:49 #, c-format msgid " -a - binary AND operator.\n" msgstr " -a - двійковий оператор AND.\n" #: ../urpmf:50 #, c-format msgid " -o - binary OR operator.\n" msgstr " -o - двійковий оператор OR.\n" #: ../urpmf:51 #, c-format msgid " ! - unary NOT.\n" msgstr " ! - унарний NOT.\n" #: ../urpmf:52 #, c-format msgid " ( ) - left and right parentheses.\n" msgstr " ( ) - ліва і права дужки.\n" #: ../urpmf:53 #, c-format msgid "List of tags:\n" msgstr "Список міток:\n" #: ../urpmf:54 #, c-format msgid " --qf - specify a printf-like output format\n" msgstr " --qf - вказати формат виводу у стилі printf\n" #: ../urpmf:55 #, c-format msgid " example: '%%name:%%files'\n" msgstr " приклад: '%%name:%%files'\n" #: ../urpmf:56 #, c-format msgid " --arch - architecture\n" msgstr " --arch - архітектура\n" #: ../urpmf:57 #, c-format msgid " --buildhost - build host\n" msgstr " --buildhost - вузол збирання\n" #: ../urpmf:58 #, c-format msgid " --buildtime - build time\n" msgstr " --buildtime - час збирання\n" #: ../urpmf:59 #, c-format msgid " --conffiles - configuration files\n" msgstr " --conffiles - файли налаштування\n" #: ../urpmf:60 #, c-format msgid " --conflicts - conflict tags\n" msgstr " --conflicts - мітки конфліктів\n" #: ../urpmf:61 #, c-format msgid " --description - package description\n" msgstr " --description - опис пакунка\n" #: ../urpmf:62 #, c-format msgid " --distribution - distribution\n" msgstr " --distribution - дистрибутив\n" #: ../urpmf:63 #, c-format msgid " --epoch - epoch\n" msgstr " --epoch - епоха\n" #: ../urpmf:64 #, c-format msgid " --filename - filename of the package\n" msgstr " --filename - назва файл пакунка\n" #: ../urpmf:65 #, c-format msgid " --files - list of files contained in the package\n" msgstr " --files - список файлів, що містяться у пакунку\n" #: ../urpmf:66 #, c-format msgid " --group - group\n" msgstr " --group - група\n" #: ../urpmf:67 #, c-format msgid " --license - license\n" msgstr " --license - ліцензія\n" #: ../urpmf:68 #, c-format msgid " --name - package name\n" msgstr " --name - назва пакунка\n" #: ../urpmf:69 #, c-format msgid " --obsoletes - obsoletes tags\n" msgstr " --obsoletes - мітки застарілих (obsoletes)\n" #: ../urpmf:70 #, c-format msgid " --packager - packager\n" msgstr " --packager - пакувальник\n" #: ../urpmf:71 #, c-format msgid " --provides - provides tags\n" msgstr " --provides - мітки дозволів (provides)\n" #: ../urpmf:72 #, c-format msgid " --requires - requires tags\n" msgstr " --requires - мітки залежностей (requires)\n" #: ../urpmf:73 #, c-format msgid " --size - installed size\n" msgstr " --size - розмір після встановлення\n" #: ../urpmf:74 #, c-format msgid " --sourcerpm - source rpm name\n" msgstr " --sourcerpm - назва джерельного rpm\n" #: ../urpmf:75 #, c-format msgid " --recommends - recommends tags\n" msgstr " --recommends - мітки рекомендацій (recommends)\n" #: ../urpmf:76 #, c-format msgid " --summary - summary\n" msgstr " --summary - резюме\n" #: ../urpmf:77 #, c-format msgid " --url - url\n" msgstr " --url - адреса url\n" #: ../urpmf:78 #, c-format msgid " --vendor - vendor\n" msgstr " --vendor - виробник\n" #: ../urpmf:79 #, c-format msgid " -m - the media in which the package was found\n" msgstr " -m - носій, на якому було знайдено пакунок\n" #: ../urpmf:80 ../urpmq:97 #, c-format msgid " -f - print version, release and arch with name.\n" msgstr " -f - вивести версію, випуск і архів з назвою.\n" #: ../urpmf:149 #, c-format msgid "unterminated expression (%s)" msgstr "незавершений вираз (%s)" #: ../urpmf:194 #, c-format msgid "Incorrect format: you may use only one multi-valued tag" msgstr "Неправильний формат: можна використовувати лише багатозначні мітки" #: ../urpmf:287 #, c-format msgid "no hdlist available for medium \"%s\"" msgstr "немає файла hdlist для носія «%s»" #: ../urpmf:294 #, c-format msgid "no synthesis available for medium \"%s\"" msgstr "немає файла synthesis для носія «%s»" #: ../urpmf:303 #, c-format msgid "no xml-info available for medium \"%s\"" msgstr "немає файла xml-info для носія «%s»" #: ../urpmi:76 #, c-format msgid " --auto-update - update media then upgrade the system.\n" msgstr " --auto-update - оновлювати носій перед оновленням системи.\n" #: ../urpmi:77 #, c-format msgid " --no-md5sum - disable MD5SUM file checking.\n" msgstr " --no-md5sum - вимкнути перевірку файлів на MD5SUM.\n" #: ../urpmi:78 #, c-format msgid " --force-key - force update of gpg key.\n" msgstr " --force-key - виконати примусове оновлення ключа gpg.\n" #: ../urpmi:79 #, c-format msgid " --auto-orphans - remove orphans without asking\n" msgstr " --auto-orphans - вилучити «осиротілі» у автоматичному режимі\n" #: ../urpmi:80 ../urpmq:52 #, c-format msgid " --no-recommends - do not auto select \"recommended\" packages.\n" msgstr " --no-recommends - не вибирати автоматично «рекомендовані» пакунки.\n" #: ../urpmi:81 #, c-format msgid "" " --no-uninstall - never ask to uninstall a package, abort the " "installation.\n" msgstr "" " --no-uninstall - ніколи не запитувати про вилучення пакунка, припиняти " "встановлення.\n" #: ../urpmi:82 #, c-format msgid " --no-install - don't install packages (only download)\n" msgstr " --no-install - не встановлювати пакунки (тільки отримати)\n" #: ../urpmi:83 ../urpmq:54 #, c-format msgid "" " --keep - keep existing packages if possible, reject requested\n" " packages that lead to removals.\n" msgstr "" " --keep - залишити існуючі пакунки, якщо можливо, відкинути " "замовлені\n" " пакунки, які мають вилучатися.\n" #: ../urpmi:85 #, c-format msgid "" " --split-level - split in small transaction if more than given packages\n" " are going to be installed or upgraded,\n" " default is %d.\n" msgstr "" " --split-level - розбивати на малі транзакції, якщо буде встановлюватися\n" " або поновлюватися більше, ніж задані пакунки,\n" " типове значення %d.\n" #: ../urpmi:89 #, c-format msgid " --split-length - small transaction length, default is %d.\n" msgstr " --split-level - транзакції малої довжини, типова довжина %d.\n" #: ../urpmi:91 #, c-format msgid " --fuzzy, -y - impose fuzzy search.\n" msgstr " --fuzzy, -y - виконати нечіткий пошук.\n" #: ../urpmi:92 #, c-format msgid " --buildrequires - install the buildrequires of the packages\n" msgstr " --buildrequires - встановити всі пакунки з мітки buildrequires\n" #: ../urpmi:93 #, c-format msgid " --install-src - install only source package (no binaries).\n" msgstr "" " --install-src - встановити тільки пакунок з вихідними текстами (без " "двійкових файлів).\n" #: ../urpmi:94 #, c-format msgid " --clean - remove rpm from cache before anything else.\n" msgstr " --clean - спочатку вилучити rpm з кешу.\n" #: ../urpmi:95 #, c-format msgid " --noclean - don't clean rpms from cache.\n" msgstr " --noclean - не прибирати rpm з кешу.\n" #: ../urpmi:97 #, c-format msgid "" " --downgrade - downgrade a package from the version currently installed\n" " to the previously highest version\n" msgstr "" " --downgrade - замінити пакунок поточної версії на пакунок з найбільшим\n" " номером попередньої версії\n" #: ../urpmi:99 #, c-format msgid "" " --replacepkgs - force installing packages which are already installed.\n" msgstr " --replacepkgs - примусове встановлення вже встановлених пакунків.\n" #: ../urpmi:101 #, c-format msgid "" " --allow-nodeps - allow asking user to install packages without\n" " dependencies checking.\n" msgstr "" " --allow-nodeps - дозволити користувачеві встановлювати пакунки без " "перевірки залежностей.\n" #: ../urpmi:103 #, c-format msgid "" " --allow-force - allow asking user to install packages without\n" " dependencies checking and integrity.\n" msgstr "" " --allow-force - дозволити користувачеві встановлювати пакунки без " "перевірки залежностей і цілісності.\n" #: ../urpmi:105 #, c-format msgid " --allow-recommends - auto select \"recommended\" packages.\n" msgstr " --allow-recommends - автоматично вибирати «рекомендовані» пакунки.\n" #: ../urpmi:109 #, c-format msgid "" " --use-distrib - configure urpmi on the fly from a distrib tree, useful\n" " to install a chroot with --root option.\n" msgstr "" " --use-distrib - налаштувати urpmi на льоту з дерева дистрибутива, " "використовується\n" " для встановлення chroot з параметром --root.\n" #: ../urpmi:111 ../urpmi.addmedia:60 ../urpmi.update:38 #, c-format msgid " --metalink - generate and use a local metalink.\n" msgstr " --metalink - створити і використати локальне метапосилання.\n" #: ../urpmi:112 #, c-format msgid "" " --download-all - download all needed packages before trying to install " "them\n" msgstr "" " --download-all - отримати всі потрібні пакунки до спроби встановлення\n" #: ../urpmi:113 #, c-format msgid "" " --downloader - program to use to retrieve distant files. \n" " known programs: %s\n" msgstr "" " --downloader - програма, яку слід використати для отримання віддалених " "файлів. \n" " відомі програми: %s\n" #: ../urpmi:116 #, c-format msgid " --curl-options - additional options to pass to curl\n" msgstr " --curl-options - додаткові параметри, які слід передати curl\n" #: ../urpmi:117 #, c-format msgid " --rsync-options- additional options to pass to rsync\n" msgstr " --rsync-options - додаткові параметри, які слід передати rsync\n" #: ../urpmi:118 #, c-format msgid " --wget-options - additional options to pass to wget\n" msgstr " --wget-options - додаткові параметри, які слід передати wget\n" #: ../urpmi:119 #, c-format msgid " --prozilla-options - additional options to pass to prozilla\n" msgstr "" " --prozilla-options - додаткові параметри, які слід передати prozilla\n" #: ../urpmi:120 #, c-format msgid " --aria2-options - additional options to pass to aria2\n" msgstr " --aria2-options - додаткові параметри, які слід передати aria2\n" #: ../urpmi:121 ../urpmi.addmedia:61 ../urpmi.update:39 #, c-format msgid " --limit-rate - limit the download speed.\n" msgstr " --limit-rate - обмежити швидкість завантаження.\n" #: ../urpmi:122 #, c-format msgid "" " --resume - resume transfer of partially-downloaded files\n" " (--no-resume disables it, default is disabled).\n" msgstr "" " --resume - відновити переміщення частково отриманих файлів\n" " (--no-resume вимикає його, типово вимкнено).\n" #: ../urpmi:124 ../urpmi.addmedia:62 ../urpmi.update:40 ../urpmq:74 #, c-format msgid "" " --proxy - use specified HTTP proxy, the port number is assumed\n" " to be 1080 by default (format is <proxyhost[:port]>).\n" msgstr "" " --proxy - використовувати вказаний HTTP-проксі, типово порт 1080 " "(формат - <проксі[:порт]>).\n" #: ../urpmi:126 ../urpmi.addmedia:64 ../urpmi.update:42 ../urpmq:76 #, c-format msgid "" " --proxy-user - specify user and password to use for proxy\n" " authentication (format is <user:password>).\n" msgstr "" " --proxy-user - задати користувача і пароль, щоб використовувати\n" " для ідентифікації на проксі (формат - <користувач:" "пароль>).\n" #: ../urpmi:128 #, c-format msgid "" " --bug - output a bug report in directory indicated by\n" " next arg.\n" msgstr "" " --bug - вивести звіт про помилку в теку, вказану наступним " "аргументом.\n" #: ../urpmi:134 #, c-format msgid " --excludepath - exclude path separated by comma.\n" msgstr " --excludepath - виключити шлях, відокремлений комою.\n" #: ../urpmi:135 #, c-format msgid " --excludedocs - exclude doc files.\n" msgstr " --excludedocs - не включати файли документації.\n" #: ../urpmi:136 #, c-format msgid " --ignoresize - don't verify disk space before installation.\n" msgstr " --ignoresize - не перевіряти місце на диску перед встановленням.\n" #: ../urpmi:137 #, c-format msgid " --ignorearch - allow to install rpms for unmatched architectures.\n" msgstr "" " --ignorearch - дозволити встановлення rpm для невідповідних архітектур.\n" #: ../urpmi:138 #, c-format msgid " --noscripts - do not execute package scriptlet(s)\n" msgstr " --noscripts - не виконувати скриптів пакунка\n" #: ../urpmi:139 #, c-format msgid " --replacefiles - ignore file conflicts\n" msgstr " --replacefiles - нехтувати конфліктами файлів\n" #: ../urpmi:140 #, c-format msgid " --skip - packages which installation should be skipped\n" msgstr " --skip - пакунки, які при встановленні будуть пропущені.\n" #: ../urpmi:141 #, c-format msgid " --prefer - packages which should be preferred\n" msgstr " --prefer - пакунки, яким слід надавати перевагу\n" #: ../urpmi:142 #, c-format msgid "" " --more-choices - when several packages are found, propose more choices\n" " than the default.\n" msgstr "" " --more-choices - якщо знайдено кілька пакунків, пропонує ширший вибір, \n" " ніж типово\n" #: ../urpmi:144 #, c-format msgid " --nolock - don't lock rpm db.\n" msgstr " --nolock - не блокувати базу даних rpm.\n" #: ../urpmi:145 #, c-format msgid " --strict-arch - upgrade only packages with the same architecture.\n" msgstr "" " --strict-arch - поновити тільки пакунки з такою самою архітектурою.\n" #: ../urpmi:146 ../urpmq:95 #, c-format msgid " -a - select all matches on command line.\n" msgstr " -a - вибрати всі відповідності в командному рядку.\n" #: ../urpmi:149 #, c-format msgid " --quiet, -q - quiet mode.\n" msgstr " --quiet, -q - режим без повідомлень.\n" #: ../urpmi:151 #, c-format msgid " --debug - very verbose mode.\n" msgstr " --debug - режим з дуже докладними повідомленнями.\n" #: ../urpmi:152 #, c-format msgid " names or rpm files given on command line will be installed.\n" msgstr " назви або rpm-файли, задані в командному рядку, буде встановлено.\n" #: ../urpmi:180 #, c-format msgid "Error: can't use --auto-select along with package list.\n" msgstr "" "Помилка: не можна використовувати --auto-select лише зі списком пакунків.\n" #: ../urpmi:187 #, c-format msgid "" "Error: To generate a bug report, specify the usual command-line arguments\n" "along with --bug.\n" msgstr "" "Помилка: для створення звіту про ваду, вкажіть звичайні параметри командного " "рядка\n" "з параметром --bug.\n" #: ../urpmi:217 #, c-format msgid "You can't install binary rpm files when using --install-src" msgstr "" "Ви не можете встановлювати бінарні файли rpm, якщо використовуєте параметр --" "install-src" #: ../urpmi:218 #, c-format msgid "You can't install spec files" msgstr "Ви не можете встановлювати файлів spec" #: ../urpmi:225 #, c-format msgid "defaulting to --buildrequires" msgstr "типовим є --buildrequires" #: ../urpmi:230 #, c-format msgid "" "please use --buildrequires or --install-src, defaulting to --buildrequires" msgstr "" "будь ласка, скористайтеся --buildrequires або --install-src, типовим є --" "buildrequires" #: ../urpmi:250 #, c-format msgid "" "Directory [%s] already exists, please use another directory for bug report " "or delete it" msgstr "" "Тека [%s] вже існує, використайте іншу теку на звіт про помилку, або знищіть " "його" #: ../urpmi:251 #, c-format msgid "Unable to create directory [%s] for bug report" msgstr "Неможливо створити теку [%s] для звіту про помилку" #: ../urpmi:272 #, c-format msgid "" "Error: %s appears to be mounted read-only.\n" "Use --allow-force to force operation." msgstr "" "Помилка: схоже, %s змонтовано в режимі тільки читання.\n" "Використовуйте --allow-force, щоб виконати цю дію." #. -PO: here format is "<package_name>: <summary> (to upgrade)" #: ../urpmi:426 #, c-format msgid "%s: %s (to upgrade)" msgstr "%s: %s (для оновлення)" #. -PO: here format is "<package_name> (to upgrade)" #: ../urpmi:428 #, c-format msgid "%s (to upgrade)" msgstr "%s (для оновлення)" #. -PO: here format is "<package_name>: <summary> (to install)" #: ../urpmi:432 #, c-format msgid "%s: %s (to install)" msgstr "%s: %s (для встановлення)" #. -PO: here format is "<package_name> (to install)" #: ../urpmi:434 #, c-format msgid "%s (to install)" msgstr "%s (для встановлення)" #: ../urpmi:440 #, c-format msgid "" "In order to satisfy the '%s' dependency, one of the following packages is " "needed:" msgstr "" "Щоб задовольнити залежність «%s», слід встановити один з таких пакунків:" #: ../urpmi:443 #, c-format msgid "What is your choice? (1-%d) " msgstr "Що оберете? (1-%d) " #: ../urpmi:485 #, c-format msgid "" "The following package cannot be installed because it depends on packages\n" "that are older than the installed ones:\n" "%s" msgstr "" "Наступні пакунки не може бути встановлено, оскільки вони залежать\n" "від пакунків, які є старішими від встановлених:\n" "%s" #: ../urpmi:487 #, c-format msgid "" "The following packages can't be installed because they depend on packages\n" "that are older than the installed ones:\n" "%s" msgstr "" "Наступні пакунки не можуть бути встановлені, тому що вони залежать\n" "від пакунків, які є старішими від встановлених:\n" "%s" #: ../urpmi:493 ../urpmi:511 #, c-format msgid "" "\n" "Continue installation anyway?" msgstr "" "\n" "Продовжувати встановлення за будь-яких умов?" #: ../urpmi:494 ../urpmi:512 ../urpmi:629 ../urpmi.addmedia:136 #, c-format msgid " (Y/n) " msgstr " (Y/n) (Т/н) " #: ../urpmi:505 #, c-format msgid "" "A requested package cannot be installed:\n" "%s" msgstr "" "Замовлений пакунок не може бути встановлено:\n" "%s" #: ../urpmi:526 #, c-format msgid "removing package %s will break your system" msgstr "вилучення пакунка %s пошкодить систему" #: ../urpmi:534 #, c-format msgid "" "The installation cannot continue because the following package\n" "has to be removed for others to be upgraded:\n" "%s\n" msgstr "" "Продовження встановлення неможливе через те, що наступний пакунок\n" "слід вилучити для того, щоб поновити інші:\n" "%s\n" #: ../urpmi:536 #, c-format msgid "" "The installation cannot continue because the following packages\n" "have to be removed for others to be upgraded:\n" "%s\n" msgstr "" "Продовження встановлення неможливе через те, що наступні пакунки повинні " "бути вилучені для того, щоб поновити інші:\n" "%s\n" #: ../urpmi:544 #, c-format msgid "(test only, removal will not be actually done)" msgstr "(лише для перевірки, вилучення проводитися не буде)" #: ../urpmi:563 #, c-format msgid "" "You must first call urpmi with --buildrequires to install the following " "dependencies:\n" "%s\n" msgstr "" "Вам слід спочатку викликати urpmi з параметром --buildrequires, щоб " "встановити такі залежності:\n" "%s\n" #: ../urpmi:573 #, c-format msgid "The following orphan package will be removed." msgid_plural "The following orphan packages will be removed." msgstr[0] "Наведений нижче «осиротілий» пакунок буде вилучено." msgstr[1] "Наведені нижче «осиротілі» пакунки буде вилучено." msgstr[2] "Наведені нижче «осиротілі» пакунки буде вилучено." #: ../urpmi:599 #, c-format msgid "WARNING: %s option is in use. Some strange problems may happen" msgstr "УВАГА: використано параметр %s. Можуть виникнути незрозумілі проблеми." #: ../urpmi:611 #, c-format msgid "(test only, installation will not be actually done)" msgstr "(лише для перевірки, встановлення проводитися не буде)" #: ../urpmi:642 #, c-format msgid "Press Enter when mounted..." msgstr "Натисніть Enter, коли змонтуєте..." #. -PO: The URI types strings 'file:', 'ftp:', 'http:', and 'cdrom:' must not be translated! #. -PO: neither the ``with''. Only what is between <brackets> can be translated. #: ../urpmi.addmedia:36 #, c-format msgid "" "usage: urpmi.addmedia [options] <name> <url>\n" "where <url> is one of\n" " [file:/]/<path>\n" " ftp://<login>:<password>@<host>/<path>\n" " ftp://<host>/<path>\n" " http://<host>/<path>\n" " cdrom://<path>\n" "\n" "usage: urpmi.addmedia [options] --distrib --mirrorlist <url>\n" "usage: urpmi.addmedia [options] --mirrorlist <url> <name> <relative path>\n" "\n" "examples:\n" "\n" " urpmi.addmedia --distrib --mirrorlist '$MIRRORLIST'\n" " urpmi.addmedia --mirrorlist '$MIRRORLIST' backports media/main/backports\n" " urpmi.addmedia --distrib --zeroconf\n" "\n" "\n" "and [options] are from\n" msgstr "" "використання: urpmi.addmedia [параметри] <назва> <url>,\n" "де <url> можна вказувати так:\n" " [file:/]/<шлях>\n" " ftp://<користувач>:<пароль>@<вузол>/<шлях>\n" " ftp://<вузол>/<шлях>\n" " http://<вузол>/<шлях>\n" " cdrom://<шлях>\n" "\n" "використання: urpmi.addmedia [параметри] --distrib --mirrorlist <url>\n" "використання: urpmi.addmedia [параметри] --mirrorlist <url> <назва> " "<відносний шлях>\n" "\n" "приклади:\n" "\n" " urpmi.addmedia --distrib --mirrorlist '$MIRRORLIST'\n" " urpmi.addmedia --mirrorlist '$MIRRORLIST' backports media/main/backports\n" "\n" "\n" "де [параметри] можна вибрати такими:\n" #: ../urpmi.addmedia:56 ../urpmi.update:34 ../urpmq:71 #, c-format msgid " --wget - use wget to retrieve distant files.\n" msgstr "" " --wget - використовувати wget для доступу до віддалених файлів.\n" #: ../urpmi.addmedia:57 ../urpmi.update:35 ../urpmq:72 #, c-format msgid " --curl - use curl to retrieve distant files.\n" msgstr "" " --curl - використовувати curl для доступу до віддалених файлів.\n" #: ../urpmi.addmedia:58 ../urpmi.update:36 ../urpmq:73 #, c-format msgid " --prozilla - use prozilla to retrieve distant files.\n" msgstr "" " --prozilla - використовувати prozilla для отримання віддалених " "файлів.\n" #: ../urpmi.addmedia:59 ../urpmi.update:37 #, c-format msgid " --aria2 - use aria2 to retrieve distant files.\n" msgstr "" " --aria2 - використовувати aria2 для отримання віддалених файлів.\n" #: ../urpmi.addmedia:66 #, c-format msgid "" " --update - create an update medium, \n" " or discard non-update media (when used with --distrib)\n" msgstr "" " --update - створити джерело поновлення, \n" " або відкинути джерело без поновлень (з --distrib)\n" #: ../urpmi.addmedia:68 #, c-format msgid "" " --xml-info - use the specific policy for downloading xml info files\n" " one of: never, on-demand, update-only, always. cf urpmi." "cfg(5)\n" msgstr "" " --xml-info - використовувати особливі правила отримання файлів xml\n" " має одне зі значень: never, on-demand, update-only, " "always. Пор. urpmi.cfg(5)\n" #: ../urpmi.addmedia:70 #, c-format msgid " --probe-synthesis - use synthesis file.\n" msgstr " --probe-synthesis - використовувати файл synthesis.\n" #: ../urpmi.addmedia:71 #, c-format msgid " --probe-rpms - use rpm files (instead of synthesis).\n" msgstr " --probe-rpms - скористатися файлами rpm (замість synthesis).\n" #: ../urpmi.addmedia:72 #, c-format msgid " --no-probe - do not try to find any synthesis file.\n" msgstr " --no-probe - не намагатися знайти файли synthesis.\n" #: ../urpmi.addmedia:74 #, c-format msgid "" " --distrib - automatically create all media from an installation\n" " medium.\n" msgstr "" " --distrib - автоматично створювати всі носії із носія встановлення.\n" #: ../urpmi.addmedia:76 #, c-format msgid " --interactive - with --distrib, ask confirmation for each media\n" msgstr "" " --interactive - разом з --distrib, запитувати підтвердження для всіх " "носіїв\n" #: ../urpmi.addmedia:77 #, c-format msgid " --all-media - with --distrib, add every listed media\n" msgstr " --all-media - разом з --distrib, додати всі носії зі списку\n" #: ../urpmi.addmedia:78 #, c-format msgid " --virtual - create virtual media wich are always up-to-date.\n" msgstr " --virtual - створити віртуального носія з найновішими даними.\n" #: ../urpmi.addmedia:79 ../urpmi.update:45 #, c-format msgid " --no-md5sum - disable MD5SUM file checking.\n" msgstr " --no-md5sum - вимкнути перевірку файлів на MD5SUM.\n" #: ../urpmi.addmedia:80 #, c-format msgid " --nopubkey - don't import pubkey of added media\n" msgstr " --nopubkey - не імпортувати публічний ключ з доданого носія\n" #: ../urpmi.addmedia:81 #, c-format msgid " --raw - add the media in config, but don't update it.\n" msgstr "" " --raw - додати носія в конфігурацію, але не поновлювати його.\n" #: ../urpmi.addmedia:82 ../urpmi.removemedia:43 ../urpmi.update:54 #, c-format msgid " -q - quiet mode.\n" msgstr " -q - режим мовчання.\n" #: ../urpmi.addmedia:83 ../urpmi.removemedia:44 ../urpmi.update:55 #, c-format msgid " -v - verbose mode.\n" msgstr " -v - детальний режим.\n" #: ../urpmi.addmedia:96 #, c-format msgid "known xml-info policies are %s" msgstr "відомими наборами правил xml-info є %s" #: ../urpmi.addmedia:107 #, c-format msgid "no argument needed for --distrib --mirrorlist <url>" msgstr "непотрібні аргументи до --distrib --mirrorlist <адреса>" #: ../urpmi.addmedia:112 #, c-format msgid "bad <url> (for local directory, the path must be absolute)" msgstr "" "помилкове значення <адреса> (для локального каталогу слід вказати абсолютний" " шлях)" #: ../urpmi.addmedia:116 #, c-format msgid "Only superuser is allowed to add media" msgstr "Тільки користувачу root дозволяється додавати носії" #: ../urpmi.addmedia:119 #, c-format msgid "creating config file [%s]" msgstr "створення файла налаштувань [%s]" #: ../urpmi.addmedia:120 #, c-format msgid "Can't create config file [%s]" msgstr "Неможливо створити конфігураційний файл [%s]" #: ../urpmi.addmedia:128 #, c-format msgid "no need to give <relative path of synthesis> with --distrib" msgstr "немає потреби задавати <відносний шлях synthesis> для --distrib" #: ../urpmi.addmedia:136 #, c-format msgid "" "\n" "Do you want to add media '%s'?" msgstr "" "\n" "Бажаєте додати носій «%s»?" #: ../urpmi.addmedia:156 ../urpmi.addmedia:181 #, c-format msgid "unable to add medium" msgstr "неможливо додати носій" #: ../urpmi.addmedia:164 #, c-format msgid "<relative path of synthesis> missing\n" msgstr "немає <відносного шляху до synthesis>\n" #: ../urpmi.addmedia:167 #, c-format msgid "Can't use %s with remote medium" msgstr "Не можна використовувати %s для віддалених носіїв" #: ../urpmi.removemedia:38 #, c-format msgid "" "usage: urpmi.removemedia (-a | <name> ...)\n" "where <name> is a medium name to remove.\n" msgstr "" "використання: urpmi.removemedia (-a | <назва> ...)\n" "де <назва> - це назва носія для вилучення.\n" #: ../urpmi.removemedia:41 #, c-format msgid " -a - select all media.\n" msgstr " -a - вибрати всі носії.\n" #: ../urpmi.removemedia:42 #, c-format msgid " -y - fuzzy match on media names.\n" msgstr " -y - на назвах носіїв позначати як чорновий.\n" #: ../urpmi.removemedia:59 #, c-format msgid "Only superuser is allowed to remove media" msgstr "Тільки користувачу root дозволяється вилучати носії" #: ../urpmi.removemedia:71 #, c-format msgid "nothing to remove (use urpmi.addmedia to add a media)\n" msgstr "нічого вилучати (використовуйте urpmi.addmedia, щоб додати носія)\n" #: ../urpmi.removemedia:77 #, c-format msgid "" "the entry to remove is missing\n" "(one of %s)\n" msgstr "" "об'єкта для вилучення немає\n" "(один з %s)\n" #: ../urpmi.update:31 #, c-format msgid "" "usage: urpmi.update [options] <name> ...\n" "where <name> is a medium name to update.\n" msgstr "" "використання: urpmi.update [параметри] <назва> ...\n" "де <назва> - це назва носія з поновленнями.\n" #: ../urpmi.update:44 #, c-format msgid " --update - update only update media.\n" msgstr " --update - поновити тільки носія з поновленнями.\n" #: ../urpmi.update:46 #, c-format msgid " --force-key - force update of gpg key.\n" msgstr " --force-key - виконати поновлення ключа gpg.\n" #: ../urpmi.update:47 #, c-format msgid " --ignore - don't update, mark the media as ignored.\n" msgstr " --ignore - не оновлювати, помітити джерело як ігнороване.\n" #: ../urpmi.update:48 #, c-format msgid " --no-ignore - don't update, mark the media as enabled.\n" msgstr " --no-ignore - не оновлювати, помітити джерело як доступне.\n" #: ../urpmi.update:50 #, c-format msgid " --probe-rpms - do not use synthesis, use rpm files directly\n" msgstr "" " --probe-rpms - не використовувати synthesis, скористатися напряму " "файлами rpm\n" #: ../urpmi.update:51 #, c-format msgid " -a - select all enabled non-removable media.\n" msgstr " -a - вибрати всі увімкнені незнімні носії.\n" #: ../urpmi.update:52 #, c-format msgid " -f - force updating synthesis\n" msgstr " -f - примусово оновити synthesis\n" #: ../urpmi.update:53 #, c-format msgid " -ff - really force updating synthesis\n" msgstr " -ff - примусити до оновлення synthesis\n" #: ../urpmi.update:70 #, c-format msgid "Only superuser is allowed to update media" msgstr "Тільки користувачу root дозволяється поновлювати носії" #: ../urpmi.update:87 #, c-format msgid "nothing to update (use urpmi.addmedia to add a media)\n" msgstr "нічого поновлювати (використовуйте urpmi.addmedia, щоб додати носія)\n" #: ../urpmi.update:88 #, c-format msgid "" "the entry to update is missing\n" "(one of %s)\n" msgstr "" "об'єкта для поновлення немає\n" "(один з %s)\n" #: ../urpmi.update:99 #, c-format msgid "\"%s\"" msgstr %s»" #: ../urpmi.update:100 #, c-format msgid "ignoring media %s" msgstr "ігнорується джерело %s" #: ../urpmi.update:100 #, c-format msgid "enabling media %s" msgstr "джерело робиться доступним %s" #: ../urpmq:44 #, c-format msgid "" " --searchmedia - use only the given media to search requested (or updated) " "packages.\n" msgstr "" " --searchmedia - використовувати тільки задані носії для пошуку запитаних " "(або поновлюваних) пакунків.\n" #: ../urpmq:49 #, c-format msgid " --auto-orphans - list orphans\n" msgstr " --auto-orphans - показати список «осиротілих»\n" #: ../urpmq:50 #, c-format msgid "" " --not-available\n" " - list installed packages not available on any media.\n" msgstr "" " --not-available\n" " - показати список встановлених пакунків, яких немає на " "жодному з носіїв.\n" #: ../urpmq:53 #, c-format msgid " --fuzzy - impose fuzzy search (same as -y).\n" msgstr " --fuzzy - встановити нечіткий пошук (те саме, що -y).\n" #: ../urpmq:56 #, c-format msgid " --list - list available packages.\n" msgstr " --list - вивести список доступних пакунків.\n" #: ../urpmq:57 #, c-format msgid " --list-media - list available media.\n" msgstr " --list-media - вивести список доступних носіїв.\n" #: ../urpmq:58 #, c-format msgid " --list-url - list available media and their url.\n" msgstr " --list-url - вивести наявні носії і їхні адреси.\n" #: ../urpmq:59 #, c-format msgid " --list-nodes - list available nodes when using --parallel.\n" msgstr "" " --list-nodes - вивести список доступних вузлів при використанні --" "parallel.\n" #: ../urpmq:60 #, c-format msgid " --list-aliases - list available parallel aliases.\n" msgstr " --list-aliases - вивести список доступних паралельних псевдонімів.\n" #: ../urpmq:61 #, c-format msgid "" " --dump-config - dump the config in form of urpmi.addmedia argument.\n" msgstr "" " --dump-config - вивести налаштування у форматі аргументу urpmi.addmedia.\n" #: ../urpmq:62 #, c-format msgid " --src - next package is a source package (same as -s).\n" msgstr "" " --src - наступний пакунок - це пакунок з вихідними текстами (так " "само, як -s).\n" #: ../urpmq:63 #, c-format msgid " --sources - print source URLs of selected packages\n" msgstr " --sources - вивести адреси походження вибраних пакунків\n" #: ../urpmq:65 #, c-format msgid " --ignorearch - allow to query rpms for unmatched architectures.\n" msgstr "" " --ignorearch - дозволити запити на пакунки rpm для незазначених " "архітектур.\n" #: ../urpmq:69 #, c-format msgid "" " --use-distrib - configure urpmi on the fly from a distrib tree.\n" " This permit to querying a distro.\n" msgstr "" " --use-distrib - налаштувати urpmi на льоту з дерева дистрибутива.\n" " Це надає змогу виконувати запити до дистрибутива.\n" #: ../urpmq:79 #, c-format msgid " --changelog - print changelog.\n" msgstr " --changelog - друкувати changelog.\n" #: ../urpmq:80 #, c-format msgid " --conflicts - print conflicts.\n" msgstr " --conflicts - вивести список conflicts: всі конфлікти.\n" #: ../urpmq:81 #, c-format msgid " --obsoletes - print obsoletes.\n" msgstr " --obsoletes - вивести список застарілих пакунків.\n" #: ../urpmq:82 #, c-format msgid " --provides - print provides.\n" msgstr " --provides - вивести всі використання (provides).\n" #: ../urpmq:83 #, c-format msgid " --requires - print requires.\n" msgstr " --requires - вивести список залежностей.\n" #: ../urpmq:84 #, c-format msgid " --recommends - print recommends.\n" msgstr " --recommends - вивести список рекомендацій.\n" #: ../urpmq:85 #, c-format msgid " --sourcerpm - print sourcerpm.\n" msgstr " --sourcerpm - вивести параметр sourcerpm: джерельний rpm.\n" #: ../urpmq:86 #, c-format msgid " --summary, -S - print summary.\n" msgstr " --summary, -S - виводити короткий звіт.\n" #: ../urpmq:88 #, c-format msgid "" " --requires-recursive, -d\n" " - query package dependencies.\n" msgstr "" " --requires-recursive, -d\n" " - виконати запит щодо залежностей пакунка.\n" #: ../urpmq:90 #, c-format msgid " --whatrequires - reverse search to what requires package.\n" msgstr " --whatrequires - зворотний пошук пакунків.\n" #: ../urpmq:91 #, c-format msgid "" " --whatrequires-recursive\n" " - extended reverse search (includes virtual packages).\n" msgstr "" " --whatrequires-recursive\n" " - розширений зворотний пошук пакунків (включає віртуальні " "пакунки).\n" #: ../urpmq:93 #, c-format msgid "" " --whatprovides, -p\n" " - search in provides to find package.\n" msgstr "" " --whatprovides, -p\n" " - виконати пошук пакунка у полях provides.\n" #: ../urpmq:96 #, c-format msgid " -c - complete output with package to be removed.\n" msgstr " -c - повний вивід даних про пакунок для вилучення.\n" #: ../urpmq:98 #, c-format msgid " -g - print groups with name also.\n" msgstr " -g - також виводити групи з назвами.\n" #: ../urpmq:99 #, c-format msgid " -i - print useful information in human readable form.\n" msgstr "" " -i - виводити корисну інформацію в придатному для читання " "вигляді.\n" #: ../urpmq:100 #, c-format msgid " -l - list files in package.\n" msgstr " -l - вивести список файлів у пакунку.\n" #: ../urpmq:101 #, c-format msgid " -m - equivalent to -du\n" msgstr " -m - рівнозначне до -du\n" #: ../urpmq:102 #, c-format msgid " -r - print version and release with name also.\n" msgstr " -r - також виводити версію і випуск з назвою.\n" #: ../urpmq:103 #, c-format msgid " -s - next package is a source package (same as --src).\n" msgstr "" " -s - наступний пакунок є пакунком з початковим кодом (те саме, " "що --src).\n" #: ../urpmq:104 #, c-format msgid "" " -u - remove package if a more recent version is already " "installed.\n" msgstr "" " -u - пропустити пакунок, якщо новіша версія вже встановлена.\n" #: ../urpmq:105 #, c-format msgid " -y - impose fuzzy search (same as --fuzzy).\n" msgstr " -y - задати невизначений пошук (так само як --fuzzy).\n" #: ../urpmq:106 #, c-format msgid " -Y - like -y, but forces to match case-insensitively.\n" msgstr " -Y - подібний до -y, але без врахування регістру.\n" #: ../urpmq:107 #, c-format msgid " names or rpm files given on command line are queried.\n" msgstr " назви або rpm-файли, задані в командному рядку, необхідні.\n" #: ../urpmq:154 #, c-format msgid "usage: \"urpmq --auto-orphans\" with no argument" msgstr "Використання: «urpmq --auto-orphans» без аргументів" #: ../urpmq:207 #, c-format msgid "--list-nodes can only be used with --parallel" msgstr "--list-nodes може використовуватися тільки з --parallel" #: ../urpmq:231 #, c-format msgid "use -l to list files" msgstr "щоб отримати список файлів, скористайтеся параметром -l" #: ../urpmq:415 #, c-format msgid "no xml info for medium \"%s\", only partial result for package %s" msgstr "" "немає файла відомостей xml для носія «%s», лише частковий результат для " "пакунка %s" #: ../urpmq:416 #, c-format msgid "no xml info for medium \"%s\", only partial result for packages %s" msgstr "" "немає файла відомостей xml для носія «%s», лише частковий результат для " "пакунків %s" #: ../urpmq:419 #, c-format msgid "" "no xml info for medium \"%s\", unable to return any result for package %s" msgstr "" "немає файла відомостей xml для носія «%s», не отримано жодного результату " "для пакунка %s" #: ../urpmq:420 #, c-format msgid "" "no xml info for medium \"%s\", unable to return any result for packages %s" msgstr "" "немає файла відомостей xml для носія «%s», не отримано жодного результату " "для пакунків %s" #: ../urpmq:487 #, c-format msgid "No changelog found\n" msgstr "Не знайдено журналу змін\n" #: ../gurpmi.desktop.in.h:1 msgid "Software Installer" msgstr "Встановлювач програм" #: ../gurpmi.desktop.in.h:2 msgid "Graphical front end to install RPM files" msgstr "Графічний інтерфейс для встановлення файлів RPM" #: ../polkit/org.mageia.gurpmi2.policy.in.h:1 msgid "Run Mageia Package Installer" msgstr "Запуск засобу встановлення пакунків Mageia" #: ../polkit/org.mageia.gurpmi2.policy.in.h:2 msgid "Authentication is required to run Mageia Package Installer" msgstr "" "Щоб запустити засіб встановлення пакунків Mageia, слід пройти розпізнавання"